All use cases

Salary Data API

Real compensation benchmarks from actual employer job postings

Most salary data comes from surveys: self-reported, lagging by months or years, and skewed by who chooses to respond. CleanJobData takes a different approach — we extract salary ranges from actual employer job postings as they're listed. When a company posts a Senior Backend Engineer role in London at £80k–£110k, that goes into the API as structured data. Query by role, seniority, location, and employment type to get a real picture of what the market is actually offering right now.

Benefits

Features

Frequently Asked Questions

How is this different from salary survey data from Levels.fyi or Glassdoor?

Survey data is self-reported and has selection bias — people who share salaries tend to be at certain companies or seniority levels. CleanJobData's salary data comes from employer job postings, which reflects what companies are actively willing to pay to hire someone right now. Both are useful; they answer different questions.

How many listings actually include salary data?

It varies significantly by country and employer. In the US, salary transparency laws (Colorado, California, New York) have significantly increased the number of listings with salary ranges. UK employers are also improving. Coverage is strongest in the markets with disclosure laws or a norm of posting ranges — query a specific role and location to see the actual salary-field coverage for your segment before you build a benchmarking feature around it.

Can I track salary trends over time?

Yes — scope the same title/location/experience_level query to different windows with published_after (e.g. `?title=staff+engineer&city_id=<sf_id>&published_after=2026-01-01T00:00:00Z`), then rerun it for other date ranges and diff the returned salary_min/salary_max. For deeper historical backfills beyond what pagination supports, contact us about bulk export options.

How do I handle salary data that's expressed as hourly or annual differently across listings?

salary_text carries the employer's original wording alongside the parsed salary_min/salary_max/salary_currency, so you can display or validate against it directly. For contract roles quoted as hourly rates, salary_text is usually the more trustworthy field to show users — surface it next to the normalized range rather than relying on the parsed numbers alone.