Cancel an Invoice
A stamped CFDI can be cancelled through the SAT. Cancellation is asynchronous: submitting the request immediately moves the invoice to in_progress; the SAT (and for some reasons, the receiver) must confirm before the invoice is formally cancelled.
Cancel a CFDI
DELETE /v1/issued-invoices/{id}
curl -X DELETE https://api.example.com/v1/issued-invoices/$INVOICE_ID \
-u "$API_KEY:" \
-H "Content-Type: application/json" \
-d '{
"reason": "01",
"replacement_uuid": "C1A2B3D4-E5F6-7890-ABCD-EF1234567890"
}'
Request body
| Field | Type | Required | Description |
|---|---|---|---|
reason |
string | yes | SAT cancellation reason code: 01, 02, 03, or 04. See Cancellation reasons. |
replacement_uuid |
string | conditional | UUID of the replacement CFDI. Required when reason is 01. |
Response — 200 OK
The updated invoice resource. cancellation.process_status will be in_progress immediately; status remains stamped until the SAT confirms.
{
"id": "01936f7a-4b2c-7e8d-9f0a-1b2c3d4e5f6a",
"uuid": "B4E2CBF2-E0E3-4AEF-8F97-9C6E77B29C1B",
"status": "stamped",
"certified_at": "2026-07-01T18:00:00+00:00",
"cancelled_at": null,
"cancellation": {
"process_status": "in_progress",
"reason": "01",
"replacement_uuid": "C1A2B3D4-E5F6-7890-ABCD-EF1234567890",
"receipt": { "available": false }
},
"xml": { "available": true },
"pdf": { "available": true }
}
Poll cancellation status
GET /v1/issued-invoices/{id}/cancellation
Queries the SAT for the latest cancellation state, reconciles the invoice, and returns the full resource with an updated cancellation.process_status. Safe to poll — no-ops unless a cancellation is already in progress.
Response — same shape as GET /v1/issued-invoices/{id}, with cancellation reflecting the latest SAT state.
Async lifecycle
The top-level status flips to cancelled only once the SAT confirms — either directly (reasons 01/04) or after receiver acceptance (reasons 02/03). A rejected or expired process leaves the invoice fully valid and billable.
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 |
Related pages
- Reference: catalogs & statuses — cancellation reason codes and error table
- List & retrieve —
GET /v1/issued-invoices/{id}and download endpoints