Feedback

Especially worth telling me: a figure that disagrees with the current Orton chart, a firing case this does not handle, or anything that broke.

837 claim checker

Catches the rejections that have nothing to do with the patient: a total that does not add up, a mistyped NPI, a pointer aimed at a diagnosis that is not there.

Choose an 837 claim file

or drop it here. It is read in your browser and never uploaded.

or paste the claim text instead

to see what the output looks like.

A rejection is not a denial

The distinction is worth being pedantic about, because one of them is a clinical argument and the other is arithmetic.

A denial means the payer looked at the claim and decided not to pay it. That is a conversation about medical necessity, coverage or coding, and it comes back on an 835 remittance with reason codes attached.

A rejection means nobody looked at all. The file failed a structural check at the clearinghouse or the payer's front door and was handed straight back. No adjudication, no reason codes, and often a report that says little more than which loop it died in.

Rejections cost the same billing cycle as a denial and carry none of the information. They are also the entirely avoidable kind, because the things that cause them are checkable before the file leaves your building.

The total against the lines

CLM02 is the claim total and every SV1 carries a line charge. They have to agree to the cent. It is the most common mechanical rejection there is, and it happens because a line was added, removed or re-priced and the header was not recalculated.

The NPI check digit

An NPI is nine digits and a tenth that is calculated from them, using the Luhn formula applied to 80840 plus the first nine. The useful property is that it catches every single mistyped digit and every transposition of adjacent digits bar one case. So a fat-fingered NPI is caught here instead of weeks later.

It cannot tell you the NPI belongs to that provider. Only that the number is well formed, which is the failure that rejects a file.

Diagnosis pointers

Diagnoses appear once per claim, in numbered positions, and each service line points at the positions that justify it. That indirection is efficient and fragile: reorder the diagnoses without touching the pointers and every line now cites the wrong condition. Delete one and a pointer aims at an empty position, which rejects.

So this tool prints each pointer with the code it resolves to. A pointer that lands nowhere is shown as landing nowhere, rather than as a plausible-looking number.

What it deliberately does not do

It does not predict payment. Medical necessity, coverage, prior authorisation, bundling and fee schedules are payer-specific and change constantly, and a tool that guessed at them would be wrong often enough to be worse than useless. This checks that the file is well formed. That is a smaller claim, and it is one that can be made honestly.

Terminology

837
The claim transaction. Professional (837P), institutional (837I) and dental (837D) variants differ in their service-line segment.
CLM
Claim information. One per claim, carrying the control number and the total charge.
HI
Health care diagnosis codes, up to twelve per claim in numbered positions.
SV1
A professional service line: procedure code, charge, units, place of service and the diagnosis pointers.
HL
Hierarchical level. The 837 nests billing provider, subscriber and patient, and each level names its parent.
NPI
National Provider Identifier. Ten digits, the last a check digit.

Questions billers actually ask

Why do my claims keep rejecting before anyone reviews them?

Because a rejection and a denial are different things. A denial means the payer adjudicated the claim and decided not to pay it. A rejection means the file never got that far — it failed a structural check at the clearinghouse or the payer’s front door and was handed straight back.

Rejections are almost always mechanical, and that makes them checkable without knowing anything about the patient or the policy: a claim total that does not match its service lines, an NPI with a bad check digit, a diagnosis pointer aimed at a diagnosis that is not on the claim. All three are checked here.

What does the NPI check digit actually catch?

Typing errors, and specifically transpositions. An NPI is nine digits plus a check digit calculated with the Luhn formula, and the calculation is done on 80840 prepended to the first nine digits rather than on the NPI alone.

The useful property is that Luhn catches every single-digit error and every transposition of adjacent digits except 09 for 90. So a fat-fingered NPI is caught here rather than three weeks later. A valid check digit does not mean the NPI belongs to that provider — only that it is a well-formed number.

What is a diagnosis pointer and how does it go wrong?

The diagnoses live once, on the claim, in the HI segment — up to twelve of them, each in a numbered position. Each service line then points at the positions that justify it, using numbers rather than repeating the codes.

That indirection is what breaks. Renumber or reorder the diagnoses without updating the pointers and every line now points at the wrong condition. Delete one and a pointer aims at an empty position, which is a rejection. This tool shows each pointer next to the code it actually resolves to, so a wrong one is visible rather than inferred.

What is the difference between an 837P, 837I and 837D?

The professional, institutional and dental variants. They are the same envelope with a different service-line segment: 837P uses SV1, 837I uses SV2 with a revenue code first, 837D uses SV3.

The tool reads which one it has from the implementation convention in GS08 or ST03 and reads the right segment accordingly. Getting that wrong means reading the wrong element for every charge on the file, which is why it is detected rather than assumed.

Does this check whether the payer will actually pay?

No, and nothing that runs in a browser could. Medical necessity, coverage, prior authorisation, bundling rules and fee schedules are all payer-specific and change constantly.

What this checks is whether the file is mechanically well formed: does it add up, do the identifiers pass their own arithmetic, do the internal references resolve. Those are the failures that cost you a billing cycle for no clinical reason, and they are the ones you can eliminate entirely.

Does my claim file get uploaded?

No. It is read with the browser File API into memory on your own machine, parsed there, and any download is generated locally. There is no server to send it to; this site is static files.

An 837 carries patient names, member identifiers, diagnoses and dates of service, so this is not a small point. Checking a claim file should not require handing it to a stranger.

How does this relate to the remittance reader?

They are two ends of the same transaction. The 837 is the claim you send; the 835 is the payer’s answer. They join on the control number — CLM01 here becomes CLP01 on the remittance, which is how you match a payment back to what you billed.

Use this one before submitting and that one after being paid. Both read the file in the browser and neither uploads anything.

The output looks wrong or the file will not parse

Most likely delimiters. An X12 file declares its own in the ISA header, and payers and clearinghouses do vary them. This parser reads them from the file rather than assuming the usual * and ~, which is the most common reason a hand-written EDI parser works on documentation samples and fails on a real file.

If you pasted a fragment with no ISA header, standard delimiters are assumed and the tool says so.

Notes and sources

Loop structure and element positions come from freely published companion guides for 005010X222A1, including those from CGS and the Community Health Center Network. The NPI check digit algorithm is published by CMS. The ASC X12 TR3 implementation guide is copyrighted and is not reproduced here; what this tool encodes is structure documented in those free guides.

Place of service codes are validated against the same CMS list used by the place of service lookup. A code that is not on that list is flagged rather than silently accepted.

No procedure or diagnosis code descriptions are shown. CPT descriptions are copyrighted by the AMA and licensed for internal use, so they are not reproduced. This costs nothing in practice: you already know what you billed, and the check is about structure, not vocabulary.

Nothing is uploaded and nothing is stored. If a real claim file fails to parse here, describe the shape of it — never send the file — and the parser gets fixed.