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
| Endpoint | Usa crédito del validador |
|---|---|
| GET /validator/cfdi | No. |
| GET /validator/fiscalinfo | 1, solo si los datos pasan la prueba. |
| GET /validator/lrfc | 1 por cada RFC con estructura válida. |
| GET /validator/lco | 1 cuando el servicio de la LCO responde. |
| GET /validator/blacklist | 1 por consulta, esté o no el RFC en la lista. |
| GET /validator/balance | No. 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
/validator/cfdiConsulta 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)
uuid- El folio fiscal del CFDI.
rfcemisor- RFC del emisor. Un
&va como%26. rfcreceptor- RFC del receptor.
total- El total del CFDI con punto decimal y sin separador de miles:
2494.58, nunca2,494.58.
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"{
"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
estadoVigente,CanceladooNo Encontrado. Un UUID que el SAT no conoce también responde HTTP 200, conNo Encontrado.escancelableCancelable sin aceptación,Cancelable con aceptaciónoNo cancelable.estatuscancelacionEn proceso,Plazo vencido,Cancelado con aceptación,Cancelado sin aceptación,Solicitud rechazadao vacío.validacionefos- El resultado de la revisión de EFOS del SAT (200 y 201: el emisor no es EFOS).
fecha_cancelacion- Cuándo quedó cancelado el CFDI, solo si el SAT lo canceló al recibir la solicitud. Ver abajo.
fecha_solicitud_cancelacion- 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.
| estatuscancelacion | fecha_cancelacion | fecha_solicitud_cancelacion |
|---|---|---|
| Cancelado sin aceptación | La del acuse: el SAT canceló al recibir la solicitud. | La del acuse. |
| Cancelado con aceptación | null: se canceló cuando tu cliente aceptó y el SAT no publica ese momento. | La del acuse. |
| Plazo vencido | null: se canceló al vencer el plazo de respuesta de tu cliente. | La del acuse. |
| En proceso o Solicitud rechazada | null: no está cancelado. | La del acuse. |
Datos fiscales de un receptor
/validator/fiscalinfoPrueba 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
Rfc- RFC del receptor, en mayúsculas.
Nombre- Nombre o razón social como aparece en su constancia, sin el régimen de capital.
Codigopostal- Código postal de su domicilio fiscal.
Regimen- Clave de tres dígitos de c_RegimenFiscal.
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"
}{
"old_balance": 45,
"new_balance": 45,
"type": "RequestException",
"short": "Wrong Data",
"sat_code": "CFDI40145",
"message": "CFDI40145 - El campo Nombre del receptor, debe pertenecer al nombre asociado al RFC registrado en el campo Rfc del Receptor.",
"code": 400
}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 Datano cobra. - Se llama desde tu servidor: los encabezados
Rfc,Nombre,CodigopostalyRegimenno están permitidos desde un navegador.
Estructura de un RFC
/validator/lrfcRevisa 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.
{
"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
/validator/lcoBusca 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:
{
"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
/validator/blacklistBusca 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.
{
"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
/validator/balanceResponde { "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.