Developers

Quarrion publishes a small read-only API. It serves the same public data the website shows — plans and prices, the published FAQ, the advertised-salary medians behind the /salary pages, and the modelled estimates behind the salary globe — so an agent or a script can read it without scraping HTML. No key, no account, no signup.

This API is EXPERIMENTAL. It exists because publishing the data we already show is cheaper than being scraped, not because we are running an API product. Endpoints may change shape, move or disappear without notice. There is no versioning commitment and no uptime commitment. If you build something on it, email support@quarrion.ai so we know you are there — that is the only thing that will make us think twice before changing a field name.

Endpoints

Every response uses the envelope { "success": boolean, "data": …, "error": string | null }. Field casing follows whatever produces the payload: the plan and FAQ endpoints return database column names in snake_case, while the salary endpoints return camelCase values built by the aggregation service.

GET/api/subscription/plans

The live plan, price and per-metric limit table behind /pricing. Prices are in GBP. Owner-only rows are excluded. Served from a one-hour cache.

curl 'https://quarrion.ai/api/subscription/plans'

GET/api/faq

Every published entry, ordered by `sort_order` then newest first. Both filters are optional and combine; `search` is a case-insensitive substring match across the question and the answer.

category
Exact-match filter on the entry category.
search
Case-insensitive substring match on question or answer.
curl 'https://quarrion.ai/api/faq?category=product'

GET/api/salary/advertised

The p25 / median / p75 of the annual pay employers STATED in public job advertisements, per sector or job title per market, over a rolling 90-day window. Every cell carries its own sample size, its date range, the nightly recompute run that produced it and the URL of its human-readable page. Advertised pay, not paid pay; an advertisement quoting no salary is excluded rather than estimated, and a cell is withdrawn rather than frozen when it falls below 30 advertisements. Covers every sector, not only technology. Both filters are optional and combine; `location` is an alias of `city` and `role` of `sector`, and either spelling — URL slug or raw value — resolves. Call /api/salary/advertised/locations first to learn the valid values.

city
Market: the URL slug (`london`, `uk`, `remote-uk`) or the raw location (`London`, `GB`, `remote-GB`). `location` is accepted as an alias.
sector
Sector or job title, as the URL slug (`hospitality-retail`, `chef-de-partie`) or its human form. `role` is accepted as an alias.
curl 'https://quarrion.ai/api/salary/advertised?city=london'

GET/api/salary/advertised/locations

One entry per market, with how many cells it publishes, how many advertisements sit behind them, and the exact `city` / `sector` slugs to pass back to /api/salary/advertised. London leads because the corpus does; the rest follow by weight of evidence.

curl 'https://quarrion.ai/api/salary/advertised/locations'

GET/api/salary/globe

Country-level MODELLED ESTIMATES for a role, normalised to USD and inflation-adjusted. These are curated estimates calibrated against BLS / ONS / Eurostat reference data — not survey data, not observed pay, and not sourced from those agencies; every row carries a confidence score and its citations, and in production today every row resolves to `provenance.kind = "estimate"`. For advertised medians computed from real job postings, use /api/salary/advertised. Passing `country` switches the response to that country’s cities — the same payload as /api/salary/globe/cities. Anonymous callers read cross-tenant research data only; no user data is ever returned.

role *
Role title. Matched against a synonym list, so close variants resolve.
country
ISO 3166-1 alpha-2. When present the response is an array of cities instead.
curl 'https://quarrion.ai/api/salary/globe?role=Software%20Engineer'

GET/api/salary/globe/cities

City-level drill-down of the same modelled estimates as /api/salary/globe — not observed pay. `median`, `p25` and `p75` are null for a city that is plotted but has no salary data for this role.

role *
Role title. Matched against a synonym list, so close variants resolve.
country *
ISO 3166-1 alpha-2 (alpha-3 is also accepted).
curl 'https://quarrion.ai/api/salary/globe/cities?role=Software%20Engineer&country=GB'

GET/api/salary/globe/roles

Distinct role titles with researched salary data, so a client can suggest roles that will actually return results. Low-confidence free-text titles are filtered out.

curl 'https://quarrion.ai/api/salary/globe/roles'

GET/api/health

Liveness of the web tier and its database connection. Always answers 200 — a degraded database is reported in the body, not as a status code. This is the one public endpoint that does not send RateLimit headers.

curl 'https://quarrion.ai/api/health'

The full machine-readable description is at https://quarrion.ai/openapi.json, indexed from /.well-known/api-catalog.

Rate limits

Request quotas per tier, per 60 seconds
TierRequestsWindow
free3060s
pro12060s
enterprise30060s

Limits are per caller per 60 seconds. An anonymous caller is keyed by IP and gets the free-tier quota. Every response except /api/health carries RFC 9331 RateLimit and RateLimit-Policy headers. Those headers declare the policy in force rather than a live remaining count — a fabricated countdown would be worse than none, because you would pace against a number that means nothing.

MCP server

The same data is available over the Model Context Protocol, so an MCP client can call it as tools rather than as HTTP. The server is read-only: it exposes five tools, all of them wrappers over the endpoints above, and nothing that writes, authenticates or costs money.

https://quarrion.ai/api/v1/mcp
https://quarrion.ai/.well-known/mcp/server-card.json
  • salary_advertisedAdvertised-salary medians from real job postings, with per-cell sample sizes. Wraps GET /api/salary/advertised.
  • salary_globeModelled country-level salary estimates for a role, with city drill-down. Wraps GET /api/salary/globe.
  • salary_rolesThe role titles that have researched salary data. Wraps GET /api/salary/globe/roles.
  • search_faqSearch the published FAQ entries. Wraps GET /api/faq.
  • get_pricing_plansThe live plan, price and per-metric limit table. Wraps GET /api/subscription/plans.

Machine-readable surfaces