healthcare.dev docs
API referenceMarketplace

ACA marketplace plans

GET /v1/marketplace/plans

GET https://api.healthcare.dev/v1/marketplace/plans

Preview: not available yet (503 dataset-unavailable until it is released). Pro plan and up (below Pro: a few preview calls a month, then 403 plan-upgrade-required). Health plans sold on the ACA marketplace in the states on the federal platform (HealthCare.gov), from the CMS Exchange public use files for the plan year: issuer, metal level, plan type, service area, rating areas and the standard variant's deductible and out-of-pocket maximum. Filter by state, county (5-digit FIPS: plans whose service area covers it), metal level, plan type, market, dental or medical, and issuer. Sorted by plan id. Then GET /v1/marketplace/plans/{plan_id} for premiums by age and rating area, every variant's deductibles and out-of-pocket maximums, and benefits. Derived from the CMS Health Insurance Exchange public use files for the plan year, as CMS published them; not CMS data, and it may differ from what HealthCare.gov shows. Covers the states on the federal platform (HealthCare.gov), not states running their own exchange. Premiums are the issuer's monthly base rates by age and rating area before any subsidy. Check the issuer's documents (links) before relying on a detail.

Requires an API key: Authorization: Bearer hdev_live_.... See Authentication.

Query parameters

NameTypeRequiredDescriptionExample
statestringnoTwo-letter stateTX
countystringnoCounty FIPS code (5 digits): plans whose service area covers all or part of it48453
metalstringnoMetal level: bronze, expanded_bronze, silver, gold, platinum, catastrophic; dental high or lowsilver
plan_typestringnoHMO, PPO, EPO, POS or IndemnityHMO
market"individual" | "shop"noindividual or shop (small group)individual
dental"true" | "false"notrue: stand-alone dental plans only; false: medical onlytrue
issuerstringnoHIOS issuer id (5 digits)29418
limitintegernoPage size (max 100)25
cursorstringnoOpaque cursor from links.next
view"compact" | "standard" | "full"noHow much of each record to return (default full). compact: id, name, issuer, metal_level, plan_type, cost_sharing (fewest tokens, for agents). standard: every field except links. full: every field.compact
fieldsstringnoComma-separated fields to return instead of a view. Valid fields: id, plan_year, name, issuer, state, market, dental_only, metal_level, plan_type, exchange, network_id, service_area, rating_areas, cost_sharing, links, effective_date, expiration_date.id,name,issuer

Examples

curl

curl "https://api.healthcare.dev/v1/marketplace/plans?limit=25" \
  -H "Authorization: Bearer $HDEV_API_KEY"

TypeScript

const res = await fetch("https://api.healthcare.dev/v1/marketplace/plans?limit=25", {
  headers: { Authorization: `Bearer ${process.env.HDEV_API_KEY}` },
});
const { data, meta } = await res.json();

Python

import os
import requests

res = requests.get("https://api.healthcare.dev/v1/marketplace/plans?limit=25", headers={"Authorization": f"Bearer {os.environ['HDEV_API_KEY']}"})
body = res.json()

Try it

GEThttps://api.healthcare.dev/v1/marketplace/plans?state=TX&county=48453&metal=silver&plan_type=HMO&market=individual&dental=true&issuer=29418&limit=25&view=compact&fields=id%2Cname%2Cissuer
Get a free key
Copy as curl
curl "https://api.healthcare.dev/v1/marketplace/plans?state=TX&county=48453&metal=silver&plan_type=HMO&market=individual&dental=true&issuer=29418&limit=25&view=compact&fields=id%2Cname%2Cissuer" \
  -H "Authorization: Bearer $HDEV_API_KEY"

Response

Plans, by id

{
  "data": [
    {
      "id": "string",
      "plan_year": 1,
      "name": "string",
      "issuer": {
        "id": "string",
        "name": "string"
      },
      "state": "string",
      "market": "individual",
      "dental_only": true,
      "metal_level": "string",
      "plan_type": "string",
      "exchange": "on_and_off",
      "network_id": "string",
      "service_area": {
        "id": "string",
        "name": "string",
        "covers_entire_state": true,
        "county_count": 1
      },
      "rating_areas": [
        "string"
      ],
      "cost_sharing": {
        "variant_id": "string",
        "deductible": 0,
        "moop": 0
      },
      "links": {
        "formulary_url": "string",
        "brochure_url": "string",
        "summary_of_benefits_url": "string",
        "enrollment_payment_url": "string"
      },
      "effective_date": "2026-10-01",
      "expiration_date": "2026-10-01"
    }
  ],
  "meta": {
    "source": "cms-icd10",
    "data_version": "2026.1",
    "retrieved_at": "2026-10-24T12:00:00Z",
    "license": "Public domain (CMS). Reference data, not medical advice."
  },
  "links": {
    "self": "/v1/marketplace/plans?limit=25",
    "next": "/v1/marketplace/plans?limit=25&cursor=eyJrIjoiRTExLjkifQ"
  }
}

Fields

FieldTypeAlways presentDescription
idstringyesPlan id (HIOS standard component id), e.g. 29418TX0140108
plan_yearintegeryes
namestringyes
issuerMarketplaceIssueryes
statestringyes
marketMarketplaceMarketyesindividual market, or shop (the Small Business Health Options Program)
dental_onlybooleanyesA stand-alone dental plan
metal_levelstringyesbronze, expanded_bronze, silver, gold, platinum, catastrophic; dental plans high or low
plan_typestringyesAs published: HMO, PPO, EPO, POS, Indemnity
exchange"on_and_off" | "on" | "off"yesOffered on the exchange, off it, or both
network_idstring | nullyes
service_areaobjectyes
rating_areasstring[]yesRating areas the plan has premiums for
cost_sharingMarketplaceCostSharingyesThe individual in-network deductible and out-of-pocket maximum of the plan's standard variant (-01 on exchange, else -00): the combined medical and drug amount when the plan integrates them, else the medical one. Every variant's full amounts are in variants
linksMarketplaceLinksyesThe issuer's own pages, as listed in the plan attributes file (links only)
effective_datestring | null (date)yes
expiration_datestring | null (date)yes

Errors

Errors are application/problem+json (RFC 9457). Branch on type, not on title. See Errors.

StatustypeWhen
400invalid-requestA parameter or the body failed validation; errors lists each field.
401unauthorizedMissing, malformed or revoked API key.
403plan-upgrade-requiredThe plan doesn't include this feature; required_plan names the plan that does.
404not-foundNo record with that id (retired records are still returned).
429rate-limited / quota-exceededToo many requests per second (retry after Retry-After), or the monthly quota is used up.
503dataset-unavailable / unavailableThe dataset has no published version yet, or the service is degraded.

On this page