Published salary ranges from 266 companies

8,041 job postings that actually state an annual pay range · normalised to USD · captured 2026-10-24 09:36 (UTC+8) · free CSV, no signup

8,041postings with pay
43.1%of all postings
$200,000median midpoint
$150,000 – $253,000p25 – p75
28.0%remote

Method, in one paragraph. We read the public job feeds of 266 companies across Greenhouse, Ashby, Lever and Workable. Where the board publishes salary as a structured field we take it as-is; where it only appears in the job body we take the range next to a pay cue (such as “base pay range”) and annualise it. Ranges given per hour or per month are converted to a yearly figure; anything that lands outside $5,000–$5,000,000 is dropped rather than “fixed”. Currencies are converted to USD. Postings without a published range are excluded — this is not a survey of what everyone pays, it is a census of what companies chose to publish.

Download

salary-ranges.csv — 1,522 rows, one per posting: company, ats, title, location, remote, role_family, salary_usd_low / high / mid, posted_at, url. Stratified so that every company in the pool appears at least once. CC BY 4.0 — use it, just link back here.

salary-ranges-full.csv — every single row (8,041), same columns, 1.3 MB. Use this one if you are computing statistics: the sample above is deliberately biased towards each company's best-paid roles, so its median is higher than the real one.

From Python, no key needed: pip install salaryranges → salaryranges.fetch().

Numbers move when the market moves and also when we were wrong. Every revision that changed a published value is listed in the change log, with the before/after numbers.

Median midpoint by company (30 highest of 166)

CompanyPostingsp25Medianp75
anthropic589$282,500$347,500$402,500
galileo3$312,500$315,000$520,000
openai631$248,000$307,500$366,000
pika6$215,000$292,500$300,000
cohere78$199,807$257,500$280,087
character13$240,000$250,000$275,000
vercel71$195,500$245,000$260,000
perplexity110$195,000$245,000$312,500
render34$230,000$242,000$259,000
figma79$207,000$236,000$264,500
faire69$190,000$232,750$256,500
baseten101$195,000$230,000$247,500
togetherai41$195,000$230,000$250,000
scaleai116$187,200$229,800$255,600
vanta47$212,000$229,000$264,500
launchdarkly35$203,300$227,735$285,650
mintlify15$165,000$227,500$227,500
modal42$200,000$225,000$275,000
roboflow7$225,000$225,000$225,000
latitude17$200,000$224,000$224,000
demandbase3$178,000$223,000$258,000
gridmaticinc10$190,000$222,500$225,000
hex37$180,000$220,000$247,500
elliptic8$202,000$218,750$230,500
stripe22$196,000$218,105$245,843
wrike6$137,000$217,500$277,500
databricks473$195,500$216,104$246,525
labelbox7$170,000$215,000$220,000
llamaindex4$215,000$215,000$215,000
plaid129$175,200$214,800$251,400

Only companies with at least 3 salary-bearing postings are included. Medians mix seniority levels — a company hiring mostly staff engineers will look expensive.

Median midpoint by role family

Role familyPostingsMedian
data / ml367$237,500
product547$225,000
engineering2201$223,000
security331$204,000
design219$195,000
finance / legal728$193,568
marketing512$186,424
other681$180,500
sales1238$164,000
support / ops1217$162,000

Which boards publish pay at all

BoardPostingsWith a rangeRate
greenhouse11,5615,13444.4%
ashby5,3582,74351.2%
lever1,7511649.4%

The denominator is every de-duplicated posting we read from that board, not just the ones with pay — so this is a publication rate, not a composition effect.

Even within one board, the spread between companies is enormous

Same denominators as above, per company, restricted to companies with at least 25 de-duplicated postings. A company that states a range on every posting and one that states it on none can sit on the same board.

CompanyBoardWith pay / postingsRate
sentryashby42/42100.0%
rainashby37/37100.0%
algoliagreenhouse28/28100.0%
mercurygreenhouse76/7798.7%
chimegreenhouse70/7198.6%
fairegreenhouse69/7098.6%
modalashby42/4397.7%
klaviyogreenhouse150/15497.4%
temporalashby69/7197.2%
sofigreenhouse54/5696.4%

Below, eleven companies with 40+ postings publish a range on none of them. This is not a scraping failure: the field is simply absent from their feed.

CompanyBoardWith pay / postingsRate
datadoggreenhouse0/4170%
betterhelpgreenhouse0/1540%
notionashby0/1400%
langchainashby0/1040%
spotifylever0/890%
getyourguidegreenhouse0/740%
trading212ashby0/530%
mollieashby0/510%
jobberashby0/430%
qontolever0/410%

Across all families: remote postings median $190,781 (n=2,255) vs on-site $204,000 (n=5,786) — a -6.5% gap.

Remote vs on-site, within the same role family

Role familyRemote nRemote medianOn-site nOn-site medianGap
other235$150,800446$200,000-24.6%
data / ml88$206,000279$250,000-17.6%
finance / legal183$181,022545$200,950-9.9%
support / ops386$153,318831$167,575-8.5%
marketing135$180,000377$192,500-6.5%
engineering563$212,0001638$226,000-6.2%
product165$222,500382$225,425-1.3%
design60$195,642159$195,000+0.3%
sales340$175,000898$160,000+9.4%
security100$216,902231$197,500+9.8%

Only families with at least 60 postings on both sides are shown. Controlling for function removes the obvious composition effect, but not geography: a remote band may simply be priced for a cheaper market. The dataset has a location column if you want to try separating the two.

Hiring momentum (starting to accumulate)

Snapshot 2026-10-24 is in the bank, and it is the first one — a change table needs a second point at least six days later, so there is nothing honest to compare yet. The weekly refresh keeps appending, and this section turns into a real "who is expanding, who is freezing hiring" table as soon as there are two points.

Where to get this refreshed

This page is a snapshot. The live version is the ATS Job Feed actor: set useVerifiedPool: true and salaryOnly: true and it returns the same schema for the current day, $0.0015 per job. There is also a browsable sample.

Only want jobs that publish a salary? (and what that costs)