Glassdoor Jobs Scraper: Salary, ZIP & Company
Pricing
$4.99 / 1,000 saved job results
Glassdoor Jobs Scraper: Salary, ZIP & Company
Scrape public Glassdoor jobs by profession, city, ZIP code, company, salary, remote status, job type, and posting date. Export formatted Excel and Google Sheets-ready data.
Pricing
$4.99 / 1,000 saved job results
Rating
0.0
(0)
Developer
[R] Kuantum
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Collect clean, structured public Glassdoor job listings by profession, job title, keyword, city, area, ZIP/postal code, company, salary, workplace type, and posting age. Export the results as a professionally formatted Excel workbook, a Google Sheets-ready table, CSV, JSON, XML, or through the Apify API.
This Actor is designed for recruiters, sourcing teams, labor-market researchers, job boards, competitive-intelligence teams, sales operations, and job seekers who need repeatable job-market data without manual copying.
What can this Glassdoor scraper do?
- Search multiple professions or job titles in one run.
- Combine every keyword with multiple cities, regions, or ZIP/postal codes.
- Resolve ZIP codes through Glassdoor's public location selector and apply a mileage radius.
- Include selected companies or exclude staffing firms and unwanted employers.
- Filter by minimum and maximum salary with hourly/yearly normalization.
- Search for remote jobs, Easy Apply listings, employment types, and recent postings.
- Match keywords in the job title or description.
- Accept canonical Glassdoor search URLs and individual job URLs.
- Deduplicate jobs across overlapping searches.
- Return complete, stable records with unavailable fields represented as
null. - Save blocks and extraction errors separately from successful job results.
Quick start
- Enter one or more values in Job titles or keywords.
- Add cities, regions, or ZIP codes and choose a search radius.
- Add any company, salary, remote, date, or employment filters.
- Set the maximum number of jobs and click Start.
- Download the dataset or connect it to your workflow through the API, webhook, Make, Zapier, Google Sheets, or another Apify integration.
For the most reliable run, keep Open every job for full details disabled. Summary mode normally returns the job title, company, rating, location, salary, Easy Apply status when visible, and job URL. Enable full details only when you need descriptions, skills, benefits, or qualifications.
Example input with multiple filters
{"keywords": ["registered nurse", "nurse practitioner"],"locations": ["Miami, FL"],"zipCodes": ["33101"],"radiusMiles": 25,"companyNames": ["Baptist Health", "HCA"],"excludeCompanies": ["Staffing Agency"],"descriptionKeywords": ["pediatrics", "ICU", "emergency"],"postedWithinDays": 14,"remoteOnly": false,"easyApplyOnly": false,"employmentTypes": ["FULL_TIME"],"minSalary": 80000,"maxSalary": 180000,"salaryPeriod": "YEAR","includeSalaryUnknown": false,"includeJobDetails": false,"maxItems": 100,"maxConcurrency": 2,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
This example searches two nursing professions around Miami and ZIP 33101, keeps jobs from either selected healthcare company, excludes matching staffing companies, applies salary and posting-age limits, and retains title/description matches for any of the requested clinical terms.
How multiple filters are combined
- Different filter categories are combined with AND.
- Multiple
keywordscreate separate Glassdoor searches. - Keywords are combined with every value in
locationsandzipCodes, up to 50 generated search combinations. - Multiple
companyNamesuse OR: a job can match any included company. - Multiple
descriptionKeywordsuse OR: the title or description can contain any requested term. - Multiple
employmentTypesuse OR. - Any
excludeCompaniesmatch removes the job.
Description and employment-type data are usually available only in full-detail mode. Glassdoor can block direct job-detail pages, so those filters are best effort.
Output example
Each successful dataset item represents one job:
{"recordType": "job","jobId": "JV_IC1132200_KO0,60_KE61,76","title": "Automation & Internal Tools Builder","companyName": "Example Company","companyRating": 4.2,"locationText": "Brooklyn, NY","city": null,"state": null,"postalCode": null,"country": null,"workplaceType": "unknown","employmentTypes": [],"employmentTypesText": null,"salaryMin": 20,"salaryMax": 35,"salaryCurrency": "USD","salaryPeriod": "HOUR","salaryAnnualMin": 41600,"salaryAnnualMax": 72800,"salaryHourlyMin": 20,"salaryHourlyMax": 35,"salaryText": "$20.00 - $35.00 Per Hour (Employer provided)","salarySource": "employer","datePosted": null,"descriptionText": null,"skills": [],"skillsText": null,"easyApply": null,"jobUrl": "https://www.glassdoor.com/job-listing/...","searchKeyword": "software engineer","searchLocation": "10001","source": "generated-search","scrapedAt": "2026-09-16T06:13:21.715Z","error": null}
Available fields
| Group | Fields |
|---|---|
| Job | jobId, title, jobUrl, applyUrl, employmentTypes, employmentTypesText, easyApply |
| Company | companyName, companyRating, companyWebsiteUrl, companyLogoUrl, nested company |
| Location | locationText, streetAddress, city, state, postalCode, country, nested location |
| Salary | salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryAnnualMin, salaryAnnualMax, salaryHourlyMin, salaryHourlyMax, salaryText, salarySource, nested salary |
| Details | descriptionText, descriptionHtml, responsibilities, qualifications, skills, skillsText, benefits, educationRequirements, experienceRequirements, industry |
| Dates | datePosted, validThrough, scrapedAt |
| Provenance | searchUrl, searchKeyword, searchLocation, source |
Fields that are not published or accessible are returned as null or an empty array. They are not silently omitted.
Excel and Google Sheets output
Every successful run creates three spreadsheet-friendly outputs:
- Formatted Excel workbook — open the run's Key-value store and download
GLASSDOOR-JOBS.xlsx, or useOUTPUT.spreadsheet.formattedExcelUrl. The workbook includes:- a styled Jobs sheet with frozen headers, filters, alternating rows, readable column widths, and number/date formatting;
- clickable links for the Glassdoor job, application, company website, company logo, and originating search;
- separate listed, annualized, and hourly salary columns;
- a Run Summary sheet containing the filters and run statistics; and
- a Data Notes sheet explaining missing values, salary normalization, and link behavior.
- Native XLSX or CSV export — use the links in
OUTPUT.spreadsheet.excelDownloadUrlandOUTPUT.spreadsheet.csvDownloadUrlfor a lightweight ordered export. - Google Sheets-ready dataset — select the Excel & Google Sheets dataset view, then use Apify's Google Sheets integration to send each result into a spreadsheet. The dedicated view contains only flat columns, so arrays and nested objects do not create malformed cells.
All links are preserved as complete URLs. The text versions of multi-value fields (employmentTypesText and skillsText) keep one clean value per spreadsheet cell while the original arrays remain available in JSON.
Pricing
This Actor uses pay per event pricing:
job-result: $0.00499 per successfully saved job — equivalent to $4.99 per 1,000 results.- Failed requests, filtered-out jobs, duplicates, empty searches, and records written to the diagnostic error dataset do not trigger the
job-resultcharge. - A run stops safely when its Apify charge limit is reached.
Apify platform usage, including residential proxy traffic and compute, is billed separately to the run owner. Start with a small maxItems value to confirm the search before scaling up.
Salary filtering
Salary filters compare overlapping pay ranges after normalization:
YEAR: hourly pay × 2,080; daily pay × 260; weekly pay × 52; monthly pay × 12.HOUR: annual pay ÷ 2,080.
When Glassdoor does not publish compensation, includeSalaryUnknown controls whether that job is retained. Salary values can be employer-provided estimates, Glassdoor estimates, or structured page data; inspect salarySource and salaryText when source distinctions matter.
ZIP code and location behavior
Glassdoor commonly maps a ZIP/postal code to its canonical city or locality. The Actor uses that resolved location plus radiusMiles. For example, live validation resolved ZIP 10001 to New York, NY and returned jobs from the surrounding search area.
The Actor supports city, state, metro-area, county, country, and remote searches when Glassdoor recognizes the supplied location.
Reliability and responsible crawling
Glassdoor is a technically difficult target. This Actor uses Playwright, residential proxy support, rotating persistent sessions, retries, conservative concurrency, randomized delays, media blocking, canonical URL deduplication, and transparent block detection.
It also fetches and enforces Glassdoor's current robots.txt. It does not call disallowed internal APIs, solve CAPTCHAs, or crawl disallowed paginated search URLs. Consequently, it does not claim to return every job available on Glassdoor. Coverage depends on the public pages Glassdoor exposes at run time.
For best results:
- Keep residential proxy enabled.
- Use concurrency 1–3.
- Search specific professions and locations.
- Start with
includeJobDetails: false. - Use canonical
searchUrlswhen you already have a working Glassdoor results URL.
Error handling
Successful jobs are stored in the default dataset. Access blocks, robots exclusions, navigation failures, and parsing errors go to a separate named dataset: glassdoor-job-errors.
This separation keeps exported job datasets clean and ensures failed pages are not mistaken for paid results.
API access
The Actor can be run from Apify Console, the API, JavaScript, Python, CLI, schedules, webhooks, or integrations.
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('kuantum/glassdoor-jobs-scraper').call({keywords: ['data analyst'],locations: ['Austin, TX'],minSalary: 80000,salaryPeriod: 'YEAR',maxItems: 50});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_APIFY_TOKEN')run = client.actor('kuantum/glassdoor-jobs-scraper').call(run_input={'keywords': ['data analyst'],'locations': ['Austin, TX'],'maxItems': 50,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Use cases
- Build recruiting and candidate-sourcing market maps.
- Monitor hiring activity by company, profession, or location.
- Compare salary ranges across cities and employers.
- Populate a niche job board or internal opportunity database.
- Track remote-job availability and Easy Apply listings.
- Research regional labor demand and skill requirements.
- Feed job intelligence into dashboards, CRMs, spreadsheets, or data warehouses.
Legal and ethical use
Only collect and use data you are legally permitted to process. Follow Glassdoor's terms, applicable privacy and employment laws, and reasonable request limits. Do not use the output for unlawful discrimination, spam, harassment, or automated employment decisions about individuals.
Glassdoor is a trademark of its owner. This independent Actor is not affiliated with or endorsed by Glassdoor.
FAQ
Can it search by profession or job title?
Yes. Add one or more professions, titles, or skills to keywords.
Can it search by company name?
Yes. Use companyNames to include matching employers and excludeCompanies to remove unwanted employers. If no search keyword is supplied, included company names are also used as search terms.
Can it filter job descriptions?
Yes. descriptionKeywords matches any requested term in the title or extracted description. Enable includeJobDetails when description-body matching is required.
Why are some detail fields null?
Search-summary mode is the reliable default. Descriptions and other enrichment fields require direct job-page access, which Glassdoor may block even when the search page is available.
Can it scrape every page of results?
No. The Actor intentionally avoids Glassdoor routes disallowed by the current robots policy. It prioritizes compliant, transparent extraction over an unrealistic coverage claim.
Does it support CSV and Excel?
Yes. Each run creates a styled GLASSDOOR-JOBS.xlsx workbook and direct native XLSX/CSV download links in the run output. The Dataset tab also supports JSON, JSONL, CSV, Excel, XML, and other Apify formats.
Can I send the results to Google Sheets?
Yes. Use the Excel & Google Sheets dataset view with Apify's Google Sheets integration. It provides ordered, flat columns for job, employer, location, salary, description, provenance, and every available link.
Am I charged for failed jobs?
The job-result event is triggered only for a successful record written to the default job dataset. Error records are written separately and do not trigger that event. Platform resource usage may still apply.
Support
If Glassdoor changes its layout or a filter stops behaving as expected, open an issue from the Actor page and include the run ID, input, and a short description. Do not include passwords, API tokens, or private candidate data.