/v1/cfdi/verify
Pregúntale al SAT si un CFDI (factura) está registrado en sus controles y si sigue vigente o fue cancelado. La respuesta viene del portal Verifica CFDI del SAT e incluye si el CFDI es cancelable, su estatus de cancelación y, si fue cancelado, la fecha y el motivo. Tarda unos 3 segundos.
Úsalo antes de pagar o deducir la factura de un proveedor, para confirmar un CFDI que te envió un cliente, o para volver a revisar si se cancelaron facturas que tienes guardadas.
Cuerpo de la solicitud
Envía la búsqueda por folio (uuid, rfc_emisor y rfc_receptor) o el CFDI mismo como xml, nunca ambos. Una solicitud que los mezcla se rechaza con 422.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
uuid |
string | Para buscar por folio | El folio fiscal (UUID) del timbre del CFDI. No importan mayúsculas o minúsculas. |
rfc_emisor |
string | Para buscar por folio | RFC del emisor. |
rfc_receptor |
string | Para buscar por folio | RFC del receptor. |
xml |
string | En lugar de los campos del folio | El XML del CFDI, subido como archivo (multipart/form-data) o enviado como cadena en un cuerpo JSON. El SAT lee de él el folio y los RFC, y además revisa los sellos del CFDI, que se devuelven como sello_cfdi y sello_timbre_fiscal. |
Pruébalo
/v1/cfdi/verify
Inicia sesión para enviar una solicitud real desde esta página.
Las cuentas nuevas reciben $5 USD de crédito al registrarse, sin tarjeta.
Solicitud de ejemplo: por folio
curl -X POST https://rfccheck.com/v1/cfdi/verify \
-H "x-api-key: rfc_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"uuid": "5FB2822E-396D-4725-8521-CDC4BDD20CCF",
"rfc_emisor": "ACM010101AAA",
"rfc_receptor": "XAXX010101000"
}'
Solicitud de ejemplo: por XML
Sube el archivo XML como multipart/form-data, como un formulario del navegador envía un archivo.
curl -X POST https://rfccheck.com/v1/cfdi/verify \
-H "x-api-key: rfc_your_api_key" \
-F [email protected]
También funciona un cuerpo JSON con el XML como cadena: {"xml": "<?xml version=..."}. La mayoría de las bibliotecas HTTP escapan las comillas y los saltos de línea por ti.
Respuesta (200)
{
"uuid": "5FB2822E-396D-4725-8521-CDC4BDD20CCF",
"found": true,
"status": "vigente",
"message": "SAT reports this CFDI is current (vigente).",
"cfdi": {
"uuid": "5FB2822E-396D-4725-8521-CDC4BDD20CCF",
"rfc_emisor": "ACM010101AAA",
"nombre_emisor": "ACME CONSULTORES",
"rfc_receptor": "XAXX010101000",
"nombre_receptor": "PUBLICO EN GENERAL",
"fecha_emision": "2026-05-06T17:45:57",
"fecha_certificacion": "2026-05-06T17:46:06",
"rfc_pac": "AAA010101AAA",
"total": "$1,000.00",
"efecto_comprobante": "Ingreso",
"estado": "Vigente",
"es_cancelable": "Cancelable sin aceptación",
"estatus_cancelacion": null,
"fecha_cancelacion": null,
"motivo": null,
"folio_sustitucion": null,
"sello_cfdi": null,
"sello_timbre_fiscal": null
}
}
Los campos de cfdi son el texto del SAT tal como lo muestra el portal: total conserva su formato de moneda, las fechas no tienen zona horaria y las celdas vacías son null. sello_cfdi y sello_timbre_fiscal solo se llenan cuando enviaste el xml; una búsqueda por folio no ve los sellos.
found y status
found |
status |
Significado |
|---|---|---|
true |
vigente |
El SAT tiene el CFDI y está vigente. |
true |
cancelado |
El SAT tiene el CFDI y fue cancelado. Revisa estatus_cancelacion, fecha_cancelacion, motivo y folio_sustitucion. |
false |
no_encontrado |
El SAT no tiene un CFDI con ese folio y esos RFC. message trae la explicación del propio SAT, en español. Un CFDI timbrado en las últimas 72 horas puede no estar registrado todavía. |
false |
rechazado |
El portal rechazó la solicitud misma, por ejemplo un XML que no pudo leer. message trae el motivo del portal. |
null |
null |
No se pudo contactar al portal del SAT. Reintenta más tarde. |
Facturación
Cada solicitud cuesta 5 créditos. Las respuestas con found: null y los errores 422 no se cobran. Una respuesta no_encontrado sí se cobra, porque el SAT respondió la pregunta que hiciste.
Errores
Los campos faltantes o mal formados se rechazan con 422 invalid_fields, que lista de una vez todos los campos por corregir. Si envías los campos del folio y también xml, la lista incluye los campos del folio que enviaste más xml.
{
"error": "invalid_fields",
"fields": ["uuid", "rfc_receptor"]
}