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

motivoSignificadoRequiere folioSustitucion
01Comprobante emitido con errores con relación — el UUID del CFDI que lo sustituye
02Comprobante emitido con errores sin relaciónNo
03No se llevó a cabo la operaciónNo
04Operación nominativa relacionada en una factura globalNo

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ónQué hacer
Error en RFC, razón social o CP del receptorCancelar con motivo 01 y emitir el sustituto.
Error en importes o conceptos, factura recién emitidaCancelar con motivo 01 y emitir el sustituto.
La venta se canceló y no hubo operaciónCancelar con motivo 02 o 03.
El cliente devolvió parte de la mercancíaNo canceles. Emite una nota de crédito.
Descuento o bonificación posteriorNo canceles. Nota de crédito.
La factura ya está pagada y deducida por el receptorNota 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.