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