Testing: Sending Mock Requests with Demo Policies

Sandbox Demo Policies

Use the demo policies below to test the sandbox API. Each endpoint has its own section with a ready-to-send example. The full policy list is available as a CSV. šŸ‘‡

šŸ“Ž Download: All demo policies (.csv)

Each row in the CSV is one policy. The is_discover, is_scan and is_medicaid columns mark the policies built for those endpoints, and expected_status_code shows the HTTP status you should get back.

Contents



Endpoints at a Glance

All requests are POST with a JSON body. Base URL: https://coverage-api-sandbox.meetnirvana.com

Every example sends the headers Content-Type: application/json, accept: application/json and apikey: [YOUR API KEY]. Replace the placeholder with your sandbox API key.

EndpointFull URLWhat you sendDemo policies that work
/v1/estimatehttps://coverage-api-sandbox.meetnirvana.com/v1/estimateMember ID, name, DOB, plus payer, provider NPI and session costPolicies with a member ID (most tables below)
/v1/discoverhttps://coverage-api-sandbox.meetnirvana.com/v1/discoverName, DOB, zip and payer. No member ID.CSV rows where is_discover is TRUE
/v1/scanhttps://coverage-api-sandbox.meetnirvana.com/v1/scanName, DOB and zip. No payer or member ID.CSV rows where is_scan is TRUE
/v1/medicaidhttps://coverage-api-sandbox.meetnirvana.com/v1/medicaidName, DOB, member ID, and either payer_id or patient_stateCSV rows where is_medicaid is TRUE

Lookup Rules

  • Policies are looked up by member ID, or by first name + last name + DOB (case-insensitive).
  • Monetary fields are in cents (for example, 10000 = $100.00).
  • If payer_id is blank for a policy in the tables, any payer will suffice.
  • If zip is blank, use 10001. Send zip as a string so leading zeros are kept (for example, "02118").
  • /discover and /scan return a thinner payload than /estimate, even when the same member has financials on /estimate.
  • Error cases with blank names (00001MHMNF, PRONOTREC and similar) match on member ID only, and only work on /v1/estimate.

Estimate Endpoint

POST https://coverage-api-sandbox.meetnirvana.com/v1/estimate

Required: member_id, name and DOB. The example also sends payer_id, provider_npi and provider_session_cost (in cents).

Example demo policy

What it testsMember IDNameDOBPayer
Starter: coinsurance after deductible, with OOP maxALFREDTESTAlfred Arnoldson2000-01-0160054
curl --request POST \
  --url https://coverage-api-sandbox.meetnirvana.com/v1/estimate \
  --header 'Content-Type: application/json' \
  --header 'accept: application/json' \
  --header 'apikey: [YOUR API KEY]' \
  --data '
{
  "payer_id": "60054",
  "member_id": "ALFREDTEST",
  "member_first_name": "Alfred",
  "member_last_name": "Arnoldson",
  "member_dob": "2000-01-01",
  "provider_npi": "1234567890",
  "provider_session_cost": 10000
}'
import requests

url = "https://coverage-api-sandbox.meetnirvana.com/v1/estimate"
headers = {
    "Content-Type": "application/json",
    "accept": "application/json",
    "apikey": "[YOUR API KEY]"
}
payload = {
    "payer_id": "60054",
    "member_id": "ALFREDTEST",
    "member_first_name": "Alfred",
    "member_last_name": "Arnoldson",
    "member_dob": "2000-01-01",
    "provider_npi": "1234567890",
    "provider_session_cost": 10000
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())

Expect: 200 with an active plan. The policy is seeded with 20% coinsurance after deductible, a deductible of 150000 (100000 remaining) and an OOP max of 350000 (300000 remaining), all in cents.

Error cases: use 00001MHMNF (404), 000011MHRR (502) or PRONOTREC (400). See Partial Coverage and Errors below. These only work on this endpoint.


Discover Endpoint

POST https://coverage-api-sandbox.meetnirvana.com/v1/discover

Required: name, DOB, zip and payer_id. Do not send member_id.

Example demo policy

What it testsNameDOBZipPayer
Active PPO (member ID W123456789 on /estimate)Liam Brooks1985-03-220211860054
curl --request POST \
  --url https://coverage-api-sandbox.meetnirvana.com/v1/discover \
  --header 'Content-Type: application/json' \
  --header 'accept: application/json' \
  --header 'apikey: [YOUR API KEY]' \
  --data '
{
  "payer_id": "60054",
  "member_first_name": "Liam",
  "member_last_name": "Brooks",
  "member_dob": "1985-03-22",
  "zip": "02118"
}'
import requests

url = "https://coverage-api-sandbox.meetnirvana.com/v1/discover"
headers = {
    "Content-Type": "application/json",
    "accept": "application/json",
    "apikey": "[YOUR API KEY]"
}
payload = {
    "payer_id": "60054",
    "member_first_name": "Liam",
    "member_last_name": "Brooks",
    "member_dob": "1985-03-22",
    "zip": "02118"
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())

Expect: 200 with an active plan and a thinner payload than /estimate.

Government programs: the Medicaid, Medicare, Medicare Advantage and dual-eligible discover policies (24 of the 37) use payer_id GOVERNMENT in the CSV.

Error cases: APDISCOVER400 Pete Provider (400), APDISCOVER404 Nora Notfound (404) and APDISCOVER429 Rita Ratelimit (429). Their names, DOBs and zips are in Partial Coverage and Errors below. Send GOVERNMENT as the payer.


Scan Endpoint

POST https://coverage-api-sandbox.meetnirvana.com/v1/scan

Required: name, DOB and zip. Do not send payer_id or member_id.

Example demo policy

What it testsNameDOBZip
Active coverage found by name, DOB and zip aloneCharlotte Williams1996-09-0594110
curl --request POST \
  --url https://coverage-api-sandbox.meetnirvana.com/v1/scan \
  --header 'Content-Type: application/json' \
  --header 'accept: application/json' \
  --header 'apikey: [YOUR API KEY]' \
  --data '
{
  "member_first_name": "Charlotte",
  "member_last_name": "Williams",
  "member_dob": "1996-09-05",
  "zip": "94110"
}'
import requests

url = "https://coverage-api-sandbox.meetnirvana.com/v1/scan"
headers = {
    "Content-Type": "application/json",
    "accept": "application/json",
    "apikey": "[YOUR API KEY]"
}
payload = {
    "member_first_name": "Charlotte",
    "member_last_name": "Williams",
    "member_dob": "1996-09-05",
    "zip": "94110"
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())

Expect: 200 with an active plan and a thinner payload than /estimate.

Not-found tests: Charlotte Reed (same DOB and zip, different last name) and Benjamin Ward born 1981-12-19 (zip 43215) both return 404 MEMBER_NOT_FOUND. Benjamin Ward born 1990-05-11 (same zip) returns 200.


Medicaid Endpoint

POST https://coverage-api-sandbox.meetnirvana.com/v1/medicaid

Required: name, DOB, member_id, and either payer_id or patient_state.

Example demo policy

What it testsMember IDNameDOBState
State Medicaid, active01STATEACTIVESuzanne Bullard2001-11-13NY
curl --request POST \
  --url https://coverage-api-sandbox.meetnirvana.com/v1/medicaid \
  --header 'Content-Type: application/json' \
  --header 'accept: application/json' \
  --header 'apikey: [YOUR API KEY]' \
  --data '
{
  "member_id": "01STATEACTIVE",
  "member_first_name": "Suzanne",
  "member_last_name": "Bullard",
  "member_dob": "2001-11-13",
  "patient_state": "NY"
}'
import requests

url = "https://coverage-api-sandbox.meetnirvana.com/v1/medicaid"
headers = {
    "Content-Type": "application/json",
    "accept": "application/json",
    "apikey": "[YOUR API KEY]"
}
payload = {
    "member_id": "01STATEACTIVE",
    "member_first_name": "Suzanne",
    "member_last_name": "Bullard",
    "member_dob": "2001-11-13",
    "patient_state": "NY"
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())

Expect: 200 with an active plan. The policy is seeded as fully covered with a $0 copay.

Other Medicaid demo policies
What it testsMember IDNameDOBState
State Medicaid, active02STATEACTIVEAgnes Wendt2003-08-13NY
State Medicaid, inactive01STATEINACTIVETommy Austin1993-02-05NY
Managed Medicaid + MCO01MCOACTIVEMichael Farmer1993-01-29FL
Managed Medicaid + MCO87777516Hilary Heber2011-06-04CO
Managed Medicaid + eligibility type DX47906595Tommy Sturgeon1984-04-09MN

Demo Policies by Scenario

These tables group the demo policies by what they test. Select a scenario to expand it. Every field for every policy is in the CSV. šŸ“Ž Download All demo policies (.csv).

Active Commercial
What it testsMember IDNameDOBPayer
Starter: coinsurance after deductible, with OOP maxALFREDTESTAlfred Arnoldson2000-01-0160054
Active copay after deductible000011MHNABeatrice Waters2006-01-10
Active copay after deductible000012MHNAWilliam Phillips2000-09-05
Active copay after deductible000013MHNAMichael Young2005-03-08
Deductible and OOP max met000014MHNAJason Worsley1988-03-04
Deductible met000015MHNABetty Dill1993-10-26
Commercial PPO passMAPASSPPOJohn Simon1992-08-15
Government and Dual-Eligible
What it testsMember IDNameDOBZipPayer
Original Medicare00001MHOMCRLeo Harris1984-07-2510001
Original Medicaid00001MHOMCDStephen Osborne1997-07-0310001
Medicare Advantage000011MHMAJanice Ball1998-12-1710001
Medicare Advantage000012MHMARobert Antonio2003-04-0310001
Managed Medicaid000011MHMMDoris Bradley1997-10-2310001
Managed Medicaid000012MHMMPaul Ford1997-10-1910001
Dual eligible, PPO87293465Alicia Mendez1957-03-1487726
Dual eligible, HMO49827356Marcus O’Neill1942-07-2260054
Original Medicare (named)UC0000005Zara Orr1958-07-0780309COMCR
QMB, fully covered9KF7-PQ4-1D89Emily Gallagher1943-02-0590026FLMCR
Managed Medicaid + MCO87777516Hilary Heber2011-06-0480201
Managed Medicaid + eligibility type DX47906595Tommy Sturgeon1984-04-0955401
Managed Medicaid + MCO01MCOACTIVEMichael Farmer1993-01-2933101
State Medicaid, active01STATEACTIVESuzanne Bullard2001-11-1310001
State Medicaid, active02STATEACTIVEAgnes Wendt2003-08-1310001
State Medicaid, inactive01STATEINACTIVETommy Austin1993-02-0510001

Note: payer codes like COMCR and FLMCR are sandbox-specific alphabetic test codes (state + payer type), not real Nirvana numeric payer IDs. Don’t use these against production.

Carve-Outs, Additional Policies, and TPAs
What it testsMember IDNameDOB
Magellan TPA000011MHCAMichael Morrow1997-02-22
Magellan TPACSGA7654321Liam McAllister1980-04-03
Optum TPA000012MHCAWm Jarvis1993-12-03
Carelon TPA000013MHCAJoseph Scruggs1989-08-10
Secondary Florida Medicaid000011MHSPWillie Ruiz2000-12-12
Primary other commercial000012MHSPJulio Vahle1999-01-09
Secondary Cigna000013MHSPMyrtle Greaves2002-06-19
Spouse + primary other planDUJ123456789Sarah Thompson1985-03-14
Utilization managerU12345673Nancy Drew1995-07-21
Partial Coverage and Errors
Expected Status CodeExpected Error CodeMember IDNameDOBZip
200Charlotte Williams1996-09-0594110
206UNKNOWN_COSTSHARE00001MHUCRonnie Wesley2007-02-2110001
206UNKNOWN_REMAININGS000011MHUARoy Ladage1990-01-0310001
400PAYER_NOT_SUPPORTED000012MHRR
400PROVIDER_NOT_RECOGNIZEDPRONOTREC
400PROVIDER_NOT_RECOGNIZEDAPDISCOVER400Pete Provider1975-05-0560601
404MEMBER_NOT_FOUND00001MHMNF
404MEMBER_NOT_FOUNDAPDISCOVER404Nora Notfound1985-07-0780202
404MEMBER_NOT_FOUNDCharlotte Reed1996-09-0594110
404MEMBER_NOT_FOUNDBenjamin Ward1981-12-1943215
429TOO_MANY_REQUESTSAPDISCOVER429Rita Ratelimit1988-08-1898101
502PAYER_FAILURE000011MHRR

Note: Charlotte Williams (200) and Charlotte Reed (404) have the same DOB and zip but different last names, so you can test name-mismatch behavior. Benjamin Ward works the same way for DOB: 1981-12-19 returns 404, while 1990-05-11 (same zip) returns 200. Neither Charlotte nor Benjamin has a member ID, so look them up by name, DOB and zip.

Plan Status
What it testsMember IDNameDOBZipPayerplan_status
Inactive / expired00001MHEXPNoah Parrish1990-04-1710001INACTIVE
Active at risk00001MHEXSBrian Murray2010-08-1510001ACTIVE_AT_RISK
Inactive namedECN123456789Sophia Kim2000-01-1910001MOBLSINACTIVE
Inactive named894726153Ethan Wright1990-04-2787726INACTIVE
Inactive commercialU987654321Elijah Foster1975-04-125540862308INACTIVE
Telehealth, Marketplace, BlueCard, and Demo Mismatch
What it testsMember IDNameDOBZipPayerNotes
Telehealth fully coveredU12345678Emily Chen1978-11-3010001NYBLSIn-person copay; telehealth $0
Telehealth copayH123456789Angela Brooks1982-08-0310001HUMANACoinsurance in-person
MarketplaceYUN12031213David Chen1978-05-0197214ORBLSMARKETPLACE
Marketplace + telehealthUC0000001Denzel Jordan1962-08-111000360054
Commercial HDHPUC0000002Sophie Lim1997-12-027521062308HSA HDHP
BlueCardBC0000001Alicia Ricci1985-10-0310001ALBLS
BlueCardBC0000002Emma Anderson1981-10-1530309ARBLSCopay, no deductible
Demographic mismatchDEMOMISSMATCHFirstname Lastname2000-01-0110001Matches even if name/DOB differ
Missing addressNO-ADDRESSGeorge Mendez1981-10-10NYBLSNo street/city/state/zip
Active PPOW123456789Liam Brooks1985-03-220211860054
Active HMOU123456789Emma Carter1992-07-147520162308
Active HMO999000123Ava Mitchell1999-11-026061487726
Active HMOUHC123456789Noah Bennett1978-08-309810187726

Note: this table is the source of truth for the ā€œSandbox: Send Mock Requestsā€ article’s Estimate examples. Liam Brooks, Emma Carter, Ava Mitchell, and Noah Bennett are all valid, distinct demo policies (not a data error), they just need to be used consistently within a single curl/Python pair rather than mixed.

Plan-Year Reset

These members have plan_reset_soon: TRUE.

What it testsMember IDNameDOBreset_benefits_status
Reset detected, no actionRESETNACOPAYDustin Dixion2006-10-08DETECTED_NO_ACTION_REQUIRED
Reset detected, no action (coinsurance)RESETNACOINSFrancis Steadman2009-07-12DETECTED_NO_ACTION_REQUIRED
Action required: copay changeRESETARCOPAYMarlena Kopka2009-07-26DETECTED_ACTION_REQUIRED
Action required: coinsurance changeRESETARCOINSPhyllis Milam2003-09-05DETECTED_ACTION_REQUIRED
Action required: member ID changeRESETIDAngeles Walters2007-01-02DETECTED_ACTION_REQUIRED
Action required: OOP max changeRESETAROOPColby Abell2010-02-17DETECTED_ACTION_REQUIRED
Action required: copay + OOPRESETARCOPAYOOPHenry Harrelson2004-07-21DETECTED_ACTION_REQUIRED
Action required: copay + deductibleRESETARCOPAYDEDDonna Jones1999-08-02DETECTED_ACTION_REQUIRED
Action required: deductible + OOPRESETARDEDOOPLinda Koch2011-07-08DETECTED_ACTION_REQUIRED
Reset not detectedRESETNDAnnette Turner2006-12-27NOT_DETECTED

šŸ“Ž Download: All demo policies (.csv)


Did this page help you?