Skip to main content

Fast FHIR ClaimResponse

Complete JSON schema and reference for Fast FHIR ClaimResponse resources returned by Turquoise after claim adjudication.

Overview

ClaimResponse is the Turquoise adjudication decision. It includes allowed amounts, benefit determinations, and settlement metadata including the opaque Stripe trace ID.

Field Reference

FieldTypeRequiredDescription
resourceTypestringAlways "ClaimResponse"
idstringUnique response ID (e.g., "CLMR-2024-001")
statusstringResponse status: "active", "cancelled"
usestringAlways "claim"
claimobjectReference to original claim: { "reference": "Claim/CLM-2024-001" }
createdtimestampISO 8601 adjudication timestamp
outcomestringAdjudication outcome: "complete", "partial", "error"
itemarrayArray of adjudicated line items
adjudicationarrayTop-level adjudication summary
extensionarrayCustom extensions (stripe-trace-id, aeob-reference, etc.)
paymentobjectPayment details object (see below)

Adjudication Categories

Each adjudication entry has a category that classifies the claim component:

CategoryCodeDescriptionExample
Allowed AmountallowedamountNegotiated rate$1,200.00
BenefitbenefitPlan's payment amount$1,100.00
Member CoinsurancecoinsuranceMember's % responsibility$100.00 (EOB)
Member DeductibledeductibleDeductible applied$0.00 (met)
Network DeterminationnetworkIn-network status"in_network"
AEOB Referenceaeob-referenceLink to AEOB document"AEOB-2024-001"

Extensions

stripe-trace-id

Unique opaque identifier for Stripe settlement tracking (no PHI):

{
"url": "https://turquoise.health/stripe-trace-id",
"valueString": "trace_0310_abc123xyz"
}

Use this to reconcile bank deposits to claim adjudications.

aeob-reference

Reference to Advance Explanation of Benefits:

{
"url": "https://turquoise.health/aeob-reference",
"valueString": "AEOB-2024-001"
}

network-status

Network determination:

{
"url": "https://turquoise.health/network-status",
"valueCode": "in_network|out_of_network|unknown"
}

Complete Example

Full ClaimResponse for institutional colonoscopy claim:

{
"resourceType": "ClaimResponse",
"id": "CLMR-2024-001",
"status": "active",
"use": "claim",
"claim": {
"reference": "Claim/CLM-2024-001"
},
"created": "2024-03-11T10:30:00Z",
"outcome": "complete",
"extension": [
{
"url": "https://turquoise.health/stripe-trace-id",
"valueString": "trace_0310_abc123xyz"
},
{
"url": "https://turquoise.health/aeob-reference",
"valueString": "AEOB-2024-001"
},
{
"url": "https://turquoise.health/network-status",
"valueCode": "in_network"
}
],
"adjudication": [
{
"category": {
"coding": [
{
"code": "allowedamount",
"display": "Allowed Amount"
}
]
},
"amount": {
"value": 1500.00,
"currency": "USD"
}
},
{
"category": {
"coding": [
{
"code": "benefit",
"display": "Benefit"
}
]
},
"amount": {
"value": 1400.00,
"currency": "USD"
}
},
{
"category": {
"coding": [
{
"code": "coinsurance",
"display": "Member Coinsurance"
}
]
},
"amount": {
"value": 100.00,
"currency": "USD"
}
}
],
"item": [
{
"itemSequence": 1,
"adjudication": [
{
"category": {
"coding": [
{
"code": "allowedamount",
"display": "Allowed Amount"
}
]
},
"amount": {
"value": 1500.00,
"currency": "USD"
}
},
{
"category": {
"coding": [
{
"code": "benefit",
"display": "Benefit"
}
]
},
"amount": {
"value": 1400.00,
"currency": "USD"
}
}
]
}
],
"payment": {
"type": {
"coding": [
{
"code": "stripe_ach",
"display": "Stripe ACH Transfer"
}
]
},
"amount": {
"value": 1400.00,
"currency": "USD"
},
"date": "2024-03-12",
"note": "Settlement initiated. Expected arrival 48 hours."
}
}

Item Adjudication Structure

For multi-item claims, each item is adjudicated separately:

{
"item": [
{
"itemSequence": 1,
"adjudication": [
{
"category": { "coding": [{ "code": "allowedamount" }] },
"amount": { "value": 1500.00, "currency": "USD" }
},
{
"category": { "coding": [{ "code": "benefit" }] },
"amount": { "value": 1400.00, "currency": "USD" }
}
]
},
{
"itemSequence": 2,
"adjudication": [
{
"category": { "coding": [{ "code": "allowedamount" }] },
"amount": { "value": 250.00, "currency": "USD" }
},
{
"category": { "coding": [{ "code": "benefit" }] },
"amount": { "value": 250.00, "currency": "USD" }
}
]
}
]
}

Payment Object

Settlement information in the payment field:

{
"payment": {
"type": {
"coding": [
{
"code": "stripe_ach",
"display": "Stripe ACH Transfer"
}
]
},
"amount": {
"value": 1400.00,
"currency": "USD"
},
"date": "2024-03-12",
"note": "Settlement initiated via Stripe Connect. Check webhook for completion."
}
}
FieldTypeDescription
type.coding[0].codestring"stripe_ach" (always)
amount.valuedecimalAmount to be paid (after deductible, copay)
datedateExpected settlement date
notestringSettlement status message

Extracting Payout Instructions

To extract settlement information from ClaimResponse:

def extract_settlement_info(claim_response):
return {
'claim_response_id': claim_response['id'],
'claim_id': claim_response['claim']['reference'].split('/')[-1],
'outcome': claim_response['outcome'],
'stripe_trace_id': next(
(ext['valueString'] for ext in claim_response.get('extension', [])
if ext['url'] == 'https://turquoise.health/stripe-trace-id'),
None
),
'allowed_amount': next(
(adj['amount']['value'] for adj in claim_response['adjudication']
if adj['category']['coding'][0]['code'] == 'allowedamount'),
0
),
'benefit_amount': next(
(adj['amount']['value'] for adj in claim_response['adjudication']
if adj['category']['coding'][0]['code'] == 'benefit'),
0
),
'settlement_amount': claim_response['payment']['amount']['value'],
'expected_date': claim_response['payment']['date']
}

Adjudication Outcomes

Outcome: complete

Claim fully adjudicated with no issues:

{
"outcome": "complete",
"adjudication": [
{ "category": { "coding": [{ "code": "allowedamount" }] }, "amount": { "value": 1500.00 } },
{ "category": { "coding": [{ "code": "benefit" }] }, "amount": { "value": 1400.00 } }
]
}

Outcome: partial

Claim partially adjudicated (e.g., some items disputed):

{
"outcome": "partial",
"adjudication": [
{ "category": { "coding": [{ "code": "allowedamount" }] }, "amount": { "value": 1500.00 } },
{ "category": { "coding": [{ "code": "benefit" }] }, "amount": { "value": 0.00 } }
],
"processNote": [
{
"number": 1,
"type": "display",
"text": "Member not eligible for this procedure. Prior authorization required."
}
]
}

Outcome: error

Claim rejected (e.g., invalid member, contract not found):

{
"outcome": "error",
"processNote": [
{
"number": 1,
"type": "display",
"text": "Member ID 'INVALID-ID' not found in SHARP-HMO-2024 plan."
}
]
}

Network Status Determination

{
"extension": [
{
"url": "https://turquoise.health/network-status",
"valueCode": "in_network"
}
]
}
StatusMeaningExample
in_networkProvider is contractedAllowed: $1,500 (full direct contract)
out_of_networkProvider not contractedAllowed: $900 (emergency-only rate)
unknownNetwork status indeterminateAllowed: $0 (pending verification)
warning

Out-of-network claims may be adjusted or denied. Plan sponsor determines coverage.

Deductible & Copay Handling

Deductible Applied

If member has remaining deductible, it's applied first:

{
"adjudication": [
{ "category": { "coding": [{ "code": "allowedamount" }] }, "amount": { "value": 1500.00 } },
{ "category": { "coding": [{ "code": "deductible" }] }, "amount": { "value": 500.00 } },
{ "category": { "coding": [{ "code": "benefit" }] }, "amount": { "value": 1000.00 } },
{ "category": { "coding": [{ "code": "coinsurance" }] }, "amount": { "value": 0.00 } }
]
}

Interpretation:

  • Allowed: $1,500
  • Deductible applied: $500
  • Plan pays (benefit): $1,000
  • Member pays: $500 (deductible)

Copay Structure

Copay after deductible is met:

{
"adjudication": [
{ "category": { "coding": [{ "code": "allowedamount" }] }, "amount": { "value": 1500.00 } },
{ "category": { "coding": [{ "code": "deductible" }] }, "amount": { "value": 0.00 } },
{ "category": { "coding": [{ "code": "copayment" }] }, "amount": { "value": 100.00 } },
{ "category": { "coding": [{ "code": "benefit" }] }, "amount": { "value": 1400.00 } }
]
}

Interpretation:

  • Allowed: $1,500
  • Deductible: $0 (met)
  • Copay: $100 (member pays)
  • Plan pays (benefit): $1,400

Reconciliation Example

Map ClaimResponse back to claim for reconciliation:

def reconcile_claim(claim, claim_response):
"""Verify claim matches adjudicated response."""

claimed_amount = sum(item['net']['value'] for item in claim['item'])
allowed_amount = next(
(adj['amount']['value'] for adj in claim_response['adjudication']
if adj['category']['coding'][0]['code'] == 'allowedamount'),
0
)

if claimed_amount != allowed_amount:
print(f"WARNING: Claim amount ${claimed_amount} != allowed ${allowed_amount}")

benefit_amount = next(
(adj['amount']['value'] for adj in claim_response['adjudication']
if adj['category']['coding'][0]['code'] == 'benefit'),
0
)

print(f"Claim: ${claimed_amount} → Allowed: ${allowed_amount} → Benefit: ${benefit_amount}")

return {
'claim_id': claim['id'],
'claimed': claimed_amount,
'allowed': allowed_amount,
'benefit': benefit_amount,
'status': 'matched' if claimed_amount == allowed_amount else 'mismatched'
}

Error Responses

Invalid Member

{
"outcome": "error",
"processNote": [{
"type": "display",
"text": "Member ID 'INVALID' not found in plan SHARP-HMO-2024"
}]
}

Contract Not Found

{
"outcome": "error",
"processNote": [{
"type": "display",
"text": "No direct contract found for CPT 99999 under SHARP-HMO-2024"
}]
}

Invalid Claim Format

{
"outcome": "error",
"processNote": [{
"type": "display",
"text": "Claim missing required field: item[0].net"
}]
}

Polling for ClaimResponse

If ClaimResponse isn't returned immediately, poll for it:

# Poll every 5 seconds
CLAIM_ID="CLM-2024-001"
for i in {1..12}; do
curl -X GET \
https://api.turquoise.health/tpa-api/v1/claims/$CLAIM_ID/response \
-H "X-API-Key: $TURQUOISE_API_KEY"
sleep 5
done
info

Most claims adjudicate within 5 seconds. Complex claims may take up to 60 seconds.

Best Practices

  1. Check outcome first: Verify outcome is "complete" before using adjudication data
  2. Use trace IDs: Store stripe-trace-id for settlement reconciliation
  3. Handle partial responses: Some claims may adjudicate partially; check processNote for details
  4. Reconcile to claims: Compare ClaimResponse amounts back to original Claim
  5. Monitor for errors: Track rejected claims and investigate reasons

Next Steps