Glassdoor Jobs Scraper
Pricing
from $2.99 / 1,000 results
Glassdoor Jobs Scraper
๐ Glassdoor Jobs Scraper extracts public Glassdoor listings by keyword/locationโtitles, companies, locations, salaries, ratings, descriptions & URLsโat scale. ๐ Export CSV/JSON. โ๏ธ For recruiters, talent intel, market research & ATS enrichment. ๐ Fast, reliable.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
3
Monthly active users
7 days ago
Last modified
Categories
Share
Glassdoor Scraper โ Job Listings, Salary Ranges and Company Data
The Glassdoor Jobs Scraper extracts job listings from Glassdoor by keyword, location, or bulk search URL โ returning job title, company, job URL, posted date, numeric salary (min/median/max), Easy Apply status, seniority, and employer firmographics (headquarters, size, revenue, website) as one JSON row per listing. Recruiters building pipelines, sales teams targeting companies that are hiring, and labour-market researchers tracking wage trends use it instead of manual browsing. Configure one search and the dataset is ready to filter, export, or pipe downstream.
What is Glassdoor Jobs Scraper?
Glassdoor Jobs Scraper is an Apify Actor that queries Glassdoor's own job-search backend (the same BFF endpoint glassdoor.com uses) and returns structured job and company data as JSON, CSV, or Excel. No Glassdoor account, login, or API key is required โ it runs anonymously against Glassdoor's public search and public employer-overview pages.
- Two ways to find jobs: a keyword + location search across 25 Glassdoor country domains, or bulk Glassdoor job-search URLs for power users (
urls), bypassing keyword/country entirely. - Core identifying fields: job title, job ID, canonical job URL, and the employer's name, short name, and profile URL for every listing.
- Real numeric salary data: parsed minimum/median/maximum pay (10th/50th/90th percentile) and currency โ not just a text string.
- Employer enrichment: headquarters, employee-size band, revenue, website, description, and tagline, pulled from the same employer Overview page fetch.
- Server- and client-side filters: salary range, listing freshness, job type, seniority, industry, domain, employer size, remote-only, Easy Apply, search radius, and minimum employer rating.
- Export formats: JSON, CSV, and Excel via the Apify dataset, or pulled programmatically through the Apify API.
What data can I extract with Glassdoor Jobs Scraper?
Every run returns job fields, salary fields, and employer fields in a single flat-ish JSON row, plus the full raw payload for anyone who wants the untransformed source.
| Field | Example value | Use case |
|---|---|---|
job_title | "Senior Backend Engineer" | Role matching and search relevance |
job_id | "1009876543" | Stable per-listing identifier for de-duplication |
job_normalized_title | "Backend Engineer" | Grouping listings by role family |
job_url | "https://www.glassdoor.com/job-listing/..." | Direct link for applicants or CRM records |
job_location | {"unknown":"Austin, TX","city":"austin","country":"us","zip":"78701"} | Geographic filtering and mapping |
job_description | "We are looking for a backend engineer..." | Plain-text description for parsing/NLP |
job_description_html | "<p>We are looking...</p>" | Original formatted description for re-display |
job_posted_date | "2026-07-18" | Listing recency |
job_remote | false | Remote/on-site segmentation |
job_salary | {"currency":"USD","min":95000,"median":120000,"max":150000,...} | Compensation benchmarking |
job_easy_apply | true | Application-friction scoring |
job_age_days | 7 | Freshness / staleness checks |
job_job_types | ["fulltime"] | Contract-type segmentation |
job_levels | "Mid-Senior level" | Seniority segmentation |
job_benefits_tags | ["Health insurance","401(k)"] | Benefits comparison |
job_shifts_and_schedule_tags | ["Day shift"] | Schedule filtering |
job_sponsored | false | Sponsored vs organic listing flag |
job_industry | "Information Technology" | Sector segmentation |
job_language | "en" | Localization/routing |
company_uri_providers | [{"provider":"glassdoor","url":"..."}] | Canonical employer profile link |
company_name | "Acme Robotics" | Employer identification |
company_short_name | "Acme-Robotics" | Slug used in Glassdoor URLs |
company_logo | "https://media.glassdoor.com/..." | Branding/display |
company_headquarters_location | {"city":"seattle","unknown":"Seattle, WA"} | Employer geography |
company_sizes_str | "1001 to 5000 Employees" | Company-size segmentation |
company_website | "https://acme-robotics.com" | Domain enrichment / firmographics |
company_revenue | "$100 to $500 million (USD)" | Firmographic scoring |
company_url | "https://www.glassdoor.com/Overview/..." | Full employer profile |
company_description | "Acme Robotics builds warehouse automation..." | Company context |
company_tag_line | "Automation for everyone" | Employer branding |
company_industries | ["Information Technology"] | Sector filtering |
all | (full raw jobview + employer payload) | Access to every field Glassdoor served, unmodified |
scrapedAt | "2026-07-25T14:03:11.482Z" | Data-freshness / audit timestamp |
Salary, seniority and posted date
job_salary carries the parsed compensation object โ currency, currency_symbol, pay_period, an estimated flag (true when Glassdoor labels the figure an estimate rather than employer-disclosed pay), and the min/median/max figures taken directly from Glassdoor's 10th/50th/90th percentile pay object. Values are null, never fabricated, when Glassdoor doesn't disclose pay for that listing โ use includeNoSalaryJob to decide whether those rows are collected at all. job_levels carries the seniority text Glassdoor/Indeed attaches to the listing (e.g. "Mid-Senior level"), and job_posted_date plus job_age_days give both an absolute date and a rolling day-count for tracking how fresh a listing is. A recruiting team can sort a run by job_salary.median to find the highest-paying open roles for a title, or filter on job_age_days to flag postings that have been open unusually long.
Location, industry and job-type targeting
job_location breaks a listing's location into city, country, and zip alongside the raw unknown string Glassdoor displayed, so results can be grouped or mapped without re-parsing free text. job_industry and company_industries carry the employer's primary sector, matching the industryType/domainType inputs used to narrow a search. job_job_types and job_remote mark contract style and remote/on-site status, matching the jobType and remoteWorkType inputs. Together these fields let a downstream dataset be sliced by geography, sector, and work arrangement without any extra scraping.
Why not build this yourself?
Glassdoor has no public, self-serve developer API โ there is no documented endpoint a developer can request a key for and call directly. Reproducing this data yourself means reverse-engineering Glassdoor's internal job-search-next/bff/jobSearchResultsQuery endpoint, its cursor-based pagination, and a location-lookup AJAX call, then keeping all three working as Glassdoor changes them.
Why is scraping Glassdoor job search harder than it looks?
Glassdoor's search results and employer pages are not static HTML you can parse once and forget. The employer Overview page recently migrated from a single __NEXT_DATA__/apolloState JSON blob to React Server Components streaming (self.__next_f.push(...) chunks) โ a format change that silently breaks any scraper written against the old shape. Anonymous requests are also rate-limited and fingerprinted, so a plain HTTP client gets blocked quickly at any real volume. This Actor impersonates a real Chrome TLS fingerprint, parses both the legacy and current RSC page formats, and escalates through direct โ Apify datacenter โ Apify residential proxy tiers automatically when a request is blocked, going "sticky residential" for the rest of a run once that tier succeeds.
Building and maintaining this yourself means owning proxy rotation, TLS fingerprinting, cursor pagination, and page-format migrations indefinitely. Use the official Glassdoor site directly if you only need to look up a handful of jobs by hand; use this Actor when you need the same data at scale, on a repeatable schedule, as structured JSON.
How to use data extracted from Glassdoor?
Recruiters and talent sourcing
Recruiters run a search on keyword + location, narrow it with seniorityType and minSalary, and get back job_title, company_name, job_url, and job_salary for every open role that matches โ a ready-made market map of who is hiring for a given role and what they're paying, without opening dozens of browser tabs.
Sales teams targeting hiring companies
A company posting several roles in job_industry or domainType categories relevant to your product is a buying signal. Sales and lead-gen teams filter by industryType/domainType and companyName, then pull company_name, company_website, and company_headquarters_location for every employer actively hiring in that space to build a targeted outreach list.
Labour market and compensation researchers
Researchers run the same search across domainType/industryType categories and locations, then aggregate job_salary.median and job_age_days to study pay distribution and hiring velocity by sector or region โ using minSalary/maxSalary to bucket results into pay bands without needing Glassdoor's own (login-gated) salary-explorer tools.
AI agents and automated pipelines
Because the Actor is a standard Apify Actor, it can be wired into an agent pipeline as a callable job-search tool: an agent passes keyword, location, and filter parameters, and reads back structured job_title/job_salary/company_name fields instead of scraping HTML itself.
๐ผ Input sample
All 21 inputs are optional โ nothing is required in the schema. Provide either keyword (+ optionally country/location) or urls; if urls is set, it takes priority and keyword/country are ignored.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
keyword | No | string | Role, skills, or title to search for. Ignored if urls is set. | "Software Engineer" |
maxItems | No | integer | Max jobs to collect for the run (min 1, max 10000). Default 20. | 100 |
urls | No | array | Bulk Glassdoor job-search URLs to run directly, bypassing keyword/country. | ["https://www.glassdoor.com/Job/software-engineer-jobs-SRCH_KO0,16.htm"] |
requestDelayMs | No | integer | Delay between paginated requests, in ms (min 0, max 60000). Default 0. | 500 |
country | No | string (enum, 25 values) | Which regional Glassdoor site to search. Default "us". | "gb" |
location | No | string | City or region to search around. Default "" (worldwide). | "London" |
includeNoSalaryJob | No | boolean | Include listings that don't disclose pay. Default false. | false |
companyName | No | string | Substring filter on employer name. Default "". | "Amazon" |
minSalary | No | integer | Minimum salary floor, in the site's local currency (min 0). Default 0. | 80000 |
maxSalary | No | integer | Maximum salary ceiling, same currency. 0/empty = no cap. | 150000 |
fromAge | No | string (enum) | Listing freshness: ANY, 1, 3, 7, 14, 30 (days). Default "ANY". | "7" |
jobType | No | string (enum) | all, fulltime, parttime, contract, temporary, temp-to-hire, internship, entrylevel, apprenticeship. Default "all". | "fulltime" |
radius | No | string (enum, km) | 0, 6, 12, 18, 31, 62, 124. Default "18". | "31" |
industryType | No | string (enum) | ALL, FINANCIAL, MANAGEMENT_AND_CONSULTING, HUMAN_RESSOURCES_AND_RECRUITMENT, INFORMATION_TECHNOLOGIE. Default "ALL". | "INFORMATION_TECHNOLOGIE" |
domainType | No | string (enum) | ALL, ADMINISTATION, AFFAIRS, CONSEIL, FORMATION, ENGENERING, FINANCE, HUMAN_RESSOURCES_AND_RECRUITMENTS, INFORMATION_TECHNOLOGIE, LEGAL, MEDIA_AND_COMMUNICATION, PRODUCT_PROJECT_MANAGEMENT, SCIENCE_RESEARCH, SELL_AREA. Default "ALL". | "ENGENERING" |
employerSizes | No | string (enum) | ALL, TINY, SMALL, MEDIUM, LARGE, HUGE. Default "ALL". | "LARGE" |
applicationType | No | string (enum) | ALL, EASY_APPLY_INCLUDED, EASY_APPLY_ONLY. Default "ALL". | "EASY_APPLY_ONLY" |
remoteWorkType | No | string (enum) | ANY, REMOTE_ONLY. Default "ANY". | "REMOTE_ONLY" |
seniorityType | No | string (enum) | all, internship, entrylevel, midseniorlevel, director, executive. Default "all". | "midseniorlevel" |
minRating | No | string (enum) | Minimum employer rating: 0, 1, 2, 3, 4, 5. Default "0". | "4" |
proxyConfiguration | No | object | Apify Proxy configuration. Default {"useApifyProxy": false} (runs direct, then escalates automatically if blocked). | {"useApifyProxy": true} |
country supports: us, ar, au, be_nl, be_fr, br, ca_en, ca_fr, de, es, fr, hk, in, ie, it, mx, nl, nz, at, ch_de, ch_fr, sg, gb, jp, kr โ each maps to a real regional Glassdoor domain (e.g. gb โ glassdoor.co.uk).
Example input
{"keyword": "Data Analyst","country": "us","location": "Chicago","radius": "31","maxItems": 100,"minSalary": 70000,"fromAge": "7","jobType": "fulltime","seniorityType": "midseniorlevel","minRating": "3","includeNoSalaryJob": false}
Common pitfall
Enum casing is not consistent across parameters โ jobType and seniorityType use lowercase values ("fulltime", "midseniorlevel"), while industryType, domainType, employerSizes, applicationType, remoteWorkType, and fromAge use uppercase ("ALL", "REMOTE_ONLY", "7" is fine but "ANY" must stay capitalized). Passing "remote_only" or "Fulltime" will not match the schema's enum and the filter is silently ignored โ copy the exact casing shown above.
๐ฝ Output sample
Every run pushes one dataset item per job, in the same flat shape shown in the fields table above. Export as JSON, CSV, or Excel from the Apify dataset, or pull it with the Apify API.
{"job_title": "Senior Backend Engineer","job_id": "1009876543","job_normalized_title": "Backend Engineer","job_url": "https://www.glassdoor.com/job-listing/senior-backend-engineer-acme-robotics-JV_IC1147401_KO0,23_KE24,38.htm","job_location": {"unknown": "Austin, TX","city": "austin","country": "us","zip": "78701"},"job_description": "We are looking for a Senior Backend Engineer to join our platform team...","job_description_html": "<p>We are looking for a Senior Backend Engineer to join our platform team...</p>","job_posted_date": "2026-07-18","job_remote": false,"job_salary": {"currency": "USD","currency_symbol": "$","pay_period": "yearly","estimated": true,"min": 118000,"median": 142000,"max": 168000},"job_easy_apply": true,"job_age_days": 7,"job_job_types": ["fulltime"],"job_levels": "Mid-Senior level","job_benefits_tags": ["Health insurance", "401(k)", "Paid time off"],"job_shifts_and_schedule_tags": null,"job_sponsored": false,"job_industry": "Information Technology","job_language": "en","company_uri_providers": [{ "provider": "glassdoor", "url": "https://www.glassdoor.com/Overview/Working-at-Acme-Robotics-EI_IE1147401.htm" }],"company_name": "Acme Robotics","company_short_name": "Acme-Robotics","company_logo": "https://media.glassdoor.com/sql/1147401/acme-robotics-squarelogo.png","company_headquarters_location": {"city": "austin","unknown": "Austin, TX"},"company_sizes_str": "1001 to 5000 Employees","company_website": "https://acme-robotics.com","company_revenue": "$100 to $500 million (USD)","company_url": "https://www.glassdoor.com/Overview/Working-at-Acme-Robotics-EI_IE1147401.htm","company_description": "Acme Robotics builds warehouse automation systems for logistics operators.","company_tag_line": "Automation for everyone","company_industries": ["Information Technology"],"all": {"header": { "...": "full raw Glassdoor header block: employer id, pay object, job-type flags, ageInDays, etc." },"job": { "...": "full raw Glassdoor job block: listingId, discoverDate, description fragments, etc." },"overview": { "...": "full raw Glassdoor employer overview block, when resolved" }},"scrapedAt": "2026-07-25T14:03:11.482Z"}
Note: the normalized output does not surface an employer star-rating as its own field. minRating is applied internally as a filter against Glassdoor's raw rating data, but the numeric rating itself is only reachable inside the all raw payload (all.header.employer.ratings.overallRating) โ there is no dedicated company_rating column. If you need that number as a normalized field, pull it from all.
How do you filter and target specific job listings?
Two ways to define a search: a free-text keyword (best when you know the exact title or skill you're after) or the structured industryType/domainType category filters (best for scanning a whole sector without guessing every title variant that sector uses). Combine keyword with industryType/domainType to narrow a broad title search to one sector.
Scope precision comes from location + radius (in kilometres, from an exact-spot 0 up to a 124 km regional search) and country, which points the whole search at one of 25 regional Glassdoor domains. Quality thresholds are minRating (drop employers below a star-rating floor), minSalary/maxSalary (drop roles outside a pay band), and fromAge (drop anything older than 1/3/7/14/30 days). seniorityType and jobType narrow by career stage and contract style; applicationType isolates Easy Apply listings; remoteWorkType isolates remote-only roles.
Volume is controlled by maxItems (hard cap on rows returned) and requestDelayMs (pacing between the internal paginated requests, which fetch 30 listings per page under the hood).
{ "keyword": "Product Manager", "location": "Berlin", "radius": "12", "jobType": "fulltime" }
{ "domainType": "ENGENERING", "seniorityType": "director", "minSalary": 150000, "minRating": "4" }
{ "keyword": "Customer Support", "fromAge": "3", "remoteWorkType": "REMOTE_ONLY", "applicationType": "EASY_APPLY_ONLY", "maxItems": 200 }
โถ๏ธ Want to try other job/company scrapers?
| Scraper Name | What it extracts |
|---|---|
| ../LinkedIn-Company-Scraper-Search-By-Name-Keyword-Or-URL | Public LinkedIn company profiles resolved from a name or keyword โ industry, size, HQ, specialties, employees, posts. |
| ../linkedin-company-about-scraper-with-firmographic-enrichment | Full LinkedIn firmographics โ founded year, org type, follower count, numeric employee count/range, jobs-search deep link. |
| ../linkedin-company-employees-scraper-with-growth-tracker | Public employee rosters per company with a headcount snapshot for tracking hiring growth over time. |
| ../LinkedIn-B2B-Emails-Scraper | B2B and personal emails discovered from LinkedIn via search, with optional decision-maker seniority scoring. |
| ../Linkedin-Profile-Scraper | Individual LinkedIn profile data โ experience, education, posts โ from a list of profile URLs. |
How to extract Glassdoor data programmatically
The Actor runs as a standard Apify Actor: one authenticated POST call starts a run, and results come back as structured JSON from the dataset โ no browser or Glassdoor session needed on your side.
Python example
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("glassdoor-jobs-scraper-pay-per-events").call(run_input={"keyword": "Data Engineer","location": "New York","minSalary": 100000,"seniorityType": "midseniorlevel","maxItems": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["job_title"], item["company_name"], item["job_salary"]["median"])
Export to spreadsheets or CRM
Every Apify dataset can be exported directly to CSV or Excel from the Console, or fetched via the API in either format. Map job_title, company_name, job_url, job_salary.median, and job_posted_date to your CRM's role, account, source-link, expected-pay, and date-added columns respectively โ no extra transformation needed.
Is it legal to scrape Glassdoor job listings?
Yes. Job listings and employer profile data are business/product information that Glassdoor publishes for public discovery, not personal data about an individual โ this Actor does not collect reviewer names or other personal reviewer content. Scraping publicly accessible business data is generally permissible, though your use remains subject to Glassdoor's Terms of Service and, depending on your jurisdiction, database-rights law rather than GDPR/CCPA (which govern personal data, not job postings or company facts). Consult legal counsel for commercial applications involving bulk storage of personal data.
โ FAQ
What happens to a job listing that expires or gets removed from Glassdoor?
It simply won't appear in a new run's results once Glassdoor's search stops returning it. The Actor only reflects what Glassdoor's live search currently serves; use job_posted_date and job_age_days on each row to judge how fresh a listing was at scrape time, and re-run your search periodically to catch newly expired postings dropping out.
Can I get salary data along with the main job records?
Yes, by default. job_salary (currency, pay period, and min/median/max figures) ships on every row where Glassdoor discloses pay. Set includeNoSalaryJob to true if you also want listings that don't disclose pay, with job_salary fields returned as null.
How accurate is the salary and company data?
The Actor returns data exactly as Glassdoor's search and employer-overview pages serve it at request time. Salary figures marked estimated: true are Glassdoor's own algorithmic estimate rather than employer-disclosed pay โ treat those as directional, not exact, and re-verify time-sensitive figures before using them in a compensation decision.
How many job listings can I get per run?
Up to maxItems, which accepts 1 to 10,000 (default 20). Internally the Actor paginates through Glassdoor's search results 30 listings per page until it reaches your maxItems or runs out of matching listings.
How do I combine location, salary, and seniority filters in one search?
Set location + radius for geography, minSalary/maxSalary for pay band, and seniorityType for career stage in the same input object โ all filters apply together, not as alternatives. See the filtering guide above for worked examples.
Does this scraper work with Claude, ChatGPT, and AI agent frameworks? It's callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make an authenticated HTTP call โ including custom tool-use setups for Claude or ChatGPT โ can trigger a run and read back the dataset.
How does it compare to other Glassdoor scrapers?
This Actor's differentiator is parsing Glassdoor's numeric percentile pay object (min/median/max) and enriching every listing with employer firmographics from the same Overview-page fetch, rather than returning only title/company/location text. Evaluate any Glassdoor scraper on exactly those two axes โ parsed numeric salary vs. a raw pay string, and whether employer data is included at all โ since pricing and speed vary by provider and listing.
Can I use this without a Glassdoor account or API key?
Yes. No Glassdoor login, cookies, or developer account are required โ the Actor only needs an Apify account to run, and proxyConfiguration is optional (used for automatic block-recovery, not authentication).
Conclusion
Glassdoor Jobs Scraper turns keyword- or URL-based Glassdoor searches into structured, filterable JSON โ job details, numeric salary, and employer firmographics in one row, without a Glassdoor login or developer account. It's built for recruiters mapping the hiring market, sales teams spotting active hiring signals, and researchers tracking pay and demand trends. Configure your filters, start a run in the Apify Console, and export the results wherever your workflow needs them.