SAT CFDI and XML validator
Upload your XML file to validate that your Digital Tax Receipt (CFDI) complies with SAT guidelines.
Drag your XML file here
or click to select
Accepts 1 or multiple .xml files (max 5). CFDI 3.3 & 4.0
Supported types: Income, Credit Note, Payroll, Payment Complement, Transfer
What the CFDI validator checks
The engine applies 437 rules to the CFDI's structure and, if you identify yourself, to its tax legality as well.
Structure, catalogs and arithmetic (Annex 20)
Digital seal, certificate, RFC, catalog keys, amounts and totals — the same things a PAC checks when it stamps a CFDI.
- Structure and required fields32
- SAT catalogs32
- Amounts and totals13
- Tax amounts and rates36
- Digital seal, certificate and stamp24
- RFC (tax ID)9
- SAT blacklists (69-B and 69)7
- Product key and unit consistency11
- Income, credit note and transfer13
Complements: Payments, Payroll, Bill of Lading and Foreign Trade
Payment complement 2.0, payroll 1.2, bill of lading (Carta Porte) 3.1 and foreign trade.
- Payment complement 2.052
- Payroll 1.2115
- Carta Porte 3.132
- Foreign trade31
Income Tax Law and VAT Law
Deductibility, VAT credit and withholdings, with the legal basis for each finding.
- Income Tax Law: deductibility and withholdings13
- VAT Law: credit and withholdings9
With your account
Foreign CFDI, pending payments, SAT status and Art. 69/69-B lists.
- Checks using your RFC and your other CFDIs8
Technical validation vs. Income Tax and VAT legality
The PAC that stamps your invoice checks Annex 20: structure, seal, catalogs and arithmetic. If the CFDI passes those rules, it gets stamped — regardless of whether the expense is deductible or a withholding was missed.
The validator also checks Mexico's Income Tax Law and VAT Law: deductibility, VAT credit and withholdings, each finding with its legal basis. These findings do not change whether the CFDI is technically valid: a properly stamped receipt can still be non-deductible or non-creditable.
Examples of what it checks under Income Tax and VAT
It compares the CFDI's data against the rates and amounts in force on the receipt's date. Four real examples from the engine:
- A cash payment over $2,000 MXN: not deductible for Income Tax (LISR Art. 27, section III).
- An individual under RESICO billing a company, without the 1.25% Income Tax withholding (LISR Art. 113-J).
- Services or a lease from an individual to a company, without the two-thirds VAT withholding on the VAT charged (LIVA Art. 1-A, section II).
- The VAT amount does not match the base times the rate, code CFDI40180: may be an altered CFDI or one stamped by a PAC that does not validate amounts.
Checks that use your account
Signed in, or with an API key linked to your account, the validator also runs these checks, which need your RFC and your other CFDIs:
- Foreign CFDI: whether the receipt is actually issued to your RFC.
- PPD without a payment complement: whether a REP already exists before deducting or crediting it.
- SAT status: whether the CFDI was cancelled or its validity has not been verified.
- SAT Art. 69 and 69-B lists: whether the issuer appears as non-compliant or as EFOS.
- Withholdings you owe: whether you should have withheld Income Tax or VAT and the receipt does not reflect it.
Without an account, the rest of the validator works the same: these five checks are the only ones that need you to identify yourself.
Validate many XML files at once
Upload several .xml files and validate all of them with the same engine: 5 validations free without an account, 50 per month with a free account, and up to 200 per batch with the Basic or Pro plan. See plans
If you validate CFDIs for several clients, see what we offer accounting firms. See the accounting firm plan
API to validate CFDI
The v1 API validates exactly the same as this page: the same technical rules and the same Income Tax and VAT findings. With a key linked to your account, it also runs the checks that use your context.
curl -X POST https://herramientasfiscales.mx/api/v1/validate \
-H "Authorization: Bearer af_tu_api_key" \
-H "Content-Type: application/xml" \
--data-binary @factura.xmlWhat the validator does not check
The validator cannot confirm on its own whether an expense is strictly necessary for your business (LISR Art. 27, section I): that is a judgment about your line of business. It also cannot cross-check a PUE payment against your bank statement, since we have no access to your bank movements. And it does not assess materiality — whether the operation actually took place, with contracts and deliverables — that remains your accountant's job.
Frequently asked questions
How is it different from the PAC's validation?
The PAC checks Annex 20 when it stamps a CFDI: structure, seal, catalogs and arithmetic. We check the same, plus Income Tax and VAT legality, with the legal basis for each finding.
Does the validator say whether an invoice is deductible?
It flags clear cases where it is not, such as a cash payment over $2,000 MXN, with the article of law behind it. It does not replace your accountant's judgment on whether an expense is strictly necessary.
Do you have an API to validate CFDI?
Yes, the v1 API validates exactly the same as this page, with or without a key.
Do you store the XML files I upload?
Validating an XML on this page is processed in memory and the file is not stored. In batch validation with an account, files are kept temporarily while they are processed and deleted when it finishes; your history keeps the result (RFC, total and findings), not the XML. The only XMLs we keep are the ones you save to your CFDI library.
Preparing a VAT refund? Validate your CFDIs here and then review all your CFDIs and build the refund file.
SAT XML validator
The validator reads your CFDI XML and checks it against SAT's rules: comprobante structure, digital seal, certificate, catalog keys and the arithmetic of amounts and taxes. Nothing to install and no sign-up: drop the file and read the result.
It works with CFDI 4.0 and 3.3 XML for income, expense, transfer, payroll, payments, bill of lading and foreign trade. That is over 400 rules, with errors explained in plain language rather than SAT's catalog wording.
What the validator catches
- Seal and certificate: a seal that does not match the certificate, an altered or expired certificate, a CSD whose RFC differs from the issuer's.
- Arithmetic: subtotal, total, discounts, tax base and amount that do not add up, and rounding rules.
- Catalogs: ClaveProdServ, ClaveUnidad, UsoCFDI, payment form and method, currency and exchange rate.
- Complements: payment complement 2.0, payroll, bill of lading and foreign trade.
- Receiver RFC, tax regime and postal code — the most common cause of rejection in CFDI 4.0.
CRP errors in the payment complement
CRP codes belong to payment complement 2.0, where most rejections happen. The validator catches them and tells you which number SAT expected and which one your XML carries.
CRP20268: the payment's BaseP does not match the related documents
The VAT base in the payment summary must equal the sum of the bases of every invoice paid. When it does not — almost always because of rounding on a currency conversion or a wrong EquivalenciaDR — SAT rejects the receipt and your VAT return ends up with differences.
The EquivalenciaDR field must contain the value "1"
When the invoice and the payment share a currency, EquivalenciaDR is 1. It is the field that fails most often in the payment complement: if the invoice is in dollars and the payment in pesos, that is where the exchange rate goes, not a 1.
Validating CFDI 4.0 and 3.3
The validator detects the version and applies the matching rules. CFDI 4.0 has been mandatory since April 2023 and is stricter: it requires the receiver's name and postal code to match their Tax Status Certificate exactly, and it validates the relationship between UsoCFDI and tax regime. If you still review 3.3 receipts from earlier years, those go through too.
Is validating a CFDI free?
Yes, your first 5 validations are free and you do not need an account for them; a free account gives you 50 per month. For more you need a paid plan, which also includes batch validation (up to 200 XMLs) and keeps your history.