Saltar al contenido
Secciones de la documentación

Validador

Seis consultas para revisar un CFDI, los datos de un receptor y un certificado. Usan los créditos del módulo validador, que son aparte de tus folios de timbrado; validator/cfdi no usa ninguno.

Créditos

EndpointUsa crédito del validador
GET /validator/cfdiNo.
GET /validator/fiscalinfo1, solo si los datos pasan la prueba.
GET /validator/lrfc1 por cada RFC con estructura válida.
GET /validator/lco1 cuando el servicio de la LCO responde.
GET /validator/blacklist1 por consulta, esté o no el RFC en la lista.
GET /validator/balanceNo. Responde tu saldo de créditos del validador.

Sin créditos, los cuatro que cobran responden HTTP 400 con code 601 y un mensaje que dice (VALIDATOR-MODULE).

Estado de un CFDI en el SAT

GET/validator/cfdi

Consulta el servicio del SAT con los mismos datos del código QR del CFDI. Responde si está vigente o cancelado, si se puede cancelar y en qué va su cancelación.

Parámetros (query)

uuidstringobligatorio
El folio fiscal del CFDI.
rfcemisorstringobligatorio
RFC del emisor. Un & va como %26.
rfcreceptorstringobligatorio
RFC del receptor.
totalnumberobligatorio
El total del CFDI con punto decimal y sin separador de miles: 2494.58, nunca 2,494.58.
curl
curl -sS -G "$FD_API/validator/cfdi" \
  -H "X-Api-Key: $FD_API_KEY" \
  --data-urlencode "uuid=6FA90F39-2D7A-4F1C-9B3E-5C1D8A0E7B42" \
  --data-urlencode "rfcemisor=EKU9003173C9" \
  --data-urlencode "rfcreceptor=XIA190128J61" \
  --data-urlencode "total=2494.58"
200
{
  "message": "La consulta se realizó exitosamente en el SAT",
  "code": "200",
  "sat_response": {
    "codigoestatus": "S - Comprobante obtenido satisfactoriamente.",
    "escancelable": "Cancelable con aceptación",
    "estado": "Cancelado",
    "estatuscancelacion": "Plazo vencido",
    "validacionefos": "200",
    "fecha_consulta": "2026-11-03 10:15:42",
    "fecha_cancelacion": null,
    "fecha_solicitud_cancelacion": "2026-10-28 09:34:50"
  }
}

sat_response

estadostring
Vigente, Cancelado o No Encontrado. Un UUID que el SAT no conoce también responde HTTP 200, con No Encontrado.
escancelablestring
Cancelable sin aceptación, Cancelable con aceptación o No cancelable.
estatuscancelacionstring
En proceso, Plazo vencido, Cancelado con aceptación, Cancelado sin aceptación, Solicitud rechazada o vacío.
validacionefosstring
El resultado de la revisión de EFOS del SAT (200 y 201: el emisor no es EFOS).
fecha_cancelacionstring | null
Cuándo quedó cancelado el CFDI, solo si el SAT lo canceló al recibir la solicitud. Ver abajo.
fecha_solicitud_cancelacionstring | null
Cuándo se pidió la cancelación por la API, del acuse del SAT.

De dónde salen las fechas de cancelación

El servicio de consulta del SAT no devuelve ninguna fecha. Las dos salen del acuse que el SAT entregó cuando la cuenta de la llave canceló el CFDI por la plataforma, y van en hora del centro de México.

estatuscancelacionfecha_cancelacionfecha_solicitud_cancelacion
Cancelado sin aceptaciónLa del acuse: el SAT canceló al recibir la solicitud.La del acuse.
Cancelado con aceptaciónnull: se canceló cuando tu cliente aceptó y el SAT no publica ese momento.La del acuse.
Plazo vencidonull: se canceló al vencer el plazo de respuesta de tu cliente.La del acuse.
En proceso o Solicitud rechazadanull: no está cancelado.La del acuse.

Datos fiscales de un receptor

GET/validator/fiscalinfo

Prueba si un RFC, su nombre, su código postal y su régimen coinciden con el SAT antes de facturarle. Para saberlo, timbra un CFDI de prueba con esos datos en un ambiente de pruebas aparte: no usa tus folios ni tu CSD. Los datos van en encabezados, con estos nombres exactos.

Encabezados

Rfcstringobligatorio
RFC del receptor, en mayúsculas.
Nombrestringobligatorio
Nombre o razón social como aparece en su constancia, sin el régimen de capital.
Codigopostalstringobligatorio
Código postal de su domicilio fiscal.
Regimenstringobligatorio
Clave de tres dígitos de c_RegimenFiscal.
curl
curl -sS "$FD_API/validator/fiscalinfo" \
  -H "X-Api-Key: $FD_API_KEY" \
  -H "Rfc: XIA190128J61" \
  -H "Nombre: XENON INDUSTRIAL ARTICLES" \
  -H "Codigopostal: 76343" \
  -H "Regimen: 601"
{
  "old_balance": 46,
  "new_balance": 45,
  "code": 200,
  "short": "OK",
  "message": "The fiscal information provided is correct.",
  "query_date": "2026-11-03 10:15:42"
}

Cuando algo no coincide, short es Wrong Data y sat_code trae la clave del SAT (CFDI40143, CFDI40145, CFDI40147…), la misma que verías al timbrar. Está en la matriz de errores.

  • Puede tardar hasta 60 segundos: pon ese tiempo de espera en tu cliente.
  • Solo usa crédito cuando los datos pasan. Un Wrong Data no cobra.
  • Se llama desde tu servidor: los encabezados Rfc, Nombre, Codigopostal y Regimen no están permitidos desde un navegador.

Estructura de un RFC

GET/validator/lrfc

Revisa que el parámetro rfc tenga la estructura de un RFC (letras, una fecha real y la homoclave) y te dice si es genérico, extranjero, de persona moral (12 caracteres) o física (13). No consulta al SAT: no confirma que el RFC esté inscrito. Para eso usa fiscalinfo, o deja que el SAT lo valide al timbrar.

200
{
  "code": 200,
  "data": {
    "contribuyenteRFC": "XIA190128J61",
    "sncf": false,
    "subcontratacion": false,
    "generico": false,
    "extranjero": false,
    "moral": true,
    "fisica": false
  },
  "query_date": "2026-11-03 10:15:42"
}

sncf y subcontratacion se conservan por compatibilidad y siempre son false. Este endpoint responde sus errores con code como texto: "400" para un RFC mal formado y "401" para lo demás (llave, parámetro faltante o sin créditos).

Certificado en la LCO

GET/validator/lco

Busca un certificado de sello digital en la LCO, la lista de certificados que el SAT publica. Manda en nocertificado los 20 dígitos del número de certificado. data trae lo que publica la lista para ese certificado; por ejemplo:

200
{
  "code": 200,
  "data": {
    "noCertificado": "30001000000500003416",
    "rfc": "EKU9003173C9",
    "validezObligaciones": "1",
    "estatusCertificado": "A",
    "fechaInicio": "2023-05-18T11:43:51",
    "fechaFinal": "2027-05-18T11:43:51"
  },
  "query_date": "2026-11-03 10:15:42"
}

Esta consulta depende de un servicio externo y no tiene un tiempo de espera propio: pon uno en tu cliente.

Lista 69-B del SAT

GET/validator/blacklist

Busca el parámetro rfc en la lista del artículo 69-B del CFF (contribuyentes que emiten comprobantes de operaciones simuladas). Si no está, responde codestr: "whitelisted" y data: null. Si está, responde codestr: "blacklisted" con el renglón de la lista en data.

200
{
  "code": "201",
  "codestr": "blacklisted",
  "message": "WARNING! This RFC is BLACKLISTED",
  "data": {
    "rfc": "AAA010101AAA",
    "contribuyente": "EMPRESA DE EJEMPLO SA DE CV",
    "situacion": "Desvirtuado",
    "estado": "desvirtuado",
    "pub_sat_presuntos": "01/01/2025",
    "pub_sat_desvirtuados": "01/06/2025",
    "actualizado_en": "2026-11-03 03:15:00"
  },
  "query_date": "2026-11-03 10:15:42"
}

Saldo del validador

GET/validator/balance

Responde { "code": 200, "balance": 354, "query_date": "…" }. Es el saldo de créditos del validador; tus folios de timbrado están en GET /account/balance.

Revisado contra la API v5 en producción el 2026-11-03.