Glassdoor Company Scraper - Most Comprehensive
Pricing
from $0.10 / 1,000 companies
Glassdoor Company Scraper - Most Comprehensive
๐ฅ ~$0.1/1K companies ๐ฅ Scrape comprehensive Glassdoor company data including profile, ratings, demographics, salaries, interviews, benefits, and job listings.
Pricing
from $0.10 / 1,000 companies
Rating
5.0
(1)
Developer
Kai
Maintained by CommunityActor stats
0
Bookmarked
71
Total users
22
Monthly active users
4.4 hours
Issues response
12 days ago
Last modified
Categories
Security
Limited permissionsShare
Glassdoor Company Scraper
Collect Glassdoor company profiles by company page URL, employer ID, company name, or website. The default Dataset holds one company record for each employer, with details, ratings, locations, benefits, photos, and updates. Interviews, salaries, benefit reviews, and current jobs go to four more Datasets, one for each kind. See Output datasets.
Company profile coverage
| Group | Data in a full company record |
|---|---|
| Company profile | Identity, website, description, size, revenue, headquarters, industry, leadership, relationships, and recognition |
| Ratings and locations | Overall and detailed ratings, distributions, demographics, review locations, and offices |
| Company content | Managed profile content, company updates, and photos |
| Optional research | Salary estimates, benefits and benefit reviews, interview data, and current jobs. Salaries, benefit reviews, interviews, and jobs are items of their own Datasets. |
Compact mode returns the core company fields as one flat row. Full mode keeps the nested sections and company relationships.
Choose full or compact records
| Need | Set | Result |
|---|---|---|
| A nested company profile for research | Keep compactMode: false | Core company data, ratings, locations, and each enabled section |
| One flat row for a table or CSV file | Set compactMode: true | Core fields only; section switches are ignored |
Collect a company from its page
{"urls": ["https://www.glassdoor.com/Overview/Working-at-Nucor-EI_IE489.htm"]}
Any supported Glassdoor company page that contains the employer ID can identify the company.
Collect a company by employer ID
{"employerIds": [489]}
Find a company by name or website
{"searchQueries": ["Nucor", "https://www.nucor.com"],"maxSearchResults": 1}
maxSearchResults applies to each search value. With a website value,
strictDomainMatch can keep results that use the same registered domain.
Create flat rows for a table
{"employerIds": [489],"compactMode": true}
Add salary, benefit, interview, and job data
Enable only the research sections that you need:
{"employerIds": [489],"includeSalaries": true,"maxSalaries": 20,"includeBenefits": true,"maxBenefitReviews": 20,"includeInterviews": true,"maxInterviews": 20,"includeJobs": true,"maxJobs": 20}
The company record keeps the benefits overview, the salary and interview statistics, and the row counts. The salaries, benefit reviews, interviews, and jobs themselves go to their own Datasets.
Output datasets
Each run writes up to five Datasets. A Dataset for a section stays empty when you do not switch that section on.
| Dataset | One item is | Switch | Count in the company record | Link in the run output |
|---|---|---|---|---|
| Default Dataset | One company record for each employer | None | None | Companies |
interviews | One interview | includeInterviews | rowsWritten.interviews | Interviews |
salaries | One salary estimate for a job title | includeSalaries | rowsWritten.salaries | Salaries |
benefitReviews | One benefit review | includeBenefits | rowsWritten.benefitReviews | Benefit reviews |
jobs | One current job listing | includeJobs | rowsWritten.jobs | Jobs |
Each Dataset has its own table view in the Output tab of the run. You can
also open each Dataset in the Storage tab of the run. To read one with the
API, read the run and take the Dataset ID from storageIds.datasets, for
example storageIds.datasets.interviews. Then request that Dataset's items. The
Export button on the run page exports only the default Dataset. Use the
Storage tab to export the other four. They are kept for as long as the
other storage of the run.
Read all Datasets of a run
This example uses the Apify client for JavaScript. It reads the company records
and the interviews of a run, and it finds the company record of the first
interview by employerId. Replace interviews with salaries,
benefitReviews, or jobs to read another Dataset.
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.run("<RUN_ID>").get();const { datasets } = run.storageIds;const readAll = async (datasetId) =>JSON.parse(await client.dataset(datasetId).downloadItems("json"));const companies = await readAll(datasets.default);const interviews = await readAll(datasets.interviews);const company = companies.find((item) => item.employerId === interviews[0].employerId);
To start the Actor and read the result in one script, call
client.actor("<ACTOR_ID>").call(input). The run it returns has the same
storageIds.
Breaking change. Interviews, salaries, benefit reviews, and jobs are no longer arrays inside the company record. The fields
interviews,salaries,benefitReviews, andjobsare gone from that record. Read them from their own Datasets. Join each one to the default Dataset onemployerId. Photos, company updates, and all other sections stay in the company record.
Each item in the four Datasets starts with employerId and employerName,
followed by the fields of the interview, salary, benefit review, or job. The
items of one employer are written in the order of collection. They are not
sorted.
rowsWritten in the company record counts the items written for each enabled
section. Compare it with the reported totals:
salaryMeta.resultCountis the number of salary estimates that Glassdoor reports.interviewStats.filteredInterviewCountis the number of interviews that Glassdoor reports.benefitsTotalReviewsis the number of benefit reviews that Glassdoor reports.
The Actor writes each interview once, even when Glassdoor shows it in more than
one list. If a run stops while it collects an employer, the four Datasets can
hold items of an employer that has no company record. A run that you resume can
write those items again. Keep only the items whose employerId is in the
default Dataset. Remove repeats by id for interviews and benefit reviews, and
by job.listingId for jobs. Salary items have no ID.
Input reference
Provide at least one non-empty urls, employerIds, or searchQueries
list. The Actor resolves duplicate inputs to one company record.
Complete input example
Enable only the sections that you need. The limits keep the optional arrays short.
{"urls": ["https://www.glassdoor.com/Overview/Working-at-Nucor-EI_IE489.htm"],"employerIds": [489],"searchQueries": ["https://www.nucor.com"],"maxSearchResults": 1,"strictDomainMatch": true,"compactMode": false,"minReviewCount": 1,"minOverallRating": 1,"includeRatings": true,"includeDemographics": true,"includeReviewLocations": true,"includeOfficeLocations": true,"includeManagedContent": true,"includeCompanyUpdates": true,"includePhotos": true,"maxPhotos": 100,"includeSalaries": true,"maxSalaries": 21,"includeBenefits": true,"maxBenefitReviews": 21,"benefitsCountryId": 1,"includeInterviews": true,"maxInterviews": 21,"includeJobs": true,"maxJobs": 21,"proxyConfiguration": {"useApifyProxy": true}}
For a normal run, use only one input method. Compact mode ignores all section switches.
Field reference
| Field | Type | Default | Description |
|---|---|---|---|
urls | string[] | [] | Company page URLs. Overview, reviews, salaries, and other company-page URLs containing an employer ID are accepted. |
employerIds | integer[] | [] | Employer IDs from 1 through 2,147,483,647. |
searchQueries | string[] | [] | Company names or company website addresses. |
maxSearchResults | integer | 20 | Requested maximum matching companies per search query. A query can return fewer. |
strictDomainMatch | boolean | true | For website searches, keep only results whose company website uses the same registered domain. |
compactMode | boolean | false | Return a flat company row instead of the full nested record. |
minReviewCount | integer | 0 | Skip companies with fewer reviews. 0 disables this filter. |
minOverallRating | number | 0 | Skip companies below this rating. Accepted range is 0 through 5; 0 disables this filter. |
includeRatings | boolean | true | Include the detailed ratings section and distributions. The overall rating and review count remain in the core profile. |
includeDemographics | boolean | true | Include ratings grouped by demographic category. |
includeReviewLocations | boolean | true | Include cities and metro areas represented in reviews. |
includeOfficeLocations | boolean | true | Include company office locations. |
includeManagedContent | boolean | true | Include company-managed profile content. |
includeCompanyUpdates | boolean | true | Include up to 400 recent company updates. |
includePhotos | boolean | true | Include company photos. |
maxPhotos | integer | 100 | Maximum photo entries per company. 0 collects all available photos. |
includeSalaries | boolean | false | Include salary estimates by job title as items of the salaries Dataset. |
maxSalaries | integer | 20 | Maximum salary items per company. 0 collects all that Glassdoor serves, up to 10,000. |
includeBenefits | boolean | false | Include the benefits overview in the company record and benefit reviews as items of the benefitReviews Dataset. |
maxBenefitReviews | integer | 20 | Maximum benefit review items per company. 0 collects all available reviews. |
benefitsCountryId | integer | 1 | Country used for benefits data. When benefits are enabled and available, benefitCountries lists the supported countries and IDs. |
includeInterviews | boolean | false | Include interview experiences as items of the interviews Dataset and aggregate statistics in the company record. |
maxInterviews | integer | 20 | Maximum interview items per company. 0 collects all available interviews. |
includeJobs | boolean | false | Include current jobs as items of the jobs Dataset. |
maxJobs | integer | 20 | Maximum job items per company. 0 collects all available jobs. |
proxyConfiguration | object | {"useApifyProxy":true} | Optional connection settings for the run. |
Company record reference
The default Dataset contains one record for each included employer. The interviews, salaries, benefit reviews, and jobs of an employer are items of their own Datasets, described in Output datasets.
| Mode | Shape | Section behavior |
|---|---|---|
| Full (default) | Nested company profile | Includes the enabled default and optional sections |
| Compact | Flat core-company row | Ignores section switches such as includeSalaries and includeJobs |
A filtered company, a missing company, or a search with no match produces no Dataset record.
The examples shorten long arrays to one item. Empty arrays and null values
keep their original meaning.
Compact record
This compact-field projection contains every documented compact key. Its
scrapedAt value dates the point-in-time record to 16 August 2026.
{"recordType": "company","mode": "compact","status": "complete","failedSections": [],"employerId": 489,"inputSource": "https://www.nucor.com","glassdoorUrl": "https://www.glassdoor.com/Overview/Working-at-Nucor-EI_IE489.11,16.htm","name": "Nucor Corporation","overallRating": 3.9,"reviewCount": 876,"revenue": "$10+ billion (USD)","size": "10000+ Employees","type": "Company - Public","yearFounded": 1971,"website": "https://www.nucor.com","headquarters": "Charlotte, NC","ceoName": "Leon Topalian","industry": "Metal & Mineral Manufacturing","sector": "Manufacturing","description": "Nucor continues to electrify the steel industry with a simple concept: The minimill is mighty. At its various minimills, Nucor produces about 15 million tons of steel annually, including hot- and cold-rolled steel, steel joists, and metal buildings. North America's largest recycler of scrap metal, Nucor produces steel by melting scrap in electric arc furnaces. Most of its products are sold to steel service centers, manufacturers, and fabricators. Subsidiaries such as Vulcraft -- one of the US's largest producers of steel joists, girders, and decking -- use the balance of the steel. The company has grown mainly through acquisition since 2006, including spending $1 billion to buy The David J. Joseph Company.","scrapedAt": "2026-08-16T15:12:05.665Z"}
Full record with optional sections
This field-shape projection contains point-in-time values dated 16 August 2026. It includes the salary, benefit, interview, and job summaries and the row counts. The rows themselves are in their own Datasets. Long arrays keep one item, so the JSON is not a complete full record.
Interview, salary, benefit review, and job items
Each item in the interviews, salaries, benefitReviews, and jobs
Datasets starts with employerId and employerName. The other fields follow.
These examples are field-shape projections with values dated 16 August 2026.
Long text is kept as Glassdoor returns it.
Common and compact fields
| Output field | JSON type and nullability |
|---|---|
recordType | string; always company |
mode | string; full or compact |
status | string; complete or partial |
failedSections | string[]; empty when status is complete |
employerId | number |
inputSource | string or null |
overallRating, reviewCount | number or null; present in full and compact records |
scrapedAt | ISO 8601 string |
Compact: glassdoorUrl, name, revenue, size, type, website, headquarters, ceoName, industry, sector, description | string or null |
Compact: yearFounded | number or null |
Full profile fields
Full mode includes the current Glassdoor profile fields and adds the selected
sections. Glassdoor can add child keys. In the child tables below, the type is
the JSON type of a non-null value. A child field can be absent or null.
Arrays can be empty. The Actor keeps new keys that Glassdoor adds.
The top-level section branches have these contracts:
| Branch | JSON type | Presence |
|---|---|---|
ratings, ratingCountDistribution | object | Optional; controlled by includeRatings; added together. |
filteredReviewsCountByLang | object[] | Optional; added with ratings. |
allReviewsCount, filteredReviewsCount, ratedReviewsCount | number | Optional; added with ratings. |
demographicRatings | object[] or null | Optional; controlled by includeDemographics. |
reviewLocations | object[] | Optional; controlled by includeReviewLocations. |
officeLocations | object[] | Optional; controlled by includeOfficeLocations. |
employerManagedContent | object[] | Optional; controlled by includeManagedContent. |
companyUpdates | object[] | Optional; controlled by includeCompanyUpdates. |
companyUpdatesTotalCount | number | Optional; added with companyUpdates. |
photos | object[] | Optional; controlled by includePhotos. |
salaryMeta | object | Optional; controlled by includeSalaries, when salary data is available. |
benefitCountries | object[] | Optional; controlled by includeBenefits. |
benefits | object[] or null | Optional; controlled by includeBenefits. |
benefitsOverallRating, benefitsTotalReviews | number or null | Optional; added when a benefit summary is available. |
benefitEmploymentStatuses | string[] | Optional; added with a benefit summary. |
interviewStats | object | Optional; controlled by includeInterviews, when interview data is available. |
jobsCompanyFilterOptions | object[] | Optional; controlled by includeJobs. |
rowsWritten | object | Optional; present when includeSalaries, includeBenefits, includeInterviews, or includeJobs is on. It has one number for each enabled section: salaries, benefitReviews, interviews, and jobs. Each number counts the items written to the Dataset of that name. |
If a section fails at the start, its branch can be absent. If it fails later,
companyUpdates and photos can keep the items collected before the failure,
and the four row Datasets keep the items written before the failure. The record then
has status: "partial", and failedSections names the incomplete section.
Profile and relationships
The profile can contain these containers:
| Field | JSON type |
|---|---|
primaryIndustry, bestProfile, overview, ceo, counts, links, coverPhoto | object |
parent | object |
officeAddresses, awards, bestPlacesToWork, bestLedCompanies, subsidiaries, siblings | object[] |
name is a string and is present in every saved record. Other profile scalars
use these JSON types when present:
| Scope | Number fields | String fields | Boolean fields |
|---|---|---|---|
| Profile root | id, yearFounded, primaryIndustryId | shortName, headquarters, revenue, size, sizeCategory, website, type, activeStatus, approvalStatus, squareLogoUrl, regularLogoUrl, largeLogoUrl | isValid |
primaryIndustry | industryId, sectorId | industryName, sectorName | โ |
bestProfile | id | โ | โ |
overview | โ | description, mission | โ |
ceo | id | name, title, photoUrl | โ |
counts | benefitCount, reviewCount, salaryCount, interviewCount, photoCount, globalJobCount.jobCount | โ | โ |
links | โ | benefitsUrl, interviewUrl, jobsUrl, overviewUrl, reviewsUrl, salariesUrl | โ |
coverPhoto | โ | hiResUrl | โ |
officeAddresses[] | id, officeLocationId, country.id, country.continent.id | addressLine1, addressLine2, cityName, countryName, postalCode, administrativeAreaName1, country.name, country.continent.name | โ |
awards[] | year | name, source | featured |
bestPlacesToWork[] | id, rank | listType, name, timePeriod | isCurrent |
bestLedCompanies[] | id, rank | name, timePeriod | isCurrent |
parent.employer, subsidiaries[].employer, and siblings[].employer use the
same relationship shape:
| Number fields | String fields | Boolean fields |
|---|---|---|
id, ratings.overallRating, counts.reviewCount, counts.salaryCount, counts.globalJobCount.jobCount | name, shortName, headquarters, squareLogoUrl, approvalStatus | isValid |
Ratings, demographics, and locations
| Scope | Number fields | String fields | Other fields |
|---|---|---|---|
ratings | overallRating, reviewCount, ceoRating, ceoRatingsCount, recommendToFriendRating, businessOutlookRating, cultureAndValuesRating, careerOpportunitiesRating, workLifeBalanceRating, seniorManagementRating, compensationAndBenefitsRating, diversityAndInclusionRating | โ | ratedCeo: object or null |
ratings.ratedCeo | id | name, title, regularPhoto, largePhoto | โ |
ratingCountDistribution | Values under 1, 2, 3, 4, and 5; recommendToFriend.RECOMMEND; recommendToFriend.WONT_RECOMMEND | โ | overall, cultureAndValues, careerOpportunities, workLifeBalance, seniorManagement, compensationAndBenefits, diversityAndInclusion, and recommendToFriend are objects. |
filteredReviewsCountByLang[] | count | isoLanguage | โ |
| Rating counts at the record root | allReviewsCount, filteredReviewsCount, ratedReviewsCount | โ | โ |
demographicRatings[] | โ | category | categoryRatings: object[] |
demographicRatings[].categoryRatings[] | Rating fields listed for ratings, including reviewCount | categoryValue | ratings: object |
reviewLocations[] | id | name, type; state and country are string or null | โ |
officeLocations[] | id, officeLocationId, country.id, country.continent.id, employerReviews.ratings.overallRating | addressLine1, addressLine2, cityName, countryName, postalCode, administrativeAreaName1, country.name, country.continent.name | country and employerReviews: object |
Managed content, updates, and photos
| Scope | Number fields | String fields | Boolean fields and containers |
|---|---|---|---|
employerManagedContent[] | โ | โ | managedContent: object[] |
managedContent[] | id | body, type, title | media: object[] |
managedContent[].media[] | โ | caption, source, mediaType | โ |
companyUpdates[] | employerId, likes; id can be a number or string | text, date | isLiked: boolean; media and category: object |
companyUpdates[].media | โ | title, description, linkUrl, linkDomain, imageUrl, videoUrl | โ |
companyUpdates[].category | id | name | โ |
photos[] | photoId | caption, photoUrl2x | โ |
Salaries and benefits
The salary item and benefitReview item scopes are items of the salaries and
benefitReviews Datasets. The other scopes are fields of the company record.
| Scope | Number fields | String fields | Boolean fields and containers |
|---|---|---|---|
salary item | employerId, basePayStatistics.mean, totalAdditionalPayStatistics.mean | employerName, payPeriod | currency, employer, jobTitle, basePayStatistics, totalAdditionalPayStatistics, and totalPayStatistics: object |
salary item: currency | id | code | โ |
salary item: employer | id, ratings.overallRating, counts.globalJobCount.jobCount | name, shortName, squareLogoUrl | ratings and counts: object |
salary item: jobTitle | id, gocId, mgocId | text | โ |
salary item: totalPayStatistics.percentiles[] | value | ident | โ |
salaryMeta | resultCount, numPages | โ | queryLocation: object or null; truncatedByWindow: boolean |
salaryMeta.queryLocation | id | name, type | โ |
benefitCountries[] | id | name | โ |
benefits[] | rating can be a number or null; reviewCount | category, name | verified: boolean |
| Benefit summary at the record root | benefitsOverallRating and benefitsTotalReviews can be a number or null | โ | benefitEmploymentStatuses: string[] |
benefitReview item | employerId, id, rating | employerName, createDate, userEnteredJobTitle | currentJob: boolean; city: object; benefitComments: object[] |
benefitReview item: city | โ | name, state.name, metro.name, country.name | state, metro, and country: object |
benefitReview item: benefitComments[] | helpfulVotes, id | comment | โ |
Interviews
The interview item scopes are items of the interviews Dataset.
interviewStats is a field of the company record.
| Scope | Number fields | String fields | Boolean fields and containers |
|---|---|---|---|
interview item | employerId, id, countHelpful | employerName, advice, difficulty, experience, negotiationDescription, outcome, processDescription, reviewDateTime, source | featured: boolean; employer, jobTitle: object; employerResponses, userQuestions: object[] |
interview item: employer | โ | name, squareLogoUrl | โ |
interview item: employerResponses[] | โ | response, responseDateTime | โ |
interview item: jobTitle | โ | text | โ |
interview item: userQuestions[] | answerCount | question | โ |
interviewStats | difficultySubmissionCount, difficultySum, filteredInterviewCount, totalInterviewCount | โ | interviewExperienceCounts, interviewObtainedChannelCounts: object[]; truncatedByWindow: boolean |
interviewStats.interviewExperienceCounts[], interviewStats.interviewObtainedChannelCounts[] | count, percentage | type | โ |
Jobs
The job item scopes are items of the jobs Dataset. A job item can contain
job, header, and overview objects. A listing that Glassdoor returns
without details is an item with only employerId and employerName.
jobsCompanyFilterOptions is a field of the company record.
| Scope | Number fields | String fields | Boolean fields and containers |
|---|---|---|---|
job item | employerId | employerName | job, header, overview: object |
job item: job | listingId | jobTitleText, description | โ |
job item: header | ageInDays, categoryMgocId, sgocId, locId, rating, jobCountryId | goc, normalizedJobTitle, locationName, locationType, employerNameFromSearch, payPeriod, salarySource, payCurrency, jobViewUrl, jobLink, applyUrl, serpUrlForJobListing | easyApply, expired, isSponsoredJob, isSponsoredEmployer: boolean; employer, coverPhoto, payPeriodAdjustedPay, urgencySignal, indeedJobAttribute: object or null; occupations: object[]; remoteWorkTypes: string[] or null |
job item: header.employer | id | name, shortName, squareLogoUrl | โ |
job item: header.coverPhoto | employerId, sgocId | url | โ |
job item: header.payPeriodAdjustedPay | p10, p50, p90 | โ | โ |
job item: header.occupations[] | โ | key | โ |
job item: header.urgencySignal | normalizedCount | labelKey, messageKey | โ |
job item: header.indeedJobAttribute.extractedJobAttributes[] | โ | key, value | โ |
job item: overview.primaryIndustry | industryId, sectorId | industryName, sectorName | โ |
jobsCompanyFilterOptions[] | id | name, squareLogoUrl, shortName | โ |
Company resolution and result behaviour
- A company or section can be unavailable for a country or employer. Missing
optional objects can be
null, empty, or absent. - A full record has
status: partialwhen a requested section does not complete.failedSectionscan containratings,demographicRatings,reviewLocations,officeLocations,employerManagedContent,companyUpdates,photos,benefits,benefitReviews,salaries,interviews, orjobs. Check this list before you use an optional section. - Glassdoor can add or remove nullable child fields. Use the field reference as a guide and allow new keys in your data pipeline.
- A company that does not match the rating or review filters produces no Dataset item. A missing company or a search with no match also produces no item.
- A search term can match more than one employer. Use
maxSearchResultsandstrictDomainMatchto limit website searches. - A maximum value of
0collects all available entries and can increase the result size and run time for large employers. - Glassdoor serves only the first 10,000 salary estimates of a company. For a
larger company, the Actor collects 10,000 salary items and stops. No filter
or sort order reaches the rest. This stop is not a failure, so the record
keeps
status: complete.salaryMeta.truncatedByWindowistruewhen Glassdoor reports more salaries than the Actor can read. The reported total issalaryMeta.resultCount. Some salary items can be exact repeats of each other, because the Actor cannot tell them apart. - For interviews, the Actor combines several views of the list of a company and
keeps each interview once. It reads all interviews of most companies, including
companies with more than 10,000 interviews. A very large list can hold a few
interviews that no view reaches. Then
interviewStats.truncatedByWindowistrue. ComparerowsWritten.interviewswithinterviewStats.filteredInterviewCount. A run that reads more interviews takes more time. - Each job appears once in the
jobsDataset, even when Glassdoor lists it on more than one page, sorowsWritten.jobscan be lower than the number of jobs that Glassdoor reports.