API
Developer API
The same panel that powers this site, as clean JSON. Authenticate with a bearer key.
Authentication
Anonymous calls support evaluation at a low limit. Pass an issued key as a Bearer token for metered access.
curl /api/v1/overview
Live response
Loading…
Endpoints
GET /api/v1/overview— headline panel KPIs
GET /api/v1/salary?by=seniority|company|job_family|country— median pay by dimension
GET /api/v1/facets— live filter values and row counts
GET /api/v1/explore?country=DE&salaried_only=true&sort=salary_desc— filtered role rows
GET /api/v1/explore?as_of=2026-08-05&…— same query, reproduced as the panel was known on that date — the time-travel parameter (also on /salary)
GET /api/v1/explore.csv?…— same filters, CSV sample export
GET /api/v1/insights/comp-mix?by=sector— equity & bonus mention rates by sector or job family
GET /api/v1/events?type=salary_revised_down&days=30— derived change events — salary revisions, closings, reopenings, each with source URL
GET /api/v1/insights/time-to-fill?by=job_family— posting lifetime distribution (uncensored spells only), by family/country/company
GET /api/v1/insights/market-mix?by=seniority— composition of open hiring by function, level or sector
GET /api/v1/insights/benchmark-series?job_family=Engineering&country=US— daily written benchmark history for one market
GET /api/v1/quality— field completeness & FX provenance
GET /api/v1/coverage— per-board coverage registry
GET /api/v1/hiring?days=30— open-role time series
GET /api/v1/signals/disclosure?days=30— salary disclosure trend (All vs EU)
GET /api/v1/signals/movers?days=30— hiring accelerators / decelerators
GET /api/v1/company/{platform}/{token}— per-company signals
Query builder
Compose a request against the live panel and copy it as curl.
curl …
Data dictionary
Field semantics for role rows. Unknown values are null — never silently imputed.
| Field | Type | Meaning |
|---|---|---|
| salary_min / salary_max | number|null | Employer-stated range bounds in the original currency and period. |
| currency | ISO 4217|null | ISO 4217 code when determinable from the posting; null otherwise. |
| period | year|month|hour | Pay period as stated (year, month or hour). |
| salary_source | stated|none | 'stated' only when the employer wrote the figure. Never modeled. |
| annual_usd | number|null | Midpoint annualized to USD with dated reference FX; null when currency is unknown. |
| confidence | 0–1|null | Deterministic extractor confidence for the stated range. |
| has_equity / has_bonus | 0|1|null | equity / bonus mentioned in the comp excerpt; null = excerpt not evaluated (never guessed) |
| as_of | date (param) | any explore/salary query accepts as_of=YYYY-MM-DD and answers from that day's knowledge — cite a number and anyone can reproduce it |
| quality_flags | string[] | Known gaps on this row, e.g. no_country, no_currency. |
| observed_at | ISO 8601 | When this exact state was last observed on the source board. |
| first_seen_at | ISO 8601 | When the posting first entered the live panel. |
| url | string | Public source posting URL — every row is auditable. |
| fx_as_of | date | Date of the FX snapshot used for USD conversion in this response. |
Errors
All errors return a JSON body with a stable shape and appropriate status code.
{ "error": "explanation", "status": 4xx }
Quotas are enforced per key per UTC day. 429 means that day's quota is exhausted.
Versioning & deprecation
- v1 endpoints are additive: new fields may appear, existing fields never change meaning within v1.
- Breaking changes ship as /api/v2 with both versions served in parallel for at least 90 days.
- Deprecations are announced in the changelog and via response headers before removal. Changelog →
Point-in-timeAs-of semantics for reproducible research
Source-linkedPublic posting URL on every role row
Stated vs normalizedOriginal local range retained
Explicit quotasDeterministic daily metering per key