Validaciones SAT
Un CFDI timbrado no es, por sí mismo, un CFDI deducible. Puede haber sido cancelado después de entregarse, estar firmado con un certificado que ya había vencido, haber sido alterado tras la firma, o provenir de un emisor publicado en el listado del artículo 69-B. Nada de eso es visible en el PDF que llega a cuentas por pagar. Una validación SAT verifica el comprobante contra las fuentes oficiales en cualquier momento posterior a su emisión: Fiscalapi ejecuta siete criterios independientes en una sola llamada y devuelve un veredicto por criterio.
Esta página explica cómo funcionan las validaciones SAT. La referencia completa de los endpoints, los modelos y los ejemplos por lenguaje está en validaciones SAT.
Para qué sirve
| Caso de uso | Qué resuelve |
|---|---|
| Cuentas por pagar | Valida cada CFDI de proveedor al recibirlo y detén el pago de los comprobantes que no producen efectos fiscales antes de generar un pasivo. |
| Conciliación posterior | Detecta las cancelaciones ocurridas después de que el comprobante se entregó y se registró. |
| Cumplimiento de proveedores | Revisa de forma recurrente tu padrón de proveedores contra los listados 69-B y 69-B Bis, con la fecha de corte de cada consulta. |
| Integridad documental | Confirma que el XML almacenado es el mismo que se firmó y que su estructura cumple el Anexo 20 antes de ingresarlo al ERP. |
| Auditoría | Conserva el veredicto de cada criterio como soporte de la deducción o el acreditamiento. |
Validar no es timbrar
El timbrado certifica un comprobante en el momento de su emisión. La validación verifica, después, que ese comprobante siga siendo íntegro, vigente y fiscalmente efectivo. Son dos operaciones distintas con saldos distintos que nunca se mezclan: el timbrado consume timbres y la validación, créditos de validación. Consulta timbres.
Marco legal
| Norma | Qué regula |
|---|---|
| CFF, artículos 29 y 29-A | Requisitos de expedición de los comprobantes fiscales digitales. |
| Anexo 20 de la Resolución Miscelánea Fiscal | Estructura del XML del CFDI y de sus complementos. |
| CFF, artículo 69-B | Operaciones presuntamente inexistentes (EFOS). Publicado el listado definitivo, los comprobantes del emisor no producen ni produjeron efecto fiscal alguno, y el receptor cuenta con 30 días hábiles desde la publicación en el DOF para acreditar la materialidad de la operación o corregir su situación fiscal. |
| CFF, artículo 69-B Bis | Transmisión indebida del derecho a disminuir pérdidas fiscales. |
Cómo funciona
Envía el comprobante y la lista de criterios que quieres ejecutar. Fiscalapi consulta la fuente oficial de cada criterio, cobra un crédito por criterio solicitado y responde con un resultado por cada uno:
POST /api/v4/sat-validations
├── xml (CFDI timbrado en Base64) → admite los siete criterios
└── tin (RFC) → solo sat.blacklist.69b y sat.blacklist.69bbis
└── validationTypes[] → resultado por criterio (type, status, passed)
Los resultados vuelven en el orden del catálogo, no en el orden en que se solicitaron. No hay estado intermedio ni consulta posterior: la respuesta de la llamada es el resultado final.
Parámetros de entrada
El cuerpo de la petición lleva dos cosas: qué se va a revisar y qué criterios se van a ejecutar sobre ello.
| Campo | Tipo | Requerido | Qué es |
|---|---|---|---|
xml | string | Uno de los dos | CFDI timbrado completo, codificado en Base64 |
tin | string | Uno de los dos | RFC a consultar |
validationTypes | arreglo de strings | Sí | Identificadores de los criterios a ejecutar, sin vacíos ni duplicados |
Qué se va a revisar: xml o tin
xml y tin son excluyentes: la petición debe llevar exactamente uno de los dos. Enviar ambos, o ninguno,
devuelve un error 400. Lo que envíes determina qué criterios puedes pedir.
Con xml se revisa un comprobante concreto y se pueden solicitar los siete criterios. Para los listados
69-B y 69-B Bis se consulta el RFC del nodo cfdi:Emisor del propio comprobante.
Con tin solo se consulta la situación de ese RFC en los listados, así que únicamente se admiten
sat.blacklist.69b y sat.blacklist.69bbis; pedir cualquier otro criterio devuelve un error 400. El RFC no se
contrasta contra ningún comprobante: la respuesta refleja solo lo que dicen los listados sobre ese RFC. Es la
vía para revisar un proveedor cuando todavía no hay una factura suya que validar.
Límites
xml admite hasta 4,000,000 de caracteres y el cuerpo de la petición hasta 10 MB. El tin debe tener
formato de RFC válido.
Los siete criterios de validación
| # | Criterio | Identificador | Se pide con |
|---|---|---|---|
| 1 | Estructura del XML | sat.xml.structure | xml |
| 2 | Vigencia del certificado | sat.certificate.validity | xml |
| 3 | Sello del emisor | sat.cfdi.sello | xml |
| 4 | Sello del SAT | sat.tfd.sello | xml |
| 5 | Estatus del comprobante | sat.cfdi.status | xml |
| 6 | Listado 69-B | sat.blacklist.69b | xml o tin |
| 7 | Listado 69-B Bis | sat.blacklist.69bbis | xml o tin |
Estructura del XML
Verifica, mediante el servicio oficial de verificación de CFDI del SAT, que el documento esté bien formado y
cumpla el Anexo 20 de su versión y los esquemas de los complementos declarados en schemaLocation. Detecta
atributos obligatorios ausentes, valores fuera de catálogo y patrones inválidos.
Vigencia del certificado
Comprueba que la fecha de emisión del CFDI esté comprendida entre NotBefore y NotAfter del certificado
del emisor. Un comprobante firmado fuera de la vigencia de su certificado carece de validez aunque su sello
sea válido.
Sello del emisor
Verifica que el atributo Sello corresponda a la cadena original del comprobante y a la llave pública del
certificado declarado. Confirma que el contenido no fue alterado después de firmarse y que quien firmó posee
la llave privada de ese certificado.
Sello del SAT
Verifica que el atributo SelloSAT del Timbre Fiscal Digital corresponda al certificado del SAT identificado
por NoCertificadoSAT. Confirma que el timbre fue emitido por el SAT a través de un PAC y no fue fabricado
ni modificado.
Estatus del comprobante
Consulta el servicio de consulta de CFDI del SAT y reporta el estado actual del comprobante. Es el único criterio que refleja cancelaciones posteriores a la emisión: un CFDI con todos los sellos correctos puede estar cancelado.
Listado 69-B
Busca el RFC del emisor en el listado completo del artículo 69-B y devuelve su situación vigente al corte
consultado. Es el criterio con más matices, porque recorre todas las etapas del procedimiento: Presunto es
una alerta de riesgo en la que los comprobantes aún conservan efectos, mientras que Definitivo implica que
no los producen y activa el plazo de 30 días hábiles para el receptor.
Listado 69-B Bis
Busca el RFC del emisor en el listado del artículo 69-B Bis, sobre transmisión indebida del derecho a disminuir pérdidas fiscales. Relevante en operaciones con partes relacionadas y reestructuras corporativas.
Estados de cada criterio
Cada criterio admite solo algunos estados. Un estado aprobatorio da passed: true.
| Estado | Veredicto | Criterios que lo devuelven |
|---|---|---|
Valido | Aprobatorio | Estructura del XML, sello del emisor y sello del SAT |
Vigente | Aprobatorio | Vigencia del certificado y estatus del comprobante |
NoListado | Aprobatorio | Listados 69-B y 69-B Bis |
Desvirtuado | Aprobatorio | Listado 69-B |
SentenciaFavorable | Aprobatorio | Listados 69-B y 69-B Bis |
Invalido | No aprobatorio | Estructura del XML, sello del emisor y sello del SAT |
Expirado | No aprobatorio | Vigencia del certificado |
NoVigenteAun | No aprobatorio | Vigencia del certificado |
Cancelado | No aprobatorio | Estatus del comprobante |
NoEncontrado | No aprobatorio | Estatus del comprobante |
Presunto | No aprobatorio | Listado 69-B |
Definitivo | No aprobatorio | Listados 69-B y 69-B Bis |
NoDisponible | No aprobatorio | Todos, salvo la vigencia del certificado |
Omitido | No aprobatorio | Todos |
Cómo leer un resultado
Cada elemento de la respuesta trae tres piezas:
| Campo | Qué es |
|---|---|
passed | El veredicto binario del criterio: true si el estado obtenido es aprobatorio para ese criterio. |
status.id | El estado concreto que produjo ese veredicto. Es el valor que conviene registrar, porque distingue casos que passed agrupa. |
status.details | Texto libre informativo con los hechos del caso: el RFC y la fecha de corte del listado, el número de certificado, la respuesta del SAT. Puede venir null y no debe interpretarse programáticamente. |
Por ejemplo, Presunto y Definitivo dan el mismo passed: false, pero no significan lo mismo. Un veredicto
adverso no es un error: si la validación se ejecutó, la respuesta es 200 aunque el criterio no pase.
Dos estados son transversales y no describen un hecho fiscal, sino la ejecución del criterio:
| Estado | Qué significa | Qué hacer |
|---|---|---|
NoDisponible | La fuente oficial no respondió, o no hay un corte importado del listado. El criterio no pudo determinarse. | Reintentar más tarde |
Omitido | La entrada no permitía evaluar ese criterio, por ejemplo un CFDI sin Timbre Fiscal Digital. | Revisar el comprobante enviado |
Que el XML no sea un CFDI timbrado tampoco produce un error 400. Un XML mal formado devuelve Invalido en la
estructura y Omitido en el resto; un CFDI legible pero sin timbrar devuelve Omitido en estructura, ambos
sellos y estatus, mientras que la vigencia del certificado y los listados sí se evalúan. En ambos casos se
cobran todos los créditos solicitados.
Créditos de validación
El cobro se hace en créditos de validación, un saldo independiente del de timbres.
- Se consume un crédito por cada criterio solicitado, no por llamada: pedir los siete cuesta siete.
- Se cobra aunque el veredicto sea
passed: false, y aunque el estado seaNoDisponibleuOmitido. - El cobro es todo o nada y previo a la ejecución: si el saldo no alcanza para todos los criterios solicitados, no se ejecuta ninguno, no se consume nada y la API responde 403.
- Los endpoints de catálogo (listar criterios, obtener uno por su identificador y listar sus estados) son de solo lectura y no consumen créditos.
| Escenario | HTTP | ¿Consume créditos? |
|---|---|---|
Ejecución completa, aunque algún criterio dé passed: false | 200 | Sí, uno por criterio |
Estado NoDisponible u Omitido | 200 | Sí |
Petición mal formada: falta xml y tin, vienen ambos, Base64 inválido, criterio desconocido | 400 | No |
| Saldo insuficiente | 403 | No |
| Criterio inexistente o inactivo en los endpoints de catálogo | 404 | No |
| Falla técnica durante la ejecución | 500 | Se reembolsa automáticamente |
| Cancelas la petición o se cierra la conexión | Sin respuesta | Sí, el consumo se conserva |
Saldo y recarga
El saldo disponible de cada persona se consulta en availableValidationBalance del recurso
personas; availableBalance es el de timbres. En el dashboard aparecen como
Validaciones disponibles y Timbres disponibles.
Compra los créditos en la tienda en línea del dashboard y distribúyelos entre las personas de tu
organización desde el catálogo de personas, o por API con el endpoint de timbres y
creditType: 2. El valor 1, que es el predeterminado, transfiere timbres.
Auditar el consumo
Cada validación deja un movimiento en el mismo registro de movimientos que los timbres, que consultas con
Listar movimientos.
El movimiento es de tipo consumo, lleva creditType: 2 y en comments los identificadores de los criterios
cobrados, por ejemplo SAT: sat.xml.structure,sat.blacklist.69b. Así concilias el gasto de créditos
criterio por criterio sin instrumentar nada en tu sistema.
Las respuestas de error incluyen además un traceIdentifier, que es el mismo referenceId del
movimiento: es el dato que debes citar al reportar un problema. Consulta modelo de respuesta y
errores.
Ambiente de pruebas
En el ambiente de pruebas los resultados son ficticios y aleatorios. En https://test.fiscalapi.com la
API no consulta al SAT ni evalúa el XML que envías: devuelve un estado elegido al azar de entre los que ese
criterio admite. Por eso dos llamadas idénticas dan resultados distintos y details siempre viene null.
Tampoco verás NoDisponible ni Omitido. Los créditos se cobran igual. Este ambiente sirve únicamente
para conocer el contrato y probar tu integración: nunca lo uses como fuente de verdad fiscal ni tomes una
decisión de negocio con su resultado.
Consulta ambientes para las credenciales y la URL de cada uno.
Disponible en los SDK
Los cinco SDK oficiales exponen las validaciones SAT con la misma superficie: tres operaciones de catálogo y una de ejecución.
| SDK | Accesor |
|---|---|
| .NET | fiscalApi.SatValidations |
| JavaScript / TypeScript | fiscalApi.satValidations |
| Python | fiscalapi.sat_validations |
| Java | fiscalApi.getSatValidationService() |
| PHP | $fiscalApi->getSatValidationService() |
| Operación | .NET | Python | JavaScript / TypeScript, Java y PHP |
|---|---|---|---|
| Listar tipos de validación | GetTypesAsync | get_types | getTypes |
| Obtener un tipo por su identificador | GetTypeByIdAsync | get_type_by_id | getTypeById |
| Listar los estados de un tipo | GetStatusesAsync | get_statuses | getStatuses |
| Validar | ValidateAsync | validate | validate |
Los cinco exponen las constantes SatValidationTypeIds y SatValidationStatusIds; úsalas en lugar de
literales. Los ejemplos por lenguaje de cada operación están en validaciones SAT, y la
instalación de cada paquete, en SDK.
Preguntas frecuentes
¿Qué diferencia hay entre validar un CFDI y timbrarlo? El timbrado certifica un comprobante en el momento de su emisión. La validación verifica, en cualquier momento posterior, que el XML siga siendo íntegro, vigente y fiscalmente efectivo: sellos, certificado, estatus en el SAT y situación del emisor en los listados del artículo 69-B.
¿Un CFDI de un emisor publicado en el listado definitivo sigue siendo válido? No produce efectos fiscales. Publicado el listado definitivo del artículo 69-B, los comprobantes del emisor se consideran, con efectos generales, sin efecto fiscal alguno, y el receptor cuenta con 30 días hábiles para acreditar la materialidad de la operación o corregir su situación fiscal.
¿Con qué frecuencia se actualizan los listados 69-B y 69-B Bis?
Fiscalapi incorpora cada publicación oficial del SAT. Cada respuesta de los criterios de listado incluye en
details la fecha de corte del listado consultado, de modo que tu sistema sabe con qué información decidió.
¿Puedo ejecutar solo algunos criterios?
Sí. validationTypes indica exactamente cuáles ejecutar y solo se cobran esos. Para consultar los listados
69-B y 69-B Bis basta enviar el RFC del emisor, sin XML.