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.

Connect an MCP client

The server speaks Streamable HTTP at one URL, so any MCP client that can add a remote server by URL can use it. These four recipes are copy-paste ready and were each checked against the client vendor’s own documentation on 12 August 2026 — the link under each one is what to re-read if a step has moved.

All 5 tools are public and read-only. There is no account, no API key and no sign-in step: leave every credential field in your client blank. The endpoint does accept an optional Quarrion access token, but no tool requires one today and none returns more data with one — and a token that is present and not valid is rejected with a 401, so send none rather than a stale one. Authenticated, tier-gated tools are planned; the authorization server behind them is not switched on yet, which is why there is no OAuth flow documented here to complete.

Claude (claude.ai and Claude Desktop)

  1. Open Settings, then Connectors. On a Team or Enterprise workspace an owner adds it under Organization settings, then Connectors, and members authorise it from their own Connectors page afterwards.
  2. Choose Add custom connector.
  3. Paste the URL below and click Add. Leave the OAuth client id and secret under Advanced settings empty — this server does not use them.

Remote MCP server URL

https://quarrion.ai/api/v1/mcp

Custom connectors are available on the Free, Pro, Max, Team and Enterprise plans; a Free account can hold one at a time.

Verified against Anthropic — About custom connectors (remote MCP servers).

Claude Code

  1. Run this from any project. Add --scope user to make the server available across all of your projects instead of just this one.
  2. Or commit the .mcp.json below to share it with everyone working in the repository.

Terminal

claude mcp add --transport http quarrion https://quarrion.ai/api/v1/mcp

.mcp.json

{
  "mcpServers": {
    "quarrion": {
      "type": "http",
      "url": "https://quarrion.ai/api/v1/mcp"
    }
  }
}

In a JSON config the "type" field is required. Claude Code reads an entry that has a "url" but no "type" as a local stdio server and skips it.

Verified against Anthropic — Connect Claude Code to tools via MCP.

Cursor

  1. Create .cursor/mcp.json in the project root for this project only, or ~/.cursor/mcp.json to have it everywhere.

.cursor/mcp.json

{
  "mcpServers": {
    "quarrion": {
      "url": "https://quarrion.ai/api/v1/mcp"
    }
  }
}

Unlike Claude Code, Cursor does not want a "type" on a remote entry — a "url" is enough. The optional "headers" object is for servers that need a key; this one does not.

Verified against Cursor — Model Context Protocol.

ChatGPT

  1. Turn on Developer mode under Settings, then Security and login. OpenAI labels it elevated risk, and on Business, Enterprise and Education accounts an admin can switch it off for the whole workspace.
  2. In the apps and connectors panel, use + to create a developer-mode app for a remote MCP server, paste the URL below, and choose No Authentication.

Remote MCP server URL

https://quarrion.ai/api/v1/mcp

Developer mode is the only route for a server OpenAI has not packaged as an app, and it is documented for people testing servers they are building rather than as a one-click add — expect the panel names to have moved. It is available to Pro, Plus, Business, Enterprise and Education accounts on the web, and it does accept an unauthenticated Streamable HTTP server, which is what this is.

Verified against OpenAI — ChatGPT Developer mode.

Using something else?

Any client that can add a remote Streamable HTTP server by URL will work — point it at https://quarrion.ai/api/v1/mcp. If a config does not seem to take, run this first: it separates “my client is misconfigured” from “their server is down” without installing anything.

Terminal

curl -sS https://quarrion.ai/api/v1/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Machine-readable surfaces