Use the Data
All of the data on this site is free to download, with no sign-up. To see how it was gathered, read Source Data.
May I reuse it?
Yes, you're welcome to. A formal license has not been chosen yet. If you use the data, please say where it came from and link back, so people can check the source.
Data files
The simplest way in: the same JSON files this site reads. They need no key.
https://medicaidrewards.com/data/states/MI.json: one file per state (swap in any two-letter state code), with its plans, programs, counties, rewards, sources, and changes.https://medicaidrewards.com/data/directory.json: all 50 states and DC, with each state's Medicaid program name and how its plans are organized.https://medicaidrewards.com/data/rewards.json: the list of reward types, so the same reward can be matched across plans.reward_categories.json,qualifier_labels.jsonandfederal_benefits.jsonin the same folder: reward categories, labels for who a reward is for, and the benefits every Medicaid member gets.
Each state file starts with exported_at, the date the file was made.
API
For custom queries, use the read-only REST API.
- Address:
https://mqbnsjkeucvumdoqdeww.supabase.co/rest/v1/ - Every request needs the public key in an
apikeyheader. The key is the same for everyone and is safe to share:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im1xYm5zamtldWN2dW1kb3FkZXd3Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODAxODUyNjgsImV4cCI6MjA5NTc2MTI2OH0.s3rp33fqEmaBgO81gVDVel14g5fBjvPgsguUiWBvi8E - Main endpoint:
reward_comparison, one row per reward, with its plan, state, category, amounts, and who qualifies. - Lists:
api_states,api_plans,api_categories,api_universal_rewards. - Status:
rpc/api_health.
The API runs on a free database that can go to sleep when idle. If it is asleep, use the data files.
What to expect
- No promise that the files or the API will always be up, or that fields won't change.
- No support.
- Found a mistake in the data? See Corrections.
Endpoint reference
Generated from the project's API documentation. Add the two headers from the API section above to every request. Query syntax is PostgREST's: ?state_id=eq.OH, ?select=plan_name,reward_name, ?limit=100&offset=0.
GET /reward_comparison — Full reward data
The primary endpoint. Returns one row per reward, fully denormalized with plan, category, state, limits, and eligibility data. This is the public API contract — column names will not be renamed or removed.
| Column | Type | Description |
|---|---|---|
state_id | text | Two-letter state abbreviation (e.g. OH, CA) |
state_name | text | Full state name |
program_name | text | State Medicaid program name (e.g. "Mountain Health Trust") |
baseline_coverage | text | What all plans in the state cover by default |
plan_id | uuid | Health plan identifier |
plan_name | text | Plan brand name in this state |
plan_short_name | text | Abbreviated display name |
plan_color | text | Hex color for UI rendering |
plan_phone | text | Member services phone number |
plan_website | text | Plan website URL |
parent_company | text | National parent company name, or null |
service_area_type | text | STATE, REGION, or COUNTY |
service_area_name | text | Geographic area the plan covers |
category_id | text | Benefit category slug (e.g. dental, wellness) |
category_name | text | Human-readable category name |
category_icon | text | Emoji icon for the category |
category_order | integer | Display sort order |
category_color | text | Hex color for the category |
reward_id | uuid | Catalog reward identifier (154-row normalized catalog) |
reward_name | text | Normalized reward title |
short_label | text | Short display label for UI tiles (≤6 words) |
shared_summary | text | One-sentence consumer description of the reward |
detail | text | 2–4 sentence comparison guidance for cross-plan evaluation |
compare_archetype | text | DOLLARS, QUANTITY, VARIANT, or PROVISION — comparison strategy |
reward_listing_id | uuid | Per-plan listing identifier |
listing_description | text | Per-plan listing description (may differ from catalog) |
reward_description | text | Per-plan description (alias of listing_description) |
qualifier | text | Who qualifies: all_members, pregnancy, postpartum, respiratory, metabolic, behavioral, cardiovascular, chronic, disability, housing, reentry, enrollment, needs_based |
reward_class | text | SERVICE, INCENTIVE, GOODS, ACCESS, or PROGRAM |
activities | jsonb | Array of per-activity breakdown objects, or null. See below. |
variant_label | text | Distinguishing label for VARIANT archetype rewards, or null |
access_note | text | Access instructions (phone, app, vendor) for PROVISION rewards, or null |
values | jsonb | Array of structured limit/value objects (v9 native), or null |
source_url | text | URL of the primary source document |
reward_limits | jsonb | Array of limit objects (alias of values), or null |
reward_eligibility | jsonb | Array of eligibility rule objects, or null |
redirect_url | text | URL to the state's own comparison tool (full redirect), or null |
official_resource_url | text | URL to the state's official comparison resource (attribution link), or null |
official_resource_label | text | Display name for the official resource, or null |
insurer_id | uuid | v9 name of plan_id |
insurer_brand | text | v9 name of plan_name |
insurer_short | text | v9 name of plan_short_name |
insurer_color | text | v9 name of plan_color |
insurer_phone | text | v9 name of plan_phone |
insurer_website | text | v9 name of plan_website |
corporate_parent | text | v9 name of parent_company |
medicaid_brand | text | State Medicaid program brand (v9 name of program_name on api_states) |
program_id | uuid | Consumer-facing program the listing belongs to (STAR, CHIP, HIP…) |
program_insurer_area_id | uuid | The program × insurer × area row the listing hangs on |
area_label | text | Service-area label of that row, or null |
evidence_type | text | confirmed (found in a plan document) or inferred_mandatory |
eligibility | jsonb | v9 name of reward_eligibility |
reward_limits element
| Field | Type | Values |
|---|---|---|
amount | numeric | Dollar amount or quantity cap |
frequency | text | MONTHLY, YEARLY, ONE_TIME, PER_OCCURRENCE, QUARTERLY, BIENNIAL |
applies_to | text | MEMBER, HOUSEHOLD, CHILD |
is_maximum | boolean | Whether the amount is a cap |
limit_quantity | numeric | Non-dollar quantity limit |
limit_unit | text | Unit for limit_quantity (e.g. visits, items) |
activities element
| Field | Type | Values |
|---|---|---|
activity | text | Activity name (e.g. "Well-child visit", "HPV vaccine") |
amount | numeric | Dollar amount or quantity for this activity |
unit | text | dollars, meals, subscription — defaults to dollars |
frequency | text | annual, per_visit, one-time, monthly, per_pregnancy, etc. |
audience | text | Target population (e.g. "Ages 0-15 months", "adults") — present for audience_split rewards |
max_amount | numeric | Cap for per-visit rewards |
max_visits | numeric | Visit cap for per-visit rewards |
Only present on rewards with structured per-activity breakdowns. Most rewards will have activities: null.
reward_eligibility element
| Field | Type | Values |
|---|---|---|
rule_type | text | AGE_RANGE, CONDITION, PROGRAM, MATERNITY, ENROLLMENT_REQUIRED |
age_min | integer | Minimum age in years |
age_max | integer | Maximum age in years |
condition_name | text | Required health condition (e.g. "Diabetes", "Asthma") |
GET /api_states — State directory
One row per state. Use this to build a state picker or discover which states have data.
| Column | Type | Description |
|---|---|---|
state_id | text | Two-letter abbreviation |
state_name | text | Full name |
medicaid_brand | text | State Medicaid program brand (e.g. "AHCCCS", "Medi-Cal") |
program_name | text | Backward-compat alias of medicaid_brand |
flow_type | text | Enrollment flow archetype for this state |
is_regionalized | boolean | Whether the state has regional plan areas |
official_resource_url | text | URL to the state's official comparison resource, or null |
redirect_url | text | URL to the state's own comparison tool (full redirect), or null |
agency_label | text | State Medicaid agency name (e.g. "Kentucky DMS") |
agency_phone | text | State Medicaid agency phone number |
agency_url | text | State Medicaid agency website |
insurer_count | integer | Number of active insurers in the state |
plan_count | integer | Backward-compat alias of insurer_count |
reward_count | integer | Total reward listings across all insurers |
avg_rewards_per_plan | numeric | Mean reward listings per insurer (backward-compat name) |
disclosure_tier | text | Data coverage classification (see below) |
data_completeness_score | numeric | Computed data quality score |
Disclosure tiers
Computed from live data — updates automatically as coverage improves.
| Tier | Criteria | Meaning |
|---|---|---|
external | State has own comparison tool | Redirect: state provides its own plan comparison with extra benefits |
green | Multi-plan, avg ≥ 15 rewards/plan | Well-covered: rich per-plan data, strong comparison |
yellow | Multi-plan, avg 10–14.9 rewards/plan | Adequate: meaningful data, some gaps likely |
red | Multi-plan, avg < 10 rewards/plan | Thin: managed care state with sparse extraction |
gray | Single plan entity | Structural: FFS/PCCM, no plan comparison possible |
GET /api_categories — Benefit categories
One row per category, ordered by display position.
| Column | Type | Description |
|---|---|---|
category_id | text | Slug identifier (e.g. dental, rewards) |
category_name | text | Human-readable name |
category_icon | text | Emoji icon |
category_color | text | Hex color |
display_order | integer | Recommended sort position |
reward_count | integer | Total rewards in this category |
GET /api_plans — Insurer directory
One row per insurer per state, with reward counts and contact info. Column names use plan_* for backward compatibility (v9 entities are "insurers" internally).
| Column | Type | Description |
|---|---|---|
state_id | text | State abbreviation |
state_name | text | Full state name |
plan_id | uuid | Insurer identifier (backward-compat name) |
plan_name | text | Full brand name |
plan_short_name | text | Short display name |
plan_color | text | Hex color |
plan_phone | text | Member services phone |
plan_website | text | Website URL |
parent_company | text | Corporate parent, or null |
service_area_name | text | Geographic area label |
reward_count | integer | Number of reward listings |
GET /api_universal_rewards — Federal benefits
Federal mandates that apply to all Medicaid members regardless of plan (NEMT, Free Cell Phone). Sourced from the federal_benefits table.
[
{
"id": "...",
"reward_name": "Non-Emergency Medical Transportation (NEMT)",
"category": "Transportation",
"description": "Free rides to and from medical appointments...",
"authority": "42 CFR § 431.53",
"is_active": true
}
]
| Column | Type | Description |
|---|---|---|
id | uuid | Unique identifier |
reward_name | text | Federal benefit title |
category | text | Reward category name |
description | text | Consumer-facing description |
authority | text | Federal regulatory authority citation |
is_active | boolean | Whether currently active |
GET /rpc/api_health — Health check and data stats
Returns API status, data freshness, and endpoint list. No parameters needed; GET and POST both work.
{
"status": "ok",
"api_version": "2.1",
"data": {
"total_rewards": <live count>,
"total_reward_definitions": <live count>,
"total_universal_rewards": <live count>,
"total_plans": <live count>,
"total_states": <live count>,
"total_sources": <live count>,
"total_extractions": <live count>,
"categories": <live count>,
"newest_update": "<timestamp>",
"oldest_record": "<timestamp>"
},
"endpoints": [
"reward_comparison",
"api_states",
"api_categories",
"api_plans",
"api_universal_rewards",
"rpc/api_health"
]
}
data key | Meaning |
|---|---|
total_rewards | reward_listings row count (per-plan instances) |
total_reward_definitions | rewards catalog row count |
total_universal_rewards | federal_benefits row count |
total_plans | Distinct active insurers (program_insurer_areas.status IS DISTINCT FROM 'exited') |
total_states | states row count |
total_sources | sources row count |
total_extractions | extractions row count |
categories | reward_categories row count |
newest_update | Max reward_listings.last_changed |
oldest_record | Min rewards.created_at |
api_health() runs as SECURITY INVOKER, so every count reflects only what the anon role can read under RLS — it is not a privileged snapshot of the full table.