Después de timbrar
Cancelaciones y estatus SAT
Cancelar un CFDI, descargar el acuse y consultar si el SAT lo tiene vigente.
Cancelar un CFDI
POST /api/authenticated/{org}/invoices/{invoiceId}/cancel
Scope: invoices.cancel
{ "motivo": "02" }
Motivos
motivo | Significado | Requiere folioSustitucion |
|---|---|---|
01 | Comprobante emitido con errores con relación | Sí — el UUID del CFDI que lo sustituye |
02 | Comprobante emitido con errores sin relación | No |
03 | No se llevó a cabo la operación | No |
04 | Operación nominativa relacionada en una factura global | No |
Con motivo 01, el CFDI sustituto ya debe estar timbrado antes de cancelar:
{
"motivo": "01",
"folioSustitucion": "B2C3D4E5-F6A7-8901-BCDE-F23456789012"
}
Respuesta:
{ "ok": true }
Tras la cancelación, la factura pasa a status: "cancelled".
Descargar el acuse de cancelación
GET /api/authenticated/{org}/invoices/{invoiceId}/acuse
Scope: invoices.read. Devuelve el PDF del acuse del SAT directamente
(Content-Type: application/pdf), no una URL firmada.
curl -s "$FACTY_HOST/api/authenticated/$FACTY_ORG/invoices/clxi7…/acuse" \
-H "X-API-Key: $FACTY_KEY" -o acuse-cancelacion.pdf
Un 404 aquí significa que la factura no está cancelada, o que el acuse aún no
llega del SAT.
Consultar el estatus en el SAT
GET /api/authenticated/{org}/invoices/{invoiceId}/sat-status
Scope: invoices.read. Dice si el SAT tiene el comprobante como vigente o
cancelado, y si es cancelable.
{
"estatus": "Vigente",
"esCancelable": "Cancelable sin aceptación",
"estatusCancelacion": null,
"checkedAt": "2026-08-28T18:40:02.000Z",
"cached": true
}
Esta consulta cuesta dinero
Cada consulta que se reenvía al PAC gasta un folio de la cuota de la organización. Por eso el endpoint sirve un valor cacheado, con una vigencia de 30 minutos.
GET /api/authenticated/{org}/invoices/{invoiceId}/sat-status?force=true
?force=true salta el caché y consulta al SAT de verdad.
Un 409 INVOICE_NOT_STAMPED significa que la factura nunca se timbró, así que no
tiene estatus en el SAT.
Cancelar un complemento de pago
Ruta distinta, mismo cuerpo:
POST /api/authenticated/{org}/payments/{paymentId}/cancel
Scope: invoices.cancel. Ver
Complemento de pago.
Cancelar un CFDI de retenciones
POST /api/authenticated/{org}/retenciones/{retencionId}/cancel
Scope: invoices.cancel.
Cuándo cancelar y cuándo no
| Situación | Qué hacer |
|---|---|
| Error en RFC, razón social o CP del receptor | Cancelar con motivo 01 y emitir el sustituto. |
| Error en importes o conceptos, factura recién emitida | Cancelar con motivo 01 y emitir el sustituto. |
| La venta se canceló y no hubo operación | Cancelar con motivo 02 o 03. |
| El cliente devolvió parte de la mercancía | No canceles. Emite una nota de crédito. |
| Descuento o bonificación posterior | No canceles. Nota de crédito. |
| La factura ya está pagada y deducida por el receptor | Nota de crédito, salvo que el receptor acepte la cancelación. |
Como regla: si la operación existió, casi siempre la respuesta correcta es una nota de crédito, no una cancelación.