ASC X12 standards define one of the widely used EDI formats. This library enables easy parsing and creation of X12 transactions.

  • Parse X12 transactions (With Loop identification)
  • Create X12 transactions

This library cannot validate a X12 transaction, just parse and allow to retrieve message components

1 Message components

Explanation of Object Types

  • Cf - class represents a configuration element. Each Cf instance represents items required to identify a Loop in a X12 transaction. Some Loops can be identified by only the segment id. Others require segment id and additional qualifiers to be able to identify the Loop.
  • Context - The class represents an X12 context. A X12 context consists of a segment separator, element separator and a composite element separator.
  • Loop - The Loop class is the representation of an Loop in a ANSI X12 transaction. Segments are grouped as loops. And a set of loops form an X12 transaction.
  • Segment - An aggregation of elements.
  • Element - The building block of an X12 transaction is an element. Some elements may be made of sub elements.

2 AX12 Message

The X12 class is the object representation of an ANSI X12 transaction. The building block of an X12 transaction is an element. Some elements may be made of sub elements. Elements combine to form segments. Segments are grouped as loops. And a set of loops form an X12 transaction.

2.1 Examples

TO DO

This section is incomplete and will be concluded as soon as possible.

2.1.1 Parse X12 file and loop over segments. (without loop identification)

Copy
var x12_835_msg = `ISA*00*          *00*          *ZZ*SENDERID       *ZZ*RECEIVERID    *030409*0701*U*00401*0000000001*0*T*:~
GS*1212*SENDERID*RECEIVERID*0701*000000001*X*00401~
ST*835*000000001~
BPR*DATA*NOT*VALID*RANDOM*TEXT~
TRN*1*0000000000*1999999999~
DTM*111*20090915~
N1*PR*ALWAYS INSURANCE COMPANY~
N7*AROUND THE CORNER~
N4*SHINE CITY*GREEN STATE*ZIP~
REF*DT*435864864~
N1*PE*FI*888888888*P.O.BOX 456*SHINE CITY*GREEN STATE*ZIP*EARTH~
LX*1~
CLP*PCN123456789**5555.55**CCN987654321~
CAS*PR*909099*100.00~
NM1*QC*1*PATIENT*TREATED*ONE***34*333333333~
DTM*273*20020824~
AMT*A1*10.10~
AMT*A2*20.20~
LX*2~
CLP*PCN123456789**4444.44**CCN987654321~
CAS*PR*909099*200.00~
NM1*QC*1*PATIENT*TREATED*TWO***34*444444444~
DTM*273*20020824~
AMT*A1*30.30~
AMT*A2*40.40~
SE*24*000000001~
GE*1*000000001~
IEA*1*000000001~`;

var x12 = new Ax.text.ax12(x12_835_msg);

for (segment of x12) {
    if (segment.getElement(0) == "CLP") {
    console.log("Total Change Amount " + segment.getElement(3));
    }
}

2.1.2 X12 Configuration for Loop Detection

To enable the X12 parser to detect loops, a configuration object (Cf) needs to be created with the Loop details. Configuration object is created based on the X12 transaction to be parsed. Different variations of the configuration object can be created allowing Parser to parse the X12 file to meet the specific needs.

Simple/Flattened Hierarchy

Here is a sample 835 hierarchy which is flattened if you're not interested in the hierarchy of the loops.

Format: LoopName - SegmentId - SegmentQualifier - SegmentQualifierPosition Note: Separate multiple qualifiers with a COMMA.

Copy
var cfX12 = new Ax.util.ax12.Cf("X12");

cfX12.addChild("ISA", "ISA");
cfX12.addChild("GS", "GS");
cfX12.addChild("ST", "ST", "835", 1);
cfX12.addChild("1000A", "N1", "PR", 1);
cfX12.addChild("1000B", "N1", "PE", 1);
cfX12.addChild("2000", "LX");
cfX12.addChild("2100", "CLP");
cfX12.addChild("2110", "SVC");
cfX12.addChild("GE", "GE");
cfX12.addChild("IEA", "IEA");

console.log(cfX12);
+--X12
|  +--ISA   - ISA
|  +--GS    - GS
|  +--ST    - ST  - 835, - 1
|  +--1000A - N1  - PR,  - 1
|  +--1000B - N1  - PE,  - 1
|  +--2000  - LX
|  +--2100  - CLP
|  +--2110  - SVC
|  +--SE    - SE
|  +--GE    - GE
|  +--IEA   - IEA

Actual Hierarchy

Here is an example of how to create a configuration object using 835 hierarchy with the actual loop hierarchy.

Format: LoopName - SegmentId - SegmentQualifier - SegmentQualifierPosition Note: Separate multiple qualifiers with a COMMA.

Copy
var cfX12 = new Ax.text.ax12.Cf("X12");

var cfISA = cfX12.addChild("ISA", "ISA");
var cfGS = cfISA.addChild("GS", "GS");
var cfST = cfGS.addChild("ST", "ST", "835", 1);

cfST.addChild("1000A", "N1", "PR", 1);
cfST.addChild("1000B", "N1", "PE", 1);

var cf2000 = cfST.addChild("2000", "LX");

var cf2100 = cf2000.addChild("2100", "CLP");
cf2100.addChild("2110", "SVC");

cfISA.addChild("GE", "GE");
cfX12.addChild("IEA", "IEA");

console.log(cfX12);
+--X12
|  +--ISA                 - ISA
|  |  +--GS               - GS
|  |  |  +--ST            - ST   - 835, - 1
|  |  |  |  +--1000A      - N1   - PR,  - 1
|  |  |  |  +--1000B      - N1   - PE,  - 1
|  |  |  |  +--2000       - LX
|  |  |  |  |  +--2100    - CLP
|  |  |  |  |  |  +--2110 - SVC
|  |  |  +--SE            - SE
|  |  +--GE               - GE
|  +--IEA                 - IEA

2.1.3 X12 Parsing with Loop detection

Example of parsing a X12 file with loop detection. There are two steps:

  • Load/Create the X12 configuration object for a 835 transaction (based on the X12 transaction) to be parsed.
  • Parse the X12 file.
Copy
var x12_835_msg = `ISA*00*          *00*          *ZZ*SENDERID       *ZZ*RECEIVERID    *030409*0701*U*00401*0000000001*0*T*:~
GS*1212*SENDERID*RECEIVERID*0701*000000001*X*00401~
ST*835*000000001~
BPR*DATA*NOT*VALID*RANDOM*TEXT~
TRN*1*0000000000*1999999999~
DTM*111*20090915~
N1*PR*ALWAYS INSURANCE COMPANY~
N7*AROUND THE CORNER~
N4*SHINE CITY*GREEN STATE*ZIP~
REF*DT*435864864~
N1*PE*FI*888888888*P.O.BOX 456*SHINE CITY*GREEN STATE*ZIP*EARTH~
LX*1~
CLP*PCN123456789**5555.55**CCN987654321~
CAS*PR*909099*100.00~
NM1*QC*1*PATIENT*TREATED*ONE***34*333333333~
DTM*273*20020824~
AMT*A1*10.10~
AMT*A2*20.20~
LX*2~
CLP*PCN123456789**4444.44**CCN987654321~
CAS*PR*909099*200.00~
NM1*QC*1*PATIENT*TREATED*TWO***34*444444444~
DTM*273*20020824~
AMT*A1*30.30~
AMT*A2*40.40~
SE*24*000000001~
GE*1*000000001~
IEA*1*000000001~`;

var cf835 = new Ax.text.ax12.Cf("X12");

var cfISA = cf835.addChild("ISA", "ISA");
var cfGS = cfISA.addChild("GS", "GS");
var cfST = cfGS.addChild("ST", "ST", "835", 1);

cfST.addChild("1000A", "N1", "PR", 1);
cfST.addChild("1000B", "N1", "PE", 1);

var cf2000 = cfST.addChild("2000", "LX");

var cf2100 = cf2000.addChild("2100", "CLP");
cf2100.addChild("2110", "SVC");

cfISA.addChild("GE", "GE");
cf835.addChild("IEA", "IEA");

// console.log(cf835);

// Parse the X12 File
        
var parser = new Ax.text.ax12.X12Parser(cf835);
var x12    = parser.parse(x12_835_msg);

var totalChargeAmount = 0.0;

// Calculate the total charge amount
for (var loop of x12.findLoop("2100")) {
    for (var s of loop) {
        if (s.getElement(0) == "CLP") {
            totalChargeAmount = totalChargeAmount + s.getElement(3);
        }
    }
}
console.log("Total Charged Amount = " + totalChargeAmount);

There is an alternative method of aggregating charge amount if you don't care about the loops:

Copy
var totalChargeAmount = 0.0;

for (s of x12.findSegment("CLP")) {
    totalChargeAmount = totalChargeAmount + s.getElement(3);
}
console.log("Total Charged Amount = " + totalChargeAmount);

3 X12 Files Examples

X12 hierarchy and specification formats available at: https://edination.com/edi-formats.html

Walmart 810 file format

Copy
ISA*00*          *00*          *16*102096559TEST  *14*PARTNERTEST    *071214*1406*U*00040*810000263*1*T*>
  GS*IN*102096559TEST*PARTNER*20071214*1406*810000263*X*004010
    ST*810*0001
      BIG*20050205*6463367*20050202*3376103367
      REF*IA*123456170*X5T
      REF*DP*00017
      REF*MR*0020
      N1*SU*SUPPLIER NAME
      N1*ST*WAL-MART 100*UL*0078742000992
        N3*406 SOUTH WALTON BLVD
        N4*BENTONVILLE*AR*72712 
      ITD*05*15*****45
      DTM*011*20050205
      FOB*CC
      IT1**1080*EA*3.61**IN*001719653*UP*022108955228*UK*            00221089552284       
        PID*F****ITEM DESCRIPTION
        SAC*A*I410***2350*******02
      TDS*387530
      CAD*T***RDWT*ROADWAY**BM*123456789
      ISS*1080*EA*100*LB
      CTT*1
    SE*19*0001
  GE*1*810000263
IEA*1*810000263

X12 HIPAA 270 Sample File

This is an example of an eligibility request from a clinic to a payer processed in Real Time. The clinic is inquiring if the patient (the subscriber) has coverage. The request is from Bone and Joint Clinic to the ABC Company. This example uses the Primary Search Option for a subscriber who is the patient and is for a generic request for Eligibility.

Copy
ISA*00*          *00*          *ZZ*1234567        *ZZ*11111          *170508*1141*^*00501*000000101*1*P*:~
  GS*HC*XXXXXXX*XXXXX*20170617*1741*101*X*005010X279A1~
    ST*270*1234*005010X279A1~
    BHT*0022*13*10001234*20060501*1319~
      HL*1**20*1~
        NM1*PR*2*ABC COMPANY*****PI*842610001~
        HL*2*1*21*1~
          NM1*1P*2*BONE AND JOINT CLINIC*****SV*2000035~
          HL*3*2*22*0~
            TRN*1*93175-012547*9877281234~
            NM1*IL*1*SMITH*ROBERT****MI*11122333301~
            DMG*D8*19430519~
            DTP*291*D8*20060501~
            EQ*30~
    SE*13*1234~
  GE*1*101~
IEA*1*000000101~

Other X12 HIPAA 270 Sample Request

Copy
ISA*00* *00* *ZZ*123456789ABC *ZZ*FIDELIS*150309*1328*{*00501*152456606*1*T*^~
GS*HS*123456789ABC*FIDELIS*20150309*13284060*152456606*X*005010X279A1~
ST*270*091328400*005010X279A1~
BHT*0022*13*123456789*20150309*132808~
HL*1**20*1~
NM1*PR*2*FIDELIS*****PI*11315~
HL*2*1*21*1~
NM1*1P*2*Hospital*****XX*1122334455~
HL*3*2*22*0~
NM1*IL*1*LASTNAME*FIRSTNAME****MI*98765432111~
REF*EJ*1234567~
DMG*D8*19630227~
DTP*291*D8*20150309~
EQ*30~
SE*13*091328400~
GE*1*152456606~
IEA*1*152456606~

X12 271 Response example:

Copy
ISA*00* *00* *ZZ*FIDELIS *ZZ*123456789ABC*151019*1054*{*00501*152928969*0*T*^~
GS*HB*FIDELIS*123456789ABC*20151019*105421*152928969*X*005010X279A1~
ST*271*091328400*005010X279A1~
BHT*0022*11*123456789*20151019*105421~
HL*1**20*1~
NM1*PR*2*Fidelis Care New York*****PI*11315~
HL*2*1*21*1~
NM1*1P*2*Hospital*****XX*1122334455~
HL*3*2*22*0~
NM1*IL*1*LASTNAME*FIRSTNAME****MI*98765432111~
REF*18*PL010000*Fidelis Care Platinum~
N3*1 Main Street~
N4*City*NY*11122~
DMG*D8*19630227*M~
DTP*291*D8*20150309~
DTP*346*D8*20150101~
DTP*347*D8*20151031~
EB*1*IND*30*HM*Fidelis Care Platinum~
EB*G*IND*30*HM*Fidelis Care Platinum*23*5000.00~
EB*G*IND*30*HM*Fidelis Care Platinum*29*2284.14~
EB*G*FAM*30*HM*Fidelis Care Platinum*23*4000.00~
EB*G*FAM*30*HM*Fidelis Care Platinum*29*1241.14~
EB*1*IND*1*HM*Fidelis Care Platinum*******Y~
EB*A*IND*1*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*1*HM*Fidelis Care Platinum**15****N*Y~
EB*I*IND*1*HM*Fidelis Care Platinum*******N~
EB*1*IND*12*HM*Fidelis Care Platinum*******Y~
EB*A*IND*12*HM*Fidelis Care Platinum***.1***Y*Y~
EB*B*IND*12*HM*Fidelis Care Platinum**0****Y*Y~
EB*I*IND*12*HM*Fidelis Care Platinum*******N~
EB*1*IND*3*HM*Fidelis Care Platinum*******Y~
EB*A*IND*3*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*3*HM*Fidelis Care Platinum**35****N*Y~
EB*I*IND*3*HM*Fidelis Care Platinum*******N~
EB*1*IND*33*HM*Fidelis Care Platinum*******Y~
EB*A*IND*33*HM*Fidelis Care Platinum***0***Y*Y~
EB*B*IND*33*HM*Fidelis Care Platinum**35****Y*Y~
EB*I*IND*33*HM*Fidelis Care Platinum*******N~
EB*1*IND*35*HM*Fidelis Care Platinum*******Y~
MSG*Contact Dentaquest at 1-800-341-8478~
EB*A*IND*35*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*35*HM*Fidelis Care Platinum**0****N*Y~
EB*I*IND*35*HM*Fidelis Care Platinum*******N~
EB*1*IND*4*HM*Fidelis Care Platinum*******Y~
EB*A*IND*4*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*4*HM*Fidelis Care Platinum**35****N*Y~
EB*I*IND*4*HM*Fidelis Care Platinum*******N~
EB*1*IND*47*HM*Fidelis Care Platinum*******Y~
EB*A*IND*47*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*47*HM*Fidelis Care Platinum**100****N*Y~
EB*I*IND*47*HM*Fidelis Care Platinum*******N~
EB*1*IND*48*HM*Fidelis Care Platinum*******Y~
EB*A*IND*48*HM*Fidelis Care Platinum***0***Y*Y~
EB*B*IND*48*HM*Fidelis Care Platinum**500****Y*Y~
EB*I*IND*48*HM*Fidelis Care Platinum*******N~
EB*1*IND*49*HM*Fidelis Care Platinum*******Y~
EB*A*IND*49*HM*Fidelis Care Platinum***0***Y*Y~
EB*B*IND*49*HM*Fidelis Care Platinum**500****Y*Y~
EB*I*IND*49*HM*Fidelis Care Platinum*******N~
EB*1*IND*50*HM*Fidelis Care Platinum*******Y~
MSG*Prior Authorization is required for some services.~
EB*A*IND*50*HM*Fidelis Care Platinum***0***Y*Y~
EB*B*IND*50*HM*Fidelis Care Platinum**100****Y*Y~
EB*I*IND*50*HM*Fidelis Care Platinum*******N~
EB*1*IND*52*HM*Fidelis Care Platinum*******Y~
EB*A*IND*52*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*52*HM*Fidelis Care Platinum**100****N*Y~
EB*1*IND*52*HM*Fidelis Care Platinum*******N~
EB*1*IND*53*HM*Fidelis Care Platinum*******Y~
EB*A*IND*53*HM*Fidelis Care Platinum***0***Y*Y~
EB*B*IND*53*HM*Fidelis Care Platinum**100****Y*Y~
EB*I*IND*53*HM*Fidelis Care Platinum*******N~
EB*1*IND*59*HM*Fidelis Care Platinum*******Y~
MSG*Air/Water and Non-Emergency Services Require Authorization.~
EB*A*IND*59*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*59*HM*Fidelis Care Platinum**100****N*Y~
EB*I*IND*59*HM*Fidelis Care Platinum*******N~
EB*1*IND*75*HM*Fidelis Care Platinum*******Y~
EB*A*IND*75*HM*Fidelis Care Platinum***.1***Y*Y~
EB*B*IND*75*HM*Fidelis Care Platinum**0****Y*Y~
EB*I*IND*75*HM*Fidelis Care Platinum*******N~
EB*1*IND*86*HM*Fidelis Care Platinum*******Y~
EB*A*IND*86*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*86*HM*Fidelis Care Platinum**0****N*Y~
EB*1*IND*86*HM*Fidelis Care Platinum*******N~
EB*1*IND*88*HM*Fidelis Care Platinum*******Y~
MSG*Contact Caremark at 1-800-345-5413~
EB*A*IND*88*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*88*HM*Fidelis Care Platinum**0****N*Y~
EB*I*IND*88*HM*Fidelis Care Platinum*******N~
EB*1*IND*98*HM*Fidelis Care Platinum*******Y~
EB*A*IND*98*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*98*HM*Fidelis Care Platinum**15****N*Y~
EB*I*IND*98*HM*Fidelis Care Platinum*******N~
EB*1*IND*AC*HM*Fidelis Care Platinum*******Y~
EB*A*IND*AC*HM*Fidelis Care Platinum***0***Y*Y~
EB*B*IND*AC*HM*Fidelis Care Platinum*23*25**VS*60*Y*Y~
EB*I*IND*AC*HM*Fidelis Care Platinum*******N~
EB*1*IND*AH*HM*Fidelis Care Platinum*******Y~
EB*A*IND*AH*HM*Fidelis Care Platinum***0***Y*Y~
EB*B*IND*AH*HM*Fidelis Care Platinum*23*500**DY*200*Y*Y~
EB*I*IND*AH*HM*Fidelis Care Platinum*******N~
EB*1*IND*AL*HM*Fidelis Care Platinum*******Y~
MSG*Contact Davis Vision at 1-800-773-2847~
EB*A*IND*AL*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*AL*HM*Fidelis Care Platinum**0****N*Y~
EB*I*IND*AL*HM*Fidelis Care Platinum*******N~
EB*1*IND*MH*HM*Fidelis Care Platinum*******Y~
MSG*Outpatient Benefits~
EB*A*IND*MH*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*MH*HM*Fidelis Care Platinum**15****N*Y~
EB*I*IND*MH*HM*Fidelis Care Platinum*******N~
MSG*Inpatient Benefits~
EB*1*IND*MH*HM*Fidelis Care Platinum*******Y~
MSG*Inpatient Benefits~
EB*A*IND*MH*HM*Fidelis Care Platinum***0***Y*Y~
EB*B*IND*MH*HM*Fidelis Care Platinum**500****Y*Y~
EB*I*IND*MH*HM*Fidelis Care Platinum*******N~
MSG*Outpatient Benefits~
EB*1*IND*UC*HM*Fidelis Care Platinum*******Y~
EB*A*IND*UC*HM*Fidelis Care Platinum***0***N*Y~
EB*B*IND*UC*HM*Fidelis Care Platinum**55****N*Y~
EB*1*IND*UC*HM*Fidelis Care Platinum*******N~
SE*122*091328400~
GE*1*152928969~
IEA*1*152928969~

X12 271 Bad Response example:

Copy
ISA*00* *00* *ZZ*FIDELIS*ZZ*123456789ABC*151019*1051*{*00501*152928966*0*T*^~
GS*HB*FIDELIS*123456789ABC*20151019*105151*152928966*X*005010X279A1~
ST*271*31092*005010X279A1~
BHT*0022*11*GXTMCNFHWMKX*20151019*105151~
HL*1**20*1~
NM1*PR*2*Fidelis Care New York*****PI*11315~
HL*2*1*21*1~
NM1*1P*1******SV*Testing~
HL*3*2*22*0~
NM1*IL*1******MI*11223344551~
AAA*N**58*C~
AAA*N**73*C~
DTP*291*D8*20151019~
SE*12*31092~
GE*1*152928966~
IEA*1*152928966~