Salary & Talent Market Benchmark
Pricing
from $7.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
18 days ago
Last modified
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:
| Field | Description |
|---|---|
role | The role you asked for |
location | City/region benchmarked, or empty for nationwide |
country | Market code (in, us, uk, …) |
currency | Reporting currency, fixed by country. Never mixed |
sampleSize | Number of usable salary observations behind the percentiles |
p25 | 25th percentile annual salary |
median | 50th percentile annual salary |
p75 | 75th percentile annual salary |
min / max | Lowest 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 |
remoteShare | Share of listing-based observations that are remote-friendly |
sourcesUsed[] | Sources that actually contributed observations |
sourcesAttempted[] / sourcesFailed[] | Full audit trail of what was tried |
observationsPerSource | Observation count per source |
medianPerSource | Median per source, so you can see cross-source agreement |
referenceMedians | The source's own published median, where one exists |
confidence | low / medium / high |
salaryPeriod | Always year — everything is normalised to annual |
generatedAt | UTC timestamp |
Sources
| Source | Coverage | What it contributes |
|---|---|---|
| Adzuna | Global (11 markets) | Job listings that publish an explicit salary or salary range |
| AmbitionBox | India | Individual, dated, employer-attributed CTC reports plus employer and skill context |
| Naukri | India | Job 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.
- 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. - One currency per benchmark. Observations denominated in anything other than the market's currency are excluded, never converted at some unstated FX rate.
- 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.
- 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.
- Confidence reflects agreement, not just volume. 200 observations from a
single source do not earn a
highgrade. Cross-source disagreement caps the grade downward. - 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}
| Field | Type | Default | Notes |
|---|---|---|---|
roles | array of strings | — | Required. One benchmark per role |
location | string | "" | Empty means nationwide |
country | enum | in | Fixes the reporting currency |
experienceLevel | enum | any | any / entry / mid / senior |
sources | array enum | all three | Sources not covering the country are skipped |
minSampleSize | integer | 8 | Suppression threshold |
pagesPerSource | integer | 3 | Listing pages read per paginated source |
proxyConfiguration | object | auto (recommended) | Network routing settings, tuned per source and country |
About network settings
Leave proxyConfiguration on its default. AmbitionBox and Adzuna are unreliable without it — in a measured comparison, turning it off collapsed the combined sample from 65 observations to 8, because those two sources stopped returning data and the benchmark fell back to Naukri alone. The default routes through the country set in country, since an in-country connection matters for all three sources.
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"}
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.
Limitations
- 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.
remoteShareis computed only over listing-derived observations, because employee-reported CTC records carry no work-mode signal. It isnullwhen 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.
- Lightweight by design, so the cost stays low even across a large role catalogue.
Use cases
- Recruiters tracking openings and building candidate pipelines
- Job-market researchers analyzing hiring trends
- Data teams feeding job boards and alerting products
Related Actors
These are two of the public data sources this benchmark pools observations from directly:
- Adzuna Scraper - Global Job Search Aggregator — Thirdwatch
- AmbitionBox Scraper - India Salaries, Ratings - No Cookies — Thirdwatch
Last verified: 2026-09
More scrapers at thirdwatch.dev.