Home › Hiring and jobs › Salary Benchmark Data
Get pay-range percentiles (p10-p90) by role, seniority and location from pay-transparent job posts on public Greenhouse, Lever and Ashby boards, with sample size, confidence and top payers.
| Field | Name | Required | What it does |
|---|---|---|---|
preset | Use case | no | Ready-made role families, locations and seed company boards. Your own roles, locations or companies below override the preset's. |
roles | Role keywords | no | Only jobs whose title contains one of these words or phrases (e.g. "data engineer", "nurse", "account executive"). Empty = the preset's role families. |
excludeRoles | Exclude titles containing | no | Drop jobs whose title contains any of these (e.g. "intern", "contract"). |
locations | Locations | no | Country, US state, city or "remote" (e.g. "United States", "California", "London", "remote"). Empty = the preset's locations. "anywhere" = no location filter. |
companies | Company job boards | no | Seed boards to read: greenhouse:slug, lever:slug, ashby:slug, a careers-board URL (boards.greenhouse.io/x, jobs.lever.co/x, jobs.ashbyhq.com/x) or a bare slug (we probe all... |
groupBy | Location level | no | Bucket by country, US state/province, or city. Leave empty for the preset level (country; state for healthcare). |
bySeniority | Split by seniority | no | Separate buckets for junior, senior, staff, principal, director and so on. Off = one bucket per role family. |
includeOte | Include OTE (sales) ranges | no | On-target-earnings ranges get their own buckets (payBasis = ote), never mixed with base pay. Off = drop them. |
minBucketSize | Minimum jobs per bucket | no | Buckets with fewer jobs with pay are not output (and not charged). |
confidentSampleSize | Sample size for the confidence flag | no | Buckets below this n get lowSample = true and low confidence. |
maxBuckets | Max buckets | no | Largest buckets first. |
maxJobsScanned | Max jobs scanned | no | Upper bound on job posts examined across all boards. |
outputRawJobs | Also output every job with pay | no | Adds one row per matching job (title, company, pay, link) after the buckets. Charged per job-with-pay event. |
monitorKey | Monitor key | no | Any name (e.g. "swe-us-weekly"). Same key on a schedule = only buckets whose median moved by the threshold or whose sample grew are output and charged. First run = baseline. |
One row per result. These are the 41 fields declared in the actor's dataset schema (field list from the schema, not a sample run).
| Field | Type | Meaning |
|---|---|---|
type | string | |
bucketKey | string | |
role | string | |
roleFamily | string | |
roleFamilyLabel | string | |
seniority | string | |
location | string | |
locationLevel | string | |
country | string | |
remote | boolean | |
currency | string | |
period | string | |
payBasis | string | |
sampleSize | integer | |
companiesCount | integer | |
confidence | string | |
lowSample | boolean | |
p10 | integer | |
p25 | integer | |
p50 | integer | |
p75 | integer | |
p90 | integer | |
mean | integer | |
medianMin | integer | |
medianMax | integer | |
lowestMin | integer | |
highestMax | integer | |
spreadPct | number | |
topPayers | array | |
exampleJobs | array | |
sources | object | |
structuredPayShare | number | |
summary | string | |
signal | string | |
changeType | string | |
prevP50 | string | |
p50ChangePct | string | |
prevSampleSize | string | |
sourceUrl | string | |
sourceUrls | array |
Public data only, no login. Fields a source does not publish come back empty rather than guessed. Coverage and freshness follow the underlying public source.
Pay on Apify, no subscription: $0.00025 per salary bucket on the free plan, down to $0.00015 on higher plans (pay per event, tiered). The live price is on the actor page.
Disclosure: we build and maintain this actor.