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)
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 HierarchyHere 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.
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.
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.
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:
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
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.
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
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:
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:
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~