The 277CA (005010X214) is the claim acknowledgment a payer or clearinghouse returns after receiving 837 claims. It reports, claim by claim, whether each one was accepted into adjudication or rejected at the front-end edits.
It is a hierarchy of information source, information receiver, billing provider and patient. Each claim is reported in loop 2200D with an STC status and the payer's claim control number.
005010X214HN (GS01)TS277A in EdiFabric.Templates.HipaaThe full X12 277CA layout from its OpenEDI definition, the same model ediFabric uses to parse, validate and generate it: 13 loops and 38 segment positions, in file order. Loops are shaded and their segments indented; Max use is how many times a segment or loop may repeat.
| Segment / loop | Name | Usage | Max use |
|---|---|---|---|
ST | Transaction Set Header | Required | 1 |
BHT | Beginning of Hierarchical Transaction | Required | 1 |
| Loop 2000A | Information Source Level | Required | 1 |
HL | Information Source Level | Required | 1 |
| Loop 2100A | Information Source Name | Required | 1 |
NM1 | Information Source Name | Required | 1 |
| Loop 2200A | Transmission Receipt Control Identifier | Required | 1 |
TRN | Transmission Receipt Control Identifier | Required | 1 |
DTP | Information Source Receipt Date | Required | 1 |
DTP | Information Source Process Date | Required | 1 |
| Loop 2000B | Information Receiver Level | Required | 1 |
HL | Information Receiver Level | Required | 1 |
| Loop 2100B | Information Receiver Name | Required | 1 |
NM1 | Information Receiver Name | Required | 1 |
| Loop 2200B | Information Receiver Application Trace Identifier | Required | 1 |
TRN | Information Receiver Application Trace Identifier | Required | 1 |
STC | Information Receiver Status Information | Required | >1 |
QTY | Total Accepted Quantity | Situational | 1 |
QTY | Total Rejected Quantity | Situational | 1 |
AMT | Total Accepted Amount | Situational | 1 |
AMT | Total Rejected Amount | Situational | 1 |
| Loop 2000C | Billing Provider of Service Level | Situational | >1 |
HL | Billing Provider of Service Level | Required | 1 |
| Loop 2100C | Billing Provider Name | Required | 1 |
NM1 | Billing Provider Name | Required | 1 |
| Loop 2200C | Provider of Service Information Trace Identifier | Situational | 1 |
TRN | Provider of Service Information Trace Identifier | Required | 1 |
STC | Billing Provider Status Information | Situational | >1 |
REF | Provider Secondary Identifier | Situational | 3 |
QTY | Total Accepted Quantity | Situational | 1 |
QTY | Total Rejected Quantity | Situational | 1 |
AMT | Total Accepted Amount | Situational | 1 |
AMT | Total Rejected Amount | Situational | 1 |
| Loop 2000D | Patient Level | Situational | >1 |
HL | Patient Level | Required | 1 |
| Loop 2100D | Patient Name | Required | 1 |
NM1 | Patient Name | Required | 1 |
| Loop 2200D | Claim Status Tracking Number | Required | >1 |
TRN | Claim Status Tracking Number | Required | 1 |
STC | Claim Level Status Information | Required | >1 |
REF | Payer Claim Control Number | Situational | 1 |
REF | Claim Identifier for Transmission Intermediaries | Situational | 1 |
REF | Institutional Bill Type Identification | Situational | 1 |
DTP | Claim Level Service Date | Required | 1 |
| Loop 2220D | Service Line Information | Situational | >1 |
SVC | Service Line Information | Required | 1 |
STC | Service Line Level Status Information | Required | >1 |
REF | Service Line Item Identification | Required | 1 |
REF | Pharmacy Prescription Number | Situational | 1 |
DTP | Service Line Date | Required | 1 |
SE | Transaction Set Trailer | Required | 1 |
Usage follows the 005010X214 implementation guide: Required segments must be sent, Situational ones only when the guide's condition applies. Trading partners often add their own rules in companion guides - ediFabric templates can be adjusted to match. Open the element-level definition in the EdiNation spec library.
An acknowledgment that accepts one professional claim into adjudication. Paste it into EdiNation to see every element named and validated.
ISA*00* *00* *ZZ*RECEIVERID *ZZ*SUBMITTERID *260929*1200*^*00501*000000002*0*T*:~ GS*HN*RECEIVERID*SUBMITTERID*20260929*1200*2*X*005010X214~ ST*277*0001*005010X214~ BHT*0085*08*277X2140001*20260929*1200*TH~ HL*1**20*1~ NM1*PR*2*KEY INSURANCE COMPANY*****PI*999996666~ TRN*1*0091182~ DTP*050*D8*20260929~ DTP*009*D8*20260929~ HL*2*1*21*1~ NM1*41*2*PREMIER BILLING SERVICE*****46*TGJ23~ TRN*2*244579~ STC*A1:19:PR*20260929*WQ*100~ QTY*90*1~ AMT*YU*100~ HL*3*2*19*1~ NM1*85*2*BEN KILDARE SERVICE*****XX*9876543210~ HL*4*3*PT~ NM1*QC*1*SMITH*TED****MI*000221111A~ TRN*2*26463774~ STC*A2:20:PR*20260929*WQ*100~ REF*1K*2026272000001~ DTP*472*RD8*20260920-20260920~ SE*22*0001~ GE*1*2~ IEA*1*000000002~
ediFabric turns every loop, segment and element into a named field. This is the transaction from the sample, in the JSON that ediFabric Native and Cloud return and accept.
{
"ST": {
"TransactionSetIdentifierCode_01": "277",
"TransactionSetControlNumber_02": "0001",
"ImplementationConventionPreference_03": "005010X214"
},
"BHT_BeginningOfHierarchicalTransaction": {
"HierarchicalStructureCode_01": "0085",
"TransactionSetPurposeCode_02": "08",
"SubmitterTransactionIdentifier_03": "277X2140001",
"TransactionSetCreationDate_04": "20260929",
"TransactionSetCreationTime_05": "1200",
"TransactionTypeCode_06": "TH"
},
"Loop2000A": {
"HL_InformationSourceLevel": {
"HierarchicalIDNumber_01": "1",
"HierarchicalLevelCode_03": "20",
"HierarchicalChildCode_04": "1"
},
"Loop2100A": {
"NM1_InformationSourceName": {
"EntityIdentifierCode_01": "PR",
"EntityTypeQualifier_02": "2",
"ResponseContactLastorOrganizationName_03": "KEY INSURANCE COMPANY",
"IdentificationCodeQualifier_08": "PI",
"ResponseContactIdentifier_09": "999996666"
}
},
"Loop2200A": {
"TRN_TransmissionReceiptControlIdentifier": {
"TraceTypeCode_01": "1",
"CurrentTransactionTraceNumber_02": "0091182"
},
"DTP_InformationSourceReceiptDate": {
"DateTimeQualifier_01": "050",
"DateTimePeriodFormatQualifier_02": "D8",
"DateTimePeriod_03": "20260929"
},
"DTP_InformationSourceProcessDate": {
"DateTimeQualifier_01": "009",
"DateTimePeriodFormatQualifier_02": "D8",
"DateTimePeriod_03": "20260929"
}
},
"Loop2000B": {
"HL_InformationReceiverLevel": {
"HierarchicalIDNumber_01": "2",
"HierarchicalParentIDNumber_02": "1",
"HierarchicalLevelCode_03": "21",
"HierarchicalChildCode_04": "1"
},
"Loop2100B": {
"NM1_InformationReceiverName": {
"EntityIdentifierCode_01": "41",
"EntityTypeQualifier_02": "2",
"ResponseContactLastorOrganizationName_03": "PREMIER BILLING SERVICE",
"IdentificationCodeQualifier_08": "46",
"ResponseContactIdentifier_09": "TGJ23"
}
},
"Loop2200B": {
"TRN_InformationReceiverApplicationTraceIdentifier": {
"TraceTypeCode_01": "2",
"CurrentTransactionTraceNumber_02": "244579"
},
"STC_InformationReceiverStatusInformation": [
{
"HealthCareClaimStatus_01": {
"HealthCareClaimStatusCategoryCode_01": "A1",
"StatusCode_02": "19",
"EntityIdentifierCode_03": "PR"
},
"Date_02": "20260929",
"ActionCode_03": "WQ",
"TotalSubmittedChargesForUnitWork_04": "100"
}
],
"QTY_TotalAcceptedQuantity": {
"QuantityQualifier_01": "90",
"AmbulancePatientCount_02": "1"
},
"AMT_TotalAcceptedAmount": {
"AmountQualifierCode_01": "YU",
"TotalClaimChargeAmount_02": "100"
}
},
"Loop2000C": [
{
"HL_BillingProviderOfServiceLevel": {
"HierarchicalIDNumber_01": "3",
"HierarchicalParentIDNumber_02": "2",
"HierarchicalLevelCode_03": "19",
"HierarchicalChildCode_04": "1"
},
"Loop2100C": {
"NM1_BillingProviderName": {
"EntityIdentifierCode_01": "85",
"EntityTypeQualifier_02": "2",
"ResponseContactLastorOrganizationName_03": "BEN KILDARE SERVICE",
"IdentificationCodeQualifier_08": "XX",
"ResponseContactIdentifier_09": "9876543210"
}
},
"Loop2000D": [
{
"HL_PatientLevel": {
"HierarchicalIDNumber_01": "4",
"HierarchicalParentIDNumber_02": "3",
"HierarchicalLevelCode_03": "PT"
},
"Loop2100D": {
"NM1_PatientName": {
"EntityIdentifierCode_01": "QC",
"EntityTypeQualifier_02": "1",
"ResponseContactLastorOrganizationName_03": "SMITH",
"ResponseContactFirstName_04": "TED",
"IdentificationCodeQualifier_08": "MI",
"ResponseContactIdentifier_09": "000221111A"
}
},
"Loop2200D": [
{
"TRN_ClaimStatusTrackingNumber": {
"TraceTypeCode_01": "2",
"CurrentTransactionTraceNumber_02": "26463774"
},
"STC_ClaimLevelStatusInformation": [
{
"HealthCareClaimStatus_01": {
"HealthCareClaimStatusCategoryCode_01": "A2",
"StatusCode_02": "20",
"EntityIdentifierCode_03": "PR"
},
"Date_02": "20260929",
"ActionCode_03": "WQ",
"TotalSubmittedChargesForUnitWork_04": "100"
}
],
"REF_PayerClaimControlNumber": {
"ReferenceIdentificationQualifier_01": "1K",
"MemberGrouporPolicyNumber_02": "2026272000001"
},
"DTP_ClaimLevelServiceDate": {
"DateTimeQualifier_01": "472",
"DateTimePeriodFormatQualifier_02": "RD8",
"DateTimePeriod_03": "20260920-20260920"
}
}
]
}
]
}
]
}
},
"SE": {
"NumberofIncludedSegments_01": "22",
"TransactionSetControlNumber_02": "0001"
}
}Read the file into typed objects with ediFabric .NET, convert it to JSON in process with the ediFabric Native bindings for Python, Java and C, or post it to the ediFabric Cloud REST API from any language.
using EdiFabric.Templates.Hipaa5010; License.SetSerial("YOUR_SERIAL_KEY"); using (var stream = File.OpenRead(@"C:\edi\277CA.txt")) using (var reader = new X12Reader(stream, "EdiFabric.Templates.Hipaa")) { var items = await reader.ReadToEndAsync(); foreach (var transaction in items.OfType<TS277A>()) { if (transaction.IsValid(out MessageErrorContext errors)) Console.WriteLine($"{transaction.ST.TransactionSetControlNumber_02} is valid"); else Console.WriteLine(string.Join(Environment.NewLine, errors.Flatten())); } }
import json import edifabric_x12 as ef serial = "YOUR_SERIAL_KEY" ef.load_library() ef.set_serial(serial) ef.set_map(json.dumps({"default": serial, "maps": {}})) edi = open("277CA.txt", "rb").read() output, offset = ef.parse(edi, ef.ParseMode.JSON_VALIDATE) transactions = output[:offset] report = json.loads(output[offset:]) print(report["errors_count"])
import com.edifabric.nativex12.EdiFabricX12; import com.edifabric.nativex12.ParseMode; import com.edifabric.nativex12.ParseResult; String serial = "YOUR_SERIAL_KEY"; EdiFabricX12.loadLibrary(); EdiFabricX12.setSerial(serial); EdiFabricX12.setMap("{\"default\":\"" + serial + "\",\"maps\":{}}"); String edi = Files.readString(Path.of("277CA.txt")); ParseResult result = EdiFabricX12.parse(edi, ParseMode.JSON_VALIDATE); System.out.println(result.getTransactions()); System.out.println(result.getReport());
#include "edifabric_x12.h" const char *serial = "YOUR_SERIAL_KEY"; ef_parse_result result; if (ef_load_library(NULL) != 0) return 1; ef_set_serial(serial); ef_set_map("{\"default\":\"YOUR_SERIAL_KEY\",\"maps\":{}}"); char *edi = read_file("277CA.txt", NULL); /* helper in example_all_functions.c */ if (ef_parse(edi, EF_PARSE_JSON_VALIDATE, NULL, &result) == 0) { /* transactions = output[0 .. offset), report = output[offset .. length) */ fwrite(result.output.data, 1, (size_t)result.output.length, stdout); ef_free(result.output.data); }
curl -X POST 'https://api.edination.com/v2/x12/read' \ -H 'Ocp-Apim-Subscription-Key: YOUR_SERIAL_KEY' \ -H 'Content-Type: application/octet-stream' \ --data-binary '@277CA.txt'
Populate a TS277A object in .NET, or pass JSON in the shape shown above to ediFabric Native or ediFabric Cloud, and get a valid 277CA file back.
using EdiFabric.Templates.Hipaa5010; License.SetSerial("YOUR_SERIAL_KEY"); var transaction = new TS277A(); // Claim acknowledgment transaction set header transaction.ST = new ST(); transaction.ST.TransactionSetIdentifierCode_01 = "277"; transaction.ST.TransactionSetControlNumber_02 = "0001"; transaction.ST.ImplementationConventionPreference_03 = "005010X214"; // Information source acknowledgment created on September 29, 2026 transaction.BHT_BeginningOfHierarchicalTransaction = new BHT_BeginningOfHierarchicalTransaction_5(); transaction.BHT_BeginningOfHierarchicalTransaction.HierarchicalStructureCode_01 = "0085"; transaction.BHT_BeginningOfHierarchicalTransaction.TransactionSetPurposeCode_02 = "08"; transaction.BHT_BeginningOfHierarchicalTransaction.SubmitterTransactionIdentifier_03 = "277X2140001"; transaction.BHT_BeginningOfHierarchicalTransaction.TransactionSetCreationDate_04 = "20260929"; transaction.BHT_BeginningOfHierarchicalTransaction.TransactionSetCreationTime_05 = "1200"; transaction.BHT_BeginningOfHierarchicalTransaction.TransactionTypeCode_06 = "TH"; // Begin 2000A Loop INFORMATION SOURCE LEVEL transaction.Loop2000A = new List<Loop_2000A_277A>(); var loop2000A = new Loop_2000A_277A(); loop2000A.HL_InformationSourceLevel = new HL_BillingProviderHierarchicalLevel(); loop2000A.HL_InformationSourceLevel.HierarchicalIDNumber_01 = "1"; loop2000A.HL_InformationSourceLevel.HierarchicalLevelCode_03 = "20"; loop2000A.HL_InformationSourceLevel.HierarchicalChildCode_04 = "1"; transaction.Loop2000A.Add(loop2000A); // ... set the remaining loops and segments the same way // SegmentBuilders is in the Common project of the example repository using (var stream = new MemoryStream()) { using (var writer = new X12Writer(stream)) { writer.Write(SegmentBuilders.BuildIsa("1")); writer.Write(SegmentBuilders.BuildGs("1", "SENDER1", "RECEIVER1", "005010X214")); writer.Write(transaction); } Console.WriteLine(Encoding.UTF8.GetString(stream.ToArray())); }
import json import edifabric_x12 as ef serial = "YOUR_SERIAL_KEY" ef.load_library() ef.set_serial(serial) ef.set_map(json.dumps({"default": serial, "maps": {}})) # the transactions JSON returned by ef.parse, edited or produced by your application transactions = open("277CA.json", "rb").read() edi = ef.build(transactions, postfix="\r\n") print(edi)
import com.edifabric.nativex12.EdiFabricX12; String serial = "YOUR_SERIAL_KEY"; EdiFabricX12.loadLibrary(); EdiFabricX12.setSerial(serial); EdiFabricX12.setMap("{\"default\":\"" + serial + "\",\"maps\":{}}"); // the transactions JSON returned by parse, edited or produced by your application String transactions = Files.readString(Path.of("277CA.json")); String edi = EdiFabricX12.build(transactions, "\r\n"); System.out.println(edi);
#include "edifabric_x12.h" ef_buffer edi; if (ef_load_library(NULL) != 0) return 1; ef_set_serial("YOUR_SERIAL_KEY"); ef_set_map("{\"default\":\"YOUR_SERIAL_KEY\",\"maps\":{}}"); /* the transactions JSON returned by ef_parse, edited or produced by your application */ char *transactions = read_file("277CA.json", NULL); if (ef_build(transactions, "\r\n", &edi) == 0) { fwrite(edi.data, 1, (size_t)edi.length, stdout); ef_free(edi.data); }
# the JSON returned by /read, edited or produced by your application curl -X POST 'https://api.edination.com/v2/x12/write' \ -H 'Ocp-Apim-Subscription-Key: YOUR_SERIAL_KEY' \ -H 'Content-Type: application/json' \ --data-binary '@277CA.json' \ -o '277CA.txt'
The 999 reports whether the 837 file is structurally valid against the implementation guide. The 277CA comes after and reports business-level acceptance or rejection of each claim.
STC01 is a composite of category code, status code and entity. Category A1 is an acknowledgment of receipt, A2 acceptance into adjudication, A3 returned as unprocessable, A7 rejected for invalid information.
No. Both use ST*277, but the 277CA (005010X214) acknowledges submitted claims, while the 277 (005010X212) answers a 276 status request.
In .NET, install EdiFabric and EdiFabric.Templates.Hipaa, read the file with X12Reader into TS277A objects and write them back with X12Writer. From Python, Java or C, use ediFabric Native, which converts 277CA files to JSON and JSON back to X12 inside your process. From any other language, post the file to the ediFabric Cloud REST API.