Home / Tools / REST quickstart
The Data API, before you talk to anyone.
Two doors to the same tools. Over MCP, an agent connects once and calls them by asking in plain English. Over REST, your code calls the same tools by name with an API key. Both return typed rows with the public source, its vintage, the methodology and a replayable hash on every answer.
1. Get a key
Create a free account at /data-access; it starts with $5 of queries, and verified .edu and .gov accounts get a free tier. Mint a key under your account (shown once). Plans and prices are on /pricing.
2. Endpoints
GET/v1/healthGET/v1/toolsGET/v1/tools/{name}/schemaPOST/v1/tools/{name}GET|POST/v1/proofs/{receipt_id}GET|POST/v1/price-proofs/{receipt_id}Base URL https://api.vladahealth.com. CORS open. Rate limit 100 requests per second per key.
3. First call
# what does this payer pay this provider for this code, with proof
curl -X POST https://api.vladahealth.com/v1/tools/get_negotiated_rate \
-H "Authorization: Bearer $VLADA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"payer":"cigna","npi":"<10-digit NPI>","billing_code":"99213","state":"CA"}'
# the schema for any tool, no key
curl https://api.vladahealth.com/v1/tools/get_negotiated_rate/schema4. Errors
Every error is one envelope: {"error":{"code":"...","message":"..."}}. A missing or bad key is 401; a tool your key is not entitled to is refused with a named code rather than an empty result; over the limit is 429 with rate_limit_exceeded. A question the data cannot answer is not an error: the tool returns not in the data with the coverage it checked, never a zero.
5. The gotchas that decide whether an answer resolves
- Pass
stateon rate lookups. Resolution is state-scoped; without it you getno_match. - NPI vs CCN. Insurer and transparency-in-coverage tools are keyed by NPI (a provider, type 1 or 2); hospital tools are keyed by CCN (a facility). The same hospital appears under both.
resolve_providercrosswalks them. - Facility vs professional. A hospital file and a payer file can carry different fees for the same code because they describe different services. Compare within a class, or use the tools that state the class.
- Years are separate. Plan year, rating year, measurement period and retrieval date are distinct fields; the answer names which it is. Star Ratings are contract-level, never a plan or county rating.
- Negotiated price is not out-of-pocket. A published negotiated rate is what a plan agreed to pay a provider, not what a patient owes.
- Provenance is on every result (
source,vintage,methodology,response_hash); theprove_*andreplay_*tools turn a number into a re-runnable receipt.
6. Connect an agent instead (MCP)
# Claude Code claude mcp add --transport http vlada https://mcp.vladahealth.com/mcp --header "Authorization: Bearer $VLADA_API_KEY" # Claude Desktop, Cursor, VS Code, your own client: a remote Streamable-HTTP server at # https://mcp.vladahealth.com/mcp with the same Authorization header # ChatGPT (browser OAuth instead of a key header): # https://mcp-secure.vladahealth.com/mcp
Then ask. The discovery tools (find_data_sources, describe_schema, describe_data_source) tell the agent what exists; query_substrate runs guarded read-only SQL over the tables your key is entitled to; heavy pulls go through submit_query, poll_query, fetch_query. One-click setup per client is on /data-access.