Glassdoor Salaries Scraper avatar

Glassdoor Salaries Scraper

Under maintenance

Pricing

from $2.00 / 1,000 result rows

Go to Apify Store
Glassdoor Salaries Scraper

Glassdoor Salaries Scraper

Under maintenance

Scrape 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. Compensation data scraper. Pay scale benchmarking tool.

Pricing

from $2.00 / 1,000 result rows

Rating

0.0

(0)

Developer

DevilScrapes

DevilScrapes

Maintained by Community

Actor 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

  1. Click Try for free at the top of the page.
  2. Fill in the input form — most fields have sensible defaults.
  3. Click Start. Output streams into the run's dataset.
  4. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

📥 Input

FieldTypeRequiredDefaultNotes
searchModestringno'title''title' scrapes national/aggregate salary benchmarks per job title via the title-search results page.…
jobTitlesarrayyes['Software Engineer']One or more job titles to search, e.g. 'Software Engineer'. Required — this is the primary search key.
companyNamesarrayno'—'Company names to scope results to. Required when Search mode is 'title_at_company'.
employerIdsarrayno'—'Power-user shortcut: known Glassdoor employerId values, paired positionally with Company names. Skips the…
locationsarrayno'—'Optional location filter, applied best-effort against whatever location signal the page exposes.
maxResultsintegerno50Hard cap on dataset rows for this run.
proxyConfigurationobjectno{'useApifyProxy': True, 'apifyProxyGroups': ['RESIDENTIAL']}Mandatory-by-default RESIDENTIAL — Glassdoor's Cloudflare wall blocks datacenter exit IPs outright, so we rotate…

Example input

{
"searchMode": "title",
"jobTitles": [
"Software Engineer"
],
"companyNames": null,
"employerIds": null,
"locations": null,
"maxResults": 3,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
}

📤 Output

Every row is one dataset item.

FieldTypeNotes
job_titlestringRequested 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_codestringISO currency code, e.g. 'USD'.
pay_periodstringPay 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_urlstringThe fetched page URL, verbatim.
scraped_atstringISO-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:

EventUSDWhat it is
actor-start$0.20One-off warm-up charge per run
result-row$0.002Per unique dataset item

Example: 1 000 results at the rates above ≈ $2.20. 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.