Glassdoor Jobs Scraper With Salary Analytics avatar

Glassdoor Jobs Scraper With Salary Analytics

Pricing

from $5.99 / 1,000 results

Go to Apify Store
Glassdoor Jobs Scraper With Salary Analytics

Glassdoor Jobs Scraper With Salary Analytics

๐Ÿ” Glassdoor Jobs Scraper extracts structured job listings, salaries, company ratings & reviews from Glassdoor at scale. โš™๏ธ Filter by role, location, or remote; schedule runs; export CSV/JSON. ๐Ÿš€ Ideal for recruitment, market research & competitive intelligence.

Pricing

from $5.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

7 days ago

Last modified

Share

Glassdoor Jobs Scraper โ€” Job Listings and Salary Percentile Analytics

Glassdoor Jobs Scraper With Salary Analytics pulls job listings from Glassdoor by keyword, region, or bulk search URL and returns structured JSON for every posting: job details, employer profile, and salary data โ€” including the real numeric pay figures Glassdoor discloses per listing, normalized into an annualized salary and ranked as a percentile against the rest of the run. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a compensation-monitoring pipeline. No Glassdoor login is required to run it.

What is Glassdoor Jobs Scraper With Salary Analytics?

Glassdoor Jobs Scraper With Salary Analytics queries Glassdoor's job-search results by keyword and region (or a list of Glassdoor search URLs) and returns one structured JSON row per job listing. What sets it apart from a plain listings scraper is its salary analytics: it unpacks the real 10th/50th/90th percentile pay figures Glassdoor already attaches to each posting, normalizes them onto a common annual basis regardless of whether the original posting was hourly, weekly, or monthly, and computes each job's percentile rank against every other job collected in the same run. No Glassdoor account or login is required โ€” the Actor reads the same public search and job-detail endpoints a browser does.

  • Search by job keyword and one of 25 regional Glassdoor sites, or paste Glassdoor job-search URLs directly for bulk runs
  • Extract full job details: title, description, location, posting age, contract type, seniority, remote status, benefits tags, Easy Apply flag
  • Pull the real numeric salary figures (job_salary_min / job_salary_median / job_salary_max) Glassdoor discloses per listing โ€” never fabricated when absent
  • Compute an annualized salary (job_salary_annual_min/median/max) and each job's job_salary_percentile within the run's result batch
  • Enrich every row with employer profile data: rating, size, industry, headquarters, revenue, website
  • Filter by salary floor/ceiling, posting freshness, remote work, Easy Apply status, employer size, industry, seniority, and minimum employer rating

What data can you get with Glassdoor Jobs Scraper With Salary Analytics?

Every run returns job listings, salary analytics, and employer profile data in one row per job.

Result TypeExtracted FieldsPrimary Use Case
Job listingjob_title, job_id, job_url, job_location, job_posted_date, job_age_days, job_description, job_job_types, job_levels, job_remote, job_easy_apply, job_sponsored, job_benefits_tags, job_shifts_and_schedule_tags, job_industry, job_languageJob board feeds, ATS ingestion, candidate sourcing
Salary analyticsjob_salary, job_salary_min, job_salary_median, job_salary_max, job_salary_annual_min, job_salary_annual_median, job_salary_annual_max, job_salary_percentileCompensation benchmarking, pay-equity analysis
Employer profilecompany_name, company_short_name, company_logo, company_headquarters_location, company_sizes_str, company_website, company_revenue, company_url, company_description, company_tag_line, company_industriesEmployer research, account mapping for recruiters

Salary analytics

This is the field group that separates this Actor from a plain Glassdoor listings scraper. Glassdoor discloses a numeric pay breakdown for many postings โ€” 10th, 50th (median), and 90th percentile pay in that job's own pay period (hourly, weekly, monthly, or annual). This Actor extracts those raw figures as job_salary_min/median/max, then (when annualizeSalary is on) normalizes them onto a common yearly basis using standard multipliers โ€” 2,080 hours/year for hourly, 52 for weekly, 12 for monthly โ€” so an hourly contract and a salaried role become directly comparable. It then ranks each job's annualized median against every other job with a valid figure in the same run, producing a 0โ€“100 job_salary_percentile. Fields are null, never guessed, when Glassdoor didn't disclose a number for that listing.

{
"job_salary": { "currency": "USD", "currency_symbol": "$", "pay_period": "hourly", "estimated": false, "min": 38.5, "median": 47.0, "max": 58.0 },
"job_salary_min": 38.5,
"job_salary_median": 47.0,
"job_salary_max": 58.0,
"job_salary_annual_min": 80080.0,
"job_salary_annual_median": 97760.0,
"job_salary_annual_max": 120640.0,
"job_salary_percentile": 71.5
}

Employer profile

Each job row is enriched with the posting employer's Glassdoor profile: legal and short name, logo, headquarters city, employer size bucket, revenue band, website, a short company description and tagline, and its primary industry. This comes from the same Overview page Glassdoor shows visitors, fetched once per unique employer per run and cached across all their listings. It's useful for grouping results by company, filtering out employers below a size or rating threshold, or building a company-level view (headquarters, size, revenue) alongside the job-level data.

Why not build this yourself?

Glassdoor doesn't publish a self-serve developer API for job search or salary data โ€” there's no signup form or API key to request. Anyone who wants this data programmatically has to scrape the same pages a browser loads, which means keeping up with a query surface that changes underneath you. This Actor's own source notes a live example: Glassdoor's employer Overview page recently migrated off its legacy __NEXT_DATA__/apolloState JSON blob onto React Server Components streaming output, and the extractor now has to handle both shapes to keep working. On top of parsing changes, Glassdoor rate-limits and blocks aggressive request patterns, so every request runs through an escalation path โ€” direct connection first, then datacenter proxy, then residential proxy โ€” with retries at each tier before giving up. Maintaining that pipeline (plus proxy cost) is the real alternative to using a maintained Actor: building and then continuously patching your own scraper as Glassdoor's markup and anti-bot posture shift.

What is the difference between a job board scraper and a salary intelligence tool?

A job board scraper collects what's visible on a listing page โ€” title, location, description, maybe a salary range as text โ€” and stops there. A salary intelligence tool takes the numeric pay data a site already discloses and turns it into something you can compare across jobs: a common annual basis regardless of the original pay period, and a rank showing where a given job sits relative to the rest of a result set. The distinction matters here because Glassdoor mixes pay periods across postings (hourly retail roles next to annual-salary office roles in the same search), so a raw salary range by itself isn't comparable across a result set without normalization.

Glassdoor Jobs Scraper With Salary Analytics returns both in the same JSON row: the job-board fields (job_title, job_location, job_description, and the rest) alongside the salary-analytics fields (job_salary_annual_median, job_salary_percentile) computed from the same listing. You don't need a separate tool or a second pass over the data to get either view.

How to scrape Glassdoor with Glassdoor Jobs Scraper With Salary Analytics?

  1. Open Glassdoor Jobs Scraper With Salary Analytics on Apify (Scrapier/Glassdoor-Jobs-Scraper-With-Salary-Analytics) and click Start.
  2. Enter a jobKeyword (e.g. "Data Analyst") and pick a glassdoorSite, or skip both and paste one or more Glassdoor job-search URLs into bulkSearchUrls.
  3. Set the filters that matter for your search: salaryFloor/salaryCeiling, postedWithinDays, contractType, remotePreference, careerLevel, minEmployerRating.
  4. Set maxJobs (up to 10,000) and start the run.
  5. Download results as JSON, CSV, or Excel from the dataset, or pull them via the Apify API.
{
"jobKeyword": "Data Analyst",
"glassdoorSite": "us",
"maxJobs": 100,
"onlyJobsWithSalary": true,
"annualizeSalary": true,
"postedWithinDays": "7"
}

How to run multiple queries in one job

Pass a list of full Glassdoor job-search result URLs in bulkSearchUrls instead of a single jobKeyword/glassdoorSite pair โ€” when this array is non-empty, the Actor ignores the keyword/site/location fields and runs each URL as its own search pipeline in sequence. job_salary_percentile is still computed once, across every row from every URL in that run, so jobs from different searches remain comparable against the same batch.

โฌ‡๏ธ Input

All 22 fields are optional โ€” leave the defaults and just set jobKeyword (or bulkSearchUrls) to get results. Every field also accepts the base actor's original key name as a fallback (see the description column), so an existing base-actor input JSON keeps working unchanged.

ParameterRequiredTypeDescriptionExample Value
jobKeywordNostringRole, skill, or title to search for. Used with glassdoorSite when bulkSearchUrls is empty."Software Engineer"
glassdoorSiteNostringRegional Glassdoor site to search โ€” one of 25 sites (us, gb, de, fr, in, au, ca_en, โ€ฆ). Default "us"."us"
maxJobsNointegerMax job rows to collect and analyze this run (1โ€“10,000). Salary percentile is computed across this whole batch. Default 20.100
targetLocationNostringFree-text city or region. Leave blank for no location filter."London"
bulkSearchUrlsNoarray of stringFull Glassdoor job-search result URLs to run instead of keyword/site/location. Overrides those fields when set.["https://www.glassdoor.com/Job/software-engineer-jobs-SRCH_KO0,16.htm"]
targetCompanyNostringSubstring match against employer name; leave empty to see every employer."Acme"
onlyJobsWithSalaryNobooleanON (default) drops postings with no pay signal at all. OFF also keeps postings with no salary data (their salary/analytics fields are null).true
salaryFloorNointegerMinimum salary, local currency of the chosen site. 0 = no minimum. Default 0.60000
salaryCeilingNointegerMaximum salary, same currency. Leave unset for no upper limit.150000
annualizeSalaryNobooleanON (default) computes job_salary_annual_* and job_salary_percentile. OFF skips both; raw job_salary_min/median/max are still extracted.true
postedWithinDaysNostring (enum)"ANY", "1", "3", "7", "14", or "30" days. Default "ANY"."7"
contractTypeNostring (enum)"all", "fulltime", "parttime", "contract", "temporary", "temp-to-hire", "internship", "entrylevel", "apprenticeship". Default "all"."fulltime"
searchRadiusKmNostring (enum)"0", "6", "12", "18", "31", "62", "124" km around targetLocation. Default "18"."18"
industryFocusNostring (enum)"ALL", "FINANCIAL", "MANAGEMENT_AND_CONSULTING", "HUMAN_RESSOURCES_AND_RECRUITMENT", "INFORMATION_TECHNOLOGIE". Default "ALL"."INFORMATION_TECHNOLOGIE"
jobDomainNostring (enum)"ALL" or one of 13 job-family domains ("ENGENERING", "FINANCE", "LEGAL", โ€ฆ). Default "ALL"."ENGENERING"
companySizeFilterNostring (enum)"ALL", "TINY", "SMALL", "MEDIUM", "LARGE", "HUGE". Default "ALL"."LARGE"
applyMethodNostring (enum)"ALL", "EASY_APPLY_INCLUDED", "EASY_APPLY_ONLY". Default "ALL"."EASY_APPLY_ONLY"
remotePreferenceNostring (enum)"ANY" (remote + on-site) or "REMOTE_ONLY". Default "ANY"."REMOTE_ONLY"
careerLevelNostring (enum)"all", "internship", "entrylevel", "midseniorlevel", "director", "executive". Default "all"."midseniorlevel"
minEmployerRatingNostring (enum)"0"โ€“"5" minimum Glassdoor employer rating. Default "0"."4"
pageDelayMsNointegerExtra delay (ms) between search-result pagination requests. Default 0.500
proxyConfigurationNoobjectApify Proxy settings. The Actor already falls back direct โ†’ datacenter โ†’ residential automatically.{"useApifyProxy": true}

Example JSON input

{
"jobKeyword": "Data Analyst",
"glassdoorSite": "us",
"targetLocation": "New York",
"maxJobs": 200,
"onlyJobsWithSalary": true,
"salaryFloor": 70000,
"annualizeSalary": true,
"postedWithinDays": "14",
"contractType": "fulltime",
"remotePreference": "ANY",
"minEmployerRating": "3",
"proxyConfiguration": { "useApifyProxy": true }
}

Pitfall: salaryFloor and salaryCeiling are passed straight through in the local currency of the chosen glassdoorSite โ€” there's no automatic currency conversion. Setting a USD-scaled floor like 70000 against glassdoorSite: "de" filters against euros, not dollars, so the number rarely means what you expect once you switch sites.

โฌ†๏ธ Output

Each run produces one dataset row per job, with a consistent schema across every run. Results can be exported as JSON, CSV, Excel, or fetched directly via the Apify API. Pricing is pay-per-event: each pushed row is billed once under the row_result charged event; a job that fails to build (e.g., a blocked request that never resolves) is never pushed, so you're never charged for a row you didn't receive.

Scraped results

[
{
"job_title": "Senior Data Analyst",
"job_id": "1009284773",
"job_normalized_title": "Data Analyst",
"job_url": "https://www.glassdoor.com/job-listing/senior-data-analyst-acme-corp-JV_IC1132348_KO0,19_KE20,29.htm",
"job_location": { "unknown": "New York, NY", "city": "new york", "country": "us", "zip": "10001" },
"job_description": "Acme Corp is looking for a Senior Data Analyst to join our growing analytics team...",
"job_description_html": "<p>Acme Corp is looking for a Senior Data Analyst...</p>",
"job_posted_date": "2026-07-20",
"job_remote": false,
"job_salary": { "currency": "USD", "currency_symbol": "$", "pay_period": "annual", "estimated": false, "min": 92000.0, "median": 112000.0, "max": 135000.0 },
"job_salary_min": 92000.0,
"job_salary_median": 112000.0,
"job_salary_max": 135000.0,
"job_salary_annual_min": 92000.0,
"job_salary_annual_median": 112000.0,
"job_salary_annual_max": 135000.0,
"job_salary_percentile": 68.5,
"job_easy_apply": true,
"job_age_days": 5,
"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-Corp-EI_IE1132348.htm" }],
"company_name": "Acme Corp",
"company_short_name": "Acme Corp",
"company_logo": "https://media.glassdoor.com/sql/1132348/acme-corp-squarelogo.png",
"company_headquarters_location": { "city": "new york", "unknown": "New York, NY" },
"company_sizes_str": "1,001 to 5,000 Employees",
"company_website": "acmecorp.com",
"company_revenue": "$100 to $500 million (USD)",
"company_url": "https://www.glassdoor.com/Overview/Working-at-Acme-Corp-EI_IE1132348.htm",
"company_description": "Acme Corp builds data infrastructure for enterprise customers.",
"company_tag_line": "Data you can trust.",
"company_industries": ["Information Technology"],
"all": { "jobview": { "...": "raw merged Glassdoor payload for this listing" } },
"scrapedAt": "2026-07-25T14:02:11.503284+00:00"
},
{
"job_title": "Data Analyst (Hourly, Contract)",
"job_id": "1009284811",
"job_normalized_title": "Data Analyst",
"job_url": "https://www.glassdoor.com/job-listing/data-analyst-globex-JV_IC1147201_KO0,12.htm",
"job_location": { "unknown": "Remote", "city": null, "country": "us", "zip": null },
"job_description": "Globex is hiring a contract Data Analyst for a 6-month engagement...",
"job_description_html": "<p>Globex is hiring a contract Data Analyst...</p>",
"job_posted_date": "2026-07-18",
"job_remote": true,
"job_salary": { "currency": "USD", "currency_symbol": "$", "pay_period": "hourly", "estimated": true, "min": 38.5, "median": 47.0, "max": 58.0 },
"job_salary_min": 38.5,
"job_salary_median": 47.0,
"job_salary_max": 58.0,
"job_salary_annual_min": 80080.0,
"job_salary_annual_median": 97760.0,
"job_salary_annual_max": 120640.0,
"job_salary_percentile": 41.0,
"job_easy_apply": false,
"job_age_days": 7,
"job_job_types": ["contract"],
"job_levels": "Mid level",
"job_benefits_tags": [],
"job_shifts_and_schedule_tags": ["Flexible hours"],
"job_sponsored": false,
"job_industry": "Information Technology",
"job_language": "en",
"company_uri_providers": [{ "provider": "glassdoor", "url": "https://www.glassdoor.com/Overview/Working-at-Globex-EI_IE1147201.htm" }],
"company_name": "Globex Corporation",
"company_short_name": "Globex",
"company_logo": "https://media.glassdoor.com/sql/1147201/globex-squarelogo.png",
"company_headquarters_location": { "city": "chicago", "unknown": "Chicago, IL" },
"company_sizes_str": "501 to 1,000 Employees",
"company_website": "globex.com",
"company_revenue": "$50 to $100 million (USD)",
"company_url": "https://www.glassdoor.com/Overview/Working-at-Globex-EI_IE1147201.htm",
"company_description": "Globex provides staffing and consulting services.",
"company_tag_line": null,
"company_industries": ["Information Technology"],
"all": { "jobview": { "...": "raw merged Glassdoor payload for this listing" } },
"scrapedAt": "2026-07-25T14:02:14.118732+00:00"
},
{
"job_title": "Junior Data Analyst",
"job_id": "1009284902",
"job_normalized_title": "Data Analyst",
"job_url": "https://www.glassdoor.com/job-listing/junior-data-analyst-initech-JV_IC1155007_KO0,20.htm",
"job_location": { "unknown": "Austin, TX", "city": "austin", "country": "us", "zip": "78701" },
"job_description": "Initech is seeking an entry-level Data Analyst to support reporting...",
"job_description_html": "<p>Initech is seeking an entry-level Data Analyst...</p>",
"job_posted_date": "2026-07-23",
"job_remote": false,
"job_salary": { "currency": "USD", "currency_symbol": "$", "pay_period": null, "estimated": false, "min": null, "median": null, "max": null },
"job_salary_min": null,
"job_salary_median": null,
"job_salary_max": null,
"job_salary_annual_min": null,
"job_salary_annual_median": null,
"job_salary_annual_max": null,
"job_salary_percentile": null,
"job_easy_apply": true,
"job_age_days": 2,
"job_job_types": ["fulltime", "entrylevel"],
"job_levels": "Entry level",
"job_benefits_tags": ["Dental", "Vision"],
"job_shifts_and_schedule_tags": null,
"job_sponsored": true,
"job_industry": "Information Technology",
"job_language": "en",
"company_uri_providers": [{ "provider": "glassdoor", "url": "https://www.glassdoor.com/Overview/Working-at-Initech-EI_IE1155007.htm" }],
"company_name": "Initech LLC",
"company_short_name": "Initech",
"company_logo": null,
"company_headquarters_location": { "city": "austin", "unknown": "Austin, TX" },
"company_sizes_str": "Unknown",
"company_website": "initech.com",
"company_revenue": null,
"company_url": "https://www.glassdoor.com/Overview/Working-at-Initech-EI_IE1155007.htm",
"company_description": null,
"company_tag_line": null,
"company_industries": ["Information Technology"],
"all": { "jobview": { "...": "raw merged Glassdoor payload for this listing" } },
"scrapedAt": "2026-07-25T14:02:16.774509+00:00"
}
]

Note the third row: this listing had no numeric pay disclosure, so every salary and salary-analytics field is null rather than an invented figure โ€” this is the expected shape when onlyJobsWithSalary is off and Glassdoor doesn't publish a number for that posting.

How can I use the data extracted with Glassdoor Jobs Scraper With Salary Analytics?

  • Job seekers and recruiters: compare offers across pay periods on an apples-to-apples annual basis using job_salary_annual_median, and use job_salary_percentile to see where a specific offer or listing sits against the rest of a role's market before negotiating.
  • Compensation analysts: pull a batch of postings for a title and region and get a ready-made pay distribution โ€” floor, median, ceiling, and each listing's percentile โ€” without manually normalizing hourly vs. annual figures in a spreadsheet.
  • AI engineers and LLM developers: have an agent issue a jobKeyword + glassdoorSite query, receive structured JSON back, and ground a compensation-aware assistant's answer in real job_salary_annual_* and job_salary_percentile figures instead of the model's own guess.
  • Market researchers: track how job_salary_annual_median and job_salary_percentile shift across a keyword set over successive runs to see how pay for a role or region is moving.

Salary-trend monitoring means re-running the same search on a schedule and comparing the salary-analytics fields between runs, rather than treating any single run as a static snapshot. Each run's job_salary_percentile is only meaningful within that run's own batch, so the fields to track over time are the batch-level ones: job_salary_annual_median (and min/max) across matching jobs, and how many rows in a run have non-null salary data at all (coverage can shift week to week). Between two runs for the same jobKeyword/glassdoorSite/targetLocation, diff on job_id where present, or on job_title + company_name + job_location when postings are refreshed at new IDs, and compare each matched job's job_salary_annual_median and its percentile position.

A practical workflow: schedule a run every week for a fixed keyword and region with onlyJobsWithSalary on, export each run's dataset, and compute the median of job_salary_annual_median across all rows as your weekly benchmark. Alert when that batch median moves more than your chosen threshold, or when a specific employer's postings drop out of the top percentile band. Apify's built-in Schedules feature can trigger the run on that cadence; you then compare the new run's dataset against the previous one using the Apify API or your own pipeline, since the Actor computes percentile fresh within each run rather than against history it doesn't retain.

Integrate Glassdoor Jobs Scraper With Salary Analytics and automate your workflow

Glassdoor Jobs Scraper With Salary Analytics works with any language or tool that can send an HTTP request.

REST API with Python

import requests
TOKEN = "YOUR_APIFY_TOKEN"
ACTOR = "scrapier~glassdoor-jobs-scraper-with-salary-analytics"
resp = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",
params={"token": TOKEN},
json={
"jobKeyword": "Data Analyst",
"glassdoorSite": "us",
"maxJobs": 100,
"onlyJobsWithSalary": True,
},
timeout=300,
)
jobs = resp.json()
for job in jobs[:5]:
print(job["job_title"], job["job_salary_annual_median"], job["job_salary_percentile"])

Scheduled monitoring and delivery

Use Apify's built-in Schedules to trigger this Actor on a recurring cadence (e.g. weekly) for a fixed keyword and region. There's no built-in webhook payload beyond Apify's standard run-finished webhooks; poll the Apify API for the new dataset, or configure an Apify webhook to notify your endpoint when the run completes, then pull run-sync-get-dataset-items from there.

Scraping publicly accessible Glassdoor job listings is generally legal โ€” this Actor retrieves the same job-search and job-detail data any visitor sees on Glassdoor's public pages, without logging in or bypassing access controls. The data returned here is business and product data (job postings, salary figures, company profiles), not personal data about individuals, so it falls under Glassdoor's Terms of Service and general web-scraping norms rather than GDPR/CCPA-style personal-data regimes. That said, scraping for AI model training and scraping for operational monitoring (compensation benchmarking, job-market tracking) carry different risk profiles and different terms-of-service implications โ€” review Glassdoor's current Terms of Service for your use case. Consult your legal team for commercial use cases involving bulk data storage.

Frequently asked questions

Which Glassdoor sites does this scraper support?

It supports 25 regional Glassdoor sites via the glassdoorSite parameter, including the US, UK, Germany, France, India, Australia, Canada (English and French), Brazil, Mexico, and more. Each site is queried on its own domain (e.g. glassdoor.co.uk for "gb") with results and salary figures in that site's local currency.

Can I filter by freshness, contract type, or remote work?

Yes. postedWithinDays restricts results to the last 1/3/7/14/30 days (or "ANY"), contractType filters by full-time/part-time/contract/temporary/internship/entry-level/apprenticeship, and remotePreference narrows to remote/WFH-only roles versus any location.

How does it handle Glassdoor's anti-bot measures?

Every request runs through an escalation path โ€” direct connection first, then a datacenter proxy, then a residential proxy โ€” with retries at each tier before giving up on that request. The Actor also detects Glassdoor's current employer-page markup, which mixes a legacy JSON blob format with newer streamed React Server Components output, and reads whichever shape a given page returns.

Does it extract salary analytics, or just a raw salary range?

It extracts both. job_salary (and the top-level job_salary_min/median/max) hold the raw numeric percentile pay Glassdoor discloses per listing; job_salary_annual_min/median/max and job_salary_percentile are this Actor's derived analytics โ€” an annual-normalized figure and a batch-relative percentile rank, computed only when annualizeSalary is on and Glassdoor disclosed a number for that listing.

How many results does it return per query?

Up to maxJobs, which accepts 1 to 10,000 per run. The default is 20 if you don't set it. There's no separate hidden cap beyond what you configure and what Glassdoor's search actually returns for that query.

Schedule a recurring run for the same keyword/site/location, extract job_salary_annual_median and job_salary_percentile from each run's dataset, and compare against the previous run's values for matching jobs (by job_id, or by title + company + location). Use Apify's Schedules feature to trigger the run, then diff the datasets in your own pipeline or via the Apify API.

Does it work with Claude, ChatGPT, and AI agent frameworks?

Yes โ€” it's callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make an HTTP request can call it, receive structured JSON back, and ground its answer in real listings and salary figures before responding.

How does it compare to other Glassdoor scrapers?

As observed on their live Apify listings on 2026-07-26, other Glassdoor job scrapers (e.g. khadinakbar/glassdoor-jobs-scraper, apivault_labs/glassdoor-jobs-scraper) surface a raw salary range or text string per listing and explicitly do not compute derived figures. This Actor extracts the same kind of job and company data plus the numeric percentile pay Glassdoor discloses, then adds annualized normalization and a batch percentile rank on top โ€” fields the competing listings' own documentation states they don't provide.

Can I use it without managing proxies or Glassdoor credentials?

Yes. The Actor handles proxy tier escalation (direct โ†’ datacenter โ†’ residential) automatically; you only need to supply Apify Proxy access if you want to override the defaults via proxyConfiguration. No Glassdoor login or credentials are required at any point.

What happens when a job has no salary data?

If onlyJobsWithSalary is off, the row is still returned with job_salary_min/median/max, job_salary_annual_min/median/max, and job_salary_percentile all set to null โ€” never a guessed figure. If onlyJobsWithSalary is on (the default), listings with no pay signal at all are dropped before they reach your dataset.

Your feedback

Found a bug or a field that doesn't match what's documented here? Let us know through the Actor's Issues tab on Apify or Scrapier's support contact โ€” reports like this go straight into fixing the extractor. It helps us keep this README and the schema in sync.