Skip to main content

X12 for billers

A field guide to the X12 segments you will run into when reading the Submission tab or the receivable Trace tab — without leaving the billing manual for the full EDI manual.

How an X12 file is shaped

ISA*... ← envelope start
GS*... ← functional group
ST*837*... ← transaction set start
BHT*...
HL*... ← hierarchy
loops
SE*... ← transaction set end
ST*...
GE*... ← functional group end
IEA*... ← envelope end

You will rarely need to read these. When the Submission tab says a file rejected at TA1 (envelope) vs 999 (transaction parsing), this shape is what's at issue.

837 — claim out

The bones of a professional claim:

LoopSegmentField
2010BANM1*IL*1*<lastname>*...Subscriber demographics.
2010BBNM1*PR*2*<payer>*...Payer name.
2300CLM*<icn>*<amount>*...Claim header.
2300DTP*431/432/096Onset / accident / discharge dates.
2300HI*ABK*<dx>Principal dx.
2300REF*9F*<auth>Auth reference.
2310BNM1*82*1*<rendering provider>Rendering provider.
2400LX*1Service line counter.
2400SV1*HC:<cpt>:<mods>*...Service line (P).
2400DTP*472*D8*<DOS>Date of service.
2400REF*6R*<line ref>Line item ref.

Institutional (837I) has different shape — SV2 instead of SV1, revenue codes, OCC / VAL / CON segments.

999 — file ack

SegmentField
AK1Functional group ack header.
AK2Transaction ack header.
IK3Bad segment.
IK4Bad element.
IK5Transaction status (A accept, E accept w/ errors, R reject).
AK9Functional group status.

A 999 rejection means the file structure failed. Almost always: delimiters, envelope IDs, control number mismatch.

277CA — claim ack

SegmentField
STC*<status>*...Status code (e.g. A1, A7, R7).
REF*1K*<payer claim control>Payer's claim ID.
DTP*472*D8*<DOS>Service date.
QTY*90*<count>Count of accepted/rejected lines.

STC01's first character: A = acknowledged, R = rejected, E = error. The full code (A7, R7) carries the reason.

835 — remittance

SegmentField
BPR*<I/C>*<amount>*...Payment header. I = check, C = ACH, etc.
TRN*1*<trace>*<payer ID>Transaction trace.
N1*PR*<payer name>Payer.
N1*PE*<payee name>Payee.
LX*<counter>Loop counter.
CLP*<patient acct>*<status>*<billed>*<paid>*<patient resp>*<filing code>*<icn>Claim level.
CAS*<group>*<reason>*<amount>Claim-level adjustment.
NM1*QC*<patient last>*<first>*...Patient.
SVC*HC:<cpt>:<mods>*<billed>*<paid>*<rev code>*<units>Service line.
DTM*150*<from> / 151*<to>Service date range.
CAS*<group>*<reason>*<amount>Line-level adjustment.
LQ*HE*<RARC>Remark code.
AMT*F2*<amount>Allowed amount (line).
AMT*B6*<amount>Allowed amount (service).
PLB*<provider id>*<date>*<reason>:*<ref>*<amount>Provider-level adjustment (file footer).

CAS group codes

GroupMeaningRoutes to
COContractualContractual write-off.
PRPatient responsibilityPatient AR.
OAOtherVarious.
CRReversalReverses a prior CAS.
PIPayer-initiatedVarious.

270 / 271 — eligibility

Segment (271)Field
EB*<status>*<service code>*<level>*<plan>Eligibility benefit.
EB011 Active, 2 Active full risk, 6 Inactive, etc.
DTP*291*<from> / 292*<to>Plan begin / end.
MSG*<text>Free-text.

276 / 277 — claim status

Segment (277)Field
STC*<status>*<date>*<amount>Status.
REF*1K*<payer ICN>Reference.
DTP*472*D8*<DOS>Service date.
QTY*90*<count>Count.

STC01 family codes are described in 3.2 — Track acks and 6.4 — Claim status inquiry.

278 — authorization

SegmentField
UM*<request category>*<certification type>*<service type>Auth request.
HSD*<units>*<count>*<period>Service limits.
REF*BB*<auth #>Auth number (response).
DTP*291*<from> / 292*<to>Effective dates.

How the platform helps you not read this

The Submission tab and the Trace tab decode segments inline:

  • Hover any segment chip → human description.
  • Click → expanded structured view.
  • The auto-decode covers the segments above plus less-common ones.

Reach for the EDI Manual when:

  • You're authoring or fixing a companion guide.
  • You need to defend an interpretation against the payer.
  • You're debugging an envelope-level reject.

For day-to-day work, the platform's structured view is enough.