Glassdoor Jobs Scraper: Questions & Difficulty Ratings
Pricing
Pay per usage
Glassdoor Jobs Scraper: Questions & Difficulty Ratings
πΌ Glassdoor Jobs Scraper extracts Glassdoor job postings at scale: titles, companies, locations, salary ranges, employer ratings, descriptions & URLs. π Export-ready data for HR, recruiters & analysts to build pipelines, track pay trends and monitor competitors. π
Pricing
Pay per usage
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Glassdoor Scraper β Extract Jobs, Questions and Difficulty Ratings
Glassdoor Jobs Scraper: Questions & Difficulty Ratings extracts Glassdoor job listings and, for every matched employer, real candidate-submitted interview questions, a per-interview difficulty rating, and the reported experience outcome β then computes a locally-derived difficulty index and a positive/neutral/negative experience breakdown per company. Every response returns typed, normalized JSON β no HTML, no selectors, no parsing. Point it at a job title, or a batch of Glassdoor search URLs, and you get back linked job and interview rows ready for a database, a dashboard, or an LLM pipeline.
What is Glassdoor Jobs Scraper: Questions & Difficulty Ratings?
Glassdoor Jobs Scraper: Questions & Difficulty Ratings is an Apify Actor that calls Glassdoor's own job-search and Interview-page backends to return job listings enriched with real interview questions, difficulty ratings, and reported experience outcomes for the employer behind each listing. It covers 25 regional Glassdoor sites and needs no Glassdoor account or login β only publicly reachable pages are queried. Alongside the raw interview reports, it also computes, locally, a 1β5 difficulty index and a positive/neutral/negative experience breakdown for every employer it touches.
- Scrape Glassdoor job listings by keyword or bulk search URL
- Scrape real, candidate-submitted interview questions per employer
- Scrape per-interview difficulty ratings and reported experience outcomes
- Get a locally-computed difficulty index and sentiment breakdown per employer
- Export as JSON, CSV, or Excel, or pull results via API β no proxy setup required
What data does Glassdoor Jobs Scraper: Questions & Difficulty Ratings collect?
The Actor returns three linked types of data in one dataset: job listings, interview questions, and difficulty/experience ratings.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Job listings | title, company, salary range, location, posted date, easy apply | job_title, company_name, job_salary, job_location, job_posted_date, job_easy_apply |
| Interview questions | question text, job interviewed for, how the interview was obtained, process length | interview_question_text, interview_questions, job_title_interviewed_for, interview_source_label |
| Difficulty ratings & experience | per-interview difficulty, outcome, employer-level difficulty index, sentiment breakdown | interview_difficulty_label, interview_outcome_label, interview_insights.difficulty_index, interview_insights.experience_breakdown |
Need more Glassdoor data?
This is the only Glassdoor scraper currently published under the API-Empire account, and it already covers both sides of a job search β listings plus interview intelligence β in a single run, so there's no companion Glassdoor Actor to cross-sell here. If your workflow needs data from other job boards or platforms, pair this Actor's output with your own pipeline rather than a second Glassdoor scraper.
Why not build this yourself?
Glassdoor doesn't publish a public API for third-party access to job listings, employer data, or interview reports, so a DIY approach means reverse-engineering Glassdoor's internal endpoints yourself. This Actor's own source shows why that's a moving target: the job-search and interview endpoints are undocumented "BFF" (backend-for-frontend) calls, the Interview-page BFF returns an HTTP 403 "Security | Glassdoor" WAF page unless the request carries a matching Referer and a sticky proxy session, and Glassdoor's employer Overview page has migrated its data payload from a __NEXT_DATA__/apolloState blob to React Server Components streaming chunks β a shift this Actor had to adapt to. Maintaining that yourself means constantly re-discovering endpoints, running a direct β datacenter β residential proxy escalation ladder, and paying for residential proxy bandwidth on every retry. This Actor already runs that escalation ladder and absorbs the maintenance, so a structure change on Glassdoor's side doesn't have to become your outage.
Why do developers and teams scrape Glassdoor?
For AI engineers and agent builders
An interview-prep chatbot or career-coaching agent needs real, sourced material instead of generic advice β this Actor supplies exactly that as structured JSON. Feed interview_question_text and interview_questions straight into a vector store to ground a RAG assistant that answers "what will they ask me at a data analyst interview at this company?" with actual candidate-submitted questions, alongside interview_difficulty_label and interview_insights.experience_breakdown so the agent can also flag how hard candidates found the process and whether reported sentiment skews positive or negative. No HTML parsing sits between the scrape and the prompt.
For recruiters and talent-acquisition teams
Recruiters can benchmark their own hiring process against what candidates report publicly for the same employer or its competitors. Pulling interview_insights.difficulty_index and experience_breakdown across a set of target companies shows whether a hiring loop reads as harder or more negative than peers, and interview_outcome_label (accepted / declined / no offer) hints at where processes lose candidates. Paired with the job-listing fields β job_salary, company_sizes_str, and job_age_days β this turns into a quick competitive-intelligence pass on both compensation and candidate experience before a req goes live.
For career coaches and job seekers
Career coaches and job-seeker tools can build company-specific interview guides from real question text instead of crowdsourced generic lists. interview_questions returns the actual candidate-submitted question (with any captured answer appended), interview_process_description gives the free-text account of what the process looked like, and interview_difficulty_label plus interview_experience_label tell a candidate what to expect emotionally, not just technically. Combined with job_salary and job_benefits_tags from the matching job listing, a coaching product can hand a candidate one brief covering pay, process, and likely questions for a single employer.
For labour-market researchers and analysts
Researchers studying hiring difficulty or candidate sentiment at scale can treat interview_insights as a structured, per-employer summary rather than raw text to code by hand β difficulty_index is a numeric 1β5 average with a documented scale, and experience_breakdown already gives positive/neutral/negative percentages. Combined with job_industry, company_sizes_str, and salary fields across many employers in one run, that supports cross-sector comparisons of interview difficulty against pay or company size without manually reading individual reports.
How to scrape Glassdoor (step by step)
- Open Glassdoor Jobs Scraper: Questions & Difficulty Ratings on the Apify Store and click Run (or call it through the Apify API with your token).
- Provide Job title or skills (
jobTitleOrSkills) and a Glassdoor regional site (glassdoorRegion), or paste ready-made search links into Bulk Glassdoor search URLs (bulkSearchUrls) instead. - Set filters β salary range, employment type, career level, industry, employer size β and leave Fetch interview questions & difficulty ratings (
includeInterviewInsights) on to get interview data, or switch it off for job listings only. - Start the run.
- Download the job and interview rows as JSON, CSV, or Excel from the run's dataset, or pull them by API into your own pipeline.
What to do when Glassdoor changes its structure
Glassdoor has already changed its employer-page data format once β from a __NEXT_DATA__/apolloState blob to React Server Components streaming β and this Actor was updated to read both shapes. The Actor is maintained, and its output schema stays stable across those changes, so a Glassdoor-side update shouldn't require you to touch your own integration code.
β¬οΈ Input
The Actor takes no required fields β every parameter below is optional, grouped in the Console into Job search, Interview prep insights, Salary range, Advanced job filters, Bulk mode & pacing, and Connection.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
jobTitleOrSkills | No | String | Role, skill, or title to search for. Leave empty when using bulkSearchUrls instead. | "Software Engineer" |
maxJobListings | No | Integer | Upper bound on job rows returned this run (1β10000). | 20 |
glassdoorRegion | No | String (enum) | Which country/language edition of Glassdoor to search (25 sites). | "us" |
cityOrRegion | No | String | Narrow results to a place, or leave blank to search the whole region. | "San Francisco, CA" |
includeInterviewInsights | No | Boolean | ON fetches interview questions, difficulty rating, and experience outcome per employer, plus a computed difficulty index. Default true. | true |
maxInterviewsPerEmployer | No | Integer | How many of an employer's most recent interview reports to pull (1β50). Default 10. | 10 |
salaryFloor | No | Integer | Only show roles at or above this pay, in local currency. 0 = no minimum. | 60000 |
salaryCeiling | No | Integer | Cap the salary range, or leave 0/empty for no upper limit. | 150000 |
includeUnlistedSalaryJobs | No | Boolean | ON also includes postings that don't mention pay. | false |
postedWithin | No | String (enum) | How fresh listings should be: ANY, 1, 3, 7, 14, or 30 days. | "7" |
employmentType | No | String (enum) | Full-time, part-time, contract, internship, etc. | "fulltime" |
searchRadiusKm | No | String (enum) | Circle size (km) around cityOrRegion. | "18" |
industryFocus | No | String (enum) | Restrict to one sector, or ALL. | "INFORMATION_TECHNOLOGIE" |
jobFamily | No | String (enum) | Restrict to one job family/domain, or ALL. | "ENGENERING" |
companyScale | No | String (enum) | Restrict to an employer-size band, or ALL. | "LARGE" |
applyMethod | No | String (enum) | All application types, Easy Apply included, or Easy Apply only. | "ALL" |
workLocationMode | No | String (enum) | Any (remote + on-site), or remote/WFH only. | "ANY" |
careerLevel | No | String (enum) | Match a career stage, or all. | "midseniorlevel" |
targetEmployerName | No | String | Lean toward listings from a specific company, or leave empty for everyone. | "Acme Corp" |
minEmployerRating | No | String (enum) | Only show employers rated at least this high, 0β5. | "0" |
bulkSearchUrls | No | Array of strings | One or more full Glassdoor job-search URLs to run instead of jobTitleOrSkills. | ["https://www.glassdoor.com/Job/software-engineer-jobs-SRCH_KO0,16.htm"] |
requestPaceMs | No | Integer | Optional pause between job-search page requests, in milliseconds. | 0 |
connectionMode | No | Object (proxy) | Apify Proxy configuration. Optional β the Actor auto-escalates direct β datacenter β residential on its own when a site blocks a request. | {"useApifyProxy": false} |
Example input
{"jobTitleOrSkills": "Software Engineer","maxJobListings": 20,"glassdoorRegion": "us","cityOrRegion": "San Francisco, CA","includeInterviewInsights": true,"maxInterviewsPerEmployer": 10,"salaryFloor": 60000,"salaryCeiling": 150000,"includeUnlistedSalaryJobs": false,"postedWithin": "7","employmentType": "fulltime","searchRadiusKm": "18","industryFocus": "INFORMATION_TECHNOLOGIE","jobFamily": "ENGENERING","companyScale": "LARGE","applyMethod": "ALL","workLocationMode": "ANY","careerLevel": "midseniorlevel","targetEmployerName": "","minEmployerRating": "0","bulkSearchUrls": [],"requestPaceMs": 0,"connectionMode": { "useApifyProxy": false }}
The most common input mistake is leaving both jobTitleOrSkills and bulkSearchUrls empty β the run needs one or the other, and otherwise exits immediately with an error log line and no rows saved.
β¬οΈ Output
Every job and interview row is typed, normalized JSON with stable field names β no HTML, no selectors. Download results from the dataset as JSON, CSV, Excel, XML, or RSS, or pull them by API. Job rows and interview rows share one dataset, distinguished by type and isChild β filter on type == "job" or type == "interview" to split them.
Scraped job listings
{"job_title": "Software Engineer","job_id": "1009876543","job_normalized_title": "Software Engineer","job_url": "https://www.glassdoor.com/job-listing/software-engineer-acme-corp-JV_IC1147401_KO0,17_KE18,27.htm","job_location": {"unknown": "San Francisco, CA","city": "san francisco","country": "us","zip": "94103"},"job_description": "We are looking for a Software Engineer to join our platform team...","job_posted_date": "2026-07-18","job_remote": false,"job_salary": {"currency": "USD","currency_symbol": "$","pay_period": "annual","estimated": true,"min": 118000,"median": 138000,"max": 162000},"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_sponsored": false,"job_industry": "Information Technology","job_language": "en","company_name": "Acme Corp","company_short_name": "Acme-Corp","company_sizes_str": "10000+ Employees","company_website": "acme.com","company_url": "https://www.glassdoor.com/Overview/Working-at-Acme-Corp-EI_IE1147401.htm","company_description": "Acme Corp builds cloud infrastructure software.","employer_id": 1147401,"interview_insights": {"interviews_sampled": 10,"difficulty_index": 3.4,"difficulty_index_scale": "1=very easy .. 5=very difficult","difficulty_label": "Average","experience_breakdown": {"positive": 6,"neutral": 2,"negative": 2,"positive_pct": 60.0,"neutral_pct": 20.0,"negative_pct": 20.0},"coverage_note": "Computed locally from the 10 most recent interview report(s) fetched for this employer."},"type": "job","isChild": false,"scrapedAt": "2026-07-25T10:15:00.000000+00:00"}
The Actor also writes an all field on every job row containing the complete raw Glassdoor job/employer payload (every field the Overview and job-search BFF exposed) β omitted from the example above for brevity.
Scraped interview questions & difficulty ratings
{"type": "interview","isChild": true,"interview_id": "58213947","employer_id": 1147401,"company_name": "Acme Corp","job_title_interviewed_for": "Software Engineer","interview_location": "San Francisco, CA","interview_difficulty": "AVERAGE","interview_difficulty_label": "Average","interview_experience": "POSITIVE","interview_experience_label": "Positive experience","interview_outcome": "ACCEPT_OFFER","interview_outcome_label": "Accepted offer","interview_source": "APPLIED_ONLINE","interview_source_label": "Applied online","interview_duration_days": 14,"interview_process_description": "Phone screen, then a take-home assignment, then two virtual onsite rounds.","interview_questions": ["Tell me about a time you debugged a production incident under pressure.","How would you design a rate limiter for a public API?"],"interview_question_text": "Tell me about a time you debugged a production incident under pressure.","interview_date": "2026-06-02","count_helpful": 4,"count_not_helpful": 0,"featured": false,"has_employer_response": false,"employer_url": "https://www.glassdoor.com/Overview/Working-at-EI_IE1147401.htm","scrapedAt": "2026-07-25T10:15:04.000000+00:00"}
How many results can you scrape with Glassdoor Jobs Scraper: Questions & Difficulty Ratings?
maxJobListings sets the job-row ceiling for a run, from 1 up to 10,000 (the input schema's hard maximum); job-search pages are fetched 30 listings at a time until that count is reached or Glassdoor's own search results run out. maxInterviewsPerEmployer separately caps interview reports per employer at 1β50 (default 10) β the Actor paginates that employer's Interview BFF in batches until it hits the cap, the number of reports Glassdoor reports as available, or a shorter page than requested. There's no additional run-wide cap on total interview rows beyond employers Γ per-employer cap: a run touching 50 unique employers at the default cap can return up to 500 interview rows on top of the job rows. Set maxInterviewsPerEmployer lower to keep large, multi-employer runs faster and cheaper.
Integrate Glassdoor Jobs Scraper: Questions & Difficulty Ratings and automate your workflow
Glassdoor Jobs Scraper: Questions & Difficulty Ratings works with any language or tool that can send an HTTP request β it runs on Apify's platform and is called through the standard Apify API.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("YOUR_USERNAME/glassdoor-jobs-scraper-questions-and-difficulty-ratings").call(run_input={"jobTitleOrSkills": "Data Analyst","glassdoorRegion": "us","maxJobListings": 20,"includeInterviewInsights": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():label = item.get("job_title") or item.get("interview_question_text")print(item["type"], label)
Works in Python, Node.js, Go, Ruby, cURL.
MCP for AI agents
Any public Apify Actor, including this one, can be exposed to an MCP-compatible AI agent through Apify's own Actors MCP Server β register it with npx -y @apify/actors-mcp-server, set APIFY_TOKEN, and include glassdoor-jobs-scraper-questions-and-difficulty-ratings in the actors list, then call it as a tool from Claude, Cursor, or any other MCP client.
Automation platforms (n8n, Make)
In n8n, the Apify community node's "Run Actor and get dataset items" operation can call this Actor directly and pass job and interview rows into downstream nodes in the same workflow. In Make, the Apify app's "Run Actor" module, paired with "Get Dataset Items," does the same β point either at glassdoor-jobs-scraper-questions-and-difficulty-ratings and map jobTitleOrSkills, glassdoorRegion, and includeInterviewInsights to your scenario's inputs.
Is it legal to scrape Glassdoor?
Scraping Glassdoor's publicly visible job listings and interview reports is generally lawful; the compliance question is about how you use the output, not the technical act of fetching public pages. Glassdoor Jobs Scraper: Questions & Difficulty Ratings only reads pages Glassdoor serves without a login β job search, employer Overview, and Interview pages β and interview reports come back without a reviewer name or handle attached. Because the output is job-listing and interview-report data rather than identifiable personal profiles, Glassdoor's Terms of Service and database-rights considerations are the relevant framing here, not GDPR/CCPA personal-data rules. Consult legal counsel for commercial use cases involving bulk personal data.
Frequently asked questions
Does Glassdoor Jobs Scraper: Questions & Difficulty Ratings work without a Glassdoor account?
Yes. It only reads pages Glassdoor serves without a login β job search results, employer Overview pages, and Interview pages β so no Glassdoor account or credentials are required to run it.
How often is the scraped data updated?
Every run fetches live from Glassdoor at request time; there's no cache. Each run reflects whatever job listings and interview reports are live on Glassdoor when it executes.
What happens if a job's employer has no interview reports?
If includeInterviewInsights is on but Glassdoor has no interview reports for an employer (or the Interview BFF can't be reached after its retry attempts), the job row's interview_insights field comes back null and no interview child rows are created for that employer β the job row itself is still saved.
Can I scrape private or restricted Glassdoor content?
No. The Actor returns only publicly reachable job listings, employer overview data, and interview reports β it doesn't log in, and any Glassdoor content that sits behind a login wall is out of scope.
Does Glassdoor Jobs Scraper: Questions & Difficulty Ratings work for AI agent workflows and LLM pipelines?
Yes. It's callable as an HTTP endpoint through the Apify API from any agent framework, and it's also reachable through Apify's Actors MCP Server as an MCP tool. Every response is typed JSON β job and interview fields alike β with no HTML parsing step before you hand it to an LLM.
How does Glassdoor Jobs Scraper: Questions & Difficulty Ratings handle Glassdoor's anti-bot system?
It escalates automatically from a direct connection to a datacenter proxy to a residential proxy whenever Glassdoor blocks a request, pins one residential session across a warm-up page load and the interview BFF call (some Glassdoor endpoints reject a request whose IP changes mid-session), and retries interview-page fetches across several fresh residential sessions before giving up on an employer.
Does Glassdoor Jobs Scraper: Questions & Difficulty Ratings return data in a format LLMs can use directly?
Yes. Every job and interview row is typed, normalized JSON with stable field names β no HTML, no selectors, no parsing required β so you can pass it directly into an LLM context window, index it into a vector store, or route it through an agent tool call.
Can I use Glassdoor Jobs Scraper: Questions & Difficulty Ratings without managing proxies?
Yes. Proxy configuration (connectionMode) is optional; left at its default, the Actor manages its own direct β datacenter β residential escalation whenever Glassdoor blocks a request, so you don't need to supply or rotate proxies yourself.
What happens when Glassdoor changes its structure or blocks the scraper?
The Actor is maintained, and its output schema stays stable on your end β field names and types don't change just because Glassdoor's page markup does. It has already adapted once, when Glassdoor's employer pages moved from a __NEXT_DATA__ blob to React Server Components streaming, without any change to the row shape documented above.
Are job rows and interview rows billed the same way?
No. Only job rows are billed, under the row_result charged event; interview child rows (type: "interview") are pushed to the same dataset without a charge. Filter a run's dataset on type == "interview" to pull just the free interview data, or type == "job" for the billed rows.
Your feedback
Found a bug, a missing field, or a Glassdoor page shape this Actor doesn't handle yet? Open an issue via the Actor's page on the Apify platform, or reach out through API-Empire's support contact β reports like these are what keep the parser and the interview-difficulty logic accurate as Glassdoor's own pages keep changing.