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'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.
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.
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'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.
curl 'https://quarrion.ai/api/faq?category=product'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.
curl 'https://quarrion.ai/api/salary/advertised?city=london'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'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.
curl 'https://quarrion.ai/api/salary/globe?role=Software%20Engineer'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.
curl 'https://quarrion.ai/api/salary/globe/cities?role=Software%20Engineer&country=GB'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'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.
| Tier | Requests | Window |
|---|---|---|
| free | 30 | 60s |
| pro | 120 | 60s |
| enterprise | 300 | 60s |
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.
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.jsonGET /api/salary/advertised.GET /api/salary/globe.GET /api/salary/globe/roles.GET /api/faq.GET /api/subscription/plans.