Glassdoor Scraper - Jobs, Reviews and Salaries
Pricing
from $1.50 / 1,000 results
Glassdoor Scraper - Jobs, Reviews and Salaries
Extract Glassdoor jobs, company profiles, reviews, salaries, interviews and benefits from the US, UK, Germany and India. Pay per delivered row, plus a start fee.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Glassdoor Scraper
Extract Glassdoor jobs, employer profiles, reviews, salaries, interviews and benefits across the United States, United Kingdom, Germany and India as exportable rows.
- Job titles, employers, locations, pay and available descriptions.
- Employer ratings, review samples, salary statistics and interview feedback.
- Company profiles, office locations and benefit categories when available.
- JSON, CSV and Excel exports, with API and AI-agent access.
- Pay for delivered rows: $2.00 per 1,000 rows on the Free plan, plus a start fee.
What does Glassdoor Scraper do?
Glassdoor Scraper collects public, guest-visible information from Glassdoor for hiring research, compensation comparisons and employer analysis. Choose one search or employer per run, or supply several job links or IDs.
- Jobs: search with
keyword, or collect specific jobs withdetailUrlsorjobListingIds. - Company: use
employerIdorcompanyUrlfor an overview; a company location-page URL can return office rows. - Employer channels: select
reviews,salaries,interviews,benefitsorcompany_jobsfor that content. - Markets:
ususesglassdoor.com,ukusesglassdoor.co.uk,deusesglassdoor.de, andinusesglassdoor.co.in. - Job enrichment:
enrichDetailsis on by default. Available details are added to the job row, not charged as a second row.
Each review, salary entry, interview, benefit category or aggregate is a separate billed row. Aggregate rows share the limit with individual rows; a reported count is not that many delivered rows.
What data can you extract from Glassdoor?
dataType identifies the row type below. Rows also carry name, type, status, country, authority, url, scrapedAt and contentDepth. Guest-visible output uses contentDepth: "guest_preview". Examples illustrate the format, not a promise that a field is present.
Job search rows: job_serp_item
| Field | Description | Example |
|---|---|---|
jobListingId | Glassdoor job identifier | 1010204489922 |
title | Job title | Software Engineer |
employer | Employer name, ID and available rating | {"name":"Example Company"} |
location | Job location | {"name":"Austin, TX"} |
pay | Available pay display, currency, range and period | {"min":120000,"currency":"USD"} |
Job detail rows: job_detail
Job details also use the job fields above.
| Field | Description | Example |
|---|---|---|
description | Available job description | Build software products. |
employmentType | Published employment types | ["FULL_TIME"] |
Employer job rows: company_job
| Field | Description | Example |
|---|---|---|
jobListingId | Employer's job identifier | 1010204489922 |
employerId | Employer identifier | 9079 |
Company overview rows: company_overview
| Field | Description | Example |
|---|---|---|
overallRating | Published employer rating | 4.2 |
reviewCount | Published review count | 1200 |
industry | Employer industry | Software |
website | Employer website | https://example.com |
headquarters | Headquarters location | Austin, TX |
Office rows: office_location
| Field | Description | Example |
|---|---|---|
address | Available office address fields | {"locality":"Austin"} |
geo | Coordinates when shown | {"lat":30.27,"lng":-97.74} |
Review rows: review
| Field | Description | Example |
|---|---|---|
reviewId | Review identifier | 12345678 |
summary | Available review text | Supportive team. |
overallRating | Review's rating | 4 |
Review aggregate rows: reviews_aggregate
These can be returned when individual reviews are unavailable but published statistics exist.
| Field | Description | Example |
|---|---|---|
aggregateRating | Employer's aggregate rating | 4.2 |
reviewCount | Published review count | 1200 |
Salary rows: salary_item
| Field | Description | Example |
|---|---|---|
jobTitle | Role associated with the salary | Software Engineer |
pay | Available salary range and period | {"display":"$120K - $180K","period":"YEAR"} |
Salary aggregate rows: salaries_aggregate
| Field | Description | Example |
|---|---|---|
salaryCount | Published salary count | 500 |
basePayStatistics | Available base-pay statistics | null |
totalPayStatistics | Available total-pay statistics | null |
Interview rows: interview_item
| Field | Description | Example |
|---|---|---|
interviewTitle | Interview title | Software Engineer Interview |
outcome | Reported offer outcome | Accepted offer |
snippet | Available interview account | Two technical interviews. |
Interview aggregate rows: interviews_aggregate
| Field | Description | Example |
|---|---|---|
interviewDifficultyScore | Published difficulty score | 3.1 |
interviewExperienceCounts | Available experience counts | null |
Benefit rows: benefit_category
| Field | Description | Example |
|---|---|---|
categoryName | Benefit category | Health Insurance |
categoryRating | Category rating when available | 4.5 |
Benefit aggregate rows: benefits_aggregate
| Field | Description | Example |
|---|---|---|
categoryCount | Number of observed categories | 6 |
How to scrape Glassdoor
- Open Glassdoor Scraper in Apify Console.
- Fill a target such as
keyword, or an employer ID and the desiredchannel. - Set
maxResultsto3for a small first run. - Click Start and wait for completion.
- Download the dataset or read it through the API.
An empty input runs the form's software engineer example in the US, limited to 3 rows. Normal start and row prices still apply. With channel: "auto", a keyword or job link selects jobs; an employer ID or company URL selects company overview. Select other employer channels explicitly.
Jobs
Enter keyword and optionally location. Direct job links or IDs take precedence over keyword searches and employer channels. Search rows remain available when enrichment cannot obtain a description.
Company
Supply employerId or companyUrl. When using an ID, add companyName with its original casing. A Glassdoor company URL containing /Location/ requests office locations instead of an overview.
Reviews
Choose reviews and an employer. Returns available review samples or, if no individual reviews are available, a source-backed aggregate.
Salaries
Choose salaries and an employer. Returns salary entries and available aggregates. jobTitle requests a role filter where supported; employer-wide statistics may still be returned.
Interviews
Choose interviews and an employer. Returns interview accounts and available aggregate statistics, not a complete interview archive.
Benefits
Choose benefits and an employer. Benefit categories are separate rows; an aggregate count may follow if space remains.
Company jobs
Choose company_jobs and an employer to collect visible open-role samples. A company page alone is not evidence of an available job.
What to fill in
| Field | What to enter | Default |
|---|---|---|
channel | auto, jobs, company, reviews, salaries, interviews, benefits, company_jobs | auto |
keyword | One job search phrase | Empty; example prefill software engineer |
employerId | Glassdoor employer ID | Empty |
companyUrl | Supported Glassdoor company page URL | Empty |
companyName | Employer name with original casing | Empty |
detailUrls | Array of job links | [] |
jobListingIds | Array of numeric job IDs as strings | [] |
maxResults | Rows per input, from 1 to 200 | 70; form prefill 3 |
market | us, uk, de, in | us |
location | City or region; empty means nationwide | Empty |
jobTitle | Requested salary role filter | Empty |
maxPages | Page limit, from 1 to 10 | 1 |
enrichDetails | Add available descriptions and job details | true |
easyApply | Request Easy Apply jobs | false |
remote | Request remote jobs | false |
seniority | senior, junior, lead, staff, principal | Empty |
sortBy | Glassdoor sort value, such as DD for date | Empty |
domain | Supported Glassdoor host; overrides market | Empty |
includeRaw | Include additional source fragments in raw | false |
failover | Retry eligible temporary failures | true |
Job search
{"keyword":"software engineer","location":"Austin, TX","maxResults":3}
Specific job — replace the illustrative ID with a current job's ID.
{"jobListingIds":["1010204489922"],"maxResults":1}
Company overview
{"channel":"company","employerId":"9079","companyName":"Google","maxResults":1}
Reviews
{"channel":"reviews","employerId":"9079","companyName":"Google","maxResults":3}
Salaries
{"channel":"salaries","employerId":"9079","companyName":"Google","maxResults":3}
Interviews
{"channel":"interviews","employerId":"9079","companyName":"Google","maxResults":3}
Benefits
{"channel":"benefits","employerId":"9079","companyName":"Google","maxResults":3}
Company jobs
{"channel":"company_jobs","employerId":"9079","companyName":"Google","maxResults":3}
maxItems and limit are aliases for maxResults, the per-input row limit. Unknown fields do not fail the run: close misspellings are corrected, and other unknown fields are ignored with a note. Invalid optional filters may also be ignored.
Unusable targets stop before row charges with INVALID_INPUT: <field> — <how to fix>. The start fee can still apply. Every run writes its input interpretation to INPUT_REPORT in the default key-value store, including inferred modes, corrections and ignored fields.
Output example
Illustrative job search row; availability and values vary by source page.
{"dataType": "job_serp_item","jobListingId": "1010204489922","title": "Software Engineer","name": "Software Engineer","type": "job","status": "open","country": "United States","authority": "glassdoor.com","channel": "jobs","url": "https://www.glassdoor.com/job-listing/software-engineer.htm?jl=1010204489922","employer": {"name": "Example Company", "rating": 4.2},"location": {"name": "Austin, TX", "country": "United States"},"pay": {"display": "$120K - $180K", "currency": "USD", "min": 120000, "max": 180000, "period": "YEAR", "source": "estimate"},"contentDepth": "guest_preview","scrapedAt": "2026-10-24T10:00:00+00:00"}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. RUN_SUMMARY describes the outcome, INPUT_ECHO records interpreted settings, and ERROR_SUMMARY provides failure details when available.
Why use this Glassdoor scraper?
- Pay per delivered row: no row charge for an attempted page that produces no row.
- Keep available results: partial results returned before the deadline are delivered; rows already written remain in the dataset after a stop. An immediate manual abort cannot guarantee delivery of unfinished work.
- Inspect problems: input errors identify the field; run summaries record warnings and partial results.
- Keep missing values visible: unavailable values stay empty rather than becoming invented contacts or salary figures.
- Batch known jobs: supply multiple job URLs or IDs in one run.
- No proxy setup: you do not need to set up proxies.
How much does it cost to scrape Glassdoor?
The Actor uses pay-per-event pricing. Platform usage is included in these prices.
| Apify plan | Start event | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.002 | $2.00 |
| Starter | $0.005 | $0.002 | $2.00 |
| Scale | $0.005 | $0.002 | $2.00 |
| Business | $0.005 | $0.0015 | $1.50 |
Start events are charged per GB of allocated memory, with a minimum of one event. The default 512 MB run therefore costs $0.005 to start. Platinum and Diamond use the Business row price.
maxResultsapplies to each search, employer target, detail URL or job ID. Its default is 70 and its supported range is 1–200. Requesting more does not guarantee more available rows.- Free-plan runs are capped at 200 rows across the run, with 10 runs of this Actor in total. These are developer-set limits.
- The whole run stops at your Maximum cost per run (
maxTotalChargeUsdin the API). Aggregate rows count toward the same limits and prices.
Example: 3 delivered rows on the Free plan at default memory cost 3 × $0.002 + $0.005 = $0.011.
What happens when the run timeout is too short
When collection needs more time, the run can pause automatically rather than fail. It shows ABORTED with the status message "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." The estimate varies.
When results are ready, the same run resumes, reports "Resumed: delivering N rows.", writes to the same dataset and finishes as SUCCEEDED if delivery succeeds. Already delivered rows are skipped, so they are not delivered or charged twice. No action is needed for this automatic pause.
- Automatic pauses are limited to 3 per run. Keep the default timeout of 3600 seconds to reduce interruptions.
- Synchronous API endpoints
run-syncandrun-sync-get-dataset-itemswait at most 300 seconds and may return an empty dataset during a pause. Start larger runs asynchronously and read the dataset after SUCCEEDED, or use a succeeded-event webhook.
Use with AI agents and the API
Apify MCP server
Add this remote server to Claude, ChatGPT, Cursor, VS Code or another compatible MCP client:
https://mcp.apify.com?tools=lentic_clockss/glassdoor-scraper
Sign in through Apify OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; read rows with get-dataset-items. For clients without remote support, run npx @apify/actors-mcp-server --tools lentic_clockss/glassdoor-scraper with APIFY_TOKEN set.
Example prompt: "Find 3 software engineer jobs in Austin using Glassdoor Scraper and show their titles, employers and available pay."
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/glassdoor-scraper").call(run_input={"keyword": "software engineer", "maxResults": 3})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/glassdoor-scraper').call({keyword: 'software engineer', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For asynchronous HTTP access, send POST https://api.apify.com/v2/acts/lentic_clockss~glassdoor-scraper/runs with JSON input and an Authorization: Bearer <YOUR_APIFY_TOKEN> header. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.
Integrations
Connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable or a webhook through the Integrations tab. Use Apify Schedules for recurring runs.
FAQ
Is it legal to scrape Glassdoor?
Public accessibility is not permission for every use. You are responsible for checking Glassdoor's terms and applicable data-protection law. Processing personal data requires a lawful basis.
Why did my run end as ABORTED?
An automatic pause can temporarily show ABORTED. Check for the resume status message described above. A manual abort is different and does not imply an automatic restart.
How many results can I get?
Set maxResults from 1–200 per input. Actual results depend on available content, page limits and your cost cap. Free-plan runs also have a 200-row total cap and a 10-run allowance.
Why are some fields empty?
Guest pages do not show every description, salary, rating or contact field. Empty phone or email lists do not prove the employer has no contact details.
How do I search jobs by location?
Set keyword, location and market. Add remote or easyApply if needed. Leaving location empty searches nationwide within the chosen market.
Why preserve companyName casing?
Company names are used in Glassdoor page URLs. Keep the source spelling and casing, or supply a current company URL instead.
Do I need a Glassdoor account or API key?
No Glassdoor login or API key is required. The Actor returns guest-visible information, not signed-in-only content. Calling Apify's API requires your Apify token.
Does maxPages guarantee complete coverage?
No. Jobs can repeat across pages, so collection stops on repeated or heavily overlapping results. Employer channels return available samples and aggregates, not guaranteed complete histories.
Limitations
- Supported hosts cover only the US, UK, Germany and India; availability varies by market and channel.
- One keyword or employer per run; arrays are supported for job URLs and IDs, not multiple search phrases.
- Unavailable pages can produce partial results or a failure. A larger limit cannot create missing content.
- Salary statistics may describe the employer rather than the requested job title.
- No signed-in content, job applications or review submissions. Descriptions, contact fields and exact addresses are not guaranteed.
Related scrapers
More job board and freelance marketplace scrapers from the same publisher:
- LinkedIn Scraper
- Indeed Scraper
- Upwork Scraper
- Freelancer.com Scraper
- SEEK Scraper
- Bayt Scraper
- Fiverr Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report problems or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.