Home › Hiring and jobs › Salary Benchmark Data

Salary Benchmark Data: Pay Ranges by Role From Job Posts

How it works

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.

Input options

FieldNameRequiredWhat it does
presetUse casenoReady-made role families, locations and seed company boards. Your own roles, locations or companies below override the preset's.
rolesRole keywordsnoOnly jobs whose title contains one of these words or phrases (e.g. "data engineer", "nurse", "account executive"). Empty = the preset's role families.
excludeRolesExclude titles containingnoDrop jobs whose title contains any of these (e.g. "intern", "contract").
locationsLocationsnoCountry, US state, city or "remote" (e.g. "United States", "California", "London", "remote"). Empty = the preset's locations. "anywhere" = no location filter.
companiesCompany job boardsnoSeed 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...
groupByLocation levelnoBucket by country, US state/province, or city. Leave empty for the preset level (country; state for healthcare).
bySenioritySplit by senioritynoSeparate buckets for junior, senior, staff, principal, director and so on. Off = one bucket per role family.
includeOteInclude OTE (sales) rangesnoOn-target-earnings ranges get their own buckets (payBasis = ote), never mixed with base pay. Off = drop them.
minBucketSizeMinimum jobs per bucketnoBuckets with fewer jobs with pay are not output (and not charged).
confidentSampleSizeSample size for the confidence flagnoBuckets below this n get lowSample = true and low confidence.
maxBucketsMax bucketsnoLargest buckets first.
maxJobsScannedMax jobs scannednoUpper bound on job posts examined across all boards.
outputRawJobsAlso output every job with paynoAdds one row per matching job (title, company, pay, link) after the buckets. Charged per job-with-pay event.
monitorKeyMonitor keynoAny 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.

Output fields

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).

FieldTypeMeaning
typestring
bucketKeystring
rolestring
roleFamilystring
roleFamilyLabelstring
senioritystring
locationstring
locationLevelstring
countrystring
remoteboolean
currencystring
periodstring
payBasisstring
sampleSizeinteger
companiesCountinteger
confidencestring
lowSampleboolean
p10integer
p25integer
p50integer
p75integer
p90integer
meaninteger
medianMininteger
medianMaxinteger
lowestMininteger
highestMaxinteger
spreadPctnumber
topPayersarray
exampleJobsarray
sourcesobject
structuredPaySharenumber
summarystring
signalstring
changeTypestring
prevP50string
p50ChangePctstring
prevSampleSizestring
sourceUrlstring
sourceUrlsarray

Limits, stated plainly

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.

Price

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.

Run it on Apify

Disclosure: we build and maintain this actor.

Related

More in hiring and jobs