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
resourceTypestring✓Always "ClaimResponse"
idstring✓Unique response ID (e.g., "CLMR-2024-001")
statusstring✓Response status: "active", "cancelled"
usestring✓Always "claim"
claimobject✓Reference to original claim: { "reference": "Claim/CLM-2024-001" }
createdtimestamp✓ISO 8601 adjudication timestamp
outcomestring✓Adjudication outcome: "complete", "partial", "error"
itemarray✗Array of adjudicated line items
adjudicationarray✗Top-level adjudication summary
extensionarray✗Custom extensions (stripe-trace-id, aeob-reference, etc.)
paymentobject✗Payment 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​