# Medicare Advantage Competitive Intelligence Monitor (`huykenny/medicare-advantage-competitive-intelligence`) Actor

Track Medicare Advantage plans, enrollment, county market share, Star Ratings and competitor changes from public CMS data. Detect plan launches, exits, growth, rating changes and geographic expansion.

- **URL**: https://apify.com/huykenny/medicare-advantage-competitive-intelligence.md
- **Developed by:** [Kenny Ha](https://apify.com/huykenny) (community)
- **Categories:** Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 competitive signals

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Medicare Advantage Competitive Intelligence Monitor

Track Medicare Advantage plans, enrollment, county market share, Star Ratings and
competitor changes from public CMS data. Detect plan launches, exits, growth,
rating changes and geographic expansion.

**Turn public CMS Medicare Advantage data into competitor signals.**

CMS publishes everything you need to understand the Medicare Advantage market —
and publishes it in a form that answers nothing. The monthly county enrollment
file is 3.4 million rows with no history, no market share, no rank, no carrier
rollup and no comparison against last month. 94.5% of its cells are suppressed to
an asterisk. This Actor does the joining, the arithmetic and the month-over-month
diff, and hands you the findings.

```
KelseyCare Advantage Signature (HMO)  ·  UnitedHealth Group  ·  contract H0332-009
Harris County, TX  ·  26,596 members  ·  6.499% of the county's 409,243 MA enrollees
County rank 1 of 160 reporting plans  ·  1,064 more competitors below CMS's reporting threshold
```

Every number above is from the live 2026-08 CMS release and hand-checked against
the source files.

### What does this Actor do?

It reads six public CMS files for two consecutive monthly releases, normalizes and
joins them, and returns one of four views:

- **Competitive signals** (default) — only what changed, ranked by significance.
- **Plans** — one row per Medicare Advantage plan, with enrollment trend, Star
  Ratings and footprint.
- **County market** — one row per plan per county, with market share, rank and
  the county's competitive picture.
- **Carriers** — one row per parent organization, rolled up.

It also remembers what it showed you last time, so a scheduled run can return
only what is new to you. On a day when CMS has published nothing new, it finishes
in about seven seconds.

### Who is it for?

- **Medicare Advantage insurers** — track competitors' enrollment, county
  footprint and rating movement without a data team.
- **Brokers and agencies** — see which plans are growing in the counties you sell
  in, and which carriers just entered or left.
- **Healthcare consultants and strategy teams** — county-level market share and
  rank across every US county, refreshed monthly.
- **Insurtech and healthcare SaaS** — a normalized MA plan and enrollment feed
  without building six CMS parsers.
- **Healthcare investors and analysts** — carrier-level share shifts and Star
  Rating changes as they publish.
- **Provider-network teams** — which plans actually have members in your counties.
- **Competitive intelligence teams** — a monitored feed instead of a quarterly
  spreadsheet exercise.

### What can you monitor?

- Which Medicare Advantage plans are gaining or losing enrollment
- Which carriers are gaining or losing county market share
- Which carriers entered or exited a county's approved service area
- Which plans launched, and which disappeared
- Which contracts' Star Ratings went up or down
- Which plans are growing fastest in a given state or county
- Who dominates a county, and how many competitors sit below CMS's reporting
  threshold
- How a carrier's footprint is expanding across states and counties

### Data sources

All public CMS files. No login, no API key, no personal or beneficiary data.

| Source | What it provides | Required |
| --- | --- | --- |
| Monthly Enrollment by Contract/Plan/State/County | Enrollment per plan per county | Yes |
| CPSC Contract Info | Plan name, type, carrier, parent organization, SNP and employer-group flags | Yes |
| MA Contract Service Area by State/County | Which counties each contract may sell in | Yes |
| MA State/County Penetration | Official county Medicare Advantage totals — the market-share denominator | Yes |
| Part C and Part D Star Ratings (current + prior year) | Contract-level overall, Part C and Part D ratings | Optional |
| SNP Comprehensive Report | SNP subtype, specialty diseases, integration status, plan segments | Optional |

The newest available release is discovered automatically, along with the previous
comparable month. An optional source failing costs only the fields it would have
filled; it is reported in the run summary and never fabricated. Full detail,
including every column quirk, is in `docs/SOURCES.md`.

### Signals

| Signal | Meaning |
| --- | --- |
| `NEW_PLAN` | A plan appeared in CMS data |
| `PLAN_EXIT` | A plan disappeared from CMS data |
| `NEW_COUNTY` | A carrier added a county to a contract's approved service area |
| `COUNTY_EXIT` | A carrier dropped a county from a contract's approved service area |
| `COUNTY_ENROLLMENT_START` | A plan rose above CMS's county reporting threshold |
| `COUNTY_ENROLLMENT_STOP` | A plan fell below CMS's county reporting threshold |
| `ENROLLMENT_GROWTH` / `ENROLLMENT_DECLINE` | Enrollment moved past both your thresholds |
| `MARKET_SHARE_GAIN` / `MARKET_SHARE_LOSS` | County or national share moved, in percentage points |
| `STAR_RATING_UP` / `STAR_RATING_DOWN` | A contract's overall Star Rating changed |

**Two of these are deliberately split apart.** CMS measures "which counties a
contract may sell in" and "does this plan have more than 10 members here" in two
different files. Only the first is a market event, so it gets `NEW_COUNTY` /
`COUNTY_EXIT`. A plan crossing the reporting threshold — 10 members to 11, or 11
back to 10 — gets `COUNTY_ENROLLMENT_START` / `STOP` instead. Calling a threshold
crossing a county exit would tell you something the data does not say.

Each signal carries a **`signalScore`** from 0 to 100 so you can sort by
significance. It is a deterministic formula over the size of the enrollment move,
the market-share shift, the rating change and the kind of event — no model, no
AI, fully documented in `docs/METHODOLOGY.md`. It ranks what deserves attention;
it does not predict business outcomes.

### Enrollment trends

`enrollmentChange` and `enrollmentChangePercent` compare the current CMS month
against the previous one. Both are withheld, with `enrollmentComparable: false`,
when either month's cell was suppressed — a plan could have moved from 1 to 200
or from 10 to 200 behind the same asterisk, and no honest delta exists.

**A suppressed value is `null`, never `0`.** CMS suppresses any county cell with
10 or fewer members: 3,204,775 of 3,390,880 rows in the 2026-08 file. Treating
those as zero would fabricate 3.2 million facts.

### County-level market intelligence

County market share divides plan enrollment by **CMS's official county Medicare
Advantage total**, not by a sum of the visible plan rows. With 94.5% of rows
suppressed, summing what is visible undercounts a county by up to 10 members per
hidden plan — in Harris County, Texas, 1,064 sub-threshold plans sit
alongside the 160 that report, against an official total of 409,243. Each county
row also carries:

- `countyVisibleEnrollment` — the sum that *is* visible, so the gap is inspectable
- `countySuppressedPlanCount` — how many competitors are present but below the threshold
- `countyRank`, `previousCountyRank`, `rankChange` — position among reporting plans
- `marketShareChangePp` — movement in **percentage points**, not percent
- `countyPenetrationPercent` — how much of the county's Medicare population is in MA
- `inServiceArea` — whether the contract is approved to sell there

### Star Ratings

Contract-level overall, Part C and Part D ratings for the current rating year,
compared against the prior year. Ratings are published annually, so a rating
signal fires once — on the run that first sees a new rating year — and once per
contract, not once per plan. The rating **values** stay on every plan and county
row on every run.

Contracts with no rating keep `null`. "Not rated" is a category — a plan too new
to be measured — not a low score, and no rating filter removes those rows.

### Input examples

Every example below has been run against live CMS data.

**Latest competitive signals, nationwide** — the default:

```json
{ "outputMode": "signals" }
```

**Monitor one carrier:**

```json
{ "outputMode": "signals", "organizations": ["Humana"], "stateStoreName": "humana-monitor" }
```

**Texas county market:**

```json
{ "outputMode": "county-market", "states": ["TX"] }
```

**Star Rating changes only:**

```json
{ "outputMode": "signals", "signalTypes": ["STAR_RATING_UP", "STAR_RATING_DOWN"] }
```

**Enrollment growth above 20%, meaningful plans only:**

```json
{
    "outputMode": "signals",
    "signalTypes": ["ENROLLMENT_GROWTH"],
    "minEnrollmentChangePercent": 20,
    "minEnrollmentChangeAbsolute": 100
}
```

**Special Needs Plans, 4 stars and up:**

```json
{ "outputMode": "plans", "snpOnly": true, "minStarRating": 4 }
```

**Carrier league table:**

```json
{ "outputMode": "carriers" }
```

### Output examples

A signal row, from a real 2026-08 production run:

```json
{
    "recordKind": "signal",
    "signalType": "ENROLLMENT_GROWTH",
    "signalGrain": "plan",
    "signalScore": 40.1,
    "headline": "SCAN Strive (HMO C-SNP) (H1822-006) grew +23.18% to 1185 members",
    "contractId": "H1822",
    "planId": "006",
    "planName": "SCAN Strive (HMO C-SNP)",
    "planType": "HMO",
    "organizationName": "SCAN DESERT HEALTH PLAN, INC.",
    "parentOrganization": "SCAN Group",
    "stateCode": "AZ",
    "currentEnrollment": 1185,
    "previousEnrollment": 962,
    "enrollmentChange": 223,
    "enrollmentChangePercent": 23.18,
    "starRating": 4.5,
    "previousStarRating": 3.5,
    "starRatingChange": 1,
    "dataPeriod": "2026-08",
    "previousDataPeriod": "2026-07",
    "monitoringChangeType": "NEW"
}
```

A county-market row:

```json
{
    "recordKind": "county-market",
    "contractId": "H0332",
    "planId": "009",
    "planName": "KelseyCare Advantage Signature (HMO)",
    "organizationName": "KS PLAN ADMINISTRATORS, LLC",
    "parentOrganization": "UnitedHealth Group, Inc.",
    "stateCode": "TX",
    "county": "Harris",
    "countyFips": "48201",
    "currentEnrollment": 26596,
    "previousEnrollment": 26583,
    "enrollmentChange": 13,
    "enrollmentComparable": true,
    "countyTotalMaEnrollment": 409243,
    "countyVisibleEnrollment": 408469,
    "countySuppressedPlanCount": 1064,
    "marketSharePercent": 6.499,
    "countyRank": 1,
    "rankChange": 0,
    "inServiceArea": true,
    "dataPeriod": "2026-08"
}
```

Each run also writes a `RUN_SUMMARY` record to the key-value store with the
periods compared, per-source health, signal counts by type, and exactly what was
charged.

### Dataset views

Four views, one per output mode: **Competitive signals**, **Plans**,
**County market** and **Carriers**. Each puts the business fields first and the
technical metadata last, so any of them exports cleanly to CSV or Excel on its
own.

### Scheduling

Point a monthly schedule at it and leave it. CMS publishes a month around the
7th–14th, so a schedule on the 15th will normally catch each new release.

Daily is also fine and costs almost nothing: `skipWhenNoNewCmsPeriod` is on by
default, so a run that finds nothing new finishes in about seven seconds and
charges only the Actor start fee. Changing any filter counts as a different
question and always runs in full.

Use a distinct `stateStoreName` per monitor, and set `deltaMode` to
`changes-only` or `new-only` for an alerting feed.

### Pricing

Pay-per-event, with tiered discounts for higher Apify plans. Measured on real
runs against the 2026-08 release:

| Run | Rows | Cost (FREE tier) |
| --- | --- | --- |
| Competitive signals, nationwide, first run | 290 | **$2.95** |
| Carriers, nationwide | 166 | **$0.06** |
| Plans, nationwide | 6,458 | **$0.37** |
| County market, one state (Texas) | 8,028 | **$0.45** |
| County market, nationwide | 120,475 | **$6.07** |
| Scheduled run, no new CMS release | 0 | **$0.05** |
| Monthly signals monitor, quiet month | ~33 | **~$0.38** |

Unchanged rows and findings you have already been given are never charged, which
is what makes recurring monitoring cheap. A first run against a new monitoring
name is billed at a reduced baseline rate.

A nationwide county-market run is the one large one — 120,475 rows. Set a cost
limit on the run if you want a hard ceiling, or filter to the states you care
about. Full breakdown in `docs/MONETIZATION.md`.

### API

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

const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client
    .actor('huykenny/medicare-advantage-competitive-intelligence')
    .call({ outputMode: 'signals', organizations: ['Humana'] });

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")

run = client.actor("huykenny/medicare-advantage-competitive-intelligence").call(
    run_input={"outputMode": "signals", "states": ["TX"]}
)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### Output formats

JSON, JSON Lines, CSV, Excel, XML, RSS — via the Apify dataset API or the
Console. Every view exports independently.

### Integrations

Anything Apify connects to: Google Sheets, Slack, webhooks, Zapier, Make, or your
own service polling the dataset API.

### Reliability

- The newest CMS release is discovered rather than assumed, and the two months
  CMS never published (2019-11 and 2023-07) are skipped automatically.
- Sources are split into required and optional. An optional source failing
  degrades the output explicitly and is recorded in the run summary; it never
  fabricates a value and never fails the run.
- Nothing claims a disappearance unless the download was complete, the run was
  unfiltered, the two periods are adjacent and row counts clear a completeness
  floor. Details under **Limitations**.
- The 170 MB enrollment file is streamed, never buffered. Peak memory on a
  nationwide run is about 550 MB.
- 176 unit tests plus a live suite that asserts the CMS file shapes this Actor
  depends on.

### Limitations

Honest ones, all of them consequences of what CMS publishes.

- **94.5% of county enrollment cells are suppressed.** CMS withholds any cell
  with 10 or fewer members. Those plans are present in a county but their size is
  unknowable, so enrollment is `null` and no delta is computed. County market
  share therefore covers reporting plans only, against the correct official
  denominator.
- **No plan segments in enrollment data.** CMS publishes `SEGMENT_ID` only in the
  SNP Comprehensive Report. Plan identity is contract + plan; segments appear as a
  `segmentIds` array. Segment-level enrollment does not exist publicly.
- **Service area is contract-level, not plan-level.** `NEW_COUNTY` and
  `COUNTY_EXIT` are therefore contract facts. CMS does not publish a
  plan-by-county approved service area.
- **Star Ratings are annual and contract-level.** They cannot be attributed to an
  individual plan, and a rating change is news once a year.
- **Carrier totals include employer-group Medicare Advantage**, because the CMS
  enrollment file does not separate it. Use the plan-level `isEghp` flag to
  isolate the individual market.
- **No premiums or benefit detail.** Those are not in this CMS dataset family.
- **Mid-year months are quiet.** Plan rosters and service areas change at the
  annual boundary, so most launches, exits and footprint changes land between
  October and January.
- **`nationalMarketSharePercent` is share of observed enrollment**, not of the
  true national total, which suppressed data makes unknowable.
- Standalone Part D, PACE and Cost plans are excluded by default. They share
  these CMS files but are different markets; set `planUniverse: "all"` to include
  them.

### Data methodology

Every derived figure — enrollment deltas, market share, rank, carrier rollups,
the signal score and the removal-safety rules — is specified in
`docs/METHODOLOGY.md`, including the exact formulas and what each one does not
claim.

### Disclaimer

This is an independent, community-built Actor. It is **not affiliated with,
endorsed by, or sponsored by** the Centers for Medicare & Medicaid Services,
Medicare, the U.S. Department of Health and Human Services, or any health
insurance company.

All data is derived from publicly available CMS datasets and is intended for
research, analytics and competitive intelligence. Figures are only as current and
as complete as the CMS files they come from, and CMS suppresses small counts by
design.

This Actor does not provide insurance, medical, legal or financial advice. It
processes aggregate plan-level data only and collects no beneficiary names,
addresses, Medicare numbers, patient records, health records or claims.

### Support

Open an issue on the Actor's Apify page. When reporting a data problem, include
the run ID — the run summary records which CMS files were used, which sources
succeeded and which periods were compared, which is usually enough to pinpoint it.

# Actor input Schema

## `outputMode` (type: `string`):

"Competitive signals": only detected changes, ranked by significance. "Plans": one row per Medicare Advantage plan with enrollment, ratings and trend. "County market": one row per plan per county with market share and rank. "Carriers": one row per parent organization.

## `signalScope` (type: `string`):

Only applies when the output mode is "Competitive signals". Plan level covers plan launches and exits, plan enrollment moves, carrier moves and county service-area changes. County level adds per-county enrollment and market-share movement, which is far more granular and much larger nationwide. Narrowing by state or county turns county-level signals on automatically.

## `signalTypes` (type: `array`):

Leave empty for every signal type. Use this to build a focused feed, for example only plan launches and exits, or only Star Rating movement.

## `currentPeriod` (type: `string`):

CMS month to analyse, as YYYY-MM, for example "2026-08". Leave empty for the newest published month.

## `previousPeriod` (type: `string`):

CMS month to compare against, as YYYY-MM. Leave empty to use the newest published month older than the current period. Note that CMS never published 2019-11 or 2023-07.

## `organizations` (type: `array`):

Match against parent organization, legal organization name or marketing name. Case-insensitive and matches on part of a name, so "humana" matches "Humana Inc.". Leave empty for all carriers.

## `contractIds` (type: `array`):

CMS contract IDs, for example "H0028". Leave empty for all contracts.

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

CMS plan IDs within a contract, three digits, for example "009". Only useful together with a contract ID.

## `states` (type: `array`):

Two-letter state codes, for example "TX". Leave empty for all states.

## `counties` (type: `array`):

County FIPS codes (preferred, for example "48201" for Harris County, Texas) or county names as CMS publishes them, without the word "County". FIPS is more reliable, because county names differ between CMS files.

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

Leave empty for all plan types. The original CMS plan-type text is always kept in the output's rawPlanType field.

## `snpOnly` (type: `boolean`):

Return only Special Needs Plans (SNPs).

## `snpTypes` (type: `array`):

Filter to specific SNP subtypes. Subtypes come from the CMS SNP Comprehensive Report, so this needs the SNP detail source switched on below.

## `planUniverse` (type: `string`):

CMS ships standalone Part D, PACE and Cost plans in the same files as Medicare Advantage. They are different markets, and including them would put non-MA volume into every enrollment total and market share, so they are excluded by default.

## `minStarRating` (type: `number`):

Only include contracts whose overall Star Rating is at least this value. Ratings move in half stars, so 3.5 and 4.5 are valid.

## `maxStarRating` (type: `number`):

Only include contracts whose overall Star Rating is at most this value. Useful for finding underperforming competitors. Half stars are valid.

## `minEnrollment` (type: `integer`):

Only include plans at or above this enrollment. Suppressed values are kept, since their true size is unknown.

## `maxEnrollment` (type: `integer`):

Only include plans at or below this enrollment.

## `minEnrollmentChangePercent` (type: `number`):

An enrollment signal needs both this percentage change and the absolute change below it. Requiring both is what stops a plan moving from 11 to 13 members being reported as 18% growth.

## `minEnrollmentChangeAbsolute` (type: `integer`):

The second half of the noise floor. Raise it to see only large movements; lower it to catch small plans.

## `minMarketSharePercent` (type: `number`):

Only include county rows where the plan holds at least this share of the county's Medicare Advantage enrollment.

## `minMarketShareChangePp` (type: `number`):

A market-share signal needs a move of at least this many percentage points. A plan going from 8% to 10% of a county moved 2 percentage points.

## `deltaMode` (type: `string`):

"Everything": the full current result each run. "Changes only": skip rows you have already been given unchanged. "New only": the cleanest feed for scheduled alerts.

## `stateStoreName` (type: `string`):

Identifies this monitor so the Actor remembers what it last showed you. Use the same value on every scheduled run for one purpose, and a different value to start an independent monitor.

## `skipWhenNoNewCmsPeriod` (type: `boolean`):

On by default. When this monitor has already answered the same request for the newest CMS month, the run finishes immediately without downloading anything, so a daily schedule costs only the Actor start fee. Changing any filter counts as a different request and always runs in full. Turn this off to force a complete run every time.

## `initializeStateOnly` (type: `boolean`):

Turn this on for the very first run of a new monitoring name: it records the current picture as your baseline and returns no rows, so your next run shows only genuine movement.

## `emitRemovedRecords` (type: `boolean`):

Include rows for plans or county positions that vanished since your last run. Only ever applies when the Actor could confirm a complete, unfiltered download — see the README's removal-safety section.

## `includeStarRatings` (type: `boolean`):

Fetch the current and previous Part C and Part D Star Ratings years. Turning this off removes all rating fields and rating signals and makes the run slightly faster.

## `includeSnpDetail` (type: `boolean`):

Fetch the CMS SNP Comprehensive Report for SNP subtype, specialty diseases, integration status and plan segment IDs. This is the only CMS file that publishes segment IDs.

## `includeEmployerGroupPlans` (type: `boolean`):

The CMS service-area file is 89% employer-group-only rows, which describe coverage sold through employers rather than the individual Medicare market. They are excluded by default.

## `includeSuppressedRows` (type: `boolean`):

CMS suppresses county cells with 10 or fewer members. Including them adds about 3.2 million rows nationwide, so this is honoured only when the run is narrowed to specific states or counties. Enrollment stays null on these rows; it is never guessed.

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

Stop after this many rows. Useful for a cheap trial run. Note that limiting rows makes the run incomplete, which switches off every signal that claims something disappeared.

## `debug` (type: `boolean`):

Log every source URL, row count and filter decision. Useful when a run returns less than you expected.

## Actor input object example

```json
{
  "outputMode": "signals",
  "signalScope": "plan",
  "currentPeriod": "2026-08",
  "previousPeriod": "2026-07",
  "organizations": [
    "Humana",
    "UnitedHealth Group"
  ],
  "contractIds": [
    "H0028",
    "H4513"
  ],
  "planIds": [
    "009"
  ],
  "states": [
    "TX",
    "FL"
  ],
  "counties": [
    "48201"
  ],
  "snpOnly": false,
  "planUniverse": "medicare-advantage",
  "minEnrollmentChangePercent": 10,
  "minEnrollmentChangeAbsolute": 25,
  "minMarketShareChangePp": 0.5,
  "deltaMode": "all",
  "stateStoreName": "humana-texas-monitor",
  "skipWhenNoNewCmsPeriod": true,
  "initializeStateOnly": false,
  "emitRemovedRecords": true,
  "includeStarRatings": true,
  "includeSnpDetail": true,
  "includeEmployerGroupPlans": false,
  "includeSuppressedRows": false,
  "debug": false
}
```

# Actor output Schema

## `records` (type: `string`):

Signals, plans, county-market rows or carriers, depending on the output mode.

## `runSummary` (type: `string`):

Periods compared, per-source health, signal counts and what was actually charged.

# 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("huykenny/medicare-advantage-competitive-intelligence").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("huykenny/medicare-advantage-competitive-intelligence").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 huykenny/medicare-advantage-competitive-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,huykenny/medicare-advantage-competitive-intelligence"
        }
    }
}

```

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/oPg2GYSkwDc5Ma69i/builds/enVtGUl3Wy9vWi2Gd/openapi.json
