Referencia de la API

Verifica un CFDI con el SAT

Pregúntale al SAT si un CFDI (factura) está registrado, vigente o cancelado, por folio fiscal o subiendo su XML.

POST /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

POST /v1/cfdi/verify
Pruébalo

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 bash
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 bash
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)

200 OK json
{
  "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.

422 json
{
  "error": "invalid_fields",
  "fields": ["uuid", "rfc_receptor"]
}