[MX] Issuing Documents

Ingreso, Factura Global, RFC Genérico, and RFC Extranjero are all issued through the same Vertex document — invoice_type: "debit", document_type: "invoice" — and differ only in specific buyer fields. Egreso is its own document type.

Ingreso

Standard income invoice — the baseline every other variant in this section builds on. Minimum structure:

{
  "supplier_company_id": "{{company_id}}",
  "invoice_number": "1432",
  "invoice_serie": "FE",
  "invoice_type": "debit",
  "document_type": "invoice",
  "invoice_date": "2026-02-17",
  "e_invoice": true,
  "currency": "MXN",
  "reason": "G03",
  "buyer": {
    "company": {
      "name": "MARIA OLIVIA MARTINEZ SAGAZ",
      "legal_name": "MARIA OLIVIA MARTINEZ SAGAZ",
      "type": "person",
      "address": {
        "postal_code": "80290",
        "country": "MX"
      },
      "tax_registrations": [
        {
          "type": "RFC",
          "number": "MASO451221PM4",
          "level": "country",
          "location": "MX",
          "status": "Régimen de Actividades Profesionales"
        }
      ]
    }
  },
  "items": [
    {
      "name": "Servicio de consultoría",
      "quantity": 1,
      "unit_amount": 700,
      "amount": 700,
      "taxes": [
        {
          "amount": 112,
          "name": "VAT",
          "rate": 0.16,
          "rate_type": "percentage",
          "adds_to_final_amount": true
        }
      ]
    }
  ]
}

Field notes:

  • supplier_company_id — your Vertex-registered supplier.
  • invoice_type / document_type — always "debit" / "invoice" for a standard Ingreso.
  • reason — SAT's UsoCFDI catalog value (e.g. G03 = gastos en general).
  • buyer.company.tax_registrations[].status — the SAT régimen fiscal, mapped through the RegimenFiscal Mapping table in MX — Test RFCs.
  • items[].taxes[] — one entry per tax applied to that line; adds_to_final_amount: true means it's added on top (like VAT), not withheld.

The Factura Global, RFC Genérico, and RFC Extranjero variants below only change the buyer block — everything else stays the same as this baseline.

📮 Postman example — Ingreso

Factura Global

Not a separate document type — same Ingreso payload, but two fields on the buyer are fixed:

"buyer": {
  "company": {
    "name": "PUBLICO EN GENERAL",
    "tax_registrations": [
      { "type": "RFC", "number": "XAXX010101000", "level": "country", "location": "MX" }
    ]
  }
}

name must be exactly "PUBLICO EN GENERAL" — that's the field that tells Vertex/SAT this is a Factura Global (consolidating retail sales to the general public), not a one-off RFC Genérico sale at the same RFC. Used typically for end-of-day or end-of-period consolidation.

📮 Postman example — Factura Global

Egreso (Credit Note)

Used to cancel or partially reduce a previously issued Ingreso. This is its own Vertex document type:

  • invoice_type: "credit"
  • document_type: "credit note"

Must reference the original CFDI's UUID (SAT-side CfdiRelacionados — see the raw XML in MX — SAT Guides, Egresos example).

📮 Postman example — Credit Note

RFC Genérico

Same RFC as Factura Global, different buyer name:

"buyer": {
  "company": {
    "name": "Juan Cliente Ocasional",
    "tax_registrations": [
      { "type": "RFC", "number": "XAXX010101000", "level": "country", "location": "MX" }
    ]
  }
}

Any name other than PUBLICO EN GENERAL at RFC XAXX010101000 = RFC Genérico (billed individually), not Global.

RFC Extranjero

For foreign buyers without a Mexican RFC. Needs two tax_registrations[] entries:

"buyer": {
  "company": {
    "tax_registrations": [
      { "type": "RFC", "number": "XEXX010101000", "level": "country", "location": "MX" },
      { "type": "tax_id", "number": "111111111", "level": "country", "location": "USA" }
    ]
  }
}

The second entry's number is the foreign tax ID (maps to SAT NumRegIdTrib); its location (≠ "MX") is the fiscal residence (maps to SAT ResidenciaFiscal).


Did this page help you?