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.