Skip to content

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.

keytypemeaning
sourcestringHuman label for the source, e.g. "CMS NCCI PTP Edits".
urlstringThe page the value was read from.
quarterstring (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.

codestatusmeaning
invalid_request400A required parameter is missing or malformed, such as an unparseable dateOfService. The message names the parameter.
unauthorized401The 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_found404No CARC, RARC or payer matches the code or slug supplied.
rate_limited429You exceeded the anonymous rate, the test-key throttle, your plan's per-minute burst, or your plan's monthly allowance.
internal500An 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.

TierBurstVolume
Anonymous (no key)4/min20/day per IP. Enough to run a call out of these docs, not enough to build on.
Test key (free on every plan)10/min200/day against the real engine and datasets. Never bills.
Pro (live key)60/min1,000 calls/mo. A hard ceiling, not a meter: past it the API returns rate_limited rather than billing you.
Scale (live key)300/min10,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

POST

/api/v1/scrub

Key optional

Scrub 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.

ParamInRequiredDescription
dateOfServicebodyyesISO date (YYYY-MM-DD). Decides which CMS edit quarter applies.
payerSlugbodynoOptional payer slug, used only for timely-filing context.
linesbodyyesArray 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."
}
GET

/api/v1/denial

Key optional

Explain 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.

ParamInRequiredDescription
carcqueryyese.g. CO-45 or 45.
rarcquerynoComma-separated RARC codes on the same remittance line.
payerquerynoPayer 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."
}
GET

/api/v1/ncci

Key optional

Look 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.

ParamInRequiredDescription
code1queryyesFirst CPT/HCPCS code.
code2queryyesSecond CPT/HCPCS code.
dosquerynoDate 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."
}
GET

/api/v1/mue

Key optional

Look 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.

ParamInRequiredDescription
codequeryyesCPT/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."
}
POST

/api/v1/appeal

Requires a live key

Generate 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.

ParamInRequiredDescription
carcbodyyesThe CARC being appealed.
rarcbodynoAny RARCs on the same remittance line.
payerSlugbodynoAttaches the payer's appeal window to the letter.
providerNamebodynoPractice or provider name.
claimNumberbodynoClaim number at issue.
dateOfServicebodynoDate of service on the claim.
codesbodynoProcedure 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."
}
GET

/api/v1/timely-filing

Key optional

Days 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.

ParamInRequiredDescription
payerqueryyesPayer slug.
dosqueryyesDate 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."
}
GET

/api/pricing

Key optional

Machine-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.

Developer overviewMCP server

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.