API

Developer API

The same panel that powers this site, as clean JSON. Authenticate with a bearer key.

Live API contract The response below is fetched now, not hard-coded. v1

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.

FieldTypeMeaning
salary_min / salary_maxnumber|nullEmployer-stated range bounds in the original currency and period.
currencyISO 4217|nullISO 4217 code when determinable from the posting; null otherwise.
periodyear|month|hourPay period as stated (year, month or hour).
salary_sourcestated|none'stated' only when the employer wrote the figure. Never modeled.
annual_usdnumber|nullMidpoint annualized to USD with dated reference FX; null when currency is unknown.
confidence0–1|nullDeterministic extractor confidence for the stated range.
has_equity / has_bonus0|1|nullequity / bonus mentioned in the comp excerpt; null = excerpt not evaluated (never guessed)
as_ofdate (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_flagsstring[]Known gaps on this row, e.g. no_country, no_currency.
observed_atISO 8601When this exact state was last observed on the source board.
first_seen_atISO 8601When the posting first entered the live panel.
urlstringPublic source posting URL — every row is auditable.
fx_as_ofdateDate 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