# Healthcare.gov Plan Scraper — ACA Marketplace Quotes & Benefits (`muhammadafzal/healthcare-gov-plan-scraper`) Actor

Extract Healthcare.gov ACA health insurance marketplace plans, monthly premiums, estimated subsidies, deductibles, out-of-pocket maximums, and benefit cost-sharings.

- **URL**: https://apify.com/muhammadafzal/healthcare-gov-plan-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 health plan scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Healthcare.gov Plan Scraper — ACA Marketplace Quotes & Benefits

> **Free-plan limit:** Apify free-plan users receive at most 5 delivered records per run. Paid users may use the Actor’s configured result limit.

Extract ACA health insurance marketplace plans, monthly premiums, estimated subsidies, deductibles, out-of-pocket maximums, and benefit cost-sharings from Healthcare.gov.

The scraper queries Healthcare.gov's official Qualified Health Plan (QHP) marketplace endpoints for Federally Facilitated Marketplace (FFM) states. It retrieves both major medical and dental plans, complete with actuarial metal tiers, carrier details, and Summary of Benefits and Coverage (SBC) documents.

### Key Features

- **ZIP Code & County Search:** Search across all FFM states (such as Florida, Texas, North Carolina, Georgia, Ohio, etc.) by 5-digit ZIP code with automatic county FIPS resolution.
- **Subsidy & Demographic Calculation:** Calculate Advance Premium Tax Credit (APTC) subsidies and net monthly premiums based on annual household income, applicant age, gender, and tobacco usage.
- **Granular Filters:** Filter by metal level (Catastrophic, Bronze, Expanded Bronze, Silver, Gold, Platinum), network type (HMO, PPO, EPO, POS), carrier name, and HSA eligibility.
- **Direct Plan ID Lookup:** Retrieve detailed plan sheets, exclusions, and SBC scenarios (maternity delivery, diabetes management, fracture care) using standard 14-digit QHP IDs.
- **Standalone Dental Plans:** Query pediatric and adult individual dental insurance plans.
- **County Lookup Mode:** Discover valid county names and FIPS codes for any US ZIP code.

***

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | String | `"search"` | Extraction mode: `"search"` (by ZIP), `"plan_ids"` (direct QHP ID lookup), or `"counties"` (county lookup). |
| `zipCode` | String | `"33101"` | 5-digit US ZIP code to search. Must be located in a Healthcare.gov FFM state. |
| `countyFips` | String | `""` | Optional 5-digit county FIPS code (e.g. `"12086"`). If blank, automatically resolves the primary county. |
| `planIds` | Array | `[]` | Specific 14-digit QHP plan IDs to look up when `mode` is `"plan_ids"` (e.g. `["21525FL0020004"]`). |
| `year` | Integer | `2026` | Marketplace coverage year (2024–2030). |
| `division` | String | `"HealthCare"` | Plan category: `"HealthCare"` for major medical or `"Dental"` for dental plans. |
| `income` | Number | `35000` | Annual household income in USD for APTC tax credit subsidies. Set `-1` for unsubsidized full-price quotes. |
| `age` | Integer | `30` | Applicant age (0–120) for age-rated premium calculation. |
| `gender` | String | `"Female"` | Applicant gender (`"Female"` or `"Male"`). |
| `usesTobacco` | Boolean | `false` | Whether the applicant uses tobacco products. |
| `aptcEligible` | Boolean | `true` | Whether the applicant is eligible for premium tax credits. |
| `metalLevels` | Array | `[]` | Optional metal tier filter (e.g. `["Bronze", "Silver", "Gold"]`). |
| `planTypes` | Array | `[]` | Optional plan type filter (e.g. `["HMO", "PPO", "EPO"]`). |
| `issuers` | Array | `[]` | Optional carrier name filter (e.g. `["Oscar", "Blue Cross", "Aetna"]`). |
| `hsaEligibleOnly` | Boolean | `false` | Filter to only Health Savings Account (HSA) eligible plans. |
| `sortBy` | String | `"premium"` | Sort order: `"premium"`, `"deductible"`, or `"oopc"`. |
| `sortOrder` | String | `"asc"` | Sort direction: `"asc"` or `"desc"`. |
| `maxItems` | Integer | `20` | Maximum plans written to the dataset (1–500). |
| `fetchFullDetails` | Boolean | `false` | When true in search mode, fetches individual SBC scenario details for each plan. |

***

### Example Inputs

#### 1. Default Medical Plan Search (Miami, FL)

```json
{
  "mode": "search",
  "zipCode": "33101",
  "year": 2026,
  "division": "HealthCare",
  "income": 35000,
  "age": 30,
  "maxItems": 20
}
```

#### 2. Silver & Gold HMO Plans with HSA Compatibility (Dallas, TX)

```json
{
  "mode": "search",
  "zipCode": "75001",
  "year": 2026,
  "metalLevels": ["Silver", "Gold"],
  "planTypes": ["HMO"],
  "hsaEligibleOnly": true,
  "income": 45000,
  "maxItems": 25
}
```

#### 3. Direct QHP Plan ID Lookup

```json
{
  "mode": "plan_ids",
  "planIds": ["21525FL0020004"],
  "year": 2026
}
```

#### 4. Standalone Dental Plans Search

```json
{
  "mode": "search",
  "zipCode": "28202",
  "division": "Dental",
  "maxItems": 15
}
```

***

### Output Data Structure

Each record stored in the dataset represents a validated health insurance plan with normalized fields:

| Field | Type | Description |
|---|---|---|
| `recordType` | String | `"plan"` for health plan records, `"county"` for county lookup records. |
| `planId` | String | Unique 14-digit Qualified Health Plan (QHP) identifier (e.g. `"21525FL0020004"`). |
| `name` | String | Official marketing name of the health plan. |
| `state` | String | 2-letter US state abbreviation (e.g. `"FL"`, `"TX"`). |
| `year` | Integer | Marketplace benefit year (e.g. `2026`). |
| `market` | String | Market segment (`"Individual"` or `"SHOP"`). |
| `division` | String | `"HealthCare"` or `"Dental"`. |
| `metalLevel` | String | Actuarial tier: `"Catastrophic"`, `"Bronze"`, `"Expanded Bronze"`, `"Silver"`, `"Gold"`, or `"Platinum"`. |
| `planType` | String | Plan network type: `"HMO"`, `"PPO"`, `"EPO"`, or `"POS"`. |
| `designType` | String / Null | Plan variant or design standard. |
| `isStandardizedPlan` | Boolean | Whether the plan is a CMS standardized plan option. |
| `hsaEligible` | Boolean | Health Savings Account compatibility. |
| `specialistReferralRequired` | Boolean | Whether visiting a specialist requires a PCP referral. |
| `hasNationalNetwork` | Boolean | Whether the carrier provides a nationwide provider network. |
| `premium` | Number | Unsubsidized gross monthly premium in USD. |
| `premiumWithCredit` | Number | Net monthly premium after estimated APTC subsidy in USD. |
| `ehbPremium` | Number | Essential Health Benefits portion of premium. |
| `aptcEligiblePremium` | Number | Portion of premium eligible for tax credit calculation. |
| `deductibleIndividual` | Number / Null | Individual in-network medical & drug deductible. |
| `deductibleFamily` | Number / Null | Family in-network medical & drug deductible. |
| `moopIndividual` | Number / Null | Individual maximum out-of-pocket spending limit. |
| `moopFamily` | Number / Null | Family maximum out-of-pocket spending limit. |
| `qualityRating` | Number / Null | CMS Quality Star Rating (1–5 stars). |
| `issuer` | Object | Insurance company info (carrier ID, name, state, website URL, phone). |
| `benefits` | Array | Covered benefits with in-network copays and coinsurance rates. |
| `diseaseManagementPrograms` | Array | Offered disease management programs (e.g. Asthma, Diabetes). |
| `brochureUrl` | String / Null | Link to official plan brochure. |
| `summaryOfBenefitsUrl` | String / Null | Link to official Summary of Benefits and Coverage (SBC) PDF. |
| `formularyUrl` | String / Null | Link to carrier's covered drug formulary. |
| `providerNetworkUrl` | String / Null | Link to carrier doctor and hospital directory. |
| `sbcScenarios` | Object / Null | Standard SBC scenarios (having a baby, diabetes care, simple fracture). |
| `searchLocation` | Object | ZIP code, county name, county FIPS, and state searched. |
| `scrapedAt` | String | ISO 8601 timestamp of extraction. |

***

### Pricing (Pay-Per-Event)

This Actor uses transparent **Pay-per-event (PPE)** pricing. Platform usage is included in the event prices; no separate per-run platform-usage fee is passed to users.

| Event | Tier | Price (USD) | When Charged |
|---|---|---:|---|
| `apify-actor-start` | FREE / BRONZE / SILVER / GOLD | $0.005 | Synthetic event charged once when the Actor run initializes. |
| `plan-scraped` | FREE | $0.0040 | One charge for each validated health plan record written to the dataset. |
| `plan-scraped` | BRONZE (2.5% discount) | $0.0039 | Volume tier discount. |
| `plan-scraped` | SILVER (5.0% discount) | $0.0038 | Volume tier discount. |
| `plan-scraped` | GOLD (20.0% discount) | $0.0032 | Volume tier discount. |

#### Representative Run Costs

- **Quick Plan Comparison (10 plans):** $0.005 (start) + (10 × $0.004) = **$0.045**
- **Comprehensive Market Survey (50 plans):** $0.005 (start) + (50 × $0.004) = **$0.205**
- **Multi-County Extraction (100 plans):** $0.005 (start) + (100 × $0.004) = **$0.405**

***

### State Coverage Notice

Healthcare.gov provides marketplace plan data for states utilizing the **Federally Facilitated Marketplace (FFM)** and State-Based Exchanges on the Federal Platform (SBM-FP), covering over 30 US states (including FL, TX, NC, SC, GA, OH, MI, IL, IN, MO, TN, AL, AZ, WI, VA, OK, UT, and others).

States operating fully autonomous state exchanges (such as California via Covered California, New York via NY State of Health, Massachusetts via Health Connector, and Washington via Healthplanfinder) do not list plans on Healthcare.gov. Querying ZIP codes in those states will return an informative notice without charging for plan results.

***

### Run with Apify API

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({
    token: process.env.APIFY_TOKEN,
});

const run = await client.actor('muhammadafzal/healthcare-gov-plan-scraper').call({
    mode: 'search',
    zipCode: '33101',
    year: 2026,
    division: 'HealthCare',
    income: 35000,
    age: 30,
    maxItems: 20
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Retrieved ${items.length} health plans`);
console.log(items[0]);
```

***

### Responsible Use & Compliance

This Actor extracts public Qualified Health Plan data published by the Centers for Medicare & Medicaid Services (CMS) on Healthcare.gov for research, market intelligence, rate comparison, and consumer decision support.

- It does not access private health information (PHI), personal records, or enrollment credentials.
- Premium quotes and subsidies are estimates based on standard CMS formulas and do not constitute official eligibility determinations or insurance binders.

# Changelog

This Actor's version history is a separate document: https://apify.com/muhammadafzal/healthcare-gov-plan-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Choose 'search' to find marketplace plans by ZIP code, 'plan_ids' to lookup full details for specific plan IDs, or 'counties' to find valid counties for a ZIP code.

## `zipCode` (type: `string`):

5-digit US ZIP code to search for ACA marketplace plans (e.g. 33101 for Miami, FL, 75001 for Dallas, TX). Must be in a Federally Facilitated Marketplace (FFM) state.

## `countyFips` (type: `string`):

5-digit county FIPS code (e.g. '12086'). Optional; if left blank, the scraper automatically discovers the county for the given ZIP code.

## `planIds` (type: `array`):

Specific 14-digit Qualified Health Plan (QHP) IDs to look up when mode is 'plan_ids' (e.g. \['21525FL0020004']). Ignored in 'search' mode.

## `year` (type: `integer`):

Marketplace plan year to query. Default is 2026.

## `division` (type: `string`):

Choose 'HealthCare' for major medical health plans or 'Dental' for standalone dental plans.

## `income` (type: `number`):

Annual household income in USD used to calculate Advance Premium Tax Credits (APTC subsidies). Set -1 for unsubsidized full-price quotes.

## `age` (type: `integer`):

Age of the primary applicant (0 to 120). Determines baseline age-banded premium rates.

## `gender` (type: `string`):

Applicant gender for marketplace demographic rating.

## `usesTobacco` (type: `boolean`):

Whether the applicant uses tobacco products. Tobacco use may adjust premiums where permitted.

## `aptcEligible` (type: `boolean`):

Whether the applicant is eligible for premium tax credit subsidies. When true with income specified, returns estimated net premium after subsidy.

## `metalLevels` (type: `array`):

Optional filter by metal tier: 'Catastrophic', 'Bronze', 'Expanded Bronze', 'Silver', 'Gold', 'Platinum' (or 'Low', 'High' for Dental). Leave empty for all tiers.

## `planTypes` (type: `array`):

Optional filter by plan network type: 'HMO', 'PPO', 'EPO', 'POS'. Leave empty for all plan types.

## `issuers` (type: `array`):

Optional case-insensitive carrier name or issuer ID filter (e.g. \['Oscar', 'Blue Cross', 'Ambetter', 'Aetna', 'UnitedHealthcare']).

## `hsaEligibleOnly` (type: `boolean`):

When true, filters results to only Health Savings Account (HSA) eligible plans.

## `sortBy` (type: `string`):

Sort plans by monthly premium, deductible, or total out-of-pocket cost (oopc).

## `sortOrder` (type: `string`):

Ascending ('asc') or descending ('desc').

## `maxItems` (type: `integer`):

Maximum plan records written to the dataset. Also bounds Pay-Per-Event billing charges. Set 1 to 500.

## `fetchFullDetails` (type: `boolean`):

When true in search mode, fetches individual plan details endpoint for each plan to retrieve full Summary of Benefits and Coverage (SBC) scenarios (having a baby, diabetes care, simple fracture) and exclusions.

## Actor input object example

```json
{
  "mode": "search",
  "zipCode": "33101",
  "countyFips": "12086",
  "planIds": [
    "21525FL0020004"
  ],
  "year": 2026,
  "division": "HealthCare",
  "income": 35000,
  "age": 30,
  "gender": "Female",
  "usesTobacco": false,
  "aptcEligible": true,
  "metalLevels": [
    "Bronze",
    "Silver"
  ],
  "planTypes": [
    "HMO",
    "EPO"
  ],
  "issuers": [
    "Oscar"
  ],
  "hsaEligibleOnly": false,
  "sortBy": "premium",
  "sortOrder": "asc",
  "maxItems": 20,
  "fetchFullDetails": false
}
```

# Actor output Schema

## `status` (type: `string`):

SUCCEEDED, PARTIAL, EMPTY, or INVALID_INPUT.

## `plansDelivered` (type: `string`):

Number of validated health plan records stored in dataset.

## `totalMarketplacePlans` (type: `string`):

Total available marketplace plans matching search criteria in this area.

## `location` (type: `string`):

ZIP code, county, and state searched.

## `chargedResultEvents` (type: `string`):

Number of plan-scraped billing events confirmed.

## `warnings` (type: `string`):

Non-fatal warnings or diagnostics encountered during the run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/healthcare-gov-plan-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/healthcare-gov-plan-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call muhammadafzal/healthcare-gov-plan-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/healthcare-gov-plan-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5Awk5KemEcEbGPkJG/builds/eHBMTkcCGsqPQQbEc/openapi.json
