Glassdoor Reviews Scraper - Pros, Cons & Sub-Ratings
Pricing
$2.50 / 1,000 review returneds
Glassdoor Reviews Scraper - Pros, Cons & Sub-Ratings
Page two of a company's Glassdoor reviews redirects a signed-out visitor to /profile/login, so this works best as many companies, few reviews each. Pros, cons, job title, location, rating and six sub-ratings. Cloudflare often wins on datacenter IPs. $2.50 per 1,000 reviews.
Pricing
$2.50 / 1,000 review returneds
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Glassdoor Company Reviews Scraper
Page two of a company's Glassdoor reviews redirects a signed-out visitor to /profile/login?reason=bot-detection. Page one is public, and page one is what this reads.
Every row is one review carrying the company context with it: pros, cons, job title, location, the overall rating, six sub-ratings, recommend / CEO-approval / business-outlook flags, and the company's own name, employer id and average rating.
Read the two limits below before you run this. They are the whole story of whether this actor is useful to you.
Limit 1: Glassdoor only shows signed-out visitors the first page
Glassdoor serves an anonymous visitor the first page of a company's reviews and redirects every deeper page to /profile/login. This actor doesn't paste a Glassdoor account cookie, so that's the ceiling it works within.
In practice that means roughly the newest handful of reviews per company, not hundreds. maxReviews defaults to 100 and accepts up to 2,000, but on a signed-out route you will not get there. When Glassdoor sends the run to the login wall it writes an uncharged LOGIN_REQUIRED row and moves on to the next company rather than pretending.
If you want breadth, the shape that works is many companies, few reviews each, not one company scraped deep.
Limit 2: Cloudflare blocks most datacenter addresses
Glassdoor sits behind Cloudflare Bot Management — the Just a moment… interstitial. The actor runs a real browser with anti-detection and rotates a fresh IP and fingerprint up to three times when it's challenged.
It runs on rotating datacenter addresses. Metered proxy groups (RESIDENTIAL, GOOGLE_SERP) are deliberately not offered here and are swapped for datacenter if you ask for them, because the per-review price doesn't cover residential bandwidth.
So here's the consequence, stated plainly. A live run on 21 August 2026 against Google-Reviews-E9079 was challenged on every rotation and came back BLOCKED. Datacenter ranges have been having a bad run against Glassdoor's current Cloudflare settings. It moves around by day and by company, so treat that as a snapshot rather than a permanent state.
If you need this to work reliably, put your own residential or ISP proxy servers in proxyUrls. They're used exactly as given, with no clamping. That's the supported path to a good hit rate, and it's why the field exists.
A run that's challenged all the way to BLOCKED writes one diagnostic row and charges you nothing.
Modes
mode defaults to sample, which returns five built-in example reviews instantly — no browser, no proxy, no charge. They're labelled sampleData: true with a _notice field so you can't mistake them for real data. It exists so you can look at the output shape for free.
Set mode to live to actually scrape.
Input
| Field | Notes |
|---|---|
mode | sample (default) or live. |
companyUrls | Glassdoor reviews URLs, e.g. https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm. The employer id is read from the E{id} part. |
companyNames | Company names to resolve to an employer first, e.g. Netflix. Use when you don't have the URL. |
maxReviews | Reviews per company. See Limit 1 — the signed-out ceiling usually bites first. |
proxyUrls (inside proxyConfiguration) | Your own proxy servers, used verbatim. This is the field that fixes Limit 2. |
{"mode": "live","companyUrls": ["https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"],"maxReviews": 10}
Give it companyUrls, companyNames, or both. Give it neither and you get an uncharged BAD_INPUT row instead of a crashed run.
Output
Each row is one review plus its company context.
Company: companyName, employerId, overallRating, reviewCount, companyUrl
Review: ratingOverall, summary, pros, cons, advice, jobTitle, employmentStatus, isCurrentJob, location, reviewDate, recommends, ceoApproval, businessOutlook, and the six sub-ratings: ratingWorkLifeBalance, ratingCultureAndValues, ratingCareerOpportunities, ratingCompensationAndBenefits, ratingSeniorLeadership, ratingDiversityAndInclusion.
Reviewers fill most of that in optionally, so advice, jobTitle, location, employmentStatus, isCurrentJob, recommends, ceoApproval, businessOutlook and any sub-rating can be null because the reviewer left it blank. Every row carries the company context plus at least one of summary / pros / cons / ratingOverall; rows with none of those are dropped and never charged.
The data is read out of Glassdoor's own embedded GraphQL cache (props.pageProps.apolloCache), not from HTML selectors, so it doesn't break on a restyle.
Billing
$2.50 per 1,000 reviews ($0.0025 each), and nothing charged when a run starts. Same rate on the free plan as on a paid one.
That single per-review price is the whole bill. The browser, the anti-detection work and the IP rotations are absorbed in it — there's no separate compute or proxy line item.
Nothing else is charged. sample mode is free. BLOCKED, LOGIN_REQUIRED, BAD_INPUT and NO_RESULTS rows are all ok: false and free. Given Limit 2, that matters: a run Cloudflare wins costs you $0.00 in charges.
Diagnostic codes
BLOCKED— Cloudflare beat every rotation. Retry later or supply your own proxy servers.LOGIN_REQUIRED— Glassdoor sent a deeper reviews page to its sign-in wall. Expected behaviour past page one.NO_RESULTS— the company resolved but no reviews parsed. Sometimes the interstitial wins the first attempt; re-running is worth a try.BAD_INPUT— nocompanyUrlsand nocompanyNames.