Reference: Catalogs & Statuses
Catalog tables, status lifecycles, and the consolidated error reference for the invoicing API.
Catalogs
Comprobante type (type)
| Value | SAT name | What it's for |
|---|---|---|
I |
Ingreso | Standard revenue invoice — most common |
E |
Egreso | Credit note or refund reducing a prior Ingreso |
T |
Traslado | Goods-in-transit; typically paired with Carta Porte |
N |
Nómina | Payroll receipt |
P |
Pago | Payment receipt complement for PPD invoices |
Payment method (payment_method)
| Value | SAT name | Meaning |
|---|---|---|
PUE |
Pago en una sola exhibición | Fully settled at time of issue |
PPD |
Pago en parcialidades o diferido | Deferred or split payment; a REP (type P) will follow |
Tax object (tax_object)
| Value | SAT name | Meaning |
|---|---|---|
01 |
No objeto de impuesto | Not subject to any tax |
02 |
Sí objeto de impuesto | Subject to tax — include a taxes array |
03 |
Sí objeto de impuesto y no obligado al desglose | Subject to tax but breakdown not required (specific regimes) |
04 |
Sí objeto del impuesto y no causa impuesto | Subject to tax but does not generate tax liability |
Tax type
Tax type values are lowercase in the API; they map to SAT c_Impuesto when the CFDI XML is built.
| API value | SAT c_Impuesto | Tax name |
|---|---|---|
iva |
002 |
Impuesto al Valor Agregado |
isr |
001 |
Impuesto Sobre la Renta |
ieps |
003 |
Impuesto Especial sobre Producción y Servicios |
Tax factor
Tax factor values are lowercase in the API; they map to SAT c_TipoFactor when the CFDI XML is built.
| API value | SAT c_TipoFactor | When to use |
|---|---|---|
rate |
Tasa |
Percentage rate applied to the base amount (e.g. IVA 16%) |
quota |
Cuota |
Fixed amount per unit of measure (e.g. IEPS per litre) |
exempt |
Exento |
Tax applies but rate is zero or exempt by law |
Cancellation reasons
| Code | SAT name | Notes |
|---|---|---|
01 |
Comprobante emitido con errores con relación | Error exists and a replacement CFDI was issued. replacement_uuid required |
02 |
Comprobante emitido con errores sin relación | Error exists, no replacement. Requires receiver acceptance |
03 |
No se llevó a cabo la operación | Transaction did not take place. Requires receiver acceptance |
04 |
Operación nominativa relacionada en una factura global | Consolidated in a global invoice. No receiver acceptance required |
Other SAT catalogs
The following fields reference SAT catalogs. Consult the official source at sat.gob.mx/consultas/53693/catalogo-de-cfdi:
| Field | SAT catalog |
|---|---|
issuer.fiscal_regime / receiver.fiscal_regime |
c_RegimenFiscal |
receiver.cfdi_use |
c_UsoCFDI |
receiver.tax_residence |
c_Pais |
payment_form |
c_FormaPago |
exportation |
c_Exportacion |
related.type |
c_TipoRelacion |
global.periodicity |
c_Periodicidad |
global.months |
c_Meses |
items[].product_code |
c_ClaveProdServ |
items[].unit_code |
c_ClaveUnidad |
carta_porte.goods.items[].product_code |
c_ClaveProdServCP |
carta_porte.goods.weight_unit |
c_ClaveUnidadPeso |
carta_porte.transport.permit_type |
c_TipoPermiso |
carta_porte.transport.vehicle.config |
c_ConfigAutotransporte |
carta_porte.locations[].address.state |
c_Estado |
employee.contract_type |
c_TipoContrato |
employee.regime_type |
c_TipoRegimen |
employee.risk |
c_RiesgoTrabajo |
employee.payment_periodicity |
c_PeriodicidadPago |
perceptions[].perception_type |
c_TipoPercepcion |
deductions[].deduction_type |
c_TipoDeduccion |
other_payments[].other_payment_type |
c_TipoOtroPago |
Statuses & lifecycle
Issued invoice status (status)
The lifecycle for house-issued invoices (source: house).
| Status | Meaning |
|---|---|
draft |
Record created but stamping has not started |
stamping |
CFDI submitted for stamping — in progress (transient, not visible in practice) |
stamped |
SAT accepted the CFDI; uuid and certified_at are populated |
stamp_failed |
Stamping was rejected or failed |
cancelled |
SAT confirmed cancellation |
The normal path is draft → stamping → stamped. Because stamping is synchronous, stamping is transient — you will see stamped or stamp_failed in the 201 or 502 response. cancelled is a terminal state reached only after the SAT confirms a cancellation request.
Cancellation process status (cancellation.process_status)
cancellation.process_status |
status |
Meaning |
|---|---|---|
null |
stamped |
No cancellation has been requested |
in_progress |
stamped |
Submitted; awaiting SAT or receiver confirmation |
cancelled_without_acceptance |
cancelled |
SAT cancelled without requiring receiver acceptance (reasons 01 and 04) |
cancelled_with_acceptance |
cancelled |
The receiver accepted the cancellation request |
rejected |
stamped |
Receiver rejected; invoice remains active and billable |
expired |
stamped |
72-hour window elapsed without a response; invoice remains active |
Extraction invoice statuses
SAT-downloaded invoices (source: extraction) carry three independent status dimensions.
status — fiscal state
Whether the CFDI is active or cancelled in SAT (estadoComprobante).
| Value | Meaning |
|---|---|
current |
Active in SAT |
cancelled |
Cancelled in SAT |
cancellation_status — cancelability
Whether the CFDI can be cancelled (estatusCancelacion). Present on active invoices.
| Value | Meaning |
|---|---|
cancelable_without_acceptance |
Can be cancelled without receiver acceptance |
cancelable_with_acceptance |
Can be cancelled but requires receiver acceptance |
not_cancelable |
Cannot be cancelled |
cancellation_process_status — cancellation workflow
Set when a cancellation request exists (estatusProcesoCancelacion). null when none has been filed.
| Value | Meaning |
|---|---|
in_progress |
Cancellation request is pending |
rejected |
Receiver rejected the request |
cancelled_without_acceptance |
Cancelled without receiver acceptance |
cancelled_with_acceptance |
Cancelled with receiver acceptance |
expired |
Acceptance period expired |
Errors
All non-2xx responses carry a JSON body. Stamping and cancellation errors include a stable reason string and a human-readable message. Validation errors follow the standard errors envelope.
| HTTP status | reason |
Endpoint(s) | When it happens | What to do |
|---|---|---|---|---|
401 |
— | all | Missing or invalid API credentials | Include a valid Authorization header |
404 |
— | all | Resource not found or belongs to a different org | Verify the ID or entity_id |
422 |
— (Laravel errors) |
all | Request body failed validation | Fix the fields listed in errors |
422 |
no_csd |
issue, cancel | The entity has no active CSD | Upload a CSD via Credentials |
422 |
csd_unreadable |
issue, cancel | The stored CSD files could not be read from storage | Re-upload the credential |
422 |
csd_invalid |
issue, cancel | The CSD could not be loaded — bad password or corrupt files | Re-upload with the correct files and password |
422 |
invalid_cfdi |
issue | The CFDI complement failed schema validation (e.g. invalid Carta Porte data) | Fix the complement data according to message |
422 |
not_stamped |
cancel | The invoice is not in stamped status |
Only stamped invoices can be cancelled |
422 |
not_cancellable |
cancel | The invoice is in a terminal state | No further action possible |
422 |
cancellation_in_progress |
cancel | A cancellation request is already pending | Poll GET /{id}/cancellation and wait |
422 |
replacement_required |
cancel | reason is 01 but replacement_uuid was not provided |
Include the replacement UUID |
502 |
stamp_rejected |
issue | The CFDI was rejected by the stamping authority | Read message for the specific fault code |
502 |
stamp_error |
issue | An unexpected error during stamping | Retry; contact support if it persists |
502 |
cancel_rejected |
cancel | The cancellation request was rejected | Read message for details |
Validation error shape (422, no reason):
{
"message": "The items.0.taxes.0.type field must be one of: iva, isr, ieps.",
"errors": {
"items.0.taxes.0.type": [
"The items.0.taxes.0.type field must be one of: iva, isr, ieps."
]
}
}
Stamping / cancellation error shape (422 or 502, with reason):
{
"message": "The entity has no active CSD credential.",
"reason": "no_csd"
}