Published salary ranges from 266 companies

8,049 job postings that actually state an annual pay range · normalised to USD · captured 2026-10-26 06:15 (UTC+8) · free CSV, no signup

8,049postings with pay
42.9%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

Machine-readable index for agents: /llms.txt — every dataset, its schema, the licence and the paid alternative in one file.

Weekly snapshots are also published as dated releases with the CSV attached: github.com/sjdfi0wjvosdju9/job-salary-open-data/releases — one tag per snapshot date, so you can diff two weeks without keeping your own copies.

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,049), 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 — install the wheel straight from this site (the PyPI listing is still pending):

pip install https://sjdfi0wjvosdju9.github.io/packages/salaryranges-0.1.2-py3-none-any.whl

Then salaryranges.fetch() returns every row and salaryranges.stats() prints the same numbers as this page. Direct download: salaryranges-0.1.2-py3-none-any.whl.

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
anthropic591$282,500$345,000$402,500
galileo3$312,500$315,000$520,000
openai629$248,000$307,500$366,000
pika6$215,000$292,500$300,000
cohere78$199,944$257,500$280,279
character13$240,000$250,000$275,000
vercel71$195,500$245,000$260,000
perplexity111$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
togetherai41$195,000$230,000$250,000
scaleai116$187,200$229,800$255,600
vanta47$212,000$229,000$264,500
baseten100$195,000$228,250$247,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
wrike6$137,000$217,500$277,500
stripe22$196,000$216,935$245,843
databricks473$195,500$216,104$246,525
labelbox7$170,000$215,000$220,000
llamaindex4$215,000$215,000$215,000
ramp160$162,812$214,300$257,500

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 / ml366$237,500
product548$225,000
engineering2201$223,050
security331$204,000
design219$195,000
finance / legal731$193,568
marketing519$187,625
other680$180,250
sales1239$164,000
support / ops1215$162,000

Which boards publish pay at all

BoardPostingsWith a rangeRate
greenhouse11,5685,14344.5%
ashby5,3532,74151.2%
lever1,7521659.4%
workable8500.0%

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
sentryashby43/43100.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%
robustaworkable0/730%
trading212ashby0/530%
mollieashby0/510%
jobberashby0/430%

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

Remote vs on-site, within the same role family

Role familyRemote nRemote medianOn-site nOn-site medianGap
other234$150,800446$200,000-24.6%
data / ml88$206,000278$250,000-17.6%
finance / legal183$181,022548$200,975-9.9%
support / ops385$153,318830$168,301-8.9%
marketing137$180,000382$193,675-7.1%
engineering561$212,0001640$226,000-6.2%
product166$222,465382$225,425-1.3%
design60$195,642159$195,000+0.3%
sales340$175,000899$159,950+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-26 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)