Skip to content

One base URL. Every dataset.

Live · API key required

REST over HTTPS with predictable pagination, stable error types, and the source attached to every response. Learn it once and every dataset added afterwards answers the same way.

Try it

A real request, a real response

Every figure below is what the endpoint returns today, read from the live dataset at build time.

Request
curl
curl "https://api.vemon.io/v1/healthcare/prices?procedure=5372" \
  -H "Authorization: Bearer vm_live_…"

No key yet? Generate one — the free trial needs no card. Or see the data first in the Explorer.

Response
200 OK
{
  "procedure": { "code": "5372", "name": "Level 2 Urology and Related Services" },
  "scope": { "state": "national" },
  "summary": {
    "facilities": 848,
    "median_charge": 3137,
    "min_charge": 262,
    "max_charge": 52123,
    "spread": 198.9
  },
  "data": [
    {
      "facility": "Northern Maine Medical Center",
      "city": "Fort Kent",
      "state": "ME",
      "ccn": "200052",
      "submitted_charge": 262,
      "medicare_allowed": 628
    }
  ],
  "source": { "data_year": 2024, "caveat": "…" }
}

How it works

Design decisions, and why

Where a choice costs convenience, the reason is stated rather than hidden.

Stable error types

Every failure carries a machine-readable type you can branch on and a message worth logging. Types are part of the contract and will not change without a version bump.

Strict parameters

Unknown query parameters return 400 rather than being ignored. A typo fails loudly instead of quietly returning the wrong rows.

Summaries cover the whole match

The summary block reflects every matching row, not the page you were handed, so a median is a real median.

Provenance travels with the data

Each response names its publisher, data year, and the caveat that applies. A number without its source is a liability.

Rate limit headers on every response

Remaining and reset values arrive on successes too, so you can slow down before you are stopped rather than after.

Cacheable by design

Responses carry cache headers and are safe to hold at your own edge. The data changes annually; your traffic should not.

Use cases

What people build with it

Price benchmarking

Compare what a facility bills against its state and national peers without maintaining an ingestion job.

Benefits and claims tooling

Attach reference charge data to a member-facing estimate or an internal review workflow.

Research and journalism

Reproducible figures with a citable source, so a finding survives review.

Specification

The details

ProtocolHTTPS only. HTTP is refused, not redirected.
FormatJSON. Money is integer USD — no floats, no currency strings.
AuthBearer token. One header, no token exchange.
VersioningPath-versioned. /v1 will not change shape underneath you.
Paginationlimit with a documented ceiling; summaries stay global.
Records available63,518 across 49 states and DC

Questions

Asked most often

Do I need an API key?
Yes, for every request. There is no unauthenticated endpoint. Keys are issued on signup — the free trial needs no card. If you want to see the data before that, the Explorer runs in your browser.
What happens when I exceed my plan's quota?
The API returns 429 and stops. You are never billed for an overage you did not agree to. Warning emails go out at 80%, 90%, and 100% of quota.
Is the summary calculated across all results or just the page?
All matching rows. If a query matches 848 facilities and you request 25, the median and spread still describe all 848.
Can I cache responses?
Yes. Responses carry Cache-Control headers and the underlying dataset updates annually, so caching aggressively is the right default.

Generate a key and query it.

The free trial key takes a minute and needs no card.