SalaryDr APIsalarydr.com ↗
Access physician and dentist salary submissions, benchmarks, and specialty/state breakdowns from SalaryDr via a structured REST API with 9 endpoints.
What is the SalaryDr API?
The SalaryDr API exposes 9 endpoints covering physician and dentist compensation data including individual salary submissions, aggregated benchmarks, and specialty-level statistics. The get_salary_benchmarks_table endpoint returns median, average, and full percentile distributions (10th through 90th) with employment-type breakdowns, while get_all_salary_submissions lets you filter across role, specialty, state, practice type, and compensation range across a paginated dataset.
curl -X GET 'https://api.parse.bot/scraper/da296220-8000-41a3-a7d9-80fe1140d2ad/get_all_salary_submissions?page=1&role=physician&limit=20&state=California&offset=0&specialty=Cardiology&salary_max=600000&salary_min=400000&practice_type=Academic' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace salarydr-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: SalaryDr SDK — physician and dentist salary exploration."""
from parse_apis.salarydr_api import SalaryDr, Role, NotFoundError
client = SalaryDr()
# Discover available specialties
directory = client.specialtydirectories.get()
print(directory.count, directory.specialties[:5])
# Search physician submissions filtered by role and specialty
for submission in client.submissions.search(role=Role.PHYSICIAN, specialty="Cardiology", limit=3):
print(submission.id, submission.specialty, submission.total_compensation, submission.practice_setting)
# Get overall salary explorer overview
overview = client.overviews.get()
print(overview.total_submissions, overview.median_total_comp, overview.average_workload_hours)
for p in overview.percentiles:
print(p.name, p.value)
# Drill into a specific specialty's benchmarks and navigate to state data
cardiology = client.specialtybenchmarks.get(specialty="Cardiology")
print(cardiology.specialty, cardiology.average_salary, cardiology.submission_count)
state_data = cardiology.state_data.get(state="California")
print(state_data.state, state_data.count)
print(state_data.stats.average_salary, state_data.stats.median_salary)
# Get aggregated benchmarks with typed error handling
try:
overall = client.benchmarks.get()
print(overall.total_submissions, overall.average_salary, overall.median_salary)
for emp in overall.by_employment_type:
print(emp.type, emp.salary, emp.submissions)
except NotFoundError as exc:
print(f"benchmarks unavailable: {exc}")
print("exercised: specialtydirectories.get / submissions.search / overviews.get / specialtybenchmarks.get / state_data.get / benchmarks.get")
Search paginated physician salary submissions. Supports filtering by role, specialty, state, practice type, and compensation range. Returns 20 submissions per page. Paginates via integer page counter.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination |
| role | string | Filter by role: 'physician', 'resident', or 'fellow'. Omitting returns all roles. |
| state | string | Filter by US state name (e.g. 'California', 'New York') |
| specialty | string | Filter by medical specialty (e.g. 'Cardiology', 'Internal Medicine') |
| salary_max | string | Maximum total compensation filter in dollars (e.g. '600000') |
| salary_min | string | Minimum total compensation filter in dollars (e.g. '400000') |
| practice_type | string | Filter by practice setting type (e.g. 'Academic', 'Hospital Employed', 'Private Practice') |
{
"type": "object",
"fields": {
"page": "current page number",
"count": "total matching submissions",
"submissions": "array of salary submission objects",
"total_pages": "total pages available"
},
"sample": {
"data": {
"page": 1,
"count": 3728,
"submissions": [
{
"id": 4483,
"state": "Florida",
"role_type": "Resident",
"specialty": "Ophthalmology",
"role_title": "Resident",
"base_salary": 60000,
"hours_worked": 45,
"subspecialty": null,
"employment_type": "trainee",
"submission_date": "2026-06-06T16:27:28.791+00:00",
"bonus_incentives": null,
"practice_setting": "Residency",
"satisfaction_level": 5,
"total_compensation": 60000,
"geographic_location": "Florida",
"years_of_experience": 3,
"effective_hourly_rate": 25.64
}
],
"total_pages": 187
},
"status": "success"
}
}About the SalaryDr API
Salary Submissions and Filtering
get_all_salary_submissions returns paginated physician salary records (20 per page) with filters for role (physician, resident, or fellow), state, specialty, practice_type, and salary_min/salary_max bounds. Each submission object includes fields like base_salary, total_compensation, hours_worked, practice_setting, satisfaction_level, and submission_date. To retrieve a single record by its numeric ID, use get_salary_submission_detail — note that this endpoint searches the most recent results, so older submissions may not resolve. Dentist records are served separately via get_dentist_salaries, which shares the same submission shape and pagination behavior.
Benchmarks and Specialty Detail
get_salary_benchmarks_table provides overall or specialty-filtered aggregate stats: median_salary, average_salary, average_base, total_submissions, a percentiles array, and a by_employment_type breakdown. For deeper specialty analysis, get_benchmark_specialty_detail adds average_hours_week, average_satisfaction, salary_distribution, and a per-employment-type salary and submission count breakdown. The get_salary_explorer_overview endpoint returns site-wide physician metrics including would_choose_again_percent, average_workload_hours, and average_satisfaction with no inputs required.
Geographic and Specialty Coverage
get_specialty_salary_by_state accepts both a state and a specialty and returns matching individual submissions alongside aggregate stats (averageSalary, medianSalary, totalSubmissions) for that state-specialty pair. get_all_specialties_list enumerates every specialty with at least one submission, returning a sorted array of specialty name strings and a total count — useful for discovering valid values before querying other endpoints.
The SalaryDr API is a managed, monitored endpoint for salarydr.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when salarydr.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official salarydr.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Benchmarking physician compensation offers against
get_salary_benchmarks_tablepercentile ranges by specialty - Comparing geographic pay variation using
get_specialty_salary_by_statefor the same specialty across multiple states - Building a salary transparency tool surfacing recent submissions via
get_recent_salary_submissions - Analyzing employment-type pay differences (Academic vs. Hospital Employed vs. Private Practice) from
by_employment_typefields - Populating a residency/fellowship compensation guide using the
rolefilter onget_all_salary_submissions - Tracking dentist compensation trends by paginating through
get_dentist_salariessubmissions over time - Generating specialty satisfaction and workload reports using
average_satisfactionandaverage_hours_weekfromget_benchmark_specialty_detail
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does SalaryDr have an official developer API?+
What does `get_salary_submission_detail` return and are there coverage limits?+
base_salary, total_compensation, hours_worked, practice_setting, satisfaction_level, submission_date, specialty, state, and role_title. The endpoint searches the most recent page of results, so submissions that are no longer in the recent result set may not resolve — if you need broad historical lookup, paginating through get_all_salary_submissions with filters is more reliable.Can I filter dentist salary submissions by state or specialty the same way physician submissions can be filtered?+
get_dentist_salaries currently supports only page-based pagination — it does not accept state, specialty, role, or compensation range filters. Specialty and state filtering are available for physician data via get_all_salary_submissions. You can fork this API on Parse and revise it to add filter parameters to the dentist endpoint.Does the API expose resident or fellow salary data at the benchmark or percentile level?+
role filter on get_all_salary_submissions, but the benchmark endpoints (get_salary_benchmarks_table, get_benchmark_specialty_detail, get_salary_explorer_overview) reflect physician-level aggregates. You can fork this API on Parse and revise it to add resident/fellow-specific benchmark endpoints.How is pagination handled across the submission endpoints?+
get_all_salary_submissions and get_dentist_salaries both return 20 submissions per page. Responses include page (current page), total_pages, and count (total matching submissions), so you can iterate through all results by incrementing the page integer parameter until you reach total_pages.