Salary & Talent Market Benchmark avatar

Salary & Talent Market Benchmark

Pricing

from $7.00 / 1,000 results

Go to Apify Store
Salary & Talent Market Benchmark

Salary & Talent Market Benchmark

Produce one salary benchmark per role and location — p25, median and p75, top employers, top skills and remote share — aggregated from live public job and compensation sources, with a stated sample size and confidence grade.

Pricing

from $7.00 / 1,000 results

Rating

0.0

(0)

Developer

Thirdwatch

Thirdwatch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Get a defensible salary benchmark for a role in a market — 25th percentile, median, 75th percentile, top employers, top skills and remote share — computed from live public compensation and job-listing data, with the sample size and a confidence grade printed next to every number.

This is not a job-listing scraper. One run returns one benchmark record per role and location, not a thousand job rows. The value is in the composition: pooling salary observations from several independent public sources, normalising them to a single currency and a single annual period, and refusing to publish a number when the evidence is too thin.

What you get

One row per role + location:

FieldDescription
roleThe role you asked for
locationCity/region benchmarked, or empty for nationwide
countryMarket code (in, us, uk, …)
currencyReporting currency, fixed by country. Never mixed
sampleSizeNumber of usable salary observations behind the percentiles
p2525th percentile annual salary
median50th percentile annual salary
p7575th percentile annual salary
min / maxLowest and highest observation in the sample
topEmployers[]Employers appearing most often in the sample, with counts
topSkills[]Skills most associated with the role, with mention counts
remoteShareShare of listing-based observations that are remote-friendly
sourcesUsed[]Sources that actually contributed observations
sourcesAttempted[] / sourcesFailed[]Full audit trail of what was tried
observationsPerSourceObservation count per source
medianPerSourceMedian per source, so you can see cross-source agreement
referenceMediansThe source's own published median, where one exists
confidencelow / medium / high
salaryPeriodAlways year — everything is normalised to annual
generatedAtUTC timestamp

Sources

SourceCoverageWhat it contributes
AdzunaGlobal (11 markets)Job listings that publish an explicit salary or salary range
AmbitionBoxIndiaIndividual, dated, employer-attributed CTC reports plus employer and skill context
NaukriIndiaJob listings where the employer discloses the salary band, plus role skills

topSkills comes from AmbitionBox's role skill list and Naukri's per-listing skill tags. Both are filtered against an explicit denylist of state, city and job-type tags, because those sources mix SEO boilerplate ("Karnataka", "Remote jobs", "Full time") into the same field as real skills. Adzuna contributes salary observations only — its refinement rail is facet navigation, not skills, so no skill signal is taken from it.

The Actor degrades gracefully. A benchmark built from two of three sources is still valid and billable. Zero sources is not — that run emits nothing.

India has the deepest coverage because two of the three sources are India-only. Outside India the benchmark runs on Adzuna alone, and the confidence field reflects that honestly.

The statistical rules this Actor will not break

These exist because a salary benchmark that is quietly wrong is worse than no benchmark at all — someone makes an offer with it.

  1. Minimum sample size. No benchmark is emitted below minSampleSize (default 8) usable observations. Below the threshold the role produces no row and is not charged.
  2. One currency per benchmark. Observations denominated in anything other than the market's currency are excluded, never converted at some unstated FX rate.
  3. Everything is annualised before the maths. Hourly, daily, weekly and monthly figures are converted to an annual basis (40h × 52w for hourly, 260 working days, 12 months) before percentiles are computed. Mixing periods is the single most common way public salary numbers go wrong.
  4. Hidden salaries are dropped, not guessed. Most Indian job listings hide the band. Inferring a number for those would invent the majority of the sample.
  5. Confidence reflects agreement, not just volume. 200 observations from a single source do not earn a high grade. Cross-source disagreement caps the grade downward.
  6. Implausible values are filtered. Anything outside a wide sanity band is a parsing artefact (a reference number read as a salary), not a wage.

Input

{
"roles": ["data scientist", "backend engineer"],
"location": "Bengaluru",
"country": "in",
"experienceLevel": "any",
"sources": ["adzuna", "ambitionbox", "naukri"],
"minSampleSize": 8,
"pagesPerSource": 3
}
FieldTypeDefaultNotes
rolesarray of stringsRequired. One benchmark per role
locationstring""Empty means nationwide
countryenuminFixes the reporting currency
experienceLevelenumanyany / entry / mid / senior
sourcesarray enumall threeSources not covering the country are skipped
minSampleSizeinteger8Suppression threshold
pagesPerSourceinteger3Listing pages read per paginated source
proxyConfigurationobjectresidentialUsed for AmbitionBox and Adzuna; Naukri is never proxied

About the proxy

Leave the proxy on. AmbitionBox and Adzuna both refuse datacenter IP ranges — AmbitionBox drops the connection outright — so without a residential proxy the run falls back to Naukri alone and the sample collapses (65 observations to 8 in a measured comparison). The proxy country is set from country automatically, because an in-country exit matters for all three sources. Naukri is deliberately never proxied: it serves its public API to plain HTTP, so proxying it would add cost and a failure mode for no benefit.

Output example

{
"role": "data scientist",
"location": "Bengaluru",
"country": "in",
"currency": "INR",
"experienceLevel": "any",
"sampleSize": 61,
"p25": 920000.0,
"median": 1610000.0,
"p75": 2280000.0,
"min": 410000.0,
"max": 6400000.0,
"topEmployers": [{ "name": "TCS", "observations": 4 }],
"topSkills": [{ "skill": "Python", "mentions": 2 }],
"remoteShare": 0.12,
"sourcesUsed": ["adzuna", "ambitionbox", "naukri"],
"observationsPerSource": { "adzuna": 8, "ambitionbox": 44, "naukri": 9 },
"medianPerSource": { "adzuna": 1500000.0, "ambitionbox": 1655000.0, "naukri": 1400000.0 },
"confidence": "high",
"salaryPeriod": "year",
"generatedAt": "2026-08-03T09:14:22.000000+00:00"
}

Pricing

Pay per event. You are charged only for a benchmark row that is actually delivered — after it has been pushed to the dataset, and only when it cleared the minimum sample size. Suppressed roles, failed roles and empty runs cost nothing.

EventFREEBRONZESILVERGOLD
benchmark — one delivered benchmark row$0.25$0.22$0.19$0.15

Who this is for

  • Recruiters and talent acquisition — pricing a requisition before it goes to market, and defending the band to a hiring manager.
  • Compensation and HR teams — periodic market checks across a role catalogue without buying a full survey subscription.
  • Founders and hiring managers — a fast, sourced answer to "what does this role actually cost in this city?"
  • Talent-market analysts — tracking percentile drift over time by re-running the same role set on a schedule.

Notes and limits

  • Percentiles use linear interpolation (the same method as numpy's default and most spreadsheets), so any number here can be reproduced from the raw sample.
  • remoteShare is computed only over listing-derived observations, because employee-reported CTC records carry no work-mode signal. It is null when no listing-based observation was collected.
  • Salary data reflects what employers and employees publish publicly. Markets where most employers hide the band will show smaller samples and a lower confidence grade — that is the honest reading, not a defect.
  • Runs on 256 MB with no browser, so the run cost stays low even across a large role catalogue.