Glassdoor Company Scraper - Most Comprehensive avatar

Glassdoor Company Scraper - Most Comprehensive

Pricing

from $0.10 / 1,000 companies

Go to Apify Store
Glassdoor Company Scraper - Most Comprehensive

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

Kai

Maintained by Community

Actor stats

0

Bookmarked

71

Total users

22

Monthly active users

4.4 hours

Issues response

12 days ago

Last modified

Security

Limited permissions

Share

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

GroupData in a full company record
Company profileIdentity, website, description, size, revenue, headquarters, industry, leadership, relationships, and recognition
Ratings and locationsOverall and detailed ratings, distributions, demographics, review locations, and offices
Company contentManaged profile content, company updates, and photos
Optional researchSalary 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

NeedSetResult
A nested company profile for researchKeep compactMode: falseCore company data, ratings, locations, and each enabled section
One flat row for a table or CSV fileSet compactMode: trueCore 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.

DatasetOne item isSwitchCount in the company recordLink in the run output
Default DatasetOne company record for each employerNoneNoneCompanies
interviewsOne interviewincludeInterviewsrowsWritten.interviewsInterviews
salariesOne salary estimate for a job titleincludeSalariesrowsWritten.salariesSalaries
benefitReviewsOne benefit reviewincludeBenefitsrowsWritten.benefitReviewsBenefit reviews
jobsOne current job listingincludeJobsrowsWritten.jobsJobs

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, and jobs are gone from that record. Read them from their own Datasets. Join each one to the default Dataset on employerId. 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.resultCount is the number of salary estimates that Glassdoor reports.
  • interviewStats.filteredInterviewCount is the number of interviews that Glassdoor reports.
  • benefitsTotalReviews is 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

FieldTypeDefaultDescription
urlsstring[][]Company page URLs. Overview, reviews, salaries, and other company-page URLs containing an employer ID are accepted.
employerIdsinteger[][]Employer IDs from 1 through 2,147,483,647.
searchQueriesstring[][]Company names or company website addresses.
maxSearchResultsinteger20Requested maximum matching companies per search query. A query can return fewer.
strictDomainMatchbooleantrueFor website searches, keep only results whose company website uses the same registered domain.
compactModebooleanfalseReturn a flat company row instead of the full nested record.
minReviewCountinteger0Skip companies with fewer reviews. 0 disables this filter.
minOverallRatingnumber0Skip companies below this rating. Accepted range is 0 through 5; 0 disables this filter.
includeRatingsbooleantrueInclude the detailed ratings section and distributions. The overall rating and review count remain in the core profile.
includeDemographicsbooleantrueInclude ratings grouped by demographic category.
includeReviewLocationsbooleantrueInclude cities and metro areas represented in reviews.
includeOfficeLocationsbooleantrueInclude company office locations.
includeManagedContentbooleantrueInclude company-managed profile content.
includeCompanyUpdatesbooleantrueInclude up to 400 recent company updates.
includePhotosbooleantrueInclude company photos.
maxPhotosinteger100Maximum photo entries per company. 0 collects all available photos.
includeSalariesbooleanfalseInclude salary estimates by job title as items of the salaries Dataset.
maxSalariesinteger20Maximum salary items per company. 0 collects all that Glassdoor serves, up to 10,000.
includeBenefitsbooleanfalseInclude the benefits overview in the company record and benefit reviews as items of the benefitReviews Dataset.
maxBenefitReviewsinteger20Maximum benefit review items per company. 0 collects all available reviews.
benefitsCountryIdinteger1Country used for benefits data. When benefits are enabled and available, benefitCountries lists the supported countries and IDs.
includeInterviewsbooleanfalseInclude interview experiences as items of the interviews Dataset and aggregate statistics in the company record.
maxInterviewsinteger20Maximum interview items per company. 0 collects all available interviews.
includeJobsbooleanfalseInclude current jobs as items of the jobs Dataset.
maxJobsinteger20Maximum job items per company. 0 collects all available jobs.
proxyConfigurationobject{"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.

ModeShapeSection behavior
Full (default)Nested company profileIncludes the enabled default and optional sections
CompactFlat core-company rowIgnores 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 fieldJSON type and nullability
recordTypestring; always company
modestring; full or compact
statusstring; complete or partial
failedSectionsstring[]; empty when status is complete
employerIdnumber
inputSourcestring or null
overallRating, reviewCountnumber or null; present in full and compact records
scrapedAtISO 8601 string
Compact: glassdoorUrl, name, revenue, size, type, website, headquarters, ceoName, industry, sector, descriptionstring or null
Compact: yearFoundednumber 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:

BranchJSON typePresence
ratings, ratingCountDistributionobjectOptional; controlled by includeRatings; added together.
filteredReviewsCountByLangobject[]Optional; added with ratings.
allReviewsCount, filteredReviewsCount, ratedReviewsCountnumberOptional; added with ratings.
demographicRatingsobject[] or nullOptional; controlled by includeDemographics.
reviewLocationsobject[]Optional; controlled by includeReviewLocations.
officeLocationsobject[]Optional; controlled by includeOfficeLocations.
employerManagedContentobject[]Optional; controlled by includeManagedContent.
companyUpdatesobject[]Optional; controlled by includeCompanyUpdates.
companyUpdatesTotalCountnumberOptional; added with companyUpdates.
photosobject[]Optional; controlled by includePhotos.
salaryMetaobjectOptional; controlled by includeSalaries, when salary data is available.
benefitCountriesobject[]Optional; controlled by includeBenefits.
benefitsobject[] or nullOptional; controlled by includeBenefits.
benefitsOverallRating, benefitsTotalReviewsnumber or nullOptional; added when a benefit summary is available.
benefitEmploymentStatusesstring[]Optional; added with a benefit summary.
interviewStatsobjectOptional; controlled by includeInterviews, when interview data is available.
jobsCompanyFilterOptionsobject[]Optional; controlled by includeJobs.
rowsWrittenobjectOptional; 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:

FieldJSON type
primaryIndustry, bestProfile, overview, ceo, counts, links, coverPhotoobject
parentobject
officeAddresses, awards, bestPlacesToWork, bestLedCompanies, subsidiaries, siblingsobject[]

name is a string and is present in every saved record. Other profile scalars use these JSON types when present:

ScopeNumber fieldsString fieldsBoolean fields
Profile rootid, yearFounded, primaryIndustryIdshortName, headquarters, revenue, size, sizeCategory, website, type, activeStatus, approvalStatus, squareLogoUrl, regularLogoUrl, largeLogoUrlisValid
primaryIndustryindustryId, sectorIdindustryName, sectorNameโ€”
bestProfileidโ€”โ€”
overviewโ€”description, missionโ€”
ceoidname, title, photoUrlโ€”
countsbenefitCount, reviewCount, salaryCount, interviewCount, photoCount, globalJobCount.jobCountโ€”โ€”
linksโ€”benefitsUrl, interviewUrl, jobsUrl, overviewUrl, reviewsUrl, salariesUrlโ€”
coverPhotoโ€”hiResUrlโ€”
officeAddresses[]id, officeLocationId, country.id, country.continent.idaddressLine1, addressLine2, cityName, countryName, postalCode, administrativeAreaName1, country.name, country.continent.nameโ€”
awards[]yearname, sourcefeatured
bestPlacesToWork[]id, ranklistType, name, timePeriodisCurrent
bestLedCompanies[]id, rankname, timePeriodisCurrent

parent.employer, subsidiaries[].employer, and siblings[].employer use the same relationship shape:

Number fieldsString fieldsBoolean fields
id, ratings.overallRating, counts.reviewCount, counts.salaryCount, counts.globalJobCount.jobCountname, shortName, headquarters, squareLogoUrl, approvalStatusisValid
Ratings, demographics, and locations
ScopeNumber fieldsString fieldsOther fields
ratingsoverallRating, reviewCount, ceoRating, ceoRatingsCount, recommendToFriendRating, businessOutlookRating, cultureAndValuesRating, careerOpportunitiesRating, workLifeBalanceRating, seniorManagementRating, compensationAndBenefitsRating, diversityAndInclusionRatingโ€”ratedCeo: object or null
ratings.ratedCeoidname, title, regularPhoto, largePhotoโ€”
ratingCountDistributionValues under 1, 2, 3, 4, and 5; recommendToFriend.RECOMMEND; recommendToFriend.WONT_RECOMMENDโ€”overall, cultureAndValues, careerOpportunities, workLifeBalance, seniorManagement, compensationAndBenefits, diversityAndInclusion, and recommendToFriend are objects.
filteredReviewsCountByLang[]countisoLanguageโ€”
Rating counts at the record rootallReviewsCount, filteredReviewsCount, ratedReviewsCountโ€”โ€”
demographicRatings[]โ€”categorycategoryRatings: object[]
demographicRatings[].categoryRatings[]Rating fields listed for ratings, including reviewCountcategoryValueratings: object
reviewLocations[]idname, type; state and country are string or nullโ€”
officeLocations[]id, officeLocationId, country.id, country.continent.id, employerReviews.ratings.overallRatingaddressLine1, addressLine2, cityName, countryName, postalCode, administrativeAreaName1, country.name, country.continent.namecountry and employerReviews: object
Managed content, updates, and photos
ScopeNumber fieldsString fieldsBoolean fields and containers
employerManagedContent[]โ€”โ€”managedContent: object[]
managedContent[]idbody, type, titlemedia: object[]
managedContent[].media[]โ€”caption, source, mediaTypeโ€”
companyUpdates[]employerId, likes; id can be a number or stringtext, dateisLiked: boolean; media and category: object
companyUpdates[].mediaโ€”title, description, linkUrl, linkDomain, imageUrl, videoUrlโ€”
companyUpdates[].categoryidnameโ€”
photos[]photoIdcaption, 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.

ScopeNumber fieldsString fieldsBoolean fields and containers
salary itememployerId, basePayStatistics.mean, totalAdditionalPayStatistics.meanemployerName, payPeriodcurrency, employer, jobTitle, basePayStatistics, totalAdditionalPayStatistics, and totalPayStatistics: object
salary item: currencyidcodeโ€”
salary item: employerid, ratings.overallRating, counts.globalJobCount.jobCountname, shortName, squareLogoUrlratings and counts: object
salary item: jobTitleid, gocId, mgocIdtextโ€”
salary item: totalPayStatistics.percentiles[]valueidentโ€”
salaryMetaresultCount, numPagesโ€”queryLocation: object or null; truncatedByWindow: boolean
salaryMeta.queryLocationidname, typeโ€”
benefitCountries[]idnameโ€”
benefits[]rating can be a number or null; reviewCountcategory, nameverified: boolean
Benefit summary at the record rootbenefitsOverallRating and benefitsTotalReviews can be a number or nullโ€”benefitEmploymentStatuses: string[]
benefitReview itememployerId, id, ratingemployerName, createDate, userEnteredJobTitlecurrentJob: boolean; city: object; benefitComments: object[]
benefitReview item: cityโ€”name, state.name, metro.name, country.namestate, metro, and country: object
benefitReview item: benefitComments[]helpfulVotes, idcommentโ€”
Interviews

The interview item scopes are items of the interviews Dataset. interviewStats is a field of the company record.

ScopeNumber fieldsString fieldsBoolean fields and containers
interview itememployerId, id, countHelpfulemployerName, advice, difficulty, experience, negotiationDescription, outcome, processDescription, reviewDateTime, sourcefeatured: boolean; employer, jobTitle: object; employerResponses, userQuestions: object[]
interview item: employerโ€”name, squareLogoUrlโ€”
interview item: employerResponses[]โ€”response, responseDateTimeโ€”
interview item: jobTitleโ€”textโ€”
interview item: userQuestions[]answerCountquestionโ€”
interviewStatsdifficultySubmissionCount, difficultySum, filteredInterviewCount, totalInterviewCountโ€”interviewExperienceCounts, interviewObtainedChannelCounts: object[]; truncatedByWindow: boolean
interviewStats.interviewExperienceCounts[], interviewStats.interviewObtainedChannelCounts[]count, percentagetypeโ€”
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.

ScopeNumber fieldsString fieldsBoolean fields and containers
job itememployerIdemployerNamejob, header, overview: object
job item: joblistingIdjobTitleText, descriptionโ€”
job item: headerageInDays, categoryMgocId, sgocId, locId, rating, jobCountryIdgoc, normalizedJobTitle, locationName, locationType, employerNameFromSearch, payPeriod, salarySource, payCurrency, jobViewUrl, jobLink, applyUrl, serpUrlForJobListingeasyApply, expired, isSponsoredJob, isSponsoredEmployer: boolean; employer, coverPhoto, payPeriodAdjustedPay, urgencySignal, indeedJobAttribute: object or null; occupations: object[]; remoteWorkTypes: string[] or null
job item: header.employeridname, shortName, squareLogoUrlโ€”
job item: header.coverPhotoemployerId, sgocIdurlโ€”
job item: header.payPeriodAdjustedPayp10, p50, p90โ€”โ€”
job item: header.occupations[]โ€”keyโ€”
job item: header.urgencySignalnormalizedCountlabelKey, messageKeyโ€”
job item: header.indeedJobAttribute.extractedJobAttributes[]โ€”key, valueโ€”
job item: overview.primaryIndustryindustryId, sectorIdindustryName, sectorNameโ€”
jobsCompanyFilterOptions[]idname, 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: partial when a requested section does not complete. failedSections can contain ratings, demographicRatings, reviewLocations, officeLocations, employerManagedContent, companyUpdates, photos, benefits, benefitReviews, salaries, interviews, or jobs. 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 maxSearchResults and strictDomainMatch to limit website searches.
  • A maximum value of 0 collects 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.truncatedByWindow is true when Glassdoor reports more salaries than the Actor can read. The reported total is salaryMeta.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.truncatedByWindow is true. Compare rowsWritten.interviews with interviewStats.filteredInterviewCount. A run that reads more interviews takes more time.
  • Each job appears once in the jobs Dataset, even when Glassdoor lists it on more than one page, so rowsWritten.jobs can be lower than the number of jobs that Glassdoor reports.