Glassdoor Salaries Scraper
Under maintenancePricing
Pay per event
Glassdoor Salaries Scraper
Under maintenanceScrape Glassdoor salary benchmarks by job title, optionally scoped to a specific company. Get base-pay and total-pay percentiles, currency, pay period, and a pay-mix breakdown per row — ready for CSV, JSON, or API export, no login required.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
3
Monthly active users
5 days ago
Last modified
Categories
Share
🎯 What this scrapes
Glassdoor publishes crowdsourced base-pay and total-pay percentiles for thousands of job titles, with an optional per-company breakdown — but the site has no export button and no public API. This Actor searches Glassdoor's own salary pages and writes one structured row per job-title (optionally per-company) benchmark: base pay, total pay (25th/median/75th percentile), currency, pay period, and a pay-mix breakdown (commission, profit-sharing, tips) when Glassdoor exposes one. No Glassdoor login is required — the percentile data is visible on the public page.
🔥 What we handle for you
- 🛡️ We rotate browser fingerprints — curl-cffi impersonates real Chrome / Firefox / Safari TLS handshakes so Glassdoor sees a browser, not Python.
- 🌐 We rotate proxy exit IPs and session IDs through Apify Proxy on every block.
- 🔁 We retry with exponential backoff on 408 / 429 / 5xx and rotate fingerprints on a Cloudflare challenge — up to 5 attempts per page, Retry-After honoured.
- 🧱 We back off when Glassdoor rate-limits — partial results surface with a clear status message; we never silently return an empty dataset.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, ready for JSON / CSV / Excel export straight from the Apify Console.
- 💰 You pay only for results that land. No data → no charge, only the small actor-start warm-up fee.
💡 Use cases
- Compensation benchmarking — pull current base/total-pay percentiles for a role family into your comp-planning sheet.
- Offer calibration — check a candidate's ask against Glassdoor's crowdsourced range for that title (and company, if you scope it).
- Comp-team market scans — sweep dozens of job titles at once, on a schedule, to track how published ranges shift.
- Company-specific pay research — resolve a target employer once (or supply its employerId directly) and pull every title you care about at that company.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
searchMode | string | no | 'title' | 'title' scrapes national/aggregate salary benchmarks per job title via the title-search results page.… |
jobTitles | array | yes | ['Software Engineer'] | One or more job titles to search, e.g. 'Software Engineer'. Required — this is the primary search key. |
companyNames | array | no | '—' | Company names to scope results to. Required when Search mode is 'title_at_company'. |
employerIds | array | no | '—' | Power-user shortcut: known Glassdoor employerId values, paired positionally with Company names. Skips the… |
locations | array | no | '—' | Optional location filter, applied best-effort against whatever location signal the page exposes. |
maxResults | integer | no | 50 | Hard cap on dataset rows for this run. |
proxyConfiguration | object | no | {'useApifyProxy': True} | Apify Proxy configuration. Glassdoor runs Cloudflare and degrades to 403/429 under burst traffic, so we rotate session… |
Example input
{"searchMode": "title","jobTitles": ["Software Engineer"],"companyNames": null,"employerIds": null,"locations": null,"maxResults": 3,"proxyConfiguration": {"useApifyProxy": true}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
job_title | string | Requested or page-confirmed job title. |
company_name | ['string', 'null'] | Company name; null for title-only aggregate rows. |
employer_id | ['integer', 'null'] | Glassdoor's internal employerId; null when the page doesn't expose one. |
location | ['string', 'null'] | Best-effort echo of the requested location filter. |
base_pay_median | ['number', 'null'] | Pay-mix BASE component median. |
total_pay_25th | ['number', 'null'] | Total-pay 25th percentile. |
total_pay_median | ['number', 'null'] | Total-pay median. |
total_pay_75th | ['number', 'null'] | Total-pay 75th percentile. |
currency_code | string | ISO currency code, e.g. 'USD'. |
pay_period | string | Pay period, e.g. 'ANNUAL'. |
additional_pay_breakdown | ['array', 'null'] | Pay-mix entries other than BASE (commission, profit-sharing, tips), each {component, median}. |
sample_size | ['integer', 'null'] | Glassdoor's submission-count field, if present. |
source_url | string | The fetched page URL, verbatim. |
scraped_at | string | ISO-8601 UTC row-construction timestamp. |
Example output
{"job_title": "Software Engineer","company_name": "Google","employer_id": 9079,"location": null,"base_pay_25th": null,"base_pay_median": 150000.0,"base_pay_75th": null,"total_pay_25th": 240111.12,"total_pay_median": 296307.52,"total_pay_75th": 374773.68,"currency_code": "USD","pay_period": "ANNUAL","additional_pay_breakdown": [{"component": "COMMISSION","median": 0.0},{"component": "PROFITSHARING","median": 45000.0},{"component": "TIPS","median": 0.0}],"sample_size": null,"source_url": "https://www.glassdoor.com/Salary/Google-Software-Engineer-Salaries-E9079_D_KO7,24.htm","scraped_at": "2026-08-02T09:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.02 | One-off warm-up charge per run |
result-row | $0.002 | Per unique dataset item |
Example: 1 000 results at the rates above ≈ $2.02. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
base_pay_25th / base_pay_75th stay null in v1 — only the BASE pay-mix median is confirmed present on every page we've verified. locations is a best-effort echo of your filter, not a server-side Glassdoor query parameter. title_at_company without Employer IDs costs a resolution request (search page) before the detail-page fetch, doubling request volume for that pair — supply Employer IDs directly to skip it.
❓ FAQ
Do I need a Glassdoor account or API key?
No. Base-pay and total-pay percentiles are visible on Glassdoor's public salary pages without logging in — we don't require or ask for credentials.
What's the difference between 'title' and 'title_at_company' mode?
'title' pulls national/aggregate benchmarks per job title across companies. 'title_at_company' resolves a specific (job title, company) pair to that company's own detail page — supply Employer IDs directly if you already know them to skip the extra resolution request.
Why are base_pay_25th and base_pay_75th sometimes null?
Glassdoor's pay-mix breakdown confirms a BASE median on every page we've verified, but not always a 25th/75th split for that component — we surface exactly what the page exposes, never an estimate.
Why did my run come back with fewer rows than Max results?
Glassdoor rate-limits aggressively under bursts. We rotate fingerprints and back off automatically and retry per target, but a run can still land short of the cap if a specific title/company genuinely has no match.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.