Lints FDA SPL establishment registration XML before it goes to the FDA ESG: DUNS format, LOINC document type, UUID setId, and the October 1 - December 31 annual registration window. Runs entirely in your browser — nothing is uploaded.
Full version - $29 once: sweep every SPL file in the submission folder and export a dated readiness report · one licence key per person or CI seat · A regulatory-affairs consultant bills $100-$200 per hour.
Same engine as the VS Code extension, byte for byte.
Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.
Open VSX (Cursor, VSCodium)npmDocker Hubnpx @readystack/spl-registration-lint <file> docker run --rm -v "$PWD:/w" getreadystack/spl-registration-lint /w
Team? One key for every ReadyStack linter, 5 seats, $149 once
Sweeps every .xml file in the submission folder in one pass and exports a dated readiness report you keep with the submission record - a different axis: scope and a document you own, not more rules.
One payment, one licence key for this tool. The key is shown right after payment.
A regulatory-affairs consultant bills $100-$200 per hour.
Buy the full version — $29· ReadyStack
Real numbers from this tool, line by line.

A US drug establishment's SPL registration XML, dated 20251110, expired on 2025-12-31 - that is 264 days before we linted it on 2026-09-21 - and the same file carried 7 blocking errors on 6 lines. The file was well-formed XML. It simply would not have been accepted.
Drug establishment registration in the United States is renewed once a year, and the window is October 1 through December 31 (FD&C Act section 510(b)(2)). A registration that is not renewed inside that window lapses on December 31. The renewal is not a web form - it is a Structured Product Labeling file, HL7 v3 XML, sent through the FDA Electronic Submissions Gateway, which answers with an acknowledgement or a rejection only after you have submitted.
That is the gap this linter sits in: it reads the same file in your editor and runs 9 rules, naming the line each time.
Here is what came back:
ERR L4 doc_type Document type is "34391-3", not 51725-0.
ERR L4 loinc_system codeSystem is "2.16.840.1.113883.6.69", not the LOINC OID
2.16.840.1.113883.6.1.
ERR L6 lapse_clock This registration is dated 20251110, so it expired on
2025-12-31, 264 days ago.
ERR L7 doc_uuid <setId> repeats the <id> UUID, so the FDA ESG reads this as a
new registration instead of a new version.
ERR L8 version_number versionNumber is "0", not a positive integer.
ERR L12 duns_format D-U-N-S number "12-345-6789" is not nine digits.
ERR L18 duns_format D-U-N-S number "98765432" is not nine digits.
Most of those are mistakes a person cannot see by reading. A D-U-N-S number typed as 12-345-6789 reads perfectly to a human and fails to a parser that wants nine digits. A setId that repeats the document id looks tidy; to the gateway it means "a brand new registration", not "version 2 of the one you already have". The code 34391-3 is a real LOINC code - it is the code for a prescription drug label, not for an establishment registration, which is 51725-0.
The ninth rule is the one that is not in the file at all: the calendar. The linter takes the date you pass it and compares it to the October 1 - December 31 window. Give it the same file as of 2026-09-21 and it reports the registration expired 264 days ago. Re-date that file to 20260215, lint it as of 2026-10-05, and the count drops to a single finding: February is month 2, before the window opens. Fix the date to 20261001 and the file returns 0 findings. The number moves because the arithmetic is real, not because a string changed.
The engine is one file that runs unchanged in Node and in the browser:
var RULES = (typeof module !== 'undefined')
? require('./rules.json')
: window.SPL_RULES;
So the free browser page and the VS Code extension cannot drift apart - same engine, byte for byte, nothing uploaded.
Free, with no key: open any .xml file, run the check, and get every blocking error with its line number and the corrected line. That finishes one file. The full version is $29 once and moves on a different axis: it sweeps every .xml file in the submission folder in one pass and exports a dated readiness report you keep with the submission record. One licence key per person or CI seat.
For scale: a regulatory-affairs consultant bills $100-$200 per hour, and a rejected gateway submission costs a re-check plus a resubmission cycle inside a window that closes on December 31. This year that window opens in 10 days and closes 101 days from 2026-09-21.
The tool checks an SPL file's structure. It is not legal or regulatory advice.
It reads an FDA Structured Product Labeling establishment registration XML file in your editor and runs 9 rules against it: the LOINC document type 51725-0, the LOINC code system OID, UUID document id and setId, versionNumber, the eight-digit effectiveTime, the October 1 - December 31 registration window, the lapse clock, and whether every D-U-N-S number is exactly nine digits. Each finding names the line.
Regulatory affairs and regulatory operations staff at US drug establishments - manufacturers, repackagers, relabelers and contract sites - who build or hand-edit SPL establishment registration XML before sending it through the FDA Electronic Submissions Gateway. It also fits developers who generate SPL files from a product database and need a check in the repository.
A generic XML validator checks well-formedness, not that your document code is 51725-0 or that your D-U-N-S extension is nine digits rather than 12-345-6789. A chatbot does not know today's date against the October 1 - December 31 window. The FDA gateway does know, but it only tells you after you have already submitted.
Free, with no key: lint the open SPL XML file against all 9 rules and get every blocking error with its line number. That finishes one file. The licence key adds a different axis - sweeping every .xml file in the submission folder in one pass, and exporting a dated readiness report you keep with the submission record.
A regulatory-affairs consultant bills $100-$200 per hour, and a rejected gateway submission costs a re-check plus a resubmission cycle inside a window that closes on December 31. The full version is $29 once, one licence key per person or CI seat,. The free tier alone finishes one file.
A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. SPL Registration Lint - FDA Establishment XML checks the file you open against 9 rules from a rule set dated 2026-09-21, and points at the exact line with the fix. For a filing, an audit or a client you need that dated result on your own files.
One question, answered by the person who built it. Your email only if you want the answer sent.
Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.
For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →