The standard validators run against every CFDI 3.3 document, whether you created it yourself withDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/eclipxe13/CfdiUtils/llms.txt
Use this file to discover all available pages before exploring further.
CfdiCreator33 or received it from a third party and are validating it with CfdiValidator33. The validators are automatically discovered and registered by MultiValidatorFactory from the CfdiUtils\\Validate\\Cfdi33\\Standard and CfdiUtils\\Validate\\Cfdi33\\RecepcionPagos namespaces — you do not need to register them manually.
Each validator checks one specific area of the SAT specification and records one or more named results. Running all validators gives you a complete audit trail of every rule evaluated, not just the ones that failed.
PREFIXNN, where the prefix identifies the validator (for example, MONDEC for monetary decimal rules) and the number distinguishes individual checks within that validator. Reference codes from the SAT specification (such as CFDI33106) are noted in parentheses where they apply.Filtering Results by Code
Before diving into the full list of validators and codes, here is how to look up or filter assertions by a specific code in your application:XML Schema Validator
XmlFollowSchema
This is the first validator to run. It verifies that the XML document conforms to every XSD schema declared in its xsi:schemaLocation attribute, including the SAT’s catalogue schemas. Because the SAT’s own XSD files encode many catalogue values (tax types, currency codes, etc.), this single check catches a large class of errors.
| Code | Title |
|---|---|
XSD01 | El contenido XML sigue los esquemas XSD |
Comprobante Validators
ComprobanteDecimalesMoneda — Monetary decimal precision
ComprobanteDecimalesMoneda — Monetary decimal precision
MXN, USD, EUR, and XXX; for any other currency all statuses are NONE.The check also catches trailing zeros that push the decimal count above the permitted maximum.| Code | Title | SAT Rule |
|---|---|---|
MONDEC01 | El subtotal del comprobante no contiene más de los decimales de la moneda | CFDI33106 |
MONDEC02 | El descuento del comprobante no contiene más de los decimales de la moneda | CFDI33111 |
MONDEC03 | El total del comprobante no contiene más de los decimales de la moneda | — |
MONDEC04 | El total de impuestos trasladados no contiene más de los decimales de la moneda | CFDI33182 |
MONDEC05 | El total de impuestos retenidos no contiene más de los decimales de la moneda | CFDI33180 |
ComprobanteFormaPago — Forma de pago exclusion
ComprobanteFormaPago — Forma de pago exclusion
FormaPago attribute. When a payment complement is present, the FormaPago attribute at the comprobante level must be absent.| Code | Title | SAT Rule |
|---|---|---|
FORMAPAGO01 | El campo forma de pago no debe existir cuando existe el complemento para recepción de pagos | CFDI33103 |
ComprobanteImpuestos — Tax node presence
ComprobanteImpuestos — Tax node presence
Impuestos node. When the node is present, at least one of the totals must exist; and when line-level taxes are present, the corresponding totals must appear at the comprobante level.| Code | Title |
|---|---|
COMPIMPUESTOSC01 | Si existe el nodo de impuestos entonces debe incluir el total de traslados y/o el total de retenciones |
COMPIMPUESTOSC02 | Si existe al menos un traslado entonces debe existir el total de traslados |
COMPIMPUESTOSC03 | Si existe al menos una retención entonces debe existir el total de retenciones |
ComprobanteTipoCambio — Exchange rate rules
ComprobanteTipoCambio — Exchange rate rules
TipoCambio attribute relative to the Moneda value.| Code | Title | SAT Rule |
|---|---|---|
TIPOCAMBIO01 | La moneda exista y no tenga un valor vacío | — |
TIPOCAMBIO02 | Si la moneda es “MXN”, entonces el tipo de cambio debe tener el valor “1” o no debe existir | CFDI33113 |
TIPOCAMBIO03 | Si la moneda es “XXX”, entonces el tipo de cambio no debe existir | CFDI33115 |
TIPOCAMBIO04 | Si la moneda no es “MXN” ni “XXX”, el tipo de cambio debe seguir el patrón [0-9]{1,18}(.[0-9]{1,6})? | CFDI33114, CFDI33117 |
ComprobanteTipoDeComprobante — Tipo de comprobante constraints
ComprobanteTipoDeComprobante — Tipo de comprobante constraints
TipoDeComprobante. Types T (traslado) and P (pago) have special restrictions — they may not carry payment method fields, tax nodes, discounts, or non-zero subtotals. Type N (nómina) must use MXN.| Code | Title | SAT Rule |
|---|---|---|
TIPOCOMP01 | Si el tipo de comprobante es T, P o N, entonces no debe existir las condiciones de pago | — |
TIPOCOMP02 | Si el tipo de comprobante es T, P o N, entonces no debe existir la definición de impuestos | CFDI33179 |
TIPOCOMP03 | Si el tipo de comprobante es T o P, entonces no debe existir la forma de pago | — |
TIPOCOMP04 | Si el tipo de comprobante es T o P, entonces no debe existir el método de pago | CFDI33123 |
TIPOCOMP05 | Si el tipo de comprobante es T o P, entonces no debe existir el descuento del comprobante | CFDI33110 |
TIPOCOMP06 | Si el tipo de comprobante es T o P, entonces no debe existir el descuento de los conceptos | CFDI33179 |
TIPOCOMP07 | Si el tipo de comprobante es T o P, entonces el subtotal debe ser cero | CFDI33108 |
TIPOCOMP08 | Si el tipo de comprobante es T o P, entonces el total debe ser cero | — |
TIPOCOMP09 | Si el tipo de comprobante es I, E o N, entonces el valor unitario de todos los conceptos debe ser mayor que cero | — |
TIPOCOMP10 | Si el tipo de comprobante es N, entonces la moneda debe ser MXN | — |
ComprobanteDescuento — Discount range
ComprobanteDescuento — Discount range
| Code | Title | SAT Rule |
|---|---|---|
DESCUENTO01 | Si existe el atributo descuento, entonces debe ser menor o igual que el subtotal y mayor o igual que cero | CFDI33109 |
ComprobanteTotal — Total field format
ComprobanteTotal — Total field format
Total attribute exists, is non-empty, and matches the numeric pattern [0-9]+(.[0-9]+)?.| Code | Title |
|---|---|
TOTAL01 | El atributo Total existe, no está vacío y cumple con el patrón [0-9]+(.[0-9]+)? |
Concepto Validators
ConceptoDescuento — Line-item discount
ConceptoDescuento — Line-item discount
Descuento attribute on each cfdi:Concepto node.| Code | Title | SAT Rule |
|---|---|---|
CONCEPDESC01 | Si existe el atributo descuento en el concepto, entonces debe ser menor o igual que el importe y mayor o igual que cero | CFDI33151 |
ConceptoImpuestos — Line-item tax rules
ConceptoImpuestos — Line-item tax rules
cfdi:Impuestos child node within each cfdi:Concepto. Rules cover the presence of the Base attribute, the handling of Exento factor types, and the requirements for Tasa or Cuota factors.| Code | Title | SAT Rule |
|---|---|---|
CONCEPIMPC01 | El nodo de impuestos de un concepto debe incluir traslados y/o retenciones | CFDI33152 |
CONCEPIMPC02 | Los traslados de los impuestos de un concepto deben tener una base y ser mayor a cero | CFDI33154 |
CONCEPIMPC03 | No se debe registrar la tasa o cuota ni el importe cuando el tipo de factor de traslado es exento | CFDI33157 |
CONCEPIMPC04 | Se debe registrar la tasa o cuota y el importe cuando el tipo de factor de traslado es tasa o cuota | CFDI33158 |
CONCEPIMPC05 | Las retenciones de los impuestos de un concepto deben tener una base y ser mayor a cero | CFDI33154 |
CONCEPIMPC06 | Las retenciones de los impuestos de un concepto deben tener un tipo de factor diferente de exento | CFDI33166 |
Emisor and Receptor Validators
EmisorRfc — Issuer RFC format
EmisorRfc — Issuer RFC format
XAXX010101000 or XEXX010101000), which are reserved for domestic and foreign general public recipients respectively and must never appear as the issuer.| Code | Title |
|---|---|
EMISORRFC01 | El RFC del emisor del comprobante debe ser válido y diferente de XAXX010101000 y XEXX010101000 |
EmisorRegimenFiscal — Issuer tax regime
EmisorRegimenFiscal — Issuer tax regime
RegimenFiscal value is appropriate for the type of RFC used (persona física vs. persona moral). References SAT rules CFDI33130 and CFDI33131.| Code | Title |
|---|---|
REGFIS01 | El régimen fiscal contenga un valor apropiado según el tipo de RFC emisor |
ReceptorRfc — Recipient RFC format
ReceptorRfc — Recipient RFC format
EmisorRfc, this validator does allow the generic public RFC (XAXX010101000) and the foreign RFC (XEXX010101000) because recipients may legitimately use them.| Code | Title |
|---|---|
RECRFC01 | El RFC del receptor del comprobante debe ser válido |
ReceptorResidenciaFiscal — Fiscal residency rules
ReceptorResidenciaFiscal — Fiscal residency rules
ResidenciaFiscal attribute on the cfdi:Receptor node against the recipient’s RFC.| Code | Title | SAT Rule |
|---|---|---|
RESFISC01 | Si el RFC no es XEXX010101000, entonces la residencia fiscal no debe existir | CFDI33134 |
RESFISC02 | Si el RFC sí es XEXX010101000 y existe el complemento de comercio exterior, entonces la residencia fiscal debe establecerse y no puede ser “MEX” | CFDI33135, CFDI33136 |
RESFISC03 | Si el RFC sí es XEXX010101000 y se registró el número de registro de identificación fiscal, entonces la residencia fiscal debe establecerse y no puede ser “MEX” | CFDI33135, CFDI33136 |
Date Validator
FechaComprobante
Validates that the Fecha attribute on the comprobante is correctly formatted and falls within an acceptable date range. The document date must be after 2017-07-01 (when CFDI 3.3 took effect) and must not be set in the future beyond a configurable tolerance.
| Code | Title |
|---|---|
FECHA01 | La fecha del comprobante cumple con el formato |
FECHA02 | La fecha existe en el comprobante y es mayor que 2017-07-01 y menor que el futuro |
FechaComprobante validator instance.Digital Seal Validators
SelloDigitalCertificado — Certificate and seal integrity
SelloDigitalCertificado — Certificate and seal integrity
Sello attribute is consistent with it. This validator requires an XmlResolver to locate the certificate.| Code | Title |
|---|---|
SELLO01 | Se puede obtener el certificado del comprobante |
SELLO02 | El número de certificado del comprobante igual al encontrado en el certificado |
SELLO03 | El RFC del comprobante igual al encontrado en el certificado |
SELLO04 | El nombre del emisor del comprobante igual al encontrado en el certificado |
SELLO05 | La fecha del documento es mayor o igual a la fecha de inicio de vigencia del certificado |
SELLO06 | La fecha del documento menor o igual a la fecha de fin de vigencia del certificado |
SELLO07 | El sello del comprobante está en base 64 |
SELLO08 | El sello del comprobante coincide con el certificado y la cadena de origen generada |
TimbreFiscalDigitalSello — SAT stamp integrity (most critical)
TimbreFiscalDigitalSello — SAT stamp integrity (most critical)
https://rdc.sat.gob.mx/, builds the TimbreFiscalDigital cadena de origen, and verifies the SAT’s SelloSAT against it.| Code | Title |
|---|---|
TFDSELLO01 | El Sello SAT del Timbre Fiscal Digital corresponde al certificado SAT |
Locate the TimbreFiscalDigital
Verify version 1.1
Match SelloCFD with Sello
SelloCFD in the TFD matches the Sello attribute of the comprobante. A mismatch means the CFDI has been tampered with.Fetch the SAT certificate
https://rdc.sat.gob.mx/. If it cannot be fetched, the result is an error.TimbreFiscalDigital and Sello attributes unchanged. In that case TimbreFiscalDigitalSello will not flag an error, but SelloDigitalCertificado will — because the comprobante Sello will no longer match the tampered cadena de origen.TimbreFiscalDigitalVersion — TFD version check
TimbreFiscalDigitalVersion — TFD version check
| Code | Title |
|---|---|
TFDVERSION01 | Si existe el complemento timbre fiscal digital, entonces su versión debe ser 1.1 |
Tax Sum Validator
SumasConceptosComprobanteImpuestos
This validator recalculates all monetary totals from the line items and compares them against the values declared at the comprobante level. It is one of the most comprehensive validators because it touches subtotals, discounts, transfer taxes, retained taxes, and the final total.
| Code | Title |
|---|---|
SUMAS01 | La suma de los importes de conceptos es igual al subtotal del comprobante |
SUMAS02 | La suma de los descuentos es igual al descuento del comprobante |
SUMAS03 | El cálculo del total es igual al total del comprobante |
SUMAS04 | El cálculo de impuestos trasladados es igual al total de impuestos trasladados |
SUMAS05 | Todos los impuestos trasladados existen en el comprobante |
SUMAS06 | Todos los valores de los impuestos trasladados coinciden con el comprobante |
SUMAS07 | No existen más nodos de impuestos trasladados en el comprobante de los que se han calculado |
SUMAS08 | El cálculo de impuestos retenidos es igual al total de impuestos retenidos |
SUMAS09 | Todos los impuestos retenidos existen en el comprobante |
SUMAS10 | Todos los valores de los impuestos retenidos coinciden con el comprobante |
SUMAS11 | No existen más nodos de impuestos trasladados en el comprobante de los que se han calculado |
SUMAS12 | El cálculo del descuento debe ser menor o igual al cálculo del subtotal |
Recepción de Pagos Validators
These validators only activate when theTipoDeComprobante is P (pago). They validate the Complemento/Pagos structure according to the SAT’s Complemento para Recepción de Pagos specification (CRP).
CfdiRelacionados — Related CFDI type
CfdiRelacionados — Related CFDI type
ComplementoPagos — Payment complement structure
ComplementoPagos — Payment complement structure
| Code | Title |
|---|---|
COMPPAG01 | El complemento de pagos debe existir si el tipo de comprobante es P y viceversa |
COMPPAG02 | Si el complemento de pagos existe su versión debe ser 1.0 |
COMPPAG03 | Si el tipo de comprobante es P su versión debe ser 3.3 |
COMPPAG04 | No debe existir el nodo impuestos del complemento de pagos (CRP237) |
ComprobantePagos — Comprobante-level constraints for pago
ComprobantePagos — Comprobante-level constraints for pago
TipoDeComprobante = P).| Code | Title |
|---|---|
PAGCOMP01 | Debe existir un solo nodo que represente el complemento de pagos |
PAGCOMP02 | La forma de pago no debe existir (CRP104) |
PAGCOMP03 | Las condiciones de pago no deben existir (CRP106) |
PAGCOMP04 | El método de pago no deben existir (CRP105) |
PAGCOMP05 | La moneda debe ser “XXX” (CRP103) |
PAGCOMP06 | El tipo de cambio no debe existir (CRP108) |
PAGCOMP07 | El descuento no debe existir (CRP107) |
PAGCOMP08 | El subtotal del documento debe ser cero “0” (CRP102) |
PAGCOMP09 | El total del documento debe ser cero “0” (CRP109) |
PAGCOMP10 | No se debe registrar el apartado de Impuestos en el CFDI (CRP122) |
Conceptos — Predefined concepto for pago
Conceptos — Predefined concepto for pago
cfdi:Conceptos node contains exactly one cfdi:Concepto with the fixed attributes required by the SAT for payment receipt CFDIs.| Code | Title |
|---|---|
PAGCON01 | Se debe usar el concepto predefinido (CRP107 - CRP121) |
UsoCfdi — Intended use
UsoCfdi — Intended use
| Code | Title |
|---|---|
PAGUSO01 | El uso del CFDI debe ser “P01” (CRP110) |
Pagos — Individual payment rules
Pagos — Individual payment rules
Pago node within the complement is validated against the following rules:| Code | Title | CRP Rule |
|---|---|---|
PAGOS01 | Debe existir al menos un pago en el complemento de pagos | — |
PAGO02 | En un pago, la fecha debe cumplir con el formato específico | — |
PAGO03 | En un pago, la forma de pago debe existir y no puede ser “99” | CRP201 |
PAGO04 | En un pago, la moneda debe existir y no puede ser “XXX” | CRP202 |
PAGO05 | En un pago, cuando la moneda no es “MXN” no debe existir tipo de cambio, de lo contrario el tipo de cambio debe existir | CRP203, CRP204 |
PAGO06 | En un pago, el tipo de cambio debe ser numérico, no debe exceder 6 decimales y debe ser mayor a “0.000001” | — |
PAGO07 | En un pago, el monto debe ser mayor a cero | CRP207 |
PAGO08 | En un pago, el monto debe tener hasta la cantidad de decimales permitidos por la moneda | CRP208 |
PAGO09 | En un pago, el monto del pago debe encontrarse entre los límites mínimo y máximo de la suma de los documentos | — |
PAGO10 | En un pago, cuando el RFC del banco emisor de la cuenta ordenante existe | — |
PAGO11 | En un pago, cuando el RFC del banco emisor sea “XEXX010101000” | — |
PAGO12 | En un pago, cuando la forma de pago no sea bancarizada | — |
PAGO13 | En un pago, cuando la forma de pago no sea bancarizada (cuenta ordenante) | — |
PAGO14 | En un pago, cuando la cuenta ordenante existe debe cumplir con el patrón | — |
PAGO15 | En un pago, cuando el RFC del banco emisor de la cuenta beneficiaria existe | — |
PAGO16 | En un pago, cuando la forma de pago no sea 02, 03, 04, 05, 28, 29 o 99 (banco beneficiario) | — |
PAGO17 | En un pago, cuando la forma de pago no sea 02, 03, 04, 05, 28, 29 o 99 (cuenta beneficiaria) | — |
PAGO18 | En un pago, cuando la cuenta beneficiaria existe | — |
PAGO19 | En un pago, cuando la forma de pago no sea 03 o 99 (tipo de cadena de pago) | — |
PAGO20 | En un pago, si existe el tipo de cadena de pago debe existir el certificado de pago y viceversa | CRP227, CRP228 |
PAGO21 | En un pago, si existe el tipo de cadena de pago debe existir la cadena de pago y viceversa | CRP229, CRP230 |
PAGO22 | En un pago, si existe el tipo de cadena de pago debe existir el sello de pago y viceversa | CRP231, CRP232 |
PAGO30 | En un pago, la suma de los valores registrados o predeterminados en el importe pagado de los documentos relacionados debe ser menor o igual que el monto del pago | CRP206 |
DoctoRelacionado — Related document rules
DoctoRelacionado — Related document rules