Acknowledgments (999 / TA1 / 277CA)
Outcome
You can read every layer of the ack chain — TA1 envelope, 999 functional, 277CA claim — interpret the codes correctly, and route the right kind of failure to the right kind of fix.
Prerequisites
Familiarity with the ack hierarchy and segment shapes (9.1 — Glossary, 9.3 — Acknowledgment codes).
The ack hierarchy
Each ack closes a different question:
| Ack | Question it answers |
|---|---|
TA1 | Did the interchange envelope parse? |
999 | Did the 837's functional content (loops + segments) parse? |
277CA | Did the payer accept individual claims into adjudication? |
A 277CA "accepted" answer is not payment — adjudication can still deny later. The 277CA only confirms the claim got past the gate.
Reading a TA1
A TA1 arriving on its own (separate inbound) is parsed by
packages/x12/src/inbound/ack-ta1.ts.
TA1*ICN0000123*250131*1234*A*000~
| Element | Value | Meaning |
|---|---|---|
TA101 | ICN0000123 | Acknowledged interchange control number. |
TA102 | 250131 | Date. |
TA103 | 1234 | Time. |
TA104 | A | Status — A accepted, E accepted with errors, R rejected. |
TA105 | 000 | Note code (see 9.3). |
A TA104 = R is envelope-fatal — the partner could not parse what we
sent. The most common cause is wrong sender / receiver authorization
(TA105 = 003). No 999 will follow; the operator must fix and resubmit.
Reading a 999
The 999 has nested response loops:
ST*999*0001~
AK1*HC*1*005010X222A1~ (group response header)
AK2*837*0001*005010X222A1~ (transaction response header)
IK3*NM1*4*2010BB*8~ (segment with errors — NM1 at position 4 in 2010BB, code 8 = element errors follow)
IK4*1:1*1098*7~ (element errors — NM101 sub 1, ref 1098 reason 7 = invalid code value)
IK5*R~ (transaction rejected)
AK9*P*1*1*0~ (group partial — 1 of 1 transactions, 0 accepted)
SE*8*0001~
| Segment | Meaning |
|---|---|
AK1 | Group-level response header. Echoes our GS01 and GS08. |
AK2 | Transaction-level response header. Echoes our ST01 and ST02. |
IK3 | Segment-level error inside a transaction. |
IK4 | Element-level error inside the segment named in the preceding IK3. |
CTX | Context — the loop and position the error refers to. |
IK5 | Transaction response trailer — A/E/R/P. |
AK9 | Group response trailer — A/E/R/P. |
Read top-down: AK1 says "this group is for 837 005010X222A1". AK2
says "this transaction is 837 control number 0001". IK3 / IK4 cite
the specific error. IK5 says transaction-level outcome. AK9 says
group-level outcome.
The transaction's IK5 = R means the whole transaction was
rejected — not just the segment cited. Most payers reject at first
error.
Source: packages/x12/src/inbound/ack-999.ts.
Reading a 277CA
The 277CA is a 277 with BHT02 = 08. It carries one STC per claim,
inside a 2200D loop that mirrors our outbound 2300:
ST*277*0001~
BHT*0085*08*REF12345*20260131*1200*TH~
HL*1**20*1~
NM1*PR*2*ANTHEM PPO*****PI*60054~
HL*2*1*21*1~
NM1*41*2*ACME BILLING*****46*1234567890~
HL*3*2*19*1~
NM1*85*2*ACME PROVIDER*****XX*9876543210~
HL*4*3*PT~
NM1*QC*1*DOE*JOHN****MI*ABC123~
TRN*2*PT123*1234567890~ (echoes our outbound CLM01)
STC*A2:20*20260131*WQ*250.00~ (status — accepted into adjudication, $250 acknowledged)
DTP*472*RD8*20260101-20260101~
REF*1K*ANTHEM-CC-99887766~ (payer claim control number — save this!)
SE*15*0001~
| Segment | Notable elements |
|---|---|
BHT | BHT02 = 08 (claim ack); BHT04 is partner's reference. |
HL | Hierarchy: payer → submitter → provider → patient. |
NM1 | Same shape as 837 outbound — names echo. |
TRN | TRN02 echoes our outbound CLM01. The matching key. |
STC | STC01 composite category : status : entity. The decision. |
STC02 | Effective date. |
STC04 | Total amount acknowledged. |
REF*1K | Payer claim control number — record this on the claim. |
STC01 is the field every operator should know:
STC01 | Meaning | What to do |
|---|---|---|
A1:19:… | Receipt acknowledged | Wait for A2. |
A2:20:… | Accepted into adjudication | Done — wait for 835. |
A3:21:… | Returned as un-processable | Read narrative; rebuild. |
A6:21:… | Rejected for missing info | Read narrative; supply the info; rebuild. |
A7:… | Rejected for invalid info | Same. |
A8:… | Rejected for relational error | Cross-reference issue (e.g. POS doesn't match service location); rebuild. |
STC03 carries the human-readable narrative. Read it before doing
anything; it usually names the exact field at fault.
Full code lists: 9.3 — Acknowledgment codes.
Steps to consume an ack chain
The flow is automated; operator awareness for diagnosis only.
Each inbound ack lands as a transaction record at
/transactionswithtx_type = TA1/999/277CA. The correlation ID points at the originating outbound (and through it, the source claim).The response-processor parses the ack and updates the source claim's status:
TA1 R→ claim back toBUILT;error_detailscarries TA1 reason.999 A→ claim staysSUBMITTED; waits for 277CA.999 R/999 Pwith this transaction rejected → claim back toBUILTwith structuredIK3/IK4errors.277CA A2→ claim advances toACCEPTED;payer_claim_control_numberrecorded fromREF*1K.277CA A3-A8→ claim advances toREJECTED;STCdecoded into theerror_details.
Operator-side rcm-app surfaces the error details on the claim detail's Submission tab. The billing clerk handles the rest.
Validation
| Check | Expected |
|---|---|
| Each inbound ack creates a transaction record with the correct correlation | Yes. |
| Source claim's status advances per ack outcome | Yes. |
payer_claim_control_number populated from REF*1K | Yes — confirm on the claim detail's Identifiers section. |
277CA STC narrative visible to the billing clerk | Yes — surfaced on the claim's Submission tab. |
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Inbound ack received but claim's status does not change | Correlation failed — the ack's TRN02 does not match a known outbound CLM01 | Open the inbound transaction; manually correlate via the admin endpoint. |
999 IK5 = E but claim status stays SUBMITTED | E is "accepted with errors" — informational, claim should continue | Correct behavior; check that E is what you saw. |
| 277CA never arrives | Partner does not produce 277CA, or 277CA inbound capability not enabled | Check capability; confirm with partner. |
STC01 = A0 "forwarded" sits indefinitely | Partner is a clearinghouse passing through to the real payer; another ack will come | Wait — the next-tier ack carries the real decision. |