Understanding EDI Segments: ISA, GS, ST, and Loop Structure
If you’ve ever opened a raw EDI file and felt like you were staring at ancient hieroglyphics, you’re not alone. X12 EDI files are dense, tightly formatted, and built for machines — not humans. But once you understand the building blocks, the structure becomes surprisingly logical.
This guide breaks down the four foundational pieces of every X12 EDI transaction: the ISA, GS, and ST segments, plus loops — the structural groupings that organize everything in between. Whether you’re in healthcare billing, revenue cycle management, or EDI development, this is the foundation you need.
Why EDI Structure Matters
EDI (Electronic Data Interchange) files are not just data dumps — they’re structured contracts between trading partners. Every character has a purpose. If a segment is in the wrong position, uses the wrong delimiter, or violates expected hierarchy, the entire file can be rejected.
Understanding how EDI files are structured helps you:
- Diagnose errors faster
- Build and validate files more accurately
- Communicate more precisely with payers and clearinghouses
- Write better parsing and validation logic
Let’s start from the outside and work inward.
The Outer Envelope: ISA and IEA
The ISA segment (Interchange Control Header) is the very first line of every X12 EDI file. It opens the interchange envelope — think of it as the outer wrapper that says “this is EDI, here’s who sent it and who it’s going to.”
The IEA segment (Interchange Control Trailer) closes that envelope at the end of the file.
ISA Segment Breakdown
ISA*00* *00* *ZZ*SENDER123 *ZZ*RECEIVER456 *260803*1700*^*00501*000000001*0*P*:~
Each element is separated by * (asterisk). Here’s what each position means:
| Position | Name | Example Value | Description |
|---|---|---|---|
| ISA01 | Authorization Info Qualifier | 00 | No auth info used |
| ISA02 | Authorization Info | (10 spaces) | Filler when 00 |
| ISA03 | Security Info Qualifier | 00 | No security info |
| ISA04 | Security Info | (10 spaces) | Filler when 00 |
| ISA05 | Interchange Sender ID Qualifier | ZZ | Mutually defined |
| ISA06 | Interchange Sender ID | SENDER123 | Sender’s ID (15 chars, padded) |
| ISA07 | Interchange Receiver ID Qualifier | ZZ | Mutually defined |
| ISA08 | Interchange Receiver ID | RECEIVER456 | Receiver’s ID (15 chars, padded) |
| ISA09 | Interchange Date | 260803 | YYMMDD format |
| ISA10 | Interchange Time | 1700 | HHMM format |
| ISA11 | Repetition Separator | ^ | Used in X12 005010 |
| ISA12 | Interchange Control Version | 00501 | HIPAA 5010 = 00501 |
| ISA13 | Interchange Control Number | 000000001 | 9-digit unique number |
| ISA14 | Acknowledgment Requested | 0 | 0=no, 1=yes (TA1 expected) |
| ISA15 | Interchange Usage Indicator | P | P=production, T=test |
| ISA16 | Component Element Separator | : | Used within composite elements |
The last character before the segment terminator (~) is the component element separator. The segment terminator itself is ~.
Pro tip: The delimiters used in the ISA segment define the delimiters for the entire file. If ISA uses
*as element separator and~as segment terminator, every segment in the file follows that rule. Don’t hardcode delimiters in your parsers — always read them from ISA.
The Functional Group: GS and GE
Inside the interchange envelope, you have functional groups, opened by the GS segment (Functional Group Header) and closed by GE (Functional Group Trailer).
A functional group contains one or more transactions of the same type — for example, all 837P claim transactions from a single sender.
GS Segment Breakdown
GS*HC*SENDER123*RECEIVER456*20260803*1700*1*X*005010X222A1~
| Position | Name | Example Value | Description |
|---|---|---|---|
| GS01 | Functional Identifier Code | HC | HC=Health Care Claim (837) |
| GS02 | Application Sender’s Code | SENDER123 | Matches ISA06 (often) |
| GS03 | Application Receiver’s Code | RECEIVER456 | Matches ISA08 (often) |
| GS04 | Date | 20260803 | CCYYMMDD format |
| GS05 | Time | 1700 | HHMM format |
| GS06 | Group Control Number | 1 | Unique per interchange |
| GS07 | Responsible Agency Code | X | X=ASC X12 |
| GS08 | Version/Release/Industry | 005010X222A1 | HIPAA implementation guide |
The value in GS08 is critical — it defines which HIPAA implementation guide governs the transaction. Common values:
005010X222A1→ 837P Professional claims005010X223A2→ 837I Institutional claims005010X221A1→ 835 Remittance Advice005010X279A1→ 270/271 Eligibility
The Transaction Set: ST and SE
Inside the functional group, individual transactions are wrapped by ST (Transaction Set Header) and SE (Transaction Set Trailer). Each ST–SE pair represents one complete transaction — one 837 claim file, one 835 remittance, etc.
ST Segment Breakdown
ST*837*0001*005010X222A1~
| Position | Name | Example Value | Description |
|---|---|---|---|
| ST01 | Transaction Set Identifier Code | 837 | The transaction type |
| ST02 | Transaction Set Control Number | 0001 | Unique within the functional group |
| ST03 | Implementation Convention Reference | 005010X222A1 | Same as GS08 |
The SE segment closes the transaction and includes a count of segments:
SE*47*0001~
- SE01: The total number of segments in the transaction (including ST and SE themselves)
- SE02: Must match ST02
If your SE01 count doesn’t match the actual segment count, the file will fail validation. This is one of the most common structural errors in EDI files.
Loops: The Organizational Core of an EDI Transaction
If ISA, GS, and ST are the envelopes, loops are the filing system inside. A loop is a named grouping of related segments that can repeat a defined number of times.
Loops are what make EDI hierarchical and flexible. For example, a single 837P transaction can contain:
- Multiple providers (Loop 2000A)
- Multiple subscribers (Loop 2000B)
- Multiple patients per subscriber (Loop 2000C)
- Multiple claims per patient (Loop 2300)
- Multiple service lines per claim (Loop 2400)
How Loops Work
Loops don’t have their own segment — they’re implied by the position of specific segments. The start of a loop is typically triggered by a key segment, and the loop ends when that key segment repeats or the parent loop ends.
For example, in an 837P:
- Loop 2000A begins with
HL*1**20*1~(Billing Provider Hierarchical Level) - Loop 2000B begins with
HL*2*1*22*1~(Subscriber) - Loop 2000C begins with
HL*3*2*23*0~(Patient, when different from subscriber) - Loop 2300 begins with
CLM*(Claim Information) - Loop 2400 begins with
LX*(Service Line)
Example: HL Segment Structure
HL*1**20*1~
NM1*85*2*ABC MEDICAL GROUP*****XX*1234567890~
N3*123 MAIN ST~
N4*BOSTON*MA*02101~
HL*2*1*22*1~
SBR*P*18*******CI~
NM1*IL*1*DOE*JOHN****MI*XYZ123456789~
N3*456 ELM ST~
N4*CAMBRIDGE*MA*02139~
HL*3*2*23*0~
PAT*19~
NM1*QC*1*DOE*JANE****~
DMG*D8*19900601*F~
CLM*CLAIM001*500.00***11:B:1*Y*A*Y*I~
In this snippet:
HL*1= Billing Provider (no parent, type 20)HL*2*1= Subscriber (parent is HL 1, type 22)HL*3*2= Dependent/Patient (parent is HL 2, type 23)CLMbegins Loop 2300 under Loop 2000C
The HL04 element (1 or 0) indicates whether there are child HL segments below. 1 means yes, 0 means this is a leaf node.
The Full Hierarchy at a Glance
ISA (Interchange Header)
GS (Functional Group Header)
ST (Transaction Set Header)
Loop 1000A — Submitter Name
Loop 1000B — Receiver Name
Loop 2000A — Billing Provider (HL)
Loop 2000B — Subscriber (HL)
Loop 2000C — Dependent/Patient (HL, if different)
Loop 2300 — Claim
Loop 2310A — Referring Provider
Loop 2310B — Rendering Provider
Loop 2320 — Other Subscriber (COB)
Loop 2400 — Service Line
Loop 2420A — Rendering Provider (line level)
SE (Transaction Set Trailer)
GE (Functional Group Trailer)
IEA (Interchange Control Trailer)
Every nested loop can repeat based on the rules in the HIPAA implementation guide. The 837P guide (005010X222A1) specifies exactly how many times each loop can repeat, which segments are required vs. situational, and which values are allowed.
Common Structural Errors and What They Mean
Understanding structure helps you debug faster. Here are the errors you’ll see most often:
“Missing or invalid ISA segment”
The file doesn’t start with ISA, or the ISA is malformed. Check that it’s exactly 106 characters, the delimiters are consistent, and there are no BOM characters or leading whitespace.
”SE segment count mismatch”
SE01 says there are 45 segments but there are actually 47. Usually caused by segments being added or removed after the SE was written. Recount from ST to SE inclusive.
”Loop out of sequence”
A segment appeared in the wrong place. For example, a CLM segment appearing before the HL hierarchy is established, or a Loop 2400 LX appearing before CLM. EDI is position-dependent — order matters.
”Control number mismatch”
ISA13 and IEA02 must match. GS06 and GE02 must match. ST02 and SE02 must match. These are how the file integrity is verified.
”Functional group version not recognized”
GS08 contains an unrecognized implementation guide version. Make sure you’re using the correct guide for the transaction type and that it matches what the payer expects.
Practical Tips for Working With EDI Structure
-
Always validate structure before sending. A structurally invalid file will be rejected before content is even evaluated. Catch structure errors first.
-
Use a real EDI viewer, not a text editor. Raw EDI is hard to read. A viewer that parses the hierarchy lets you navigate loops and segments intuitively.
-
Check delimiters from ISA, not from assumptions. Don’t assume
*,~, and:— read them from ISA11 and ISA16 and the segment terminator at position 106. -
Count your segments. When building files programmatically, compute SE01 at the end — don’t hardcode it.
-
Match control numbers exactly. ISA13↔IEA02, GS06↔GE02, ST02↔SE02. One mismatch can cause full rejection.
Summary
The ISA, GS, and ST segments form a three-level envelope around every X12 EDI transaction. Together they establish:
- Who sent the file and who receives it (ISA)
- What type of transactions are inside (GS)
- Where one transaction starts and ends (ST/SE)
Loops organize the clinical and billing content within that envelope into a predictable, hierarchical structure that both senders and receivers can navigate programmatically.
Once you internalize this structure, reading and debugging raw EDI becomes dramatically faster. You’ll know exactly where to look for a specific piece of data, what controls the file’s validity, and how to trace a structural error back to its root cause.
Ready to work with EDI files in your browser? Try EDI Paisan free — no install required.