fynxIQ
Sign inStart free

Comparing GSTR-1 JSON validators: fourteen checks to test any tool against

9 min readUpdated 25 September 2026Rests on GSTR1 - Save GSTR1 data, request schema v4.1 (GST Developer Portal, GSTN)

How to judge a GSTR-1 JSON validator by what it catches, not by its claims: fourteen checks, each with its source, and a test file of known faults to try.

  1. Make a test file with faults you know: start from the sample in the free GSTR-1 JSON validator and add the ones listed below.
  2. Run the same file through every tool you are comparing, and write down which faults each one names, and where in the file it says they are.
  3. Score each tool against the fourteen checks on this page. A tool that finds nothing in a file you broke on purpose has told you what its "valid" means.

Try it on your own figures with the free GSTR-1 JSON validator.

Why compare by test rather than by name?

Because every validator says it validates, and the word covers anything from "the file is JSON" to "every field is in GSTN’s form and Table 12 adds up to the paisa". The only fair comparison is a file whose faults you already know, run through each tool, with the answers written down. Tools change often; a list of which product did what goes out of date, and a test does not.

This page names no product, fynxIQ’s rivals included. It gives the checks, where each comes from, and how fynxIQ does each one, with the file in its code that does it, so that its own claims can be tested the same way.

Which checks should a GSTR-1 validator make?

Fourteen, in three kinds: the form of the file, the arithmetic between its tables, and what the law and the portal hold it to. Each is written as what to look for, why, where the rule comes from, and what fynxIQ does.

  • The whole file against GSTN’s own schema: none it requires missing, every value of the right kind, and a field the schema does not list named (the portal has processed files carrying one, so that is a warning, the rest a stop). Source: GSTN’s Save GSTR1 schema; a breach is RET191106. In fynxIQ: packages/gst-engine/src/validate/schema.ts, in the free validator and the app.
  • Document numbers: 1 to 16 characters, letters, digits, "/" and "-", with at least one letter or a digit other than 0. Source: the schema’s own pattern. In fynxIQ: DOCUMENT_NUMBER_RE in packages/gst-engine/src/validate/json-format.ts, in both.
  • A number used twice in the file, across tables as well as within one. Source: rule 46(b) of the CGST Rules; RET191190. In fynxIQ: packages/gst-engine/src/validate/json-format.ts, in both, and across a whole month’s files in packages/gst-engine/src/validate/rules.ts, in the app.
  • Every GSTIN’s shape, state code and check digit, the shapes without a PAN included (an embassy, a non-resident, a foreign online provider). Source: GSTN’s published patterns and the mod-36 check digit; RET191113. In fynxIQ: packages/gst-engine/src/reference/gstin.ts, in both.
  • Tax heads that match the place of supply: integrated tax across states, central and state tax within one, in equal halves. Source: sections 7 and 8 of the IGST Act; RET191150 to RET191305. In fynxIQ: packages/gst-engine/src/validate/json-format.ts and checkTaxHeads in packages/gst-engine/src/validate/rules.ts, in both.
  • Table 12 equal to the tables it summarises, in total and by its B2B and B2C tabs, to the paisa. Source: GSTN’s FAQ on Table 12; the portal only warns, and allows 10 per cent. In fynxIQ: the totals in apps/web/components/site/tools/json.tsx and the Table 12 cross-check in packages/gst-engine/src/validate/rules.ts, in both.
  • HSN codes that cannot exist: a length Table 12 does not take, or a subheading missing from a heading GSTN lists in full, such as 71170990. Source: GSTN’s HSN list; RET191349. In fynxIQ: classifyHsn in packages/gst-engine/src/reference/hsn-master.ts, in both.
  • Rates on GSTN’s list, and in the app the rates the law had set for the period. Source: the rate notifications; RET191175. In fynxIQ: LEGAL_RATES in packages/gst-engine/src/adapters/rate.ts in both, and the period’s rates in packages/gst-engine/src/validate/rules.ts in the app.
  • Credit and debit notes in their de-linked form: no original invoice, invoice date or pre-GST flag in Table 9B. Source: the schema from version 2.2. In fynxIQ: packages/gst-engine/src/emit/portal-json.ts on every download, and the schema check in both.
  • Inter-state tables without central or state tax fields: Table 5, its amendment in 9A and Table 9C for unregistered buyers. Source: the schema. In fynxIQ: InterItemDetail in packages/gst-engine/src/emit/gstr1-types.ts, and the schema check in both.
  • An empty B2B tab of Table 12 beside B2B supplies, and a missing Table 13. Source: GSTN’s advisory of 2 May 2025 and FAQ; RET192547 and RET192540. In fynxIQ: hsnTabsPresence and docIssueCoverage in packages/gst-engine/src/validate/rules.ts, in the app; the free validator shows the tab split.
  • HSN digits by turnover: four up to ₹5 crore of the previous year’s aggregate turnover, six above. Source: Notification 78/2020-Central Tax; RET191350. In fynxIQ: packages/gst-engine/src/validate/rules.ts, in the app, where the turnover is known.
  • Table 14 against the operators’ TCS credit statement, operator by operator. Source: section 52 of the CGST Act. In fynxIQ: the TCS cross-check in packages/gst-engine/src/pipeline.ts, in the app with the statement uploaded; a finished JSON does not carry the statement.
  • Where each rule comes from, and what the tool cannot check. Source: none but honesty; a check with no source is an opinion. In fynxIQ: packages/gst-engine/src/reference/authorities.ts, shown on the page of every check, and the codes it cannot see in packages/gst-engine/src/reference/portal-errors.ts.

How do you build a test file?

Start from a JSON you trust, or the sample on fynxIQ’s free validator, which has two faults of its own: an invoice number of eighteen characters and a Table 12 that is ₹800 more than Table 7. Then add one fault at a time, so that each finding can be traced to its cause:

  • Change one invoice number to 0000, and another to INV 42 with a space.
  • Give one note in cdnr an inum field, as notes carried before 2020.
  • Put "camt": 0 on an item in b2cl.
  • Change one buyer GSTIN’s last character.
  • Give an intra-state invoice integrated tax instead of central and state tax.
  • Move one B2B invoice’s HSN row from hsn_b2b to hsn_b2c, leaving the totals as they were.
  • Change one HSN code to 71170990, and one unit to KG1.
  • Write one amount with three decimal places, and one as text in quotes.

What should a good result look like?

Every fault above named, each at its place in the file, such as cdnr[0].nt[0].inum, with the reason in words and, where there is one, GSTN’s code for it. A tool that says "invalid JSON" and nothing else leaves you to find the field. A tool that finds the invoice number and not the Table 12 tab has checked the form and not the arithmetic.

The totals matter as much as the fields. A Table 12 that is short by a whole marketplace is well formed in every field, and the portal lets it through with a warning, or with none at all within 10 per cent. Only a tool that adds the tables up will say so.

Does a clean result mean the return is right?

No. It means the file is well formed and adds up against itself. A finished JSON no longer carries the files it was made from, so no validator of a JSON can say whether a sale is missing from all of its tables at once, whether the TCS statement agrees, or whether a rate suited the goods. Those need the month’s files, which is what fynxIQ prepares a return from.

Nor can any tool without a connection to the portal know what the portal alone holds: whether a buyer’s registration was active on the invoice date, what you filed in earlier months, your own registration date. A tool that claims those without a connection is guessing. The RET191 codes guide marks each portal code a JSON check cannot see.

Where does the file go when you check it?

Ask this of every tool. A GSTR-1 JSON carries your buyers’ registrations and every invoice of the month. fynxIQ’s free validator reads the file in the browser tab and sends it nowhere, and closing the tab forgets it; in the app, a recognised marketplace file is read in the browser too, and the server receives summaries. A tool that uploads the file should say where it is kept and for how long.

Where this comes from

  • GSTN, GSTR1 - Save GSTR1 data, request schema v4.1, and its error codes (developer.gst.gov.in): the schema checks, the document number pattern, the de-linked notes and inter-state items, and the RET codes named.
  • GSTN, FAQs on Form GSTR-1 and on its Table 12 (tutorial.gst.gov.in): Table 12 by tab, the 10 per cent tolerance, the empty tabs, Table 13, HSN digits by turnover.
  • Rule 46(b) of the CGST Rules; sections 7 and 8 of the IGST Act; section 52 of the CGST Act: one number for one invoice, tax heads by place of supply, TCS.
  • Notification 78/2020-Central Tax, and GSTN’s advisory of 2 May 2025: HSN digits by turnover; Tables 12 and 13 from the May 2025 period.
  • fynxIQ’s code: each file named beside its check: what fynxIQ does for each check, and whether the free validator or only the app does it.

Try it on your own figures with the free GSTR-1 JSON validator.

Which file to download, and from where: the list for each marketplace and the GST portal.

By Raunak Pathak, founder of fynxIQ, who files GST returns on it. Last updated 25 September 2026. This is general information about how GST returns work, not advice about your particular return.

Related guides

JSONRET191113 and the other GSTR-1 error codes: what each means and what to changeJSONWhy the portal rejects a GSTR-1 JSON, and how to read the error reportJSONError in JSON structure validation: why the portal refused the whole GSTR-1 file

Check this on your own return.

fynxIQ’s free JSON validator runs the checks marked for it below, in your browser, on a file from any product, and the app runs all fourteen on every return it prepares.

Start free