Data Pay Index API and MCP server
Free, read-only access to the same skills and pay data as this site, as JSON or as tools for AI assistants. No key, no sign-up. Data as of 2026-10-22, rebuilt daily.
Quick start
curl https://datapayindex.com/api/v1/skills/databricks
curl "https://datapayindex.com/api/v1/skills?category=genai&sort=median_pay&min_pay_n=10&limit=5"
curl https://datapayindex.com/api/v1/roles/data-engineer
Every response is JSON, carries as_of (the snapshot date) and a source line to cite, and is cached at the edge for a few hours. CORS is open, so it works from a browser. The full description is the OpenAPI 3.1 document.
Endpoints
| Endpoint | Returns |
|---|---|
GET /api/v1/ | API index. Lists the endpoints and the dataset date. |
GET /api/v1/meta | Dataset summary. Data date, coverage (postings, companies, job boards), pay rules, license and citation. |
GET /api/v1/skills | List and filter skills. All tracked skills with demand and median pay. |
GET /api/v1/skills/{key} | One skill. Demand, median pay, pay by level, and the roles that ask for one skill. |
GET /api/v1/roles | List roles. The 12 data & AI role families with postings and median pay. |
GET /api/v1/roles/{key} | One role. Postings, median pay, pay by level and the most-requested skills for one role family. |
GET /api/v1/levels | Pay by level. Postings and median published US pay by seniority level (from job titles), all data & AI roles. |
GET /api/v1/categories | Skill categories. Taxonomy categories and how many skills each has. |
GET /api/v1/openapi.json | This API as an OpenAPI 3.1 document. |
Base URL: https://datapayindex.com/api/v1. Skill and role keys are the same as the page URLs (/skills/dbt/ is /api/v1/skills/dbt), and display names work too.
Filters for /api/v1/skills
| Parameter | What it does |
|---|---|
category | Only skills in this taxonomy category (see /categories), e.g. `platform`, `genai`. |
role | Only skills mentioned in postings for this role family (key or name), e.g. `data-engineer`. |
q | Case-insensitive match on skill key or name. |
min_postings | Minimum postings. |
min_pay_n | Minimum postings with pay (use 10 to get only skills with a median). |
sort | Sort order (descending except name). `role_postings` needs `role`. |
limit | Maximum items (1-500). |
What the numbers mean
- share_pct: percent of all 13,293 tracked data & AI postings that mention the skill.
- median_pay_usd: median of the published pay-range midpoint, US postings in USD, annualized. It is
nullwhen fewer than 10 postings have pay, the same rule the site uses. pay_n is how many postings it's based on. - wow_change_pts: change in share versus last week, in percentage points.
- Aggregates only. The API never returns job postings, titles, links or per-company figures. See the methodology.
MCP server for AI assistants
Add the Data Pay Index to Claude, ChatGPT, Cursor or any client that supports remote MCP servers, then ask things like “what does a Databricks skill pay?” or “top skills for data engineers”. Server URL (Streamable HTTP, no sign-in):
https://datapayindex.com/mcp
| Tool | Inputs | What it answers |
|---|---|---|
get_skill_pay | skill | Demand and median pay for one skill: share of postings, companies, week-over-week change, pay by level, and the roles that ask for it. |
compare_skills | skills (2-10) | Side-by-side demand and pay for several skills, with senior and staff pay. |
top_skills_for_role | role, limit | One role's postings, median pay overall and by level, and its most-requested skills. |
rank_skills | by, category, role, min_pay_n, limit | Rank skills by postings, median pay, week-over-week change or companies, optionally within a category or role. |
How to connect
- Claude (web and desktop): Settings › Connectors › Add custom connector, and paste the server URL.
- Claude Code:
claude mcp add --transport http data-pay-index https://datapayindex.com/mcp - ChatGPT: with developer mode on, Settings › Connectors › Create, and paste the server URL (no authentication).
- Cursor: add it to
~/.cursor/mcp.json:
{ "mcpServers": { "data-pay-index": { "url": "https://datapayindex.com/mcp" } } }
- VS Code: add it to
.vscode/mcp.json:
{ "servers": { "data-pay-index": { "type": "http", "url": "https://datapayindex.com/mcp" } } }
The server is stateless and read-only. It answers JSON-RPC over POST; a GET returns 405 because there's no event stream. Its server card is at /mcp/server-card.
Errors
Errors use RFC 9457 problem details (application/problem+json) with a stable code and a hint:
| code | HTTP | When |
|---|---|---|
not_found | 404 | No endpoint at that path. |
skill_not_found | 404 | Unknown skill key or name; the body may include suggestions. |
role_not_found | 404 | Unknown role key or name. |
invalid_parameter | 400 | A query parameter is out of range or unknown (for example limit=0 or an unknown category). |
method_not_allowed | 405 | Anything but GET, HEAD or OPTIONS on the API, or a GET on /mcp (the MCP server takes POST). |
rate_limited | 429 | More than 120 requests a minute from one address. Wait for Retry-After seconds. |
internal_error | 500 | Something broke on our side. Try again later. |
Limits, caching and versioning
- 120 requests a minute per address, counted per server instance, shown in the
RateLimitandRateLimit-Policyheaders. Responses are cached at the edge, so repeat calls are fast. - Responses have an
ETag; sendIf-None-Matchto get a 304. /api/v1/stays stable. A breaking change would ship as/api/v2/, with v1 kept running.
Discovery files
- /api/v1/openapi.json (OpenAPI 3.1, also at /openapi.json)
- /.well-known/api-catalog (RFC 9727 API catalog)
- /mcp/server-card and /.well-known/mcp.json (MCP server card)
- /llms.txt (site guide for AI agents) and the aggregates CSV
License and credit
The data is free to reuse under CC BY 4.0. Credit “Data Pay Index (https://datapayindex.com/), data as of …” with the as_of date. Questions or a field you need: hello@datapayindex.com.