Glassdoor Jobs Scraper — Salaries, Skills & Companies avatar

Glassdoor Jobs Scraper — Salaries, Skills & Companies

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Glassdoor Jobs Scraper — Salaries, Skills & Companies

Glassdoor Jobs Scraper — Salaries, Skills & Companies

Scrape Glassdoor jobs by keyword and city, state or country: salary range (employer or Glassdoor estimate), company rating, skills, benefits, seniority, job type and posting date, plus optional company data. Splits big searches to reach thousands of jobs. Not affiliated with Glassdoor.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

Logiover

Logiover

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Share

Independent tool — not affiliated with, endorsed by or sponsored by Glassdoor, Inc. "Glassdoor" is a trademark of its owner and is used here only to describe the public website this Actor reads.

Export Glassdoor job listings in bulk — with the salary range (employer-published or Glassdoor's estimate, with 10th/50th/90th percentiles), company rating, skills, benefits, seniority, experience, education, job type, work setting and posting date for every job. Search by job title or keyword in any city, state or country Glassdoor covers — the United States, the United Kingdom, Canada, Germany, India and more — or paste your own Glassdoor search URL.

Turn on job details and each row also gets the full job description, exact posting and expiry dates, coordinates, and the employer card: headquarters, employee count, revenue band, company type, industry, sector, founding year, website, CEO and seven Glassdoor rating breakdowns (culture, work/life balance, compensation, management, career opportunities, CEO approval, recommend-to-a-friend).

No login, no cookies, no API key.

What does Glassdoor Jobs Scraper do?

Glassdoor's search only ever shows about 70 different jobs per search, however many it claims to have: page 1 has 30 jobs, page 2 adds about 23 new ones, page 3 about 16 — and pages 5, 8, 12 or 40 return nothing you have not already seen. A plain page-by-page scraper therefore stops at ~70 jobs for "registered nurse in the United States" even though Glassdoor reports 435,177.

This Actor reads the filter counts Glassdoor prints next to every search and splits a big search into slices — each city, job function, industry, seniority level, job type, company size, posting window, salary band and sort order — and reads every slice as its own search. Each slice is another ~70-job window, and duplicates are removed by Glassdoor's job ID, so the slices add up to thousands of unique jobs instead of 70.

  • 🔎 Keyword × location grid — every keyword is searched in every location you list.
  • 🌍 Any Glassdoor location — cities ("Austin, TX", "London"), states/regions ("Texas", "California"), countries ("United States", "Germany", "Canada") or "Remote". Names are resolved by Glassdoor itself.
  • 💰 Salary data on ~75–95% of jobs — min, median and max, currency, pay period, and whether the employer published it or Glassdoor estimated it.
  • 🧠 Structured requirements — skills, seniority, years of experience, education, benefits, job type and work setting, as Glassdoor extracted them from the posting.
  • 🏢 Company firmographics (optional job details) — HQ, size, revenue, industry, website, CEO, rating breakdowns.
  • 🧹 No duplicates — one row per Glassdoor job ID per run.
  • 🛡️ Honest runs — a run that cannot reach Glassdoor fails with the reason instead of finishing "successfully" with zero rows. Every run writes a SUMMARY record with the outcome and per-search counts.

Who uses Glassdoor job data?

  • Recruiters and staffing agencies — find every company hiring for a role in a metro, with salary and seniority, and prioritise accounts by hiring volume.
  • Salary benchmarking / compensation teams — collect employer-published pay ranges and Glassdoor estimates per title, city and seniority level.
  • B2B sales and lead generation — companies that are hiring are companies that are buying. Use company name, size, revenue, industry and website (job details) to build prospect lists by hiring signal.
  • Labor-market and economic research — track demand for skills (Python, SQL, nursing, CDL…), remote-work share, benefits and pay over time.
  • Competitive intelligence — monitor which roles and locations competitors are hiring for, week by week, with Glassdoor ratings alongside.
  • Job boards and aggregators — feed fresh listings with structured salary, skills and benefits.

How to use it

  1. Enter one or more job titles or keywords (e.g. data analyst, registered nurse).
  2. Enter locations — cities, states, countries or Remote. Leave empty for the whole United States.
  3. Set Max jobs (0 = no limit) and keep Split big searches on Standard (or Deep for maximum coverage).
  4. Optionally add filters (posted within, job type, seniority, remote only, Easy Apply only, minimum rating, minimum salary, company size) or switch on Fetch job details.
  5. Click Start, then export the dataset as JSON, CSV, Excel, XML or HTML, or pull it through the API.

Input examples

Several roles across several cities:

{
"keywords": [
"data analyst",
"data engineer"
],
"locations": [
"New York, NY",
"Austin, TX",
"Chicago, IL"
],
"maxItems": 2000
}

Country-wide, filtered, maximum coverage (full-time nursing jobs posted in the last 7 days paying $80k+):

{
"keywords": [
"registered nurse"
],
"locations": [
"United States"
],
"remoteOnly": false,
"postedWithinDays": "7",
"jobType": "fulltime",
"minSalary": 80000,
"searchDepth": "2",
"maxItems": 10000
}

Your own Glassdoor search URL, with job details and company data:

{
"startUrls": [
{
"url": "https://www.glassdoor.com/Job/london-accountant-jobs-SRCH_IL.0,6_IC2671300_KO7,17.htm"
}
],
"fetchDetails": true,
"maxItems": 200
}

Main input options

OptionWhat it does
keywordsJob titles / keywords. One search per keyword per location.
locationsCities, states, countries or Remote. Empty = United States.
startUrlsAny Glassdoor job-search URLs, used as-is (your filters are kept).
maxItemsMaximum unique jobs per run. 0 = no limit.
searchDepth0 off (~70 jobs per search), 1 standard split (recommended), 2 deep split.
maxPagesPerSearchPages per search or slice (30 jobs each). 3 is the sweet spot — Glassdoor repeats jobs after page 3.
postedWithinDays, jobType, seniority, remoteOnly, easyApplyOnly, minCompanyRating, minSalary, companySize, sortByGlassdoor's own filters, applied to every search.
fetchDetailsOpen every job page for the full description and company data (one extra page per job).
concurrencyPages fetched in parallel (default 32, max 50).
proxyConfigurationKeep the UNBLOCKER group — Glassdoor answers ordinary datacenter and residential proxies with a Cloudflare 403.

Output example

A real row from a test run (search results only):

{
"jobId": "1010196677363",
"title": "Data Scientist II",
"normalizedTitle": "data scientist",
"company": "Scribd Inc.",
"companyId": "354208",
"companyRating": 2.9,
"companyLogo": "https://media.glassdoor.com/sql/354208/scribd-inc-squareLogo-1772827903423.png",
"location": "Los Angeles, CA",
"city": "Los Angeles",
"state": "CA",
"country": "United States",
"locationType": "city",
"isRemote": false,
"workSetting": "Hybrid",
"jobTypes": "Full-time",
"seniority": "Mid-level",
"experience": "4 years",
"education": "Bachelor's degree in statistics | Master's degree | Bachelor's degree in computer science | Bachelor's degree in data science",
"skills": "Spark | SQL | Distributed systems | Natural language processing | APIs",
"benefits": "Paid parental leave | Disability insurance | Health insurance | Dental insurance | Paid time off | Vision insurance",
"otherHighlights": "AI models | Databricks | Big data projects | Statistics | PyTorch | NumPy | Generative models | Model deployment | Neural networks | …",
"salaryText": "$118K - $150K (Employer provided)",
"salaryMin": 118000,
"salaryMedian": 134000,
"salaryMax": 150000,
"salaryCurrency": "USD",
"salaryPeriod": "ANNUAL",
"salarySource": "employer",
"easyApply": false,
"sponsored": false,
"ageInDays": 92,
"postedDate": "2026-07-10",
"descriptionSnippet": "Bachelors or Masters in relevant quantitative discipline including but not limited to Statistics, Computer Science, Data Science, Artificial Intelligence or…",
"jobUrl": "https://www.glassdoor.com/job-listing/data-scientist-ii-scribd-JV_IC1146821_KO0,17_KE18,24.htm?jl=1010196677363",
"applyUrl": "https://www.glassdoor.com/partner/jobListing.htm?pos=116&ao=1136043&…&jobListingId=1010196677363",
"searchKeyword": "data scientist",
"searchLocation": "California, US",
"searchSlice": null,
"page": 1,
"position": 16,
"scrapedAt": "2026-10-10T18:34:00.114Z"
}

With Fetch job details on, each row additionally carries (real values from a test run):

{
"description": "Job Title: Senior Product Manager – Finance\n\nLocation: Seattle, Washington 98101 (Hybrid — 4 days onsite and 1 day remote per week)\n\nDuration: 04+month contract …",
"datePosted": "2026-10-05",
"validThrough": "2027-02-07",
"employmentType": "CONTRACTOR",
"latitude": 47.60639,
"longitude": -122.33083,
"companyHeadquarters": "Columbus, OH",
"companySize": "51 to 200 Employees",
"companyRevenue": "$25 to $100 million (USD)",
"companyType": "Company - Private",
"companyIndustry": "HR Consulting",
"companySector": "Human Resources & Staffing",
"companyFounded": 2009,
"companyWebsite": "https://www.tailoredmanagement.com",
"companyCeo": "Brad Beach",
"ratingCareerOpportunities": 3.5,
"ratingCompensationBenefits": 3.5,
"ratingCultureValues": 3.7,
"ratingSeniorManagement": 3.3,
"ratingWorkLifeBalance": 3.9,
"ceoApprovalPercent": 67,
"recommendToFriendPercent": 61
}

Data fields

Search-result fields (every row)

FieldTypeDescription
jobIdstringGlassdoor listing ID (the jl= value). Stable, use it to deduplicate across runs.
titlestringTitle exactly as the employer posted it.
normalizedTitlestringGlassdoor's standardised occupation for the posting, e.g. "data analyst" — handy for grouping.
companystringEmployer name.
companyIdstringGlassdoor employer ID.
companyRatingnumberOverall Glassdoor rating of the employer (1–5). Empty when the employer has no rating yet.
companyLogostringURL of the employer's square logo.
locationstringLocation as shown on the listing.
citystringCity part of the location.
statestringState, province or region part of the location.
countrystringCountry of the job, when it matches a country this run resolved.
locationTypestringcity, state or country — how precisely the employer located the job.
isRemotebooleantrue when the job is listed as remote; empty when the posting does not say.
workSettingstringRemote, Hybrid or On-site, when the posting states it.
jobTypesstringFull-time, Part-time, Contract, Temporary, Internship, Permanent… (pipe-separated).
senioritystringEntry level, Mid-level, Senior level… as extracted by Glassdoor.
experiencestringYears of experience the posting asks for, e.g. "5 years".
educationstringDegrees or qualifications mentioned, pipe-separated.
skillsstringSkills Glassdoor extracted from the posting, pipe-separated.
benefitsstringBenefits mentioned in the posting (health insurance, 401(k), PTO…), pipe-separated.
otherHighlightsstringOther requirements and responsibilities Glassdoor tagged in the posting, pipe-separated.
salaryTextstringSalary text as displayed, e.g. "$122K - $197K (Glassdoor est.)" or "(Employer provided)".
salaryMinnumberLower end of the pay range (10th percentile for Glassdoor estimates), in salaryCurrency per salaryPeriod.
salaryMediannumberMidpoint / median of the pay range.
salaryMaxnumberUpper end of the pay range (90th percentile for Glassdoor estimates).
salaryCurrencystringCurrency of the salary figures, e.g. USD, GBP, EUR.
salaryPeriodstringANNUAL, MONTHLY, HOURLY…
salarySourcestringemployer when the employer published the range, glassdoor_estimate when Glassdoor estimated it.
easyApplybooleanWhether the job accepts Glassdoor Easy Apply.
sponsoredbooleanWhether the listing is a paid/sponsored placement.
ageInDaysnumberDays since the job was posted, as Glassdoor reports it.
postedDatestringPosting date (YYYY-MM-DD) derived from the age at scrape time.
descriptionSnippetstringShort excerpt of the job description shown in search results.
jobUrlstringGlassdoor job page.
applyUrlstringGlassdoor's apply/redirect link for the job.
searchKeywordstringKeyword of the search that found the job.
searchLocationstringLocation of the search that found the job.
searchSlicestringFilter slice that surfaced the job when a big search was split (e.g. "city: Austin, TX"). Empty for the main search.
pagenumberResults page the job was found on.
positionnumberPosition within the search results.
scrapedAtstringWhen the row was collected (ISO 8601).

Job-detail fields (with "Fetch job details")

FieldTypeDescription
descriptionstringFull job description text.
datePostedstringExact posting date from the job page.
validThroughstringDate the listing is valid until.
employmentTypestringFULL_TIME, CONTRACTOR… from the job page.
addressLocalitystringCity from the job page's structured address.
addressRegionstringRegion from the structured address.
addressCountrystringCountry from the structured address.
latitudenumberJob location latitude.
longitudenumberJob location longitude.
experienceMonthsnumberMonths of experience required, where stated.
educationRequirementstringEducation credential category, where stated.
directApplybooleanWhether the job can be applied to directly.
companyHeadquartersstringEmployer headquarters.
companySizestringEmployee count band, e.g. "201 to 500 Employees".
companyRevenuestringAnnual revenue band.
companyTypestringCompany - Private, Company - Public, Non-profit…
companyIndustrystringEmployer's primary industry.
companySectorstringEmployer's sector.
companyFoundednumberYear the company was founded, where known.
companyWebsitestringEmployer website.
companyCeostringCEO name.
companyReviewsUrlstringEmployer's Glassdoor reviews page.
companyOverviewUrlstringEmployer's Glassdoor overview page.
ratingCareerOpportunitiesnumberSub-rating 1–5.
ratingCompensationBenefitsnumberSub-rating 1–5.
ratingCultureValuesnumberSub-rating 1–5.
ratingSeniorManagementnumberSub-rating 1–5.
ratingWorkLifeBalancenumberSub-rating 1–5.
ceoApprovalPercentnumberShare of reviewers approving of the CEO.
recommendToFriendPercentnumberShare of reviewers who would recommend the employer.

Sparse columns are sparse at the source, not lost: Glassdoor only tags seniority, experience, education, benefits and work setting when the posting states them (typically 30–80% of jobs), and only shows a salary when the employer published one or Glassdoor could estimate it (75–95% of jobs in our tests). Empty means "not stated", never "zero".

How many results can I get?

Measured on the Apify platform on 2026-10-10:

RunResult
1 keyword × 1 location, splitting off~70 unique jobs (page 1: 30 new, page 2: +23, page 3: +16, pages 5–40: +0)
"registered nurse" × United States, standard split~2,170 unique jobs before the deep level started
"registered nurse" × United States, deep split, max 3,0003,000 unique jobs, 0 duplicates (limit reached, still finding new jobs)
3 keywords × 3 locations (US, Texas, London), max 1,5001,500 unique jobs, 0 duplicates
4 keywords × 2 locations (US, California), max 1,2001,200 unique jobs, 0 duplicates
2 keywords × 2 locations (Chicago, Texas), max 1,0001,000 unique jobs, 0 duplicates in 44 seconds

Tens of thousands of jobs: combine many keywords with many locations (each keyword × location is its own search tree), use Deep splitting, set maxItems to 0 or a large number and give the run a longer timeout. Each slice adds up to ~70 new jobs; the run stops on its own when slices stop producing new jobs, when it reaches maxItems, or shortly before the run timeout (results are always saved).

Speed and cost

  • Speed (measured on the platform, default settings): 1,000 unique jobs in 44–51 seconds (2 keywords × Chicago/Texas — the same search took 214 s before the speed update), with the first rows in the dataset after ~3–9 seconds. The prefilled example (50 jobs) finishes in about 7–15 seconds.
  • Why it is fast: 32 pages are fetched in parallel; a page that has not answered after 10 s is requested once more on a fresh connection and the first answer wins (the slower copy is cancelled), and the first page of every search is raced on two connections from the start; common locations need no lookup and the rest are looked up in parallel; the next page fetched is always the one expected to add the most new jobs; and the run stops the moment maxItems is reached. Rows are saved page by page, so you can watch them arrive.
  • With job details: about 10–15 jobs per minute at default concurrency (one extra page per job) — raise concurrency for more.
  • Platform usage measured: about 50–120 page requests and ≈ $0.07–0.17 of platform usage per 1,000 jobs (fewer when you search several keywords/locations, more when you mine a single search very deeply); job details add about $1.70 per 1,000 jobs. Memory stays under ~250 MB.
  • Price: see the Pricing tab — you pay per result (job) delivered.

Tips

  • More jobs: add locations (big cities of a state, states of a country) and related keywords ("nurse", "RN", "registered nurse"). Different search trees overlap less than you would expect.
  • Fresh jobs only: postedWithinDays: "1" plus a daily schedule gives you a daily feed of new postings.
  • Salary research: filter on salarySource = employer for published pay ranges only.
  • Company lead lists: run with job details, then group by company — you get size, revenue, industry, website and HQ for every hiring company.
  • Remote work: use locations: ["Remote"] or remoteOnly: true with a country.

FAQ

Do I need a Glassdoor account, cookies or an API key? No. The Actor reads public search pages only. Glassdoor has no public jobs API; this Actor is the practical alternative.

Why does Glassdoor say 15,000 jobs but a normal search only gives ~70? Glassdoor's pagination repeats jobs after page 3. This Actor gets past that by splitting the search into filter slices (city, function, industry, seniority, date…) — see "How many results can I get?".

Which countries are supported? Any location Glassdoor's own location search knows: US cities and states, the UK, Canada, Germany, France, India, Australia and more. Type the name as you would on glassdoor.com.

Is the salary real or estimated? salarySource tells you: employer means the employer published the range; glassdoor_estimate means Glassdoor estimated it (shown as "Glassdoor est." on the site). salaryMin/salaryMax are the 10th/90th percentiles of the estimate.

What happens if Glassdoor blocks the run? Glassdoor is behind Cloudflare; the Actor uses Apify's UNBLOCKER proxy group, which got through on every test run. Refused attempts are retried on a fresh exit, half-rendered pages are fetched again. If nothing can be fetched, the run fails with the reason — it never reports success with zero rows.

Can I get the full job description? Yes — switch on Fetch job details. It also adds coordinates, exact dates and company data.

Can I schedule it? Yes. Use Apify Schedules (e.g. daily with postedWithinDays: "1") and deduplicate on jobId across runs.

How do I export to Excel, Google Sheets or my database? Export the dataset as CSV/Excel/JSON from the Storage tab, use the Google Sheets / Make / Zapier / webhook integrations, or call the Apify API (examples below).

How accurate is the data? Every value is taken from Glassdoor's own page data at scrape time; nothing is guessed. postedDate is derived from Glassdoor's "age in days" at scrape time.

Does it collect personal data? No personal data about individuals is collected — only job postings and company information that employers publish. (The CEO name comes from the public employer card.)

Is scraping Glassdoor legal? The Actor collects publicly available information without logging in or bypassing authentication. You are responsible for using the data in line with Glassdoor's terms, copyright and data-protection law (e.g. GDPR/CCPA) in your jurisdiction. If in doubt, consult a lawyer.

Why did my run stop before maxItems? Either every slice was exhausted (check SUMMARY.searches for Glassdoor's reported totals per slice), or the run approached its timeout — raise the timeout or add keywords/locations.

Use it via API

JavaScript (apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('logiover/glassdoor-jobs-scraper').call({
keywords: ['data analyst'],
locations: ['New York, NY', 'Austin, TX'],
maxItems: 1000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);

Python (apify-client):

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("logiover/glassdoor-jobs-scraper").call(run_input={
"keywords": ["registered nurse"],
"locations": ["Texas"],
"postedWithinDays": "7",
"maxItems": 2000,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], job["company"], job["salaryMin"], job["salaryMax"])

REST (run synchronously and get items):

curl -X POST "https://api.apify.com/v2/acts/logiover~glassdoor-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":["accountant"],"locations":["London"],"maxItems":200}'

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Glassdoor, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. The Actor only accesses publicly available pages, does not log in and does not bypass authentication. Users are responsible for complying with applicable laws and the website's terms of use.

Changelog

2026-10-10 — faster

  • 1,000 jobs in 44 s instead of 214 s (same search), first rows after ~6 s instead of ~18 s, and less than half the page requests.
  • Slow pages are re-requested on a fresh connection after 10 s (first answer wins), the first page of each search is raced on two connections; default concurrency 32 (max 50).
  • Common locations resolve instantly, the rest in parallel; the most productive pages are fetched first; the run stops as soon as the limit is reached; live progress in the status message.

2026-10-10 — first release

  • Keyword × location searches for any city, state or country Glassdoor knows, plus raw search URLs.
  • Automatic splitting of big searches into filter slices (standard and deep), deduplicated by job ID.
  • Salary (min/median/max, currency, period, source), skills, benefits, seniority, experience, education, job type, work setting.
  • Optional job details: full description, dates, coordinates, company firmographics and rating breakdowns.
  • Fails loudly when Glassdoor cannot be reached; SUMMARY record with outcome and per-search counts.