Orthopedic Surgeon Rankings API
Free, versioned JSON endpoints for developers, researchers, and AI systems. No API key. CORS-enabled. CC-BY-4.0 license.
API Endpoints
Base URL: https://orthoprocedures.com/data/v1/
Discovery
Surgeons
Rankings
Trends
Summary
Code Examples
curl
# Lookup surgeon by NPI curl https://orthoprocedures.com/data/v1/surgeons/npi/1194043521.json # Texas hip rankings curl https://orthoprocedures.com/data/v1/rankings/tx/hip.json # National top 100 β knee curl https://orthoprocedures.com/data/v1/rankings/national/knee.json # Hip trends 2013-2023 curl https://orthoprocedures.com/data/v1/trends/hip.json
Python
import requests
# Lookup surgeon by NPI
npi = "1194043521"
resp = requests.get(f"https://orthoprocedures.com/data/v1/surgeons/npi/{npi}.json")
surgeon = resp.json()
print(f"{surgeon['name']} β {surgeon['totalProcedures']} procedures "
f"(rank #{surgeon['overallStateRank']} in {surgeon['stateName']})")
# Texas hip rankings β top 10
resp = requests.get("https://orthoprocedures.com/data/v1/rankings/tx/hip.json")
data = resp.json()
for s in data["rankings"][:10]:
print(f"#{s['rank']}: {s['name']} ({s['city']}) β {s['procedureCount']} hip procedures")
JavaScript / TypeScript
// Lookup surgeon by NPI
const resp = await fetch('https://orthoprocedures.com/data/v1/surgeons/npi/1194043521.json');
const surgeon = await resp.json();
console.log(surgeon.name, surgeon.totalProcedures);
// State rankings
const rankResp = await fetch('https://orthoprocedures.com/data/v1/rankings/ca/knee.json');
const rankings = await rankResp.json();
rankings.rankings.slice(0, 5).forEach(s => {
console.log(`#${s.rank}: ${s.name} β ${s.procedureCount} knee procedures`);
});
// All surgeons (2 MB)
const allResp = await fetch('https://orthoprocedures.com/data/v1/surgeons/all.json');
const allData = await allResp.json();
const texasSurgeons = allData.surgeons.tx;
R
library(jsonlite)
# National hip trends
trends <- fromJSON("https://orthoprocedures.com/data/v1/trends/hip.json")
df <- data.frame(
year = trends$national$years,
total = trends$national$totalProcedures,
surgeons = trends$national$totalSurgeons
)
plot(df$year, df$total, type="l", main="National Hip Arthroplasty Volume 2013-2023")
Bulk Downloads
License & Citation
All data is licensed under CC-BY-4.0 β free to use, share, and adapt with attribution. Source data from CMS (U.S. government, public domain). Our rankings, metadata, and endpoint structure are CC-BY-4.0.
OrthoProcedures.com. (2024). U.S. Orthopedic Surgeon Rankings by Medicare Procedure Volume [Data set]. Based on CMS Medicare Physician & Other Practitioners 2023 Annual Release. https://orthoprocedures.com/data/v1/catalog.json
Full citation formats (academic, journalistic, BibTeX) at data-methodology.
Bandwidth & Acceptable Use
Please be a good citizen of this free API.
- Cache responses locally β all endpoints are static and change only on annual data updates.
- For bulk access, download surgeons/all.json once rather than looping over 8,079 NPI endpoints.
- Do not poll endpoints in tight loops or build scrapers that re-fetch unchanged data.
- High-volume automated access that disrupts service for other users may be rate-limited or blocked without notice.
Why CORS is enabled
All /data/v1/ endpoints include Access-Control-Allow-Origin: *, enabling browser-side JavaScript to query the API directly without a proxy server. This is intentional β the data is public and the bandwidth exposure is mitigated by:
- Immutable cache headers (
max-age=31536000, immutable) β browsers and CDNs cache aggressively after the first fetch. - Netlify CDN β static files served from the edge; origin is never hit for cached responses.
- No auth required β eliminates credential-stuffing and authentication abuse vectors.
- Versioned URLs (
/v1/) β future breaking changes ship as/v2/without disrupting existing consumers.
If you are building a high-traffic application on top of this API, consider self-hosting a copy of surgeons/all.json and generating your own derived endpoints rather than proxying orthoprocedures.com.