What the data is
Attending physician total compensation (base, bonus and incentives) from approved, self-reported salary reports. Reports are moderated before publication but are not NPI-verified. Medians and percentiles exclude outliers beyond 1.5×IQR. A figure is published only above its floor: 5 reports nationally or for a whole state, 3 for one specialty in one state, and 15 for the 10th and 90th percentiles. Figures from 24 or fewer reports are rounded. Below a floor the figure is null, never estimated. The numbers are identical to the ones on SalaryDr’s pages and /data feeds. Resident pay comes from scales that teaching hospitals publish themselves. Details are in the methodology.
JSON API
Base URL https://www.salarydr.com/data/api/v1. Every endpoint is a GET and returns JSON. Slugs accept the common spellings of a specialty (ob-gyn, pm-and-r). An unknown slug returns a 404 with close matches.
| Endpoint | Returns |
|---|---|
| /data/api/v1/specialties.json | Every specialty SalaryDr publishes, with its slug, national median, 25th and 75th percentiles and report count. |
| /data/api/v1/specialties/{slug}.json | National attending pay for one specialty (median, mean, percentiles), its top 10 states, practice settings and compensation per wRVU. |
| /data/api/v1/states/{state}.json | Attending pay in one state (slug or two-letter code): median, mean, top specialties against their national medians, and cost of living. |
| /data/api/v1/wrvu/{slug}.json | Total compensation per wRVU for one specialty: median, 25th and 75th percentiles and report count. |
| /data/api/v1/residency/institutions/{slug}.json | One teaching hospital's published resident pay scale by PGY year, with its cost-of-living-adjusted PGY-1 pay and rank. |
curl -s https://www.salarydr.com/data/api/v1/specialties/cardiology.jsonEvery response includes these fields. They are stable within v1: fields may be added, never renamed or removed.
n: Approved salary reports behind the figures. Null when figures are withheld, and for published resident pay scales, which are not reports.as_of: YYYY-MM-DD: the submission date of the newest report included, or the date a pay scale was checked.citation_url: The SalaryDr page or /data feed that shows the same figures. Cite this URL.methodology_url: How the figures are collected, moderated and published (https://www.salarydr.com/methodology).license: CC BY 4.0, with license_url and a ready-made attribution line.notice: Present only when figures are withheld, saying why.
Caching and limits. Responses carry an ETag. Send it back in If-None-Match and an unchanged response is a 304 with no body. 60 requests a minute and 2,000 a day per IP address. Responses are cached at the edge for an hour, and cached responses do not count. Over the limit you get a 429 with Retry-After. CORS is open, so the API works from a browser.
curl -s -H 'If-None-Match: "<etag from a previous response>"' \
https://www.salarydr.com/data/api/v1/specialties/cardiology.json -o /dev/null -w '%{http_code}\n' # 304 when unchangedMCP server for AI assistants
SalaryDr runs a remote Model Context Protocol server at https://www.salarydr.com/mcp (Streamable HTTP, no authentication). Its tools return the same figures and fields as the API, as text plus structured JSON.
| Tool | What it answers |
|---|---|
| list_specialties | List specialties |
| get_specialty_pay | Physician pay by specialty |
| compare_specialties | Compare two specialties |
| get_wrvu_rate | Compensation per wRVU |
| get_resident_pay | Resident pay scales |
Claude
In Claude (web or desktop), open Settings, then Connectors, choose “Add custom connector” and paste https://www.salarydr.com/mcp. In Claude Code, run:
claude mcp add --transport http salarydr https://www.salarydr.com/mcpChatGPT
Turn on developer mode in ChatGPT’s connector settings (Settings, then Apps & Connectors, then Advanced settings), create a connector with the URL https://www.salarydr.com/mcp and choose no authentication. Menu names vary by plan and change over time.
Other clients
Any client that speaks Streamable HTTP can use the URL directly. For a client that only runs local (stdio) servers, bridge it with mcp-remote:
{
"mcpServers": {
"salarydr": { "command": "npx", "args": ["-y", "mcp-remote", "https://www.salarydr.com/mcp"] }
}
}Or call it by hand:
curl -s https://www.salarydr.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"get_specialty_pay","arguments":{"specialty":"Cardiology","state":"TX"}}}'How to cite
SalaryDr's published aggregate salary data (medians, percentiles and report counts) is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You may share and adapt it, including commercially, as long as you credit SalaryDr, link to the source page and the license, and say if you changed the data.
When you quote a figure, link its citation_url, give the report count (n) and the as_of date, and say the data is self-reported. Each response also carries an attribution line you can use as is. Suggested format:
SalaryDr, "Cardiology Salary Data," https://www.salarydr.com/data/cardiology (data as of [as_of from the response]; accessed [date you accessed it]). Licensed under CC BY 4.0.
More machine-readable data: /data, /llms.txt and /llms-full.txt. Questions or higher limits: contact us.