CAD Developer API · v1
Plan, price, drug, network and quality data, by API.
The same marketplace and dental plans, age-rated premiums, formularies, in-network checks and Medicare Advantage and Part D plans that power Choice Arrangement Deck, plus five years of plan history, competitive benchmarks, provider quality scores and bulk exports, available to your systems through a versioned REST API.
- ACA medical plans
- Plan history 2021-2025
- Dental plans
- Plan documents
- Prices & quotes
- Competitive benchmarking
- Subsidies & ICHRA
- Drugs & formularies
- In-network status
- Network compare & disruption
- Provider quality
- Medicare plans
- Bulk exports
Free: 600 calls/day per account · No credit card · Paid tiers coming soon
# 1. get a token
curl -u $CLIENT_ID:$CLIENT_SECRET \
-d grant_type=client_credentials \
https://api.choicearrangementdeck.com/v1/oauth/token
# 2. plans in Hennepin County, MN, for 2026
API=https://api.choicearrangementdeck.com
curl -H "Authorization: Bearer $TOKEN" \
"$API/v1/plans?zipCode=55401&countyFips=27053&planYear=2026&page=1&perPage=25"
# 3. Medicare Advantage and Part D plans, Washington County, MN
curl -H "Authorization: Bearer $TOKEN" \
"$API/v1/medicare/plans?year=2026&zipCode=55082&countyFips=27163&planType=HMO"
Data categories
Thirteen categories of health plan data from public CMS files and carrier sources, all under one version root, https://api.choicearrangementdeck.com/v1/..., with one token and one quota.
Plan history, plan documents, competitive benchmarks and provider quality
| Endpoint | Returns |
|---|---|
GET /v1/plans?planYear=2021 to 2025 | Historical federal-exchange plans with premiums by age (historical: true); also /v1/plans/{planId}, /rates and the plans and service-areas exports |
GET /v1/plans/{planId}/benefits | Benefit rows plus links: Summary of Benefits and Coverage, brochure, formulary |
GET /v1/benchmarks/plans | By metal level: min, quartiles, median, max of premium, deductible and MOOP, and each plan's rank and percentile |
GET /v1/plans/{planId}/benchmark | One plan against its county and metal-level competitors |
GET /v1/providers/{npi}/quality | Clinician MIPS final and category scores and affiliated hospitals' star ratings |
GET /v1/quality/hospitals, /v1/hospitals/{ccn}/quality | Hospital overall star ratings (1-5) by state or CMS Certification Number |
History covers HealthCare.gov states, from the CMS QHP public use files. Quality comes from CMS Care Compare and is refreshed weekly when CMS publishes new files.
# 2023 plans in Dallas County, TX, priced for a 40-year-old
curl -H "Authorization: Bearer $TOKEN" \
"https://api.choicearrangementdeck.com/v1/plans?zipCode=75201&countyFips=48113&planYear=2023&ages=40"
# how every plan in the county ranks, by metal level
curl -H "Authorization: Bearer $TOKEN" \
"https://api.choicearrangementdeck.com/v1/benchmarks/plans?zipCode=75201&countyFips=48113&age=40"
# a clinician's MIPS score and hospital star ratings
curl -H "Authorization: Bearer $TOKEN" \
"https://api.choicearrangementdeck.com/v1/providers/1003000126/quality"
# the whole plans dataset, as CSV, with document URLs
curl -H "Authorization: Bearer $TOKEN" \
"https://api.choicearrangementdeck.com/v1/exports/plans?format=csv&limit=5000"
Medicare Advantage and Part D plan data API
Search Medicare Advantage (MA and MA-PD) and stand-alone Part D (PDP) plans by state, county or ZIP code, plan type, organization, premium, drug coverage and Star Rating, and read a plan's premium, maximum out-of-pocket, copays, extra benefits, Part D deductible and tier cost sharing, and service area. The data comes from CMS public files. Every plan year is served separately: pass year=2026 or year=2027, and call /v1/medicare/years to see which years are live (a year appears when CMS publishes it).
| Endpoint | Returns |
|---|---|
GET /v1/medicare/plans | Plans with filters and pagination |
GET /v1/medicare/plans/{planId} | Full plan detail for one plan year |
GET /v1/medicare/plans/{planId}/service-area | Counties (FIPS) the plan serves |
GET /v1/medicare/zip-codes/{zipCode} | Counties of a ZIP code and the plans serving each |
GET /v1/medicare/years | Published plan years, data versions and CMS source files |
Plan IDs are CMS contract-plan-segment IDs such as H0028_007_0. Part D formulary lists per drug are not part of these endpoints yet.
# plans for ZIP 55082 (Washington County, MN), 2026 and 2027
curl -H "Authorization: Bearer $TOKEN" \
"https://api.choicearrangementdeck.com/v1/medicare/plans?year=2026&zipCode=55082&countyFips=27163&perPage=10"
curl -H "Authorization: Bearer $TOKEN" \
"https://api.choicearrangementdeck.com/v1/medicare/plans?year=2027&zipCode=55082&countyFips=27163&includesDrugCoverage=true&minStarRating=4"
# one plan: premium, MOOP, copays, drug tiers, service area
curl -H "Authorization: Bearer $TOKEN" \
"https://api.choicearrangementdeck.com/v1/medicare/plans/H0028_007_0?year=2026"
Subsidy-aware quoting API: premium tax credit, Medicaid and cost-sharing reduction estimates
Give the API a household's income, size, ages, ZIP code and county, tobacco use and plan year, and it estimates the federal premium tax credit (APTC) from the second-lowest-cost silver plan (SLCSP) benchmark, flags likely Medicaid eligibility, and identifies cost-sharing reduction (CSR) eligibility and the matching silver plan variant. POST /v1/quotes accepts the same optional income fields and then adds a subsidized premium and credit to each plan; without them it behaves exactly as before. The rules are keyed by plan year (IRS applicable percentage table, HHS poverty guidelines, Medicaid expansion status) and every response names the rule year and sources, lists its assumptions, and states that it is an estimate, not tax advice or an eligibility determination. GET /v1/subsidies/rules returns the exact parameters, including whether the enhanced credits are in effect, for the year you ask about.
| Endpoint | Returns |
|---|---|
POST /v1/subsidies/estimate | Federal poverty level percentage, applicable percentage, benchmark, estimated premium tax credit, Medicaid indicator, CSR eligibility |
GET /v1/subsidies/rules | The year-keyed parameters and sources the estimates use |
POST /v1/quotes | Plan premiums; with householdIncome, also subsidizedPremium, estimatedPremiumTaxCredit and csrVariant per plan |
Inputs you supply, such as an employer offer or Medicare eligibility, are taken as given and never verified. The benchmark comes from the same silver benchmark data as /v1/benchmarks/silver. Children's Medicaid and CHIP, immigration status and state subsidies are not assessed. An unsupported planYear returns 422 with the years that are available.
# estimate for one 40-year-old in ZIP 55082 (Washington County, MN)
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"zipCode":"55082","countyFips":"27163","planYear":2026,
"householdIncome":46950,"householdSize":1,"members":[{"age":40}]}' \
"https://api.choicearrangementdeck.com/v1/subsidies/estimate"
# the rules and sources behind the numbers
curl -H "Authorization: Bearer $TOKEN" \
"https://api.choicearrangementdeck.com/v1/subsidies/rules?year=2026"
# the same household as a quote, with per-plan subsidized premiums
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"zipCode":"55082","countyFips":"27163","planYear":2026,
"householdIncome":46950,"householdSize":1,"members":[{"age":40}]}' \
"https://api.choicearrangementdeck.com/v1/quotes"
# hypothetical: the same household if the expired enhanced credits returned (not current law)
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"zipCode":"55082","countyFips":"27163","planYear":2026,
"householdIncome":64165,"members":[{"age":60}],
"scenario":"enhancedCredits"}' \
"https://api.choicearrangementdeck.com/v1/subsidies/estimate"
Design decisions
- Medicaid is an indicator, not a determination. If adults in the household look likely to be eligible for Medicaid, the estimate still returns the premium tax credit as if the household were eligible for Marketplace coverage, with
medicaidChip.likelyMedicaidEligible: true, acreditNoteexplaining that people who are eligible for Medicaid generally cannot receive the credit, and oneeligibilitysummary. Your application decides. SendtreatMedicaidLikelyAsIneligible: trueto get a credit of 0 in that case. - State programs are flags; CHIP is not assessed. Basic Health Programs and similar state coverage (MinnesotaCare, the New York Essential Plan, Oregon OHP Bridge, Healthy DC Plan and the DC Health Care Alliance) appear in
stateProgramswith a source and as-of date, for the plan years where the program is confirmed. They never change the credit. Children's Medicaid and CHIP income limits are not assessed. - Enhanced credits are a hypothetical scenario.
scenario: "enhancedCredits"shows what the credit would be if the expired enhanced credits (no 400% limit, 0% to 8.5% of income) returned. It is not current law, every response says so, and the default iscurrentLaw.GET /v1/subsidies/rules?planYear=2026&scenario=enhancedCreditsreturns its rules.
Free developer tier
| Calls per UTC day | Speed | Response when over |
|---|---|---|
| 1 - 100 | Full speed | — |
| 101 - 600 | 1 call / 5 s | 429 + Retry-After (≤ 5 s) |
| 601+ | Blocked | 429 until 00:00 UTC |
The day resets at 00:00 UTC (7:00 PM Central during CDT, 6:00 PM during CST). Token requests, /v1/me/usage, 429s and our own 5xx errors are not counted. Your dashboard shows a live meter.
How it works
- Request an account: name, work email, company, intended use.
- Confirm your email (link from support@choicearrangementdeck.com).
- Sign in and create your client ID + client secret (the secret is shown once).
- Exchange them for a 60-minute access token and call
/v1.
Coming soon: paid tiers
Higher daily volume, no throttle band and an SLA, for systems that use CAD as a source of truth.
Join the waitlistVersioned and documented
OpenAPI 3.1 per major version, Swagger UI, a changelog, and at least 12 months' notice before a version is retired.
Download openapi.json