Skip to content
Documentation sections

JSON validator

Paste the JSON you send to POST /invoice/create and check, before stamping, whether the amounts add up and the recipient meets the SAT rules. Each finding carries the error key the SAT or the API would return.

The local check runs in your browser as you type. Use test data: there's no need to paste your customer's.

Local check

No findings in the local check.

Validate with the sandbox API

Sends the JSON to the sandbox API v5, which builds the XML and validates it against the SAT schema just like production, without stamping it. It doesn't check the SAT RFC list (CFDI40143 and similar): that happens at stamping.

API validation isn't available right now. The local check still works.

What it checks in your browser

  • Structure: that the text is JSON, that Version is "4.0" and that the SAT schema's required fields are there.
  • The small SAT catalogs: c_TipoDeComprobante, c_Exportacion, c_Moneda, c_FormaPago, c_MetodoPago, c_RegimenFiscal, c_UsoCFDI, c_ObjetoImp, c_Impuesto, c_TipoFactor and c_Pais.
  • Recipient rules: RFC shape, regime against the type of taxpayer (CFDI40158), use against the regime (CFDI40161) and the generic RFC rules (CFDI40130, CFDI40146, CFDI40149, CFDI40159).
  • The math: each item's Importe within the SAT margins (CFDI40167), item taxes (CFDI40180), SubTotal (CFDI40108), global transfers and withholdings (CFDI40205, CFDI40215, CFDI40221, CFDI40211) and Total (CFDI40119).
  • The decimals of each amount against what the currency allows (CFDI40107, CFDI40112, CFDI40220).

It doesn't check the large catalogs (c_ClaveProdServ, c_ClaveUnidad, c_CodigoPostal), complements or the SAT RFC list. The API validates those when stamping.

What the API validation does

It sends your JSON to the sandbox POST /invoice/create with OmitirTimbrado: "si". The API builds the XML, seals it with the test certificate of a sandbox account and validates it against the SAT schema, just like production, but stops before stamping. If something fails, you see the same response your system would get: code, message and, on a 702, the errors list.

  • The issuer is the sandbox test account; your JSON only provides Emisor.RegimenFiscal.
  • If you send Folio: "AUTO", it's validated with folio 1, because automatic series depend on each account.
  • No emails are sent and no PDF template is used: enviar_mail and plantilla_id are removed before sending.
  • Checks against the SAT RFC list (CFDI40143 to CFDI40148) don't run here. To see them, stamp in your sandbox account.

Checked against the production API v5 on 2026-11-03.