Reference
API reference
Every payload below is computed by the real scrubbing and denial-resolution engine against the live CMS/X12 dataset, not hand-typed JSON. Machine-readable spec at /api/openapi.
Base URL
https://denialpath.vercel.app/api/v1
Auth
Send Authorization: Bearer <key> to lift the throttle to your plan's quota. Every endpoint also works with no key at all at the anonymous rate.
Format
JSON in, JSON out. Every success is { data, request_id, disclaimer }.
Determinism
The same claim or denial input always returns the same verdict. There is no model in the request path.
Honesty semantics
A finding or lookup status of no_data means NOT CHECKED, not passed. Our NCCI PTP and MUE datasets are curated subsets of much larger CMS files; treat no_data as an instruction to check the full CMS file yourself, never as a clean result.
Success envelope
Every success is { data, request_id, disclaimer }. This response is a real scrub of a real PTP pair, computed from curl -X POST https://denialpath.vercel.app/api/v1/scrub \.
200 response
{
"data": {
"input": {
"dateOfService": "2026-07-18",
"payerSlug": "medicare",
"lines": [
{
"code": "10021",
"modifiers": [],
"units": 1
},
{
"code": "11102",
"modifiers": [],
"units": 1
}
]
},
"editQuarter": "2026 Q3",
"findings": [
{
"kind": "ptp",
"status": "fail",
"lineIndexes": [
0,
1
],
"codes": [
"10021",
"11102"
],
"summary": "11102 is bundled into 10021 and will be denied as billed",
"rule": "PTP edit with modifier indicator 1. CMS rationale: Sequential procedure. A modifier may bypass this edit, but only when the services were genuinely separate.",
"remedy": "If the two services were distinct (different session, different site, different encounter), append the modifier that describes that distinction to the 11102 line. If they were not distinct, remove 11102.",
"resolvingModifiers": [
"59",
"XE",
"XS",
"XP",
"XU",
"25",
"24",
"57",
"91",
"LT",
"RT",
"78",
"79",
"58"
],
"citation": {
"source": "CMS Medicare NCCI Procedure to Procedure Edits, Practitioner Services",
"url": "https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-procedure-procedure-ptp-edits",
"quarter": "2026 Q3",
"retrievedAt": "2026-07-18",
"confidence": "verified"
}
},
{
"kind": "mue",
"status": "pass",
"lineIndexes": [
0
],
"codes": [
"10021"
],
"summary": "10021: 1 unit is within the MUE of 1",
"rule": "MUE 1, adjudication indicator MAI 2. Date of service edit, absolute. Units above this limit are never payable on the same date of service. The edit follows from policy or from the code definition itself and cannot be overcome by documentation, a modifier or an appeal.",
"remedy": "",
"citation": {
"source": "CMS Medicare NCCI Medically Unlikely Edits, Practitioner Services",
"url": "https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-medically-unlikely-edits",
"quarter": "2026 Q3",
"retrievedAt": "2026-07-18",
"confidence": "verified"
}
},
{
"kind": "mue",
"status": "pass",
"lineIndexes": [
1
],
"codes": [
"11102"
],
"summary": "11102: 1 unit is within the MUE of 1",
"rule": "MUE 1, adjudication indicator MAI 2. Date of service edit, absolute. Units above this limit are never payable on the same date of service. The edit follows from policy or from the code definition itself and cannot be overcome by documentation, a modifier or an appeal.",
"remedy": "",
"citation": {
"source": "CMS Medicare NCCI Medically Unlikely Edits, Practitioner Services",
"url": "https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-medically-unlikely-edits",
"quarter": "2026 Q3",
"retrievedAt": "2026-07-18",
"confidence": "verified"
}
}
],
"summary": {
"total": 3,
"failures": 1,
"bypassed": 0,
"noData": 0,
"clean": false
},
"coverage": {
"ptpPairsLoaded": 40009,
"mueCodesLoaded": 15162,
"note": "Checked against 40009 PTP pairs and 15162 MUE values curated from published CMS sources. This is a subset of the full CMS files. Codes marked no data were not checked and may still be subject to an edit."
}
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing."
}The citation shape
How to read a source and confidence
Every PTP pair, MUE limit, CARC, RARC and payer field carries the citation it came from, in this shape. There is no "reported" middle tier: a value is either verified against the cited page or it is not, and an unverified value must render as Unverified, never as fact.
| key | type | meaning |
|---|---|---|
| source | string | Human label for the source, e.g. "CMS NCCI PTP Edits". |
| url | string | The page the value was read from. |
| quarter | string (optional) | The CMS edit quarter this value belongs to, when the source is versioned. |
| confidence | "verified" | "verify" | "verified" was read directly off the cited page. "verify" renders as Unverified in every client; never presented as fact. |
Errors
Structured, never silent
Every non-2xx response is JSON in the { error: { code, message }, request_id } envelope. The code is stable; build on it, not on the message text.
| code | status | meaning |
|---|---|---|
| invalid_request | 400 | A required parameter is missing or malformed, such as an unparseable dateOfService. The message names the parameter. |
| unauthorized | 401 | The Authorization header carries a key that is not valid or has been revoked. Only sent when you supply a key; keyless calls are allowed at the anonymous rate. |
| not_found | 404 | No CARC, RARC or payer matches the code or slug supplied. |
| rate_limited | 429 | You exceeded the anonymous rate, the test-key throttle, your plan's per-minute burst, or your plan's monthly allowance. |
| internal | 500 | An unexpected server error. Safe to retry; contact support if it persists. |
404, unknown CARC
{
"error": {
"code": "not_found",
"message": "No CARC matches \"999\"."
},
"request_id": "req_2f9c41a7b0e84d15"
}Rate limits & quota
By key type
Every endpoint works with no key at the anonymous rate. Send a key to lift the throttle to your plan's quota. A free test key runs the real engine and never bills; a live key needs Pro or Scale.
| Tier | Burst | Volume |
|---|---|---|
| Anonymous (no key) | 4/min | 20/day per IP. Enough to run a call out of these docs, not enough to build on. |
| Test key (free on every plan) | 10/min | 200/day against the real engine and datasets. Never bills. |
| Pro (live key) | 60/min | 1,000 calls/mo. A hard ceiling, not a meter: past it the API returns rate_limited rather than billing you. |
| Scale (live key) | 300/min | 10,000 calls/mo. A hard ceiling, not a meter: past it the API returns rate_limited rather than billing you. |
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, so an agent can back off before a 429. Full plans at /pricing or the machine-readable /api/pricing.
Endpoints
Every route
/api/v1/scrub
Key optionalScrub a claim: the same engine as the free browser scrubber. Given a date of service, an optional payer, and billed lines (code, modifiers, units), returns every PTP and MUE finding, the CMS edit quarter checked against, and a coverage disclosure. A finding with status no_data means the code or pair was not checked, not that it passed.
| Param | In | Required | Description |
|---|---|---|---|
| dateOfService | body | yes | ISO date (YYYY-MM-DD). Decides which CMS edit quarter applies. |
| payerSlug | body | no | Optional payer slug, used only for timely-filing context. |
| lines | body | yes | Array of { code, modifiers, units }. |
request
curl -X POST https://denialpath.vercel.app/api/v1/scrub \
-H "Content-Type: application/json" \
-d '{"dateOfService":"2026-07-18","payerSlug":"medicare","lines":[{"code":"10021","modifiers":[],"units":1},{"code":"11102","modifiers":[],"units":1}]}'response 200
{
"data": {
"input": {
"dateOfService": "2026-07-18",
"payerSlug": "medicare",
"lines": [
{
"code": "10021",
"modifiers": [],
"units": 1
},
{
"code": "11102",
"modifiers": [],
"units": 1
}
]
},
"editQuarter": "2026 Q3",
"findings": [
{
"kind": "ptp",
"status": "fail",
"lineIndexes": [
0,
1
],
"codes": [
"10021",
"11102"
],
"summary": "11102 is bundled into 10021 and will be denied as billed",
"rule": "PTP edit with modifier indicator 1. CMS rationale: Sequential procedure. A modifier may bypass this edit, but only when the services were genuinely separate.",
"remedy": "If the two services were distinct (different session, different site, different encounter), append the modifier that describes that distinction to the 11102 line. If they were not distinct, remove 11102.",
"resolvingModifiers": [
"59",
"XE",
"XS",
"XP",
"XU",
"25",
"24",
"57",
"91",
"LT",
"RT",
"78",
"79",
"58"
],
"citation": {
"source": "CMS Medicare NCCI Procedure to Procedure Edits, Practitioner Services",
"url": "https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-procedure-procedure-ptp-edits",
"quarter": "2026 Q3",
"retrievedAt": "2026-07-18",
"confidence": "verified"
}
},
{
"kind": "mue",
"status": "pass",
"lineIndexes": [
0
],
"codes": [
"10021"
],
"summary": "10021: 1 unit is within the MUE of 1",
"rule": "MUE 1, adjudication indicator MAI 2. Date of service edit, absolute. Units above this limit are never payable on the same date of service. The edit follows from policy or from the code definition itself and cannot be overcome by documentation, a modifier or an appeal.",
"remedy": "",
"citation": {
"source": "CMS Medicare NCCI Medically Unlikely Edits, Practitioner Services",
"url": "https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-medically-unlikely-edits",
"quarter": "2026 Q3",
"retrievedAt": "2026-07-18",
"confidence": "verified"
}
},
{
"kind": "mue",
"status": "pass",
"lineIndexes": [
1
],
"codes": [
"11102"
],
"summary": "11102: 1 unit is within the MUE of 1",
"rule": "MUE 1, adjudication indicator MAI 2. Date of service edit, absolute. Units above this limit are never payable on the same date of service. The edit follows from policy or from the code definition itself and cannot be overcome by documentation, a modifier or an appeal.",
"remedy": "",
"citation": {
"source": "CMS Medicare NCCI Medically Unlikely Edits, Practitioner Services",
"url": "https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-medically-unlikely-edits",
"quarter": "2026 Q3",
"retrievedAt": "2026-07-18",
"confidence": "verified"
}
}
],
"summary": {
"total": 3,
"failures": 1,
"bypassed": 0,
"noData": 0,
"clean": false
},
"coverage": {
"ptpPairsLoaded": 40009,
"mueCodesLoaded": 15162,
"note": "Checked against 40009 PTP pairs and 15162 MUE values curated from published CMS sources. This is a subset of the full CMS files. Codes marked no data were not checked and may still be subject to an edit."
}
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing."
}/api/v1/denial
Key optionalExplain a denial. Given a CARC (with or without a group prefix) and any RARCs, returns the plain-meaning explanation, ranked corrective actions, an appeal-worthiness rating, and, when a payer is supplied, the appeal deadline context.
| Param | In | Required | Description |
|---|---|---|---|
| carc | query | yes | e.g. CO-45 or 45. |
| rarc | query | no | Comma-separated RARC codes on the same remittance line. |
| payer | query | no | Payer slug, to attach timely-filing and appeal-window context. |
request
curl "https://denialpath.vercel.app/api/v1/denial?carc=CO-16&rarc=M51&payer=medicare"
response 200
{
"data": {
"found": true,
"group": {
"code": "CO",
"meaning": "Contractual Obligation. The provider is responsible and the amount cannot be billed to the patient."
},
"carc": {
"code": "16",
"commonGroups": [
"CO",
"PI"
],
"title": "Claim/service lacks information or has submission/billing error(s).",
"plainMeaning": "The claim is missing required information or has a data or billing error that prevents adjudication. Code 16 is a header level flag that must be paired with a remark code telling you exactly what field or documentation is missing. Without checking that remark code you cannot fix this denial.",
"whyItFires": [
"A required field on the claim was blank, invalid, or inconsistent, such as a missing NPI or invalid diagnosis pointer",
"The payer's system flagged a data mismatch between the 837 claim and its records",
"Supporting documentation required for this code type was not attached"
],
"correctiveActions": [
{
"step": "Read the paired remark code first",
"detail": "Always check the accompanying RARC before doing anything else. Code 16 alone does not tell you what is wrong."
},
{
"step": "Correct and resubmit",
"detail": "Fix the specific field or error identified by the remark code and resubmit as a corrected claim, not an appeal."
},
{
"step": "Audit your claim scrubber rules",
"detail": "If this recurs across many claims, add a pre-submission edit check for the specific field that keeps failing."
}
],
"appealWorthiness": "low",
"appealNote": "Not an appeal candidate. This is a correctable data error, so fix and resubmit a corrected claim rather than filing a formal appeal.",
"relatedRarc": [
"M51"
],
"sourceUrl": "https://x12.org/codes/claim-adjustment-reason-codes",
"confidence": "verified"
},
"rarc": [
{
"code": "M51",
"type": "informational",
"title": "Missing/incomplete/invalid procedure code(s)",
"plainMeaning": "The claim line is missing a procedure code, or the code submitted is not recognized as valid by the payer's claims editing system.",
"correctiveActions": [
{
"step": "Confirm the procedure code was transmitted",
"detail": "Check the claim file or clearinghouse report to confirm the CPT/HCPCS code actually left your system; a mapping or scrubber error can silently drop it."
},
{
"step": "Correct and resubmit",
"detail": "Enter the correct, currently valid procedure code for the service performed and resubmit as a corrected claim rather than a duplicate."
}
],
"relatedCarc": [
"16"
],
"sourceUrl": "https://x12.org/codes/remittance-advice-remark-codes",
"confidence": "verified"
}
],
"unknownRarc": [],
"correctiveActions": [
{
"step": "Read the paired remark code first",
"detail": "Always check the accompanying RARC before doing anything else. Code 16 alone does not tell you what is wrong."
},
{
"step": "Correct and resubmit",
"detail": "Fix the specific field or error identified by the remark code and resubmit as a corrected claim, not an appeal."
},
{
"step": "Audit your claim scrubber rules",
"detail": "If this recurs across many claims, add a pre-submission edit check for the specific field that keeps failing."
},
{
"step": "Confirm the procedure code was transmitted",
"detail": "Check the claim file or clearinghouse report to confirm the CPT/HCPCS code actually left your system; a mapping or scrubber error can silently drop it."
}
],
"appeal": {
"worthiness": "low",
"note": "Not an appeal candidate. This is a correctable data error, so fix and resubmit a corrected claim rather than filing a formal appeal.",
"payer": {
"payer": "Medicare (Original / Part B)",
"slug": "medicare",
"initialClaimLimitDays": 365,
"limitText": "12 months (1 calendar year) from the date of service",
"clockStartsFrom": "date of service",
"appealLimitDays": 120,
"notes": "Set by federal regulation at 42 CFR 424.44, not by contract, so this figure does not vary by Medicare Administrative Contractor. Claims denied for untimely filing carry no appeal rights for the timeliness issue itself; the 120-day figure is the standard redetermination (first-level appeal) deadline for a substantive denial, measured from the date of the initial determination.",
"sourceUrl": "https://www.medicare.gov/providers-services/claims-appeals-complaints/claims",
"confidence": "verified"
},
"deadlineDays": 120
},
"note": ""
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing."
}/api/v1/ncci
Key optionalLook up the NCCI PTP edit governing two procedure codes on a date of service, if we hold one: the column order, modifier indicator, effective/deletion dates, and the CMS citation. Returns a no_data status, not a pass, when the pair is outside our loaded dataset.
| Param | In | Required | Description |
|---|---|---|---|
| code1 | query | yes | First CPT/HCPCS code. |
| code2 | query | yes | Second CPT/HCPCS code. |
| dos | query | no | Date of service (YYYY-MM-DD). Defaults to today if omitted. |
request
curl "https://denialpath.vercel.app/api/v1/ncci?code1=10021&code2=11102&dos=2026-07-18"
response 200
{
"data": {
"column1": "10021",
"column2": "11102",
"modifierIndicator": "1",
"effectiveDate": "2019-01-01",
"deletionDate": null,
"rationale": "Sequential procedure",
"citation": {
"source": "CMS NCCI PTP Edits",
"url": "https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-procedure-procedure-ptp-edits",
"confidence": "verified"
}
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing."
}/api/v1/mue
Key optionalLook up the medically unlikely edit for one procedure code: the MUE value, the adjudication indicator (MAI 1, 2 or 3) and what it means for whether an overage can be overcome. Returns a no_data status when the code is outside our loaded dataset.
| Param | In | Required | Description |
|---|---|---|---|
| code | query | yes | CPT/HCPCS code. |
request
curl "https://denialpath.vercel.app/api/v1/mue?code=0001U"
response 200
{
"data": {
"code": "0001U",
"mueValue": 1,
"mai": "2",
"maiMeaning": "Date of service edit, absolute. Units above this limit are never payable on the same date of service. The edit follows from policy or from the code definition itself and cannot be overcome by documentation, a modifier or an appeal.",
"serviceType": "Practitioner",
"citation": {
"source": "CMS Medically Unlikely Edits",
"url": "https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-medically-unlikely-edits",
"confidence": "verified"
}
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing."
}/api/v1/appeal
Requires a live keyGenerate an appeal letter for a denial: the argument built from cited corrective actions, the citations behind it, and a list of fields the letter could not fill in (claim number, provider name, and so on) that the practice must complete before sending. Requires a live key on Pro or Scale.
| Param | In | Required | Description |
|---|---|---|---|
| carc | body | yes | The CARC being appealed. |
| rarc | body | no | Any RARCs on the same remittance line. |
| payerSlug | body | no | Attaches the payer's appeal window to the letter. |
| providerName | body | no | Practice or provider name. |
| claimNumber | body | no | Claim number at issue. |
| dateOfService | body | no | Date of service on the claim. |
| codes | body | no | Procedure codes at issue, numeric only. |
request
curl -X POST https://denialpath.vercel.app/api/v1/appeal \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
-d '{"carc":"16","payerSlug":"medicare","providerName":"Example Family Medicine","claimNumber":"CLM-2026-00042","dateOfService":"2026-07-18"}'response 200
{
"data": {
"subject": "Request for reconsideration - claim CLM-2026-00042 - 16",
"body": "2026-07-18\n\nMedicare (Original / Part B)\nAttn: Claims Review / Appeals Department\n\nRe: Request for reconsideration\nClaim number: CLM-2026-00042\nDate of service: 2026-07-18\nProcedure code(s) at issue: 11102\nProvider: Example Family Medicine\n\nTo whom it may concern,\n\nWe are writing to request reconsideration of the adjustment applied to the claim referenced above.\n\nThe remittance reports 16: Claim/service lacks information or has submission/billing error(s)..\n\nThe claim is missing required information or has a data or billing error that prevents adjudication. Code 16 is a header level flag that must be paired with a remark code telling you exactly what field or documentation is missing. Without checking that remark code you cannot fix this denial.\n\nThe remittance also carries M51: Missing/incomplete/invalid procedure code(s)\n\nBasis for reconsideration:\n1. Read the paired remark code first. Always check the accompanying RARC before doing anything else. Code 16 alone does not tell you what is wrong.\n2. Correct and resubmit. Fix the specific field or error identified by the remark code and resubmit as a corrected claim, not an appeal.\n3. Audit your claim scrubber rules. If this recurs across many claims, add a pre-submission edit check for the specific field that keeps failing.\n4. Confirm the procedure code was transmitted. Check the claim file or clearinghouse report to confirm the CPT/HCPCS code actually left your system; a mapping or scrubber error can silently drop it.\n\nThis request is submitted within the 120 day appeal window published by Medicare (Original / Part B).\n\nWe ask that the claim be reprocessed. Supporting documentation is enclosed. Please contact the billing office at the number on file if any further information would assist the review.\n\nSincerely,\n\n[TO BE COMPLETED BY PRACTICE]\nExample Family Medicine",
"citations": [
{
"source": "X12 Claim Adjustment Reason Codes",
"url": "https://x12.org/codes/claim-adjustment-reason-codes",
"confidence": "verified"
},
{
"source": "X12 Remittance Advice Remark Code M51",
"url": "https://x12.org/codes/remittance-advice-remark-codes",
"confidence": "verified"
},
{
"source": "Medicare (Original / Part B) timely filing and appeal policy",
"url": "https://www.medicare.gov/providers-services/claims-appeals-complaints/claims",
"confidence": "verified"
}
],
"placeholders": [
"Signature, name and title of the person sending the letter"
],
"grounded": true
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing."
}/api/v1/timely-filing
Key optionalDays elapsed and remaining to file an initial claim for a payer, given a date of service, where we hold a published limit. Returns null for a payer whose limit is set by individual contract rather than public policy, rather than guessing a number.
| Param | In | Required | Description |
|---|---|---|---|
| payer | query | yes | Payer slug. |
| dos | query | yes | Date of service (YYYY-MM-DD). |
request
curl "https://denialpath.vercel.app/api/v1/timely-filing?payer=medicare&dos=2026-07-18"
response 200
{
"data": {
"payer": {
"payer": "Medicare (Original / Part B)",
"slug": "medicare",
"initialClaimLimitDays": 365,
"limitText": "12 months (1 calendar year) from the date of service",
"clockStartsFrom": "date of service",
"appealLimitDays": 120,
"notes": "Set by federal regulation at 42 CFR 424.44, not by contract, so this figure does not vary by Medicare Administrative Contractor. Claims denied for untimely filing carry no appeal rights for the timeliness issue itself; the 120-day figure is the standard redetermination (first-level appeal) deadline for a substantive denial, measured from the date of the initial determination.",
"sourceUrl": "https://www.medicare.gov/providers-services/claims-appeals-complaints/claims",
"confidence": "verified"
},
"daysElapsed": 0,
"daysRemaining": 365,
"expired": false
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing."
}/api/pricing
Key optionalMachine-readable plans and quotas, built from the same PLANS constant the pricing page and Stripe checkout read.
request
curl https://denialpath.vercel.app/api/pricing
response 200
{
"data": {
"unit": "billable API call",
"currency": "USD",
"anonymous": {
"price_usd": 0,
"rate_limit_per_minute": 4,
"rate_limit_per_day": 20,
"note": "Every endpoint is free and keyless to try at the anonymous rate. A test key is free on every plan and never bills."
},
"test_key": {
"rate_limit_per_minute": 10,
"rate_limit_per_day": 200
},
"plans": [
{
"id": "free",
"name": "Free",
"price_usd_per_month": 0,
"saved_claims": 0,
"batch_claims_per_run": 0,
"included_api_calls_per_month": 0,
"rate_limit_per_minute": 0,
"api_access": false,
"appeal_letters": false,
"mcp_production": false,
"features": [
"Single-claim scrubber, runs in your browser so claim data is never transmitted",
"Every CARC and RARC denial page, with cited corrective actions",
"NCCI PTP and MUE verdicts with the CMS citation and edit quarter",
"Test API key for developers (throttled, never bills)",
"Public API and MCP at the anonymous rate"
]
},
{
"id": "pro",
"name": "Pro",
"price_usd_per_month": 49,
"saved_claims": "unlimited",
"batch_claims_per_run": 250,
"included_api_calls_per_month": 1000,
"rate_limit_per_minute": 60,
"api_access": true,
"appeal_letters": true,
"mcp_production": true,
"features": [
"Batch scrubbing, up to 250 claims per run",
"Saved claim history with the verdict and the CMS quarter it was checked against",
"Appeal letter generation and download, with the citations that justify it",
"Denial analytics by payer across your saved claims",
"Claim scrubbing API and MCP server (1,000 calls/mo)",
"Inspectable request log"
]
},
{
"id": "scale",
"name": "Scale",
"price_usd_per_month": 149,
"saved_claims": "unlimited",
"batch_claims_per_run": 2000,
"included_api_calls_per_month": 10000,
"rate_limit_per_minute": 300,
"api_access": true,
"appeal_letters": true,
"mcp_production": true,
"features": [
"Everything in Pro",
"10,000 API calls/mo",
"300 requests/minute burst",
"Batch scrubbing up to 2,000 claims per run",
"Priority support"
]
}
]
},
"request_id": "req_2f9c41a7b0e84d15",
"disclaimer": "DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing."
}DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing.
Start with no key, then raise the throttle
Every route answers anonymously at the free rate. A key lifts it to your plan's quota and gives you the inspectable request log.