Field notes · 2026

Why Glassdoor Reviews Are Hard to Scrape (and How to Do It Anyway)

The content is gated by design, the company IDs are obfuscated, and salary lives in a different place than reviews. Understand the structure and the rest is solvable.

Skip to a ready-made Actor →

Glassdoor holds something genuinely useful — honest employee sentiment, culture signals and real salary ranges — and it guards that data more deliberately than most review sites. If you've tried to pull it and gotten half a review and a signup prompt, that wasn't a glitch. This guide explains the three structural things that make Glassdoor awkward (the wall, the employer ID, the two separate datasets), then shows the clean way through.

The give-to-get wall is the whole problem

Glassdoor's content moat is built on a "give-to-get" model. A signed-out visitor sees a teaser — the overall rating and a handful of reviews — and then hits a prompt to contribute their own review or salary before the rest unlocks. That wall is the single biggest reason naive scrapers come back with thin results: the HTML you fetched literally doesn't contain the reviews past the teaser unless the session is treated as a contributing, returning user.

Getting past it reliably means handling sessions and cookies that look like a legitimate returning visitor, not just requesting the URL. This is the part that breaks DIY attempts within a day.

Resolve the employer ID first

Glassdoor keys everything off a numeric employer ID baked into the URL — the E-number, as in .../Reviews/Acme-Reviews-E1234567.htm. Reviews, salaries, interviews and benefits for a company all hang off that ID. The practical consequence: your first job is always name → employer ID resolution, because that ID, not the company name, is the stable key you paginate against. Two companies with similar names are trivially confused if you skip this step.

Reviews and salaries are two different datasets

People say "scrape Glassdoor" as if it's one thing. It's at least two, on different pages, with different shapes and independent pagination:

Review records

  • Overall & sub-ratings (1–5)
  • Pros / Cons free text
  • Reviewer job title & location
  • Employment status, date
  • "Recommends / CEO approval" flags

Salary records

  • Job title & location
  • Base pay range (median + spread)
  • Additional pay (bonus, stock)
  • Sample size (n reports)
  • Currency & pay period

If you need both, plan two passes against the same employer ID. Don't expect a salary number to appear on a review object or vice versa — they don't share a payload.

Pagination and the anti-bot layer

Reviews come in pages of roughly ten, ordered by recency or relevance. There's no hard public cap, but two forces throttle you in practice: the give-to-get session requirement above, and standard anti-bot defences — datacenter IPs get challenged quickly, and request bursts trigger interstitials. Collecting a large employer with thousands of reviews in full is entirely doable, but only with proxy rotation, paced requests and retry-on-challenge logic. Plan for partial pages and resume-from-page-N rather than assuming a clean single run.

Worth knowing: scrape only public review and salary content, respect the site's terms, and never try to de-anonymize reviewers — Glassdoor's value depends on anonymity and so does staying on the right side of the line. Use the data in aggregate (ratings, themes, ranges), not to target individuals.

The clean path: a managed Actor

Because the hard parts here are session handling, the wall and the anti-bot layer — not parsing — the no-code route is to call a maintained Glassdoor reviews Actor on Apify. You give it company URLs (already carrying the employer ID), it returns structured review records as JSON:

curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "companyUrls": [
      "https://www.glassdoor.com/Reviews/Apify-Reviews-E1234567.htm"
    ],
    "maxReviews": 200
  }'

Each record carries fields along the lines of rating, pros, cons, jobTitle, location, employmentStatus and reviewDate — ready for sentiment analysis, competitor benchmarking or an employer-brand dashboard.

Want a ready-made Glassdoor Actor?

Our maintained Glassdoor reviews scraper handles the give-to-get wall, employer-ID resolution and anti-bot layer, and returns review text, ratings, pros and cons as clean JSON. Callable as an API, free to start.

Get the Glassdoor Scraper → Or get done-for-you leads

FAQ

Why does Glassdoor hide reviews behind a wall?

The give-to-get model: contribute a review or salary to unlock more. It protects Glassdoor's contributed-data moat and is the main obstacle to collecting the full review set.

Is salary data the same as review data?

No — separate pages, separate shapes, independent pagination. Reviews carry ratings/pros/cons/title/date; salaries carry base pay range, additional pay, sample size and location.

What is the employer ID?

The numeric E-number in the URL. Every review and salary page hangs off it, so you resolve name → employer ID first and paginate against that ID.

How many reviews can you get per company?

Pages of ~10, no hard public cap, but throughput is limited by the wall and anti-bot throttling. Large employers need pacing, proxy rotation and resumable pagination.

Disclosure: links to Apify on this page are affiliate links. If you create a paid account through them we may earn a commission, at no extra cost to you. We recommend Apify because we build and ship Actors on it ourselves.