state
get_medicaid_rate
Get Medicaid Rate·v0.2.0·L2·read-only·MCP + REST·admitted 2026-11-02
Inputs
130 required
Sources
4
Known limits
5
Real answer
1.6scomplete
What it answers
- 1State Medicaid fee-for-service (FFS) rates by code from every state's published fee schedules, with history, cross-state comparison and the Medicare benchmark.
- 2Five modes: lookup (state + code(s): the rate in force today or on as_of, with its unit, type, schedule, effective date and source), compare (one code across every state that publishes it, on one basis, with the national median, quartiles, ratio and rank), trend (one state x code: the dated rates by key with the change at each step), changes (every rate that moved in a state in a date window: increase, decrease, new_code, pct_change), vs_medicare (a state's Medicaid rates as a share of the Medicare PFS non-facility rate for the same codes).
- 3Use cases: 'What does Arizona Medicaid pay for 97153 (ABA)?'; 'Which states pay the most for T1019 personal care per hour?'; 'How has Ohio's H2019 rate moved since 2021?'; 'What changed in Florida's behavioral health rates this year?'; 'How does Texas Medicaid compare with Medicare for 99213?'.
- 4A rate is dated by its own effective date (schedules reprint old rates in each edition; the latest edition printing a dated rate wins; in force = the latest dated rate on or before the day, for a key the current edition still prints).
- 5Every rate names its unit (rate_unit, unit_minutes) and type (fee, per_diem, percent_of_charges, conversion_factor, manual_pricing, not_covered); a key with more than one rate for the same date is served flagged ambiguous_key and never averaged; compare keeps one basis (per_hour for time units) and lists other-basis states as not compared.
- 6These are the state's FFS maximums, never managed-care negotiated rates.
- 7Coverage is state by state (47 states on 2026-11-02): a state with no rows is not built yet, not zero.
- 8SOURCE: vlada_curated.vw_state_medicaid_rate_v2 (one row per published rate with its source file sha256 and locator) and the States lane's views vw_state_medicaid_rate_change_v1, _compare_v1, _vs_medicare_v1 (M2).
Inputs (13)
| Name | Type | Required | Default | Accepts |
|---|---|---|---|---|
as_of | any | optional | null | YYYY-MM-DD: the rate in force on that day (lookup). Default: today. |
code | any | optional | null | One procedure / service code (97153, H2019, T1019). Required for compare and trend. |
code_system | any | optional | null | cpt | hcpcs | local | drg | apc ... as the schedule labels it; optional (compare maps 5-character CPT/HCPCS to HCPCS). |
codes | any | optional | null | Up to 25 codes for lookup, in place of code. |
date_from | any | optional | null | YYYY-MM-DD (changes, on the rate's effective date). Default: 24 months before date_to. |
date_to | any | optional | null | YYYY-MM-DD (changes). Default: today. |
limit | any | optional | null | Rows to return (default 50, max 500). |
mode | string | optional | "lookup" | lookup (state + code(s)), compare (code across states), trend (state + code by dated rate), changes (state, date window), vs_medicare (state [+ code]: Medicaid as a share of Medicare PFS). lookup | compare | trend | changes | vs_medicare |
modifiers | any | optional | null | Modifier string as printed (HO, 'HM U1'); '' for no modifier. compare defaults to no modifier. |
program | any | optional | null | Filter: the program / waiver as the schedule names it (contains match). |
provider_type | any | optional | null | Filter: the provider type as the schedule names it (contains match). |
service_line | any | optional | null | Filter: aba_ei, behavioral_health, sud, hcbs, idd, professional, ... |
state | any | optional | null | 2-letter state code (AZ). Required for lookup, trend, changes, vs_medicare. |
Call it
# MCP (https://mcp.vladahealth.com/mcp): the tool by name get_medicaid_rate(mode="lookup", state="AZ", code="97153")
curl -X POST https://api.vladahealth.com/v1/tools/get_medicaid_rate \
-H "Authorization: Bearer $VLADA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"mode":"lookup","state":"AZ","code":"97153"}'
# the schema, no key
curl https://api.vladahealth.com/v1/tools/get_medicaid_rate/schemaA real answer
customer seat, 2026-11-09·over REST·1.6s·status
complete·complete·verbatim{
"value": {
"found": false,
"not_found_reason": "query_failed",
"mode": "lookup",
"query": {
"mode": "lookup",
"state": "AZ",
"code": "97153",
"limit": 50
},
"rates": [],
"query_ids": []
},
"unit": "medicaid_ffs_rate",
"vintage": null,
"source": {
"dataset": "States lane M2: FFS rate book",
"publisher": "vlada",
"catalog_updated_at": "2026-10-29"
},
"caveats": [
"These are the state's published Medicaid fee-for-service maximums, never what a managed-care plan pays a provider."
],
"response_hash": "d0b6bd345dec7296c7eeb1f6834a1ec1418da9e0f77474145e786d84c5253517",
"semantic_version": 1,
"tool_version": "get_medicaid_rate@0.2.0",
"explanation": null,
"status": "complete",
"audience": "customer",
"answer": {
"value_ref": "value",
"unit": "medicaid_ffs_rate",
"scope": {
"tool": "get_medicaid_rate",
"filters": {
"mode": "lookup",
"state": "AZ",
"code": "97153"
}
}
},
"method": "Computed over the filters shown in this answer's scope, from the sources listed in its evidence. Nothing outside those filters was included.",
"evidence": {
"sources": [
{
"dataset": "States lane M2: FFS rate book",
"publisher": "vlada",
"catalog_updated_at": "2026-10-29"
}
],
"response_hash": "d0b6bd345dec7296c7eeb1f6834a1ec1418da9e0f77474145e786d84c5253517"
},
"freshness": {
"state": "unknown",
"why": "This tool does not report an edition for its answer, and the door could not derive one from what the answer reads. Treat the result as current to no stated date."
}
}What comes back
| Field | Holds |
|---|---|
status | complete · partial · refused · failed · queued |
value | the shape below |
source · caveats · invariants_applied · response_hash | the public file and vintage; what to know before citing; the rules honoured; replayable |
refusal | code (15), message, recover_with |
{
"$defs": {
"Quality": {
"description": "Row-level quality signal. All flags precomputed at build time\n(stored on the gold mart) and passed through here.",
"properties": {
"is_outlier": {
"default": false,
"title": "Is Outlier",
"type": "boolean"
},
"is_ghost_candidate": {
"default": false,
"title": "Is Ghost Candidate",
"type": "boolean"
},
"n_similar_rates": {
"default": 0,
"title": "N Similar Rates",
"type": "integer"
},
"confidence": {
"default": 1,
"title": "Confidence",
"type": "number"
}
},
"title": "Quality",
"type": "object"
},
"Source": {
"description": "Cell-level provenance. Every served value traces back here.\n\n`snapshot_id` is the Iceberg snapshot the tool read from. Two calls\nat the same snapshot MUST produce byte-identical responses —\nthat's the content-addressed caching guarantee.",
"properties": {
"table": {
"title": "Table",
"type": "string"
},
"rate_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Rate Id"
},
"source_files": {
"items": {
"type": "string"
},
"title": "Source Files",
"type": "array"
},
"snapshot_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Snapshot Id"
}
},
"required": [
"table"
],
"title": "Source",
"type": "object"
}
},
"properties": {
"value": {
"default": null,
"title": "Value"
},
"unit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Unit"
},
"vintage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Vintage"
},
"source": {
"$ref": "#/$defs/Source"
},
"methodology": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Methodology"
},
"quality": {
"$ref": "#/$defs/Quality"
},
"invariants_applied": {
"items": {
"type": "string"
},
"title": "Invariants Applied",
"type": "array"
},
"caveats": {
"items": {
"type": "string"
},
"title": "Caveats",
"type": "array"
},
"response_hash": {
"default": "",
"title": "Response Hash",
"type": "string"
},
"semantic_version": {
"default": 1,
"title": "Semantic Version",
"type": "integer"
},
"tool_version": {
"default": "unknown",
"title": "Tool Version",
"type": "string"
},
"explanation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Explanation"
},
"status": {
"default": "complete",
"title": "Status",
"type": "string"
},
"refusal": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Refusal"
},
"failure": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Failure"
},
"as_of": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "As Of"
},
"freshness_state": {
"default": "unknown",
"title": "Freshness State",
"type": "string"
}
},
"title": "MedicaidRateResponse",
"type": "object"
}Sources
| Kind | Name |
|---|---|
| source | vlada_curated.vw_state_medicaid_rate_v2 |
| source | vlada_curated.vw_state_medicaid_rate_change_v1 |
| source | vlada_curated.vw_state_medicaid_rate_compare_v1 |
| source | vlada_curated.vw_state_medicaid_rate_vs_medicare_v1 |
| table | vlada_curated.vw_state_medicaid_rate_v2 |
| table | vlada_curated.vw_state_medicaid_rate_change_v1 |
| table | vlada_curated.vw_state_medicaid_rate_compare_v1 |
| table | vlada_curated.vw_state_medicaid_rate_vs_medicare_v1 |
| view | vlada_curated.vw_state_medicaid_rate_change_v1 |
| view | vlada_curated.vw_state_medicaid_rate_compare_v1 |
| view | vlada_curated.vw_state_medicaid_rate_vs_medicare_v1 |
Known limits (5)
- 1Coverage is state by state (47 states on 2026-11-02; 147 of 255 state x service-line cells served): a state or line with no rows is not built yet, not zero.
- 2A printing that holds more than one rate for the same date is served flagged ambiguous_key with its low and high, and kept out of compare (1 key on 2026-11-02 after the dated rule; 11,518 when keyed by edition).
- 3History depth varies by state (back to 2021 in 71 of 147 cells; some schedules one dated rate).
- 4vs_medicare joins only no-modifier, single-rate keys with a per-service / unit / visit / 15_min unit and a 5-character CPT/HCPCS code; the Medicare side is PFS non-facility, latest year, unweighted mean of the state's localities, so a per-15-minute Medicaid rate against a per-service Medicare amount is not like for like.
- 5compare and trend read one code at a time; lookup and vs_medicare take up to 25 codes.
| Admitted with a known defect |
|---|
| Coverage is state by state: 47 states hold rows and 147 of 255 state x service-line cells are served (measured 2026-11-02), so lookup answers not-found for an unbuilt state or line and says so; compare leaves out every state whose key carries more than one rate in the edition (about 11,800 ambiguous keys, NY, IA, NC most) and names how many, and converts time units to an hour but never another basis. |
This page as markdown: /docs-md/tools/get_medicaid_rate.md · every page in one file: /llms-full.txt