---
title: "A defensible pay range (floor, midpoint, ceiling) for a role in a country"
method: GET
path: "/api/pay-range.json"
---

# A defensible pay range (floor, midpoint, ceiling) for a role in a country

`GET /api/pay-range.json`

## Request

- Base URL: `https://geo-parity.com`
- URL: `https://geo-parity.com/api/pay-range.json`
- Auth: one of:
  - none
  - HTTP bearer
  - API key in query parameter `key`

For employers publishing a salary range. NOT LEGAL ADVICE AND NOT A CERTIFICATION OF COMPLIANCE with the EU Pay Transparency Directive or any national law — every 200 response carries a `caveats` array saying so, which should be reproduced with any quoted figure. `basis` is `measured` or `modelled` and is never blurred. Seniority is a percentile offset within the country's own wage distribution, not a fixed multiplier.

## Query parameters

- `country` string, required
- `occupation` 'total' | 'armed-forces' | 'managers' | 'professionals' | 'technicians' | 'clerical' | 'services-sales' | 'agricultural' | 'craft' | 'operators' | 'elementary'
- `seniority` 'entry' | 'mid' | 'senior' | 'lead'

## Response `200`

floor/midpoint/ceiling (monthly + annual USD, each with its local percentile), basis, gender gap, and caveats

## Other responses

- `400`: Required parameters missing; body includes code, message, and a worked example.
- `422`: Well-formed but invalid input; body includes a machine-readable code (e.g. UNKNOWN_TARGET) and message.
- `429`: A ceiling was exceeded. Body is { ok:false, code, message, retryAfterSeconds } where code is RATE_LIMITED (per-minute burst — back off and retry within the minute) or QUOTA_EXCEEDED (the monthly allowance is spent; retrying will not help until it resets on the 1st). Honour Retry-After.

---

[API](https://skmtc.dev/geo-parity/apis/geo-parity-api.md) · [All operations](https://skmtc.dev/geo-parity/apis/geo-parity-api/llms.txt) · [OpenAPI document](https://skmtc.dev/geo-parity/apis/geo-parity-api/revisions/8ddff47a0806?raw)
