To scrape Glassdoor, use two ready-made Actors: one turns a job search into rows with pay ranges, company ratings and full descriptions, the other turns a company page into employee reviews with every sub-rating. Neither needs a Glassdoor account, cookies or a browser on your side, and both export JSON, CSV or Excel.
This guide covers the fields you get, the no-code steps with Store presets, the same jobs in curl, Python, Node.js and through an AI agent, and two real runs from 26 October 2026: the five newest data engineer jobs in the US, and the five newest Microsoft employee reviews with the company's rating summary.
What data you can get from Glassdoor
The Glassdoor Jobs Scraper returns one row per job; the Glassdoor Reviews Scraper returns one row per review.
| Jobs field | What it holds |
|---|---|
id, title, url, seoUrl | Listing ID, job title and links |
employer | Employer ID, name, overview URL and logo |
location | City, its Glassdoor ID and country |
pay | min, max, currency, period and source (EMPLOYER_PROVIDED or ESTIMATED), or null |
rating, easyApply, ageInDays | Company rating, Easy Apply flag, days since posting |
description | The listing's HTML |
| Reviews field | What it holds |
|---|---|
summary, pros, cons, advice | The review headline and text |
ratingOverall and six sub-ratings | Work-life balance, culture, diversity, career, compensation, senior leadership (1–5) |
ratingCeo, ratingBusinessOutlook, ratingRecommendToFriend | CEO approval, outlook and recommendation |
reviewDateTime, isCurrentJob, employmentStatus, lengthOfEmployment | When, and the reviewer's status |
jobTitle, location, employer | Role, city and company |
employerResponses, countHelpful | Company replies and helpful votes |
companyReviewStats | The company's rating summary, when you turn it on |
What you won't get: the Reviews Scraper collects reviews only, not salaries, interviews or benefits, and neither Actor reads anything behind a Glassdoor login.
How to scrape Glassdoor without code
Jobs. Open the Glassdoor Jobs Scraper and pick the Newest data engineer jobs in the US preset. We lowered limit from 15 to 5:
{
"keywords": "data engineer",
"location": "United States",
"limit": 5,
"sortBy": "date_desc",
"daysOld": 30,
"easyApply": false,
"remoteWorkType": false
}Click Start, then export the dataset. The fields that matter most:
keywordsandlocation: what you'd type into Glassdoor's search boxes.limit: jobs to save, up to 1,000 (Glassdoor serves roughly 900 per search).daysOld,easyApply,remoteWorkType,minRating,radius,employerSizes: filters.excludeJobIds: listing IDs you already have, so a scheduled run saves only new jobs.
How to scrape Glassdoor reviews
Open the Glassdoor Reviews Scraper and pick the Microsoft employee reviews preset. We kept the company URL, cut maxReviews to 5, sorted by date and turned on the rating summary:
{
"startUrls": [{ "url": "https://www.glassdoor.com/Reviews/Microsoft-Reviews-E1651.htm" }],
"maxReviews": 5,
"language": "auto",
"sortReviewsBy": "DATE",
"includeAllReviews": false,
"includeCompanyStats": true
}Any company page with an employer ID works (Reviews, Overview, Jobs or Salaries, on any country site such as glassdoor.fr), and a bare employer ID such as 1651 does too. Add keyword to keep only reviews that mention a word, newerThan (YYYY-MM-DD) for incremental runs, and language or includeAllReviews for non-English reviews.
How to scrape Glassdoor with the API
Create a token under Settings → API & Integrations in the dashboard and store it as SCRAPELY_TOKEN. Both runs below finished in about 10 seconds or less, so the synchronous endpoint returns the rows in one call:
curl -X POST "https://api.scrape.ly/v2/actors/openrole~glassdoor-jobs-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $SCRAPELY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords": "data engineer", "location": "United States", "limit": 5, "sortBy": "date_desc", "daysOld": 30}'It returns a JSON array; add ?format=csv for CSV. For hundreds of jobs or thousands of reviews, the sync call can pass its 45-second wait and answer 408 while the run keeps going (calling again starts a second run). Use POST /v2/actors/openrole~glassdoor-reviews-scraper/runs, poll /v2/actor-runs/RUN_ID?waitForFinish=60 until SUCCEEDED, then read /v2/actor-runs/RUN_ID/dataset/items, as the API docs describe.
In Python (pip install scrapely-client-python), this script pulls the newest reviews of a company, capped at 5 cents, and averages the sub-ratings the reviewers actually filled in:
import os
from decimal import Decimal
from statistics import mean
from scrapely_client import ScrapelyClient
client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")
run = client.actor("openrole/glassdoor-reviews-scraper").call(
run_input={
"startUrls": [{"url": "https://www.glassdoor.com/Reviews/Microsoft-Reviews-E1651.htm"}],
"maxReviews": 5,
"sortReviewsBy": "DATE",
},
max_total_charge_usd=Decimal("0.05"),
)
reviews = list(client.dataset(run.default_dataset_id).iterate_items())
for field in ["ratingOverall", "ratingWorkLifeBalance", "ratingCompensationAndBenefits"]:
scores = [r[field] for r in reviews if r.get(field)] # 0 or None means "not rated"
print(f"{field:32} {mean(scores):.1f} from {len(scores)} of {len(reviews)} reviews")In JavaScript or Node.js (npm install scrapely-client):
import { ScrapelyClient } from 'scrapely-client';
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });
const run = await client.actor('openrole/glassdoor-jobs-scraper').call({
keywords: 'data engineer',
location: 'United States',
limit: 5,
sortBy: 'date_desc',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const job of items) console.log(job.title, job.employer.name, job.pay?.min, job.pay?.max);For an API-style overview of both Actors, see the Glassdoor API page.
With an AI agent (MCP)
Scrape.ly runs a hosted MCP server at https://mcp.scrape.ly. In Claude Code, run claude mcp add --transport http scrapely https://mcp.scrape.ly and sign in with /mcp. In Cursor, add it to ~/.cursor/mcp.json:
{
"mcpServers": {
"scrapely": {
"url": "https://mcp.scrape.ly?actors=openrole/glassdoor-jobs-scraper,openrole/glassdoor-reviews-scraper",
"headers": { "Authorization": "Bearer YOUR_TOKEN" }
}
}
}Then ask: "Use scrapely to get the 20 newest Glassdoor reviews of Microsoft and summarize what employees say about work-life balance, with the average sub-rating." The MCP docs cover ChatGPT, VS Code, Windsurf and the other clients.
A real run: data engineer jobs and Microsoft reviews
Jobs. We ran the jobs input on 26 October 2026. It saved 5 jobs, all with a description, in 10.1 seconds:
| Title | Employer | Location | Pay (annual) | Pay source | Rating | Age (days) |
|---|---|---|---|---|---|---|
| Principal Data Engineer | XpertDox, LLC | Scottsdale, AZ | $150,000–$190,000 | employer | — | 3 |
| Generative AI Data Engineer | Embedded Alliance | Herndon, VA | $120,000–$210,000 | employer | 4.9 | 4 |
| Data Engineer, Talent Community | Lennar Corporation | Miami, FL | $80,328–$149,946 | estimated | 3.4 | 24 |
| Data Pipeline Engineer | DCI Solutions | Washington, DC | $160,000–$200,000 | employer | 3.8 | 2 |
| Senior AWS IAM & Data Engineer | CGI Group Inc. | Lafayette, LA | $102,000–$178,500 | employer | 3.7 | 25 |
Every job had a pay range, four of five from the employer and one Glassdoor estimate, which is the difference to keep when you benchmark salaries. Two of the five took Easy Apply. The log shows the part you never have to handle:
2026-10-26T14:29:14.778Z [Scrapely] Container started (setup 1.5 s)
2026-10-26T14:29:16.105Z [scrapely.actor] INFO Searching data engineer in United States, limit 5, proxy DATACENTER
2026-10-26T14:29:19.142Z [scrapely.actor] INFO Location lookup was blocked.
2026-10-26T14:29:19.142Z [scrapely.actor] WARN Datacenter was blocked. Retrying through residential.
2026-10-26T14:29:20.551Z [scrapely.actor] INFO City United States is location 1.
2026-10-26T14:29:22.984Z [scrapely.actor] INFO Saved 5 jobs. 5 included a description.
2026-10-26T14:29:23.434Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=falseReviews. The reviews run saved 5 reviews in 4.5 seconds. Reviewers are employees, so we show them as [reviewer 1] to [reviewer 5] and leave out their job title, city and tenure, which together with a date can point to one person:
| Reviewer | Date | Overall | Work-life balance | Compensation | CEO | Headline |
|---|---|---|---|---|---|---|
| [reviewer 1] | 2026-10-24 | 4 | 4 | 4 | — | Benefits and culture changing for the worse |
| [reviewer 2] | 2026-10-24 | 5 | not rated | not rated | — | Good pay overshadowed by layoffs |
| [reviewer 3] | 2026-10-23 | 3 | 2 | 4 | Disapprove | Good pay, but local leadership is lacking |
| [reviewer 4] | 2026-10-23 | 5 | 5 | 5 | Approve | Great place to work |
| [reviewer 5] | 2026-10-23 | 4 | 5 | 5 | No opinion | High-impact role with a challenging environment |
With includeCompanyStats on, every row also carried the company summary: 69,801 reviews in total (66,265 in English, then 1,008 in Portuguese and 896 in French), an overall rating of 4.0, diversity and inclusion 4.1, work-life balance and compensation 3.9, culture and career 3.8, senior management 3.4, and 75% who would recommend Microsoft to a friend. Note the gap: two of the five newest reviews mention layoffs while the all-time average sits at 4.0. Sorting by date and scheduling the run is how you see that kind of shift early.
What it costs
Both Actors charge per row saved, with platform usage (compute, proxy and browser) included. Prices checked on the Store pages on 26 October 2026:
- Jobs: $0.000039 per job ($0.039 per 1,000).
- Reviews: $0.00302 per review ($3.02 per 1,000).
Our runs: 5 jobs × $0.000039 = $0.000195, and 5 reviews × $0.00302 = $0.0151, at list price. Our account was billed $0.000156 and $0.01208 after its plan's Store discount. The residential retry in the jobs log cost nothing extra.
At scale: a daily check of 1,000 new jobs costs $0.039; the newest 1,000 reviews of each of 10 competitors cost 10 × $3.02 = $30.20 once, then only the new reviews on later runs with newerThan.
What to watch out for
- Blocks. Glassdoor sits behind bot protection. The Jobs Scraper switches from datacenter to residential addresses by itself when it's refused, as our log shows, and both Actors run on Scrape.ly's proxies, so you never manage IPs.
- "Not rated" is 0, not 1. In our run,
[reviewer 2]skipped the work-life balance and compensation questions and those sub-ratings came back as0; CEO approval and outlook come backnullwhen skipped. Exclude both before you average, as the Python script does. - Date sort isn't strict. With
sortBy: "date_desc", our five jobs were 3, 4, 24, 2 and 25 days old. The order is Glassdoor's; sort byageInDaysyourself if order matters. - Search caps. One job search tops out around 900 jobs (about 30 pages). Split big searches by city or filters.
- Empty descriptions and pay. Glassdoor sometimes withholds a description or publishes no pay range; the row is still saved with
descriptionempty orpay: null. - Language. Reviews are read in one language per run, following the country site. Use
includeAllReviewsfor a global company. - Personal data. Reviews are written by employees. Keep only the fields you need, and don't publish job title, city and date together.
Is it legal to scrape Glassdoor?
Both Actors read only what Glassdoor shows without a login: public job search results and public company reviews. Glassdoor's terms of use apply to how you access the site, and job ads and reviews are copyrighted text, so read the terms and avoid republishing full descriptions or review text. Reviews are also personal data under the GDPR and similar laws even without names, because role, location and date can identify an employee; collect what you need, store it securely and honor deletion requests. Recruiter names in job descriptions deserve the same care. This is not legal advice; ask a lawyer before building a commercial product on Glassdoor data.
Why Scrape.ly for Glassdoor data
- No browser fight. Glassdoor's pages are guarded by bot checks, and DIY guides rely on generated CSS class names that change. The Actors read Glassdoor's own data, retry through residential addresses on their own, and return stable field names.
- Jobs and reviews in one place. Two Actors, the same token, the same export formats, and a company's employer ID links its jobs to its reviews.
- Pennies per run. $0.039 per 1,000 jobs and $3.02 per 1,000 reviews, platform usage included, with a maximum charge per run.
- Agent-ready. The same Actors run from Claude, Cursor or ChatGPT through the hosted MCP server.
FAQ
Can you scrape Glassdoor without logging in?
Yes. Both Actors read public job search results and public company reviews, with no Glassdoor account and no cookies.
How do I get reviews for several companies at once?
Paste several company URLs or employer IDs into startUrls. maxReviews applies to each company, and up to four companies are read at the same time.
Can I scrape only new Glassdoor reviews?
Yes. Sort by DATE and set newerThan to the date of your last run, then schedule it. For jobs, pass the IDs you already stored in excludeJobIds.
Does Glassdoor show salaries in job listings?
Often. In our run all five jobs had a pay range, four provided by the employer and one estimated by Glassdoor. The pay.source field tells you which.
Can I scrape Glassdoor with Python?
Yes. Install scrapely-client-python, call openrole/glassdoor-jobs-scraper or openrole/glassdoor-reviews-scraper, and iterate over the dataset, as in the script above. The scraping runs in the cloud.
How does Glassdoor compare with Indeed or LinkedIn job data?
Glassdoor adds company ratings and employee reviews to each job. For volume across boards, combine it with the Indeed scrapers and LinkedIn Jobs; our job scraping guide compares them on one search.




