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. |


## 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 xml=@factura.xml
```

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"]
}
```