CFDI verification

Before processing a payment against an invoice, verify that the CFDI is still active in SAT. This endpoint queries SAT's public web service (no CIEC or e.firma required) and returns the document status, whether it can be cancelled, and whether the issuer appears on the EFOS list of phantom-invoice companies.

Verify a CFDI

POST /v1/cfdi/verify

{
  "uuid":         "b4e2cbf2-e0e3-4aef-8f97-9c6e77b29c1b",
  "issuer_rfc":   "COSC8001137NA",
  "receiver_rfc": "DIM8701081LA",
  "total":        15000.00
}

All four fields are required and must match what is stamped in the CFDI — the SAT rejects combinations where the values don't align with its records.

Response (200 OK):

{
  "uuid":                "b4e2cbf2-e0e3-4aef-8f97-9c6e77b29c1b",
  "status":              "active",
  "is_cancelable":       true,
  "cancellation_status": "by_direct_call",
  "efos":                false
}

Field reference

Field Type Description
uuid string The CFDI UUID, lowercased
status string See status table
is_cancelable bool true when cancellation is possible right now
cancellation_status string See cancellation table
efos bool true if the issuer RFC is on the SAT EFOS list (phantom invoices)

Status values

status Meaning
active The CFDI is vigente — has not been cancelled
cancelled The CFDI has been cancelled in SAT
not_found The UUID does not exist in SAT (404 response)

Cancellation status values

cancellation_status Meaning
by_direct_call Can be cancelled by the issuer directly (no receiver approval needed)
by_approval Cancellation requires the receiver to approve in the SAT portal
not_cancellable Cannot be cancelled (e.g. already cancelled, or linked to pending payments)

EFOS flag

efos: true means the issuer's RFC appears on the EFOS list — the SAT has identified them as a presumed or confirmed emitter of phantom invoices (facturas simuladas). Invoices from EFOS-listed companies are not tax-deductible. Use this together with the 69-B blacklist endpoint for full compliance screening.

Responses

Status reason What happened What to do
200 — SAT returned a result Use the status and efos fields
404 not_found UUID not found in SAT Verify the UUID with the emitter
422 — (Laravel errors) Request failed validation Fix the request body
502 upstream_error SAT service unavailable Retry

CFDI verification is synchronous — the result comes back in the response. No webhook, no polling. The SAT endpoint is free and public — no credentials required from you.