Therapy estimates
Timed units and practice-expense reductions.
Estimate a therapy visit
POST /api/v1/therapy/estimate allocates timed units when requested and applies the same therapy MPPR calculation as the site. It returns an estimate without creating a stored resource.
Required attributes
- Name
lines- Type
- object[]
- Description
1–20 lines with distinct codes. Every line must use the same minutes or units mode.
- Name
lines[].code- Type
- string
- Description
Five-character code. Combine repeated codes into one line.
Optional attributes
- Name
date- Type
- string
- Description
Service date in YYYY-MM-DD format. Defaults to today in UTC.
- Name
qp_status- Type
- string
- Description
non_qp (default) or qp. Selects the payment schedule; does not establish eligibility.
- Name
locality- Type
- string
- Description
Contractor-locality ID. Supply exactly one of locality or zip.
- Name
zip- Type
- string
- Description
Five-digit ZIP or hyphenated ZIP+4. Cannot be combined with locality.
- Name
lines[].minutes- Type
- integer
- Description
0–1500 timed minutes. Required in minutes mode; cannot be combined with units.
- Name
lines[].units- Type
- integer
- Description
1–100 billable units. Required in units mode; cannot be combined with minutes.
Parameter usage notes
Supply exactly one location: locality in contractor-locality format or zip as ZIP/ZIP+4. National estimates are not supported. date defaults to today UTC; the supported rule window is 2025–2026. qp_status is non_qp (default) or qp.
lines accepts 1–20 distinct codes. Every line must use either integer units (1–100) or integer minutes (0–1500). Do not mix the two modes or supply both fields. Combine repeated codes into one line.
Minute allocation supports 97110, 97112, 97113, 97116, 97140, 97530, 97535, 97542, 97750, 97760, 97761, 97763, 97032, 97033, and 97035. For other codes, supply units; MPPR eligibility is checked against the selected release. No patient data is needed or accepted.
Response
- Name
date- Type
- string
- Description
Resolved service date.
- Name
qp_status- Type
- string
- Description
Selected payment schedule.
- Name
location- Type
- object
- Description
Resolved locality type and ID.
- Name
release- Type
- integer
- Description
Accepted PFS release ID.
- Name
geography_release- Type
- integer | null
- Description
ZIP release, when ZIP resolution was requested.
- Name
currency- Type
- string
- Description
Always usd.
- Name
complete- Type
- boolean
- Description
False when any billable line cannot be priced or is ineligible.
- Name
lines- Type
- object[]
- Description
Visit lines in request order.
- Name
lines[].code- Type
- string
- Description
Procedure code.
- Name
lines[].units- Type
- integer
- Description
Allocated or supplied billable units.
- Name
lines[].minutes- Type
- integer · minutes mode
- Description
Input timed minutes.
- Name
lines[].per_code_units- Type
- integer · minutes mode
- Description
Separate per-code unit calculation for comparison.
- Name
lines[].status- Type
- string
- Description
Pricing status, or no_billable_units.
- Name
lines[].full_units- Type
- integer | null
- Description
Units paid without a practice-expense reduction.
- Name
lines[].reduced_units- Type
- integer | null
- Description
Units subject to the practice-expense reduction.
- Name
lines[].base_amount- Type
- integer | null
- Description
Line amount before MPPR, in cents.
- Name
lines[].amount- Type
- integer | null
- Description
Line amount after MPPR, in cents.
- Name
total_units- Type
- integer
- Description
Total billable units.
- Name
base_amount- Type
- integer | null
- Description
base amount in USD cents. Null when the estimate is incomplete.
- Name
amount- Type
- integer | null
- Description
amount in USD cents. Null when the estimate is incomplete.
- Name
reduction- Type
- integer | null
- Description
reduction in USD cents. Null when the estimate is incomplete.
- Name
rules- Type
- object
- Description
Allocation mode, reduction rule, version, and source_url.
- Name
explanation- Type
- string
- Description
Explanation of the applied reduction and scope.
Response behavior and edge cases
The response includes date, qp_status, location, release, nullable geography_release, currency, complete, lines, total_units, base_amount, amount, reduction, rules, and explanation.
Each line returns code, allocated units, status, full_units, reduced_units, base_amount, and amount. Minutes mode also echoes minutes and per_code_units for comparison. Final monetary values are integer cents. rules identifies allocation mode, reduction rule, version and source URL.
If any billable line cannot be priced or is ineligible, complete is false and monetary totals are null. No partial visit total is presented as complete. Below the minimum timed-unit threshold, the result has zero billable units and a real zero amount.
Rules and limitations
Timed minutes are pooled under the CMS 8-minute rule; remaining units go to the largest minute remainders, with input order breaking ties. per_code_units shows a separate per-code calculation for comparison, not a payer coverage determination.
For eligible therapy units, one unit with the highest practice expense is paid in full. Other units keep half of practice expense; work and malpractice remain unchanged. Ties use input order. This estimates non-facility allowed amounts before assistant reductions, coinsurance and other claim-level adjustments. ZIP resolution requires exact-period geography; no older mapping is silently substituted.
Request
curl -X POST 'https://feebase.co/api/v1/therapy/estimate' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"locality": "06102-16",
"lines": [
{
"code": "97110",
"minutes": 24
},
{
"code": "97530",
"minutes": 23
}
]
}'Response
{
"date": "2026-10-06",
"qp_status": "non_qp",
"location": {
"type": "locality",
"id": "06102-16"
},
"release": 1,
"geography_release": null,
"currency": "usd",
"complete": true,
"lines": [
{
"code": "97110",
"minutes": 24,
"per_code_units": 2,
"units": 2,
"status": "priced",
"full_units": 1,
"reduced_units": 1,
"base_amount": 6000,
"amount": 5500
},
{
"code": "97530",
"minutes": 23,
"per_code_units": 2,
"units": 1,
"status": "priced",
"full_units": 0,
"reduced_units": 1,
"base_amount": 3000,
"amount": 2500
}
],
"total_units": 3,
"base_amount": 9000,
"amount": 8000,
"reduction": 1000,
"rules": {
"allocation": "cms_8_minute",
"reduction": "therapy_mppr",
"version": "1",
"source_url": "https://www.cms.gov/medicare/coding-billing/therapy-services"
},
"explanation": "One unit with the highest practice expense is paid in full; other eligible units retain half their practice expense. Work and malpractice are unchanged. This estimates allowed amounts before assistant and other claim-level adjustments."
}Illustrative response. Values and release IDs are examples.
