{
  "data": {
    "id": "0MNxV9LZL72iuqVzo",
    "actId": "5lWwuQH8dZ6LpE4AU",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-12T08:06:24.193Z",
    "finishedAt": "2026-11-12T08:06:29.230Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 4953,
      "runTimeSecs": 4.953,
      "computeUnits": 0.005503333333333333,
      "imageSizeBytes": 358322176
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Glassdoor Employee Review Export Input\",\n  \"description\": \"Scrape employee reviews from Glassdoor companies by URL, name, or employer id. No login, cookie, or proxy setup is required.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"companies\": {\n      \"title\": \"Companies\",\n      \"type\": \"array\",\n      \"editor\": \"stringList\",\n      \"description\": \"Glassdoor company Review or Overview URLs, company names, or employer ids. Add one item per company. Example: https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm or Google or 9079.\",\n      \"default\": [],\n      \"prefill\": [\n        \"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"\n      ]\n    },\n    \"maxItems\": {\n      \"title\": \"Maximum reviews\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of reviews to save across all companies.\",\n      \"default\": 100,\n      \"prefill\": 3,\n      \"minimum\": 1,\n      \"maximum\": 50000\n    },\n    \"maxReviewsPerCompany\": {\n      \"title\": \"Maximum reviews per company\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum reviews to save for each company. Set to 0 for no per-company limit.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 50000\n    },\n    \"sortBy\": {\n      \"title\": \"Sort reviews by\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"description\": \"Order in which Glassdoor returns reviews.\",\n      \"enum\": [\n        \"mostRecent\",\n        \"mostRelevant\",\n        \"oldest\",\n        \"highestRated\",\n        \"lowestRated\",\n        \"mostRelevantClassic\"\n      ],\n      \"enumTitles\": [\n        \"Newest first\",\n        \"Most relevant\",\n        \"Oldest first\",\n        \"Highest rated\",\n        \"Lowest rated\",\n        \"Most relevant (classic)\"\n      ],\n      \"default\": \"mostRecent\",\n      \"prefill\": \"mostRecent\",\n      \"sectionCaption\": \"Review filters\",\n      \"sectionDescription\": \"Optional filters for the review export. When a date window is selected, sorting is forced to newest first.\"\n    },\n    \"location\": {\n      \"title\": \"Location\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"City, state, metro area, or country to filter reviews by, such as New York, NY or London. Leave empty for all locations. The value is resolved automatically through Glassdoor's location search.\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"jobFunction\": {\n      \"title\": \"Job function\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"description\": \"Only keep reviews whose job function matches this category.\",\n      \"enum\": [\n        \"any\",\n        \"1001\",\n        \"1002\",\n        \"1003\",\n        \"1004\",\n        \"1005\",\n        \"1006\",\n        \"1007\",\n        \"1008\",\n        \"1009\",\n        \"1010\",\n        \"1011\",\n        \"1012\",\n        \"1013\",\n        \"1014\",\n        \"1015\",\n        \"1016\",\n        \"1017\",\n        \"1018\",\n        \"1019\",\n        \"1020\",\n        \"1021\",\n        \"1022\",\n        \"1023\"\n      ],\n      \"enumTitles\": [\n        \"Any job function\",\n        \"Administrative\",\n        \"Arts & Design\",\n        \"Business\",\n        \"Consulting\",\n        \"Customer Services & Support\",\n        \"Education\",\n        \"Engineering\",\n        \"Finance & Accounting\",\n        \"Healthcare\",\n        \"Human Resources\",\n        \"Information Technology\",\n        \"Legal\",\n        \"Marketing\",\n        \"Media & Communications\",\n        \"Military & Protective Services\",\n        \"Operations\",\n        \"Other\",\n        \"Product & Project Management\",\n        \"Research & Science\",\n        \"Retail & Food Services\",\n        \"Sales\",\n        \"Skilled Labor & Manufacturing\",\n        \"Transportation\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"postedWithinDays\": {\n      \"title\": \"Posted within\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"description\": \"Only keep reviews posted within this many days. Uses newest-first order and stops when older reviews are reached.\",\n      \"enum\": [\n        \"any\",\n        \"7\",\n        \"30\",\n        \"90\",\n        \"180\",\n        \"365\"\n      ],\n      \"enumTitles\": [\n        \"Any time\",\n        \"Last 7 days\",\n        \"Last 30 days\",\n        \"Last 90 days\",\n        \"Last 6 months\",\n        \"Last 12 months\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"dateFrom\": {\n      \"title\": \"Date from\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"Keep reviews posted on or after this date (YYYY-MM-DD). Applied client-side and forces newest-first order.\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"dateTo\": {\n      \"title\": \"Date to\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"Keep reviews posted on or before this date (YYYY-MM-DD). Applied client-side and forces newest-first order.\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"rating\": {\n      \"title\": \"Star rating\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"description\": \"Only keep reviews with this exact overall star rating. Use ratings to select several stars.\",\n      \"enum\": [\n        \"any\",\n        \"1\",\n        \"2\",\n        \"3\",\n        \"4\",\n        \"5\"\n      ],\n      \"enumTitles\": [\n        \"Any rating\",\n        \"1 star\",\n        \"2 stars\",\n        \"3 stars\",\n        \"4 stars\",\n        \"5 stars\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"ratings\": {\n      \"title\": \"Star ratings\",\n      \"type\": \"array\",\n      \"editor\": \"stringList\",\n      \"description\": \"Keep reviews with any of these exact star ratings: 1, 2, 3, 4, 5. Leave empty to use the single rating filter.\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"employmentType\": {\n      \"title\": \"Employment type\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"description\": \"Only keep reviews with this employment status.\",\n      \"enum\": [\n        \"any\",\n        \"regular\",\n        \"part_time\",\n        \"intern\",\n        \"contract\",\n        \"freelance\",\n        \"temporary\"\n      ],\n      \"enumTitles\": [\n        \"Any employment type\",\n        \"Full-time (regular)\",\n        \"Part-time\",\n        \"Intern\",\n        \"Contract\",\n        \"Freelance\",\n        \"Temporary\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"employmentTypes\": {\n      \"title\": \"Employment types\",\n      \"type\": \"array\",\n      \"editor\": \"stringList\",\n      \"description\": \"Keep reviews with any of these employment statuses: regular, part_time, intern, contract, freelance, temporary. Leave empty to use the single employment type filter.\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"onlyCurrentEmployees\": {\n      \"title\": \"Current employees only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only keep reviews written by current employees.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"onlyWithEmployerResponses\": {\n      \"title\": \"Only with responses\",\n      \"type\": \"boolean\",\n      \"description\": \"Only keep reviews that have an official employer response.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"jobTitleKeywords\": {\n      \"title\": \"Job title keywords\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"Only keep reviews whose job title matches these words. Glassdoor may also return closely related titles, such as software developer for software engineer.\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"keyword\": {\n      \"title\": \"Review text keyword\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"Only keep reviews that mention this word or phrase.\",\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"language\": {\n      \"title\": \"Review language\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"description\": \"Language of the reviews to collect. Choose all languages to include every language Glassdoor exposes.\",\n      \"enum\": [\n        \"eng\",\n        \"fra\",\n        \"deu\",\n        \"nld\",\n        \"por\",\n        \"spa\",\n        \"ita\",\n        \"all\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"French\",\n        \"German\",\n        \"Dutch\",\n        \"Portuguese\",\n        \"Spanish\",\n        \"Italian\",\n        \"All languages\"\n      ],\n      \"default\": \"eng\",\n      \"prefill\": \"eng\"\n    },\n    \"languages\": {\n      \"title\": \"Review languages\",\n      \"type\": \"array\",\n      \"editor\": \"stringList\",\n      \"description\": \"Collect reviews in any of these languages: eng, fra, deu, nld, por, spa, ita. Leave empty to use the single language filter.\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"includeWorldwideReviews\": {\n      \"title\": \"Include worldwide reviews\",\n      \"type\": \"boolean\",\n      \"description\": \"Remove Glassdoor's default review criteria and include reviews from all countries. This raises the review ceiling but can add much older or non-local reviews.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeCompanySummary\": {\n      \"title\": \"Include company summaries\",\n      \"type\": \"boolean\",\n      \"description\": \"Add one companySummary record per company with saved, available, siteTotal, stopReason, logo, rating, and URL. Summary records are marked with recordType=companySummary.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeCompanyProfile\": {\n      \"title\": \"Include company profile\",\n      \"type\": \"boolean\",\n      \"description\": \"Add company profile fields such as website, headquarters, size, revenue, industry, CEO, and company sub-ratings to each review. This makes one extra request per company.\",\n      \"default\": false,\n      \"prefill\": false,\n      \"sectionCaption\": \"Company profile\",\n      \"sectionDescription\": \"Optional company context. Leave this off for the smallest and fastest run.\"\n    },\n    \"onlyNew\": {\n      \"title\": \"Only new reviews\",\n      \"type\": \"boolean\",\n      \"description\": \"Remember previously seen reviews in a named key-value store and emit only reviews that are new since the last run. Uses newest-first order and stops at the stored review-id watermark. Set the same monitorId on every scheduled run.\",\n      \"default\": false,\n      \"prefill\": false,\n      \"sectionCaption\": \"Incremental monitoring\",\n      \"sectionDescription\": \"Run on a schedule with onlyNew to receive new reviews only. The actor stores a per-company review-id watermark and seen set after each successful dataset push.\"\n    },\n    \"monitorId\": {\n      \"title\": \"Monitor id\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"Name of the named key-value store that holds monitoring state. Use the same value on every scheduled run. Default glassdoor-reviews.\",\n      \"default\": \"glassdoor-reviews\",\n      \"prefill\": \"glassdoor-reviews\"\n    },\n    \"emitUnchanged\": {\n      \"title\": \"Also emit unchanged reviews\",\n      \"type\": \"boolean\",\n      \"description\": \"With onlyNew, also emit previously seen reviews that have not changed. Each emitted review gets isNew=false and its original firstSeenAt. Leave off to avoid duplicate dataset records.\",\n      \"default\": false,\n      \"prefill\": false\n    }\n  }\n}",
    "readme": "# Glassdoor Review Export - Ratings, Pros, Cons & Replies\r\n\r\nCollect employee reviews from Glassdoor companies by URL, company name, or employer id. Get the overall rating and every sub-rating, pros, cons, advice to management, reviewer job title and location, employment status, helpful votes, language, employer responses, company logo, canonical review URLs, and optional company profile data. No Glassdoor login, cookie, or proxy setup is required. The actor escalates from direct requests to Apify datacenter and residential proxies only when Glassdoor blocks the session.\r\n\r\n## What this actor does\r\n\r\n- Accepts one or many Glassdoor company Review or Overview URLs, company names, or employer ids.\r\n- Reads Glassdoor's public review data through its own JSON endpoint, so it does not need a browser or a logged-in session.\r\n- Returns every review Glassdoor serves, including beyond the roughly 200 reviews the public review page shows.\r\n- Supports exact single or multi-star filtering, employment type(s), current employees only, employer responses only, keyword search, job-title keywords, job function, location, language selection, worldwide review coverage, a recent-date window, and client-side `dateFrom`/`dateTo` ranges.\r\n- Keeps the 25 fields from the previous version and adds canonical review URLs, company logo, language data, employer responses, company context, and optional firmographics.\r\n- Applies an exact post-filter when keyword and star rating are combined, because Glassdoor treats that server-side rating as a minimum, not an exact match.\r\n- Reports a completeness contract (`saved`, `available`, `siteTotal`, `stopReason`) in the run status and in the `RUN_SUMMARY` key-value record.\r\n- Supports incremental monitoring with `onlyNew` and a named `monitorId` state store: per-company review-id watermarks and seen sets, `isNew`/`firstSeenAt` output, optional `emitUnchanged`, and state updates only after a successful dataset push.\r\n- Resolves company and location names with exact/unique matching. Ambiguous or invalid values produce typed warnings instead of silently taking the first autocomplete row.\r\n- Omits fields that Glassdoor does not provide for a review instead of writing empty strings, nulls, or zero placeholders.\r\n- **Empty fields are omitted:** never null, empty strings or empty arrays/objects.\r\n\r\nTypical uses: employer-brand research, culture and sentiment analysis, HR benchmarking, due diligence, recruiting research, and building review datasets for analytics.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `companies` | string list | Any (prefill: Google Reviews URL) | Glassdoor Review or Overview URLs, company names, or employer ids. Add one item per company. |\r\n| `maxItems` | integer 1-50,000 | 100 | Maximum reviews to save across all companies. |\r\n| `maxReviewsPerCompany` | integer 0-50,000 | 0 | Maximum reviews per company. 0 means no per-company limit. |\r\n| `sortBy` | select | Newest first (`mostRecent`) | Newest first, most relevant, oldest first, highest rated, lowest rated, or classic relevance. |\r\n| `location` | text | empty | City, state, metro area, or country, such as New York, NY or London. Resolved automatically through Glassdoor's location search. |\r\n| `jobFunction` | select | Any job function | Administrative, Arts & Design, Business, Consulting, Customer Services & Support, Education, Engineering, Finance & Accounting, Healthcare, Human Resources, Information Technology, Legal, Marketing, Media & Communications, Military & Protective Services, Operations, Other, Product & Project Management, Research & Science, Retail & Food Services, Sales, Skilled Labor & Manufacturing, or Transportation. |\r\n| `postedWithinDays` | select | Any time | Keep only reviews from the last 7, 30, 90, 180, or 365 days. Sorting is forced to newest first. |\r\n| `dateFrom` | text | empty | Keep reviews posted on or after this date (`YYYY-MM-DD`). Applied client-side; sorting is forced to newest first. |\r\n| `dateTo` | text | empty | Keep reviews posted on or before this date (`YYYY-MM-DD`). Applied client-side; sorting is forced to newest first. |\r\n| `rating` | select | Any rating | Keep only reviews with an exact 1-5 star overall rating. |\r\n| `ratings` | string list | empty | Keep reviews with any of several exact star ratings. When set, it takes precedence over `rating`. |\r\n| `employmentType` | select | Any | Full-time (regular), part-time, intern, contract, freelance, or temporary. |\r\n| `employmentTypes` | string list | empty | Keep reviews with any of several employment statuses. When set, it takes precedence over `employmentType`. |\r\n| `onlyCurrentEmployees` | boolean | false | Keep only reviews from current employees. |\r\n| `onlyWithEmployerResponses` | boolean | false | Keep only reviews that have an official employer response. |\r\n| `jobTitleKeywords` | text | empty | Keep reviews whose job title matches these words. Glassdoor may include closely related titles. |\r\n| `keyword` | text | empty | Keep reviews that mention this word or phrase. Combined with a star rating, the actor applies an exact client-side rating filter. |\r\n| `language` | select | English | English, French, German, Dutch, Portuguese, Spanish, Italian, or all languages. |\r\n| `languages` | string list | empty | Collect reviews in any of several languages. When set, it takes precedence over `language`. |\r\n| `includeWorldwideReviews` | boolean | false | Remove Glassdoor's default review criteria and include reviews from all countries. |\r\n| `includeCompanySummary` | boolean | false | Add one `companySummary` record per company with saved, available, site total, stop reason, logo, rating, and URL. |\r\n| `includeCompanyProfile` | boolean | false | Add website, headquarters, size, revenue, industry, CEO, and company sub-ratings to each review. |\r\n| `onlyNew` | boolean | false | Emit only reviews that were not seen in a previous run. Stores a per-company review-id watermark and seen set in the named `monitorId` key-value store. Forces newest-first order. |\r\n| `monitorId` | string | `glassdoor-reviews` | Name of the key-value store that holds monitoring state. Use the same value on every scheduled run. |\r\n| `emitUnchanged` | boolean | false | With `onlyNew`, also emit previously seen reviews that have not changed. Each emitted review gets `isNew: false` and its original `firstSeenAt`. |\r\n\r\n### Example: one company by URL\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"],\r\n  \"maxItems\": 50,\r\n  \"sortBy\": \"mostRecent\"\r\n}\r\n```\r\n\r\n### Example: several companies by name or id\r\n\r\n```json\r\n{\r\n  \"companies\": [\"Microsoft\", \"Amazon\", \"9079\"],\r\n  \"maxItems\": 300,\r\n  \"maxReviewsPerCompany\": 100,\r\n  \"language\": \"eng\"\r\n}\r\n```\r\n\r\n### Example: recent five-star reviews from current employees\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"],\r\n  \"maxItems\": 100,\r\n  \"rating\": \"5\",\r\n  \"onlyCurrentEmployees\": true,\r\n  \"postedWithinDays\": \"90\"\r\n}\r\n```\r\n\r\n### Example: exact date range with several star ratings and languages\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"],\r\n  \"maxItems\": 200,\r\n  \"dateFrom\": \"2026-01-01\",\r\n  \"dateTo\": \"2026-06-30\",\r\n  \"ratings\": [\"1\", \"2\"],\r\n  \"languages\": [\"eng\", \"fra\"]\r\n}\r\n```\r\n\r\n### Example: New York engineers with employer responses\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"],\r\n  \"maxItems\": 50,\r\n  \"location\": \"New York, NY\",\r\n  \"jobFunction\": \"1007\",\r\n  \"onlyWithEmployerResponses\": true\r\n}\r\n```\r\n\r\n### Example: all languages, worldwide, with company profile\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Siemens-Reviews-E3510.htm\"],\r\n  \"maxItems\": 200,\r\n  \"language\": \"all\",\r\n  \"includeWorldwideReviews\": true,\r\n  \"includeCompanyProfile\": true\r\n}\r\n```\r\n\r\n### Example: scheduled incremental monitoring\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"],\r\n  \"maxItems\": 500,\r\n  \"onlyNew\": true,\r\n  \"monitorId\": \"google-reviews\"\r\n}\r\n```\r\n\r\n## Output\r\n\r\nEach dataset item is one review. The actor keeps these existing fields with the same names:\r\n\r\n`reviewId`, `reviewDate`, `title`, `pros`, `cons`, `advice`, `ratingOverall`, `ratingWorkLifeBalance`, `ratingCultureAndValues`, `ratingDiversityAndInclusion`, `ratingSeniorLeadership`, `ratingCareerOpportunities`, `ratingCompensationAndBenefits`, `ratingCeo`, `ratingBusinessOutlook`, `ratingRecommendToFriend`, `jobTitle`, `location`, `employmentStatus`, `isCurrentJob`, `lengthOfEmployment`, `countHelpful`, `countNotHelpful`, `companyName`, `companyId`.\r\n\r\nNew fields are added beside them:\r\n\r\n| Field | Description |\r\n|---|---|\r\n| `reviewUrl` | Canonical link to the company reviews page with this review's `#Review<id>` anchor. Built from Glassdoor's canonical Reviews URL, so non-ASCII company names such as L'Oréal and Nestlé stay valid. |\r\n| `companyLogo` | Company square logo URL, from the company profile or the review response. |\r\n| `jobTitleId` | Glassdoor's job-title id. |\r\n| `locationId` | Glassdoor's location id. |\r\n| `locationType` | Location type, such as `CITY`. |\r\n| `isFeatured` | Whether Glassdoor marked the review as featured. |\r\n| `languageId` | Review language bucket, such as `eng` or `fra`. |\r\n| `originalLanguageId` | Original language when Glassdoor exposes it. |\r\n| `summaryOriginal`, `prosOriginal`, `consOriginal`, `adviceOriginal` | Original text when Glassdoor exposes it. |\r\n| `translationMethod` | Translation method when Glassdoor exposes it. |\r\n| `hasEmployerResponse` | Whether the employer replied to the review. |\r\n| `employerResponses` | Employer replies, with response text, date, responder job title, and helpful count. |\r\n| `companyRating` | Company's overall rating. |\r\n| `companyReviewCount` | Company's total review count. |\r\n| `companyUrl` | Company's Glassdoor reviews page. |\r\n| `companyRatingDistribution` | Company's star distribution by rating category. |\r\n| `sourceDomain` | Glassdoor domain used for the data. |\r\n| `recordType` | `review` for review rows; `companySummary` for summary rows. |\r\n| `sourceUrl` | Canonical review URL (`reviewUrl`); for company summaries, the company reviews URL. |\r\n| `scrapedAt` | Run timestamp in UTC. |\r\n\r\nWhen `onlyNew` is on, each emitted review also gets these monitoring fields:\r\n\r\n| Field | Description |\r\n|---|---|\r\n| `isNew` | `true` when the review id was never seen by this monitor, `false` for a previously seen review emitted because `emitUnchanged` is on. |\r\n| `firstSeenAt` | UTC timestamp of the first run that saw this review. |\r\n| `lastSeenAt` | UTC timestamp of the current run that saw this review. |\r\n| `changed` | `true` when a previously seen review's tracked content changed since the stored snapshot. |\r\n| `lastChangedAt` | UTC timestamp of the first or latest detected content change. |\r\n\r\nWhen `includeCompanyProfile` is on, each review also gets `companyWebsite`, `companyHeadquarters`, `companySize`, `companyRevenue`, `companyType`, `companyFoundedYear`, `companyIndustry`, `companyCeo`, and `companySubRatings`.\r\n\r\n`companySubRatings` keeps the six category ratings on Glassdoor's 1-5 scale (`overall`, `workLifeBalance`, `cultureAndValues`, `diversityAndInclusion`, `seniorManagement`, `careerOpportunities`, `compensationAndBenefits`) and converts the three fraction fields to 0-100 percentages: `ceoApprovalPct`, `recommendToFriendPct`, and `businessOutlookPct`. A `scale` string documents both scales.\r\n\r\n`lengthOfEmployment` is Glassdoor's tenure bucket; `0` means less than one year, not missing. `ratingRecommendToFriend` uses Glassdoor's values such as `RECOMMEND`, `WONT_RECOMMEND` and `NO_OPINION` when present.\r\n\r\nMissing values are omitted. For example, a review without advice has no `advice` key, and a review without sub-ratings has no sub-rating keys. Booleans such as `isCurrentJob`, `isFeatured`, and `hasEmployerResponse` are always present.\r\n\r\n## Completeness and company summaries\r\n\r\nEvery run reports a completeness contract in the status message and in the `RUN_SUMMARY` key-value record:\r\n\r\n| Field | Meaning |\r\n|---|---|\r\n| `saved` | Reviews written to the dataset. |\r\n| `available` | Server-side review count for the exact filter set, when it is exact. `null` when a client-side filter (keyword + rating, multi-star, date window) makes the server count non-exact. |\r\n| `siteTotal` | Glassdoor's total review count across the processed companies. |\r\n| `stopReason` | Why scraping stopped: `maxItems`, `maxReviewsPerCompany`, `postedWithinDays`, `dateFrom`, `onlyNew`, `source exhausted`, `error`, or `completed`. |\r\n\r\nWhen `includeCompanySummary` is on, the actor also writes one record per company with `recordType: \"companySummary\"` and the same `saved`/`available`/`siteTotal`/`stopReason` fields plus company id, name, logo, rating, URL, and the resolved location. With `onlyNew`, summaries also include `newReviews`, `unchangedReviews`, `monitorId`, and the stored `watermark`. Filter on `recordType` to separate summaries from reviews.\r\n\r\n## Incremental monitoring\r\n\r\nSet `onlyNew` to run the actor on a schedule and receive only reviews that are new since the previous run. Monitoring state lives in a named key-value store whose name is `monitorId` (default `glassdoor-reviews`). Use the same `monitorId` on every run that belongs to the same monitor.\r\n\r\nHow it works:\r\n\r\n- Each company has its own state record with a numeric `reviewId` watermark and a `seen` set of review ids, first-seen timestamps, last-seen timestamps, and content hashes.\r\n- The first run emits all matching reviews (up to `maxItems`) as `isNew: true` and records their ids.\r\n- Later runs read newest first and stop as soon as they reach the stored watermark, so they do not page through the entire history. A run that stops this way reports `stopReason: \"onlyNew\"`.\r\n- A review is emitted only when its id is not in the seen set. Previously seen reviews are skipped by default, so they are not billed twice.\r\n- `emitUnchanged` re-emits previously seen reviews with `isNew: false`, their original `firstSeenAt`, and `changed` set when the tracked review content differs from the stored hash.\r\n- State is written only after the dataset push succeeds. If a push fails, the affected ids are not marked as seen, so the next run retries them.\r\n- `maxItems` and `maxReviewsPerCompany` stop the run early without advancing the watermark past unseen reviews. The next run resumes where the previous one stopped.\r\n- Monitoring state is tied to the current filter set (ratings, employment types, keyword, location, language, date window, and so on). Changing filters starts a fresh baseline for that company.\r\n\r\nOnly reviews above the stored watermark are read, so edits to older reviews are not detected unless `emitUnchanged` is used on a review that is re-encountered. To start over, use a new `monitorId` or delete the named key-value store.\r\n\r\n## How far back and how many reviews\r\n\r\nGlassdoor's public page shows only a slice of a company's reviews. This actor uses Glassdoor's review endpoint, which can return thousands of reviews. For Google, the actor reaches about 74,000 reviews, close to Glassdoor's own total. For smaller companies, it returns everything Glassdoor serves.\r\n\r\nGlassdoor still counts a small number of reviews it does not serve. The actor reports the available count and the site total in the run status, so you can see the gap instead of guessing. Set `language` to all (or list every `languages` value) and `includeWorldwideReviews` to true to reach the broadest set.\r\n\r\n## Languages and countries\r\n\r\nGlassdoor stores reviews in language buckets. Set `language` to collect English, French, German, Dutch, Portuguese, Spanish, Italian, or all languages, or list several values in `languages`. Region-specific Glassdoor URLs are accepted, but the data comes from Glassdoor's global review endpoint; the country domain alone does not create a separate review set. `sourceDomain` records the domain from the input URL.\r\n\r\n## Use cases\r\n\r\n- **Employer-brand and culture research** - compare pros, cons and sub-ratings across companies or locations.\r\n- **HR and recruiting benchmarking** - measure compensation, work-life balance and leadership sentiment by job function or tenure.\r\n- **Due diligence and investment research** - export structured review history, ratings and employer responses for analysis.\r\n- **Voice-of-employee monitoring** - schedule `onlyNew` runs and route new reviews to HR, ops or customer-experience teams.\r\n- **Labor-market datasets** - build review corpora with canonical URLs, language buckets and first-seen timestamps.\r\n\r\n## Data source and limitations\r\n\r\n- Data source: Glassdoor's public review and company endpoints.\r\n- No user credentials, cookies, or proxy configuration are required.\r\n- Reviewer names are not exposed by Glassdoor's public review data. The actor does not attempt to identify reviewers.\r\n- Employer responses are optional and appear only when Glassdoor provides them. Use onlyWithEmployerResponses to keep response-bearing reviews only.\r\n- Glassdoor does not expose original-language or translation text for the sampled reviews; those fields are omitted unless the source provides them.\r\n- Arbitrary date ranges are applied client-side, so very old ranges may require paging through newer reviews first.\r\n- Keyword + exact rating filtering is also client-side because Glassdoor treats the server rating as a minimum. Newest-first order may page through many non-matching reviews; highest-rated or lowest-rated order is faster for sparse exact ratings.\r\n- Company names are resolved through Glassdoor autocomplete with exact/unique matching. For ambiguous names, use the company URL or employer id.\r\n- Regional Glassdoor URLs are accepted for company resolution, but review data still comes from Glassdoor's global endpoint; `sourceDomain` records the input domain.\r\n- Monitoring state is stored in a named key-value store. Use the same `monitorId` across scheduled runs; a different id starts a fresh baseline. State is tied to the current filter set, and edits to reviews older than the stored watermark are not re-read.\r\n- Glassdoor can change its public endpoints without notice. The actor rotates sessions and escalates direct → datacenter → residential proxies on repeated blocks. If a run reports a block or an endpoint error, re-run later or contact support with the run id.\r\n## FAQ\r\n\r\n**Do I need a Glassdoor account or cookie?**\r\nNo. The actor reads public review data without a login, cookie, or user-supplied proxy.\r\n\r\n**Why did I get fewer reviews than `maxItems`?**\r\nThe company may have fewer reviews than requested, Glassdoor's filters may exclude some reviews, or the recent-date window may have been reached. The run status shows the stop reason and the available count out of the site total (for example, available 51,182 of 74,053).\r\n\r\n**Why are some fields missing on some reviews?**\r\nGlassdoor does not require reviewers to provide advice, tenure, sub-ratings, CEO approval, business outlook, or a response. Missing values are omitted, not filled with placeholders.\r\n\r\n**Can I filter by reviewer location or job function?**\r\nYes. Enter a city, state, metro area, or country in `location`; the actor resolves it through Glassdoor's location search before scraping. Select a `jobFunction` category to keep only that function. Ambiguous locations are reported with the chosen candidate and fallbacks, and a zero-result candidate falls back to the next one. If a location cannot be resolved at all, the actor warns and ignores the filter instead of failing the run.\r\n\r\n**Can I filter by an exact date range?**\r\nYes. Set `dateFrom` and `dateTo` (`YYYY-MM-DD`). Glassdoor's endpoint does not accept arbitrary date bounds, so the actor reads newest-first and applies the range client-side. It stops once reviews older than `dateFrom` are reached. `postedWithinDays` remains a shortcut for a recent window.\r\n\r\n**Can I filter by several star ratings, languages, or employment types?**\r\nYes. Use the `ratings`, `languages`, and `employmentTypes` lists. Multi-star and date filters are applied client-side, so the run status marks the server count as non-exact instead of claiming it is the final count.\r\n\r\n**Can I monitor only new reviews?**\r\nYes. Run the actor on a schedule with `onlyNew: true` and the same `monitorId`. The actor stores a per-company review-id watermark and seen set in the named key-value store, emits only reviews it has not seen before, and reports `stopReason: \"onlyNew\"` when it reaches the watermark. Set `emitUnchanged: true` to also receive previously seen reviews with `isNew: false` and change flags. Use a new `monitorId` to start a fresh baseline.\r\n\r\n**What happens with an ambiguous or invalid company or location?**\r\nThe actor no longer silently takes the first autocomplete row. Company names require an exact or unique match; ambiguous names are skipped with a warning that lists candidates. Location candidates are ranked (city/country before state), ambiguous choices are reported, and a zero-result location falls back to the next candidate. An unresolved location is ignored with a warning instead of failing the whole run.\r\n\r\n**Is this affiliated with Glassdoor?**\r\nNo. This actor collects public review data and is not affiliated with, endorsed by, or sponsored by Glassdoor.\r\n\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "glassdoor-employee-reviews-with-full-ratings",
      "title": "Glassdoor Review Export - Ratings, Pros, Cons & Replies",
      "description": "Get Glassdoor employee reviews for any company with overall and sub-category ratings, pros, cons, advice to management, job title and employment status.",
      "version": "1.0",
      "meta": {
        "templateId": "python-start"
      },
      "input": {
        "title": "Glassdoor Employee Review Export Input",
        "description": "Scrape employee reviews from Glassdoor companies by URL, name, or employer id. No login, cookie, or proxy setup is required.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "companies": {
            "title": "Companies",
            "type": "array",
            "editor": "stringList",
            "description": "Glassdoor company Review or Overview URLs, company names, or employer ids. Add one item per company. Example: https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm or Google or 9079.",
            "default": [],
            "prefill": [
              "https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm"
            ]
          },
          "maxItems": {
            "title": "Maximum reviews",
            "type": "integer",
            "description": "Maximum number of reviews to save across all companies.",
            "default": 100,
            "prefill": 3,
            "minimum": 1,
            "maximum": 50000
          },
          "maxReviewsPerCompany": {
            "title": "Maximum reviews per company",
            "type": "integer",
            "description": "Maximum reviews to save for each company. Set to 0 for no per-company limit.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 50000
          },
          "sortBy": {
            "title": "Sort reviews by",
            "type": "string",
            "editor": "select",
            "description": "Order in which Glassdoor returns reviews.",
            "enum": [
              "mostRecent",
              "mostRelevant",
              "oldest",
              "highestRated",
              "lowestRated",
              "mostRelevantClassic"
            ],
            "enumTitles": [
              "Newest first",
              "Most relevant",
              "Oldest first",
              "Highest rated",
              "Lowest rated",
              "Most relevant (classic)"
            ],
            "default": "mostRecent",
            "prefill": "mostRecent",
            "sectionCaption": "Review filters",
            "sectionDescription": "Optional filters for the review export. When a date window is selected, sorting is forced to newest first."
          },
          "location": {
            "title": "Location",
            "type": "string",
            "editor": "textfield",
            "description": "City, state, metro area, or country to filter reviews by, such as New York, NY or London. Leave empty for all locations. The value is resolved automatically through Glassdoor's location search.",
            "default": "",
            "prefill": ""
          },
          "jobFunction": {
            "title": "Job function",
            "type": "string",
            "editor": "select",
            "description": "Only keep reviews whose job function matches this category.",
            "enum": [
              "any",
              "1001",
              "1002",
              "1003",
              "1004",
              "1005",
              "1006",
              "1007",
              "1008",
              "1009",
              "1010",
              "1011",
              "1012",
              "1013",
              "1014",
              "1015",
              "1016",
              "1017",
              "1018",
              "1019",
              "1020",
              "1021",
              "1022",
              "1023"
            ],
            "enumTitles": [
              "Any job function",
              "Administrative",
              "Arts & Design",
              "Business",
              "Consulting",
              "Customer Services & Support",
              "Education",
              "Engineering",
              "Finance & Accounting",
              "Healthcare",
              "Human Resources",
              "Information Technology",
              "Legal",
              "Marketing",
              "Media & Communications",
              "Military & Protective Services",
              "Operations",
              "Other",
              "Product & Project Management",
              "Research & Science",
              "Retail & Food Services",
              "Sales",
              "Skilled Labor & Manufacturing",
              "Transportation"
            ],
            "default": "any",
            "prefill": "any"
          },
          "postedWithinDays": {
            "title": "Posted within",
            "type": "string",
            "editor": "select",
            "description": "Only keep reviews posted within this many days. Uses newest-first order and stops when older reviews are reached.",
            "enum": [
              "any",
              "7",
              "30",
              "90",
              "180",
              "365"
            ],
            "enumTitles": [
              "Any time",
              "Last 7 days",
              "Last 30 days",
              "Last 90 days",
              "Last 6 months",
              "Last 12 months"
            ],
            "default": "any",
            "prefill": "any"
          },
          "dateFrom": {
            "title": "Date from",
            "type": "string",
            "editor": "textfield",
            "description": "Keep reviews posted on or after this date (YYYY-MM-DD). Applied client-side and forces newest-first order.",
            "default": "",
            "prefill": ""
          },
          "dateTo": {
            "title": "Date to",
            "type": "string",
            "editor": "textfield",
            "description": "Keep reviews posted on or before this date (YYYY-MM-DD). Applied client-side and forces newest-first order.",
            "default": "",
            "prefill": ""
          },
          "rating": {
            "title": "Star rating",
            "type": "string",
            "editor": "select",
            "description": "Only keep reviews with this exact overall star rating. Use ratings to select several stars.",
            "enum": [
              "any",
              "1",
              "2",
              "3",
              "4",
              "5"
            ],
            "enumTitles": [
              "Any rating",
              "1 star",
              "2 stars",
              "3 stars",
              "4 stars",
              "5 stars"
            ],
            "default": "any",
            "prefill": "any"
          },
          "ratings": {
            "title": "Star ratings",
            "type": "array",
            "editor": "stringList",
            "description": "Keep reviews with any of these exact star ratings: 1, 2, 3, 4, 5. Leave empty to use the single rating filter.",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "employmentType": {
            "title": "Employment type",
            "type": "string",
            "editor": "select",
            "description": "Only keep reviews with this employment status.",
            "enum": [
              "any",
              "regular",
              "part_time",
              "intern",
              "contract",
              "freelance",
              "temporary"
            ],
            "enumTitles": [
              "Any employment type",
              "Full-time (regular)",
              "Part-time",
              "Intern",
              "Contract",
              "Freelance",
              "Temporary"
            ],
            "default": "any",
            "prefill": "any"
          },
          "employmentTypes": {
            "title": "Employment types",
            "type": "array",
            "editor": "stringList",
            "description": "Keep reviews with any of these employment statuses: regular, part_time, intern, contract, freelance, temporary. Leave empty to use the single employment type filter.",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "onlyCurrentEmployees": {
            "title": "Current employees only",
            "type": "boolean",
            "description": "Only keep reviews written by current employees.",
            "default": false,
            "prefill": false
          },
          "onlyWithEmployerResponses": {
            "title": "Only with responses",
            "type": "boolean",
            "description": "Only keep reviews that have an official employer response.",
            "default": false,
            "prefill": false
          },
          "jobTitleKeywords": {
            "title": "Job title keywords",
            "type": "string",
            "editor": "textfield",
            "description": "Only keep reviews whose job title matches these words. Glassdoor may also return closely related titles, such as software developer for software engineer.",
            "default": "",
            "prefill": ""
          },
          "keyword": {
            "title": "Review text keyword",
            "type": "string",
            "editor": "textfield",
            "description": "Only keep reviews that mention this word or phrase.",
            "default": "",
            "prefill": ""
          },
          "language": {
            "title": "Review language",
            "type": "string",
            "editor": "select",
            "description": "Language of the reviews to collect. Choose all languages to include every language Glassdoor exposes.",
            "enum": [
              "eng",
              "fra",
              "deu",
              "nld",
              "por",
              "spa",
              "ita",
              "all"
            ],
            "enumTitles": [
              "English",
              "French",
              "German",
              "Dutch",
              "Portuguese",
              "Spanish",
              "Italian",
              "All languages"
            ],
            "default": "eng",
            "prefill": "eng"
          },
          "languages": {
            "title": "Review languages",
            "type": "array",
            "editor": "stringList",
            "description": "Collect reviews in any of these languages: eng, fra, deu, nld, por, spa, ita. Leave empty to use the single language filter.",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "includeWorldwideReviews": {
            "title": "Include worldwide reviews",
            "type": "boolean",
            "description": "Remove Glassdoor's default review criteria and include reviews from all countries. This raises the review ceiling but can add much older or non-local reviews.",
            "default": false,
            "prefill": false
          },
          "includeCompanySummary": {
            "title": "Include company summaries",
            "type": "boolean",
            "description": "Add one companySummary record per company with saved, available, siteTotal, stopReason, logo, rating, and URL. Summary records are marked with recordType=companySummary.",
            "default": false,
            "prefill": false
          },
          "includeCompanyProfile": {
            "title": "Include company profile",
            "type": "boolean",
            "description": "Add company profile fields such as website, headquarters, size, revenue, industry, CEO, and company sub-ratings to each review. This makes one extra request per company.",
            "default": false,
            "prefill": false,
            "sectionCaption": "Company profile",
            "sectionDescription": "Optional company context. Leave this off for the smallest and fastest run."
          },
          "onlyNew": {
            "title": "Only new reviews",
            "type": "boolean",
            "description": "Remember previously seen reviews in a named key-value store and emit only reviews that are new since the last run. Uses newest-first order and stops at the stored review-id watermark. Set the same monitorId on every scheduled run.",
            "default": false,
            "prefill": false,
            "sectionCaption": "Incremental monitoring",
            "sectionDescription": "Run on a schedule with onlyNew to receive new reviews only. The actor stores a per-company review-id watermark and seen set after each successful dataset push."
          },
          "monitorId": {
            "title": "Monitor id",
            "type": "string",
            "editor": "textfield",
            "description": "Name of the named key-value store that holds monitoring state. Use the same value on every scheduled run. Default glassdoor-reviews.",
            "default": "glassdoor-reviews",
            "prefill": "glassdoor-reviews"
          },
          "emitUnchanged": {
            "title": "Also emit unchanged reviews",
            "type": "boolean",
            "description": "With onlyNew, also emit previously seen reviews that have not changed. Each emitted review gets isNew=false and its original firstSeenAt. Leave off to avoid duplicate dataset records.",
            "default": false,
            "prefill": false
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Glassdoor Employee Reviews Output",
        "description": "Employee reviews scraped from Glassdoor with ratings, pros and cons, reviewer context, language data, employer responses, company context, company logo, and canonical review URLs. With onlyNew, reviews also carry isNew, firstSeenAt, lastSeenAt, changed, and lastChangedAt monitoring fields. The run status and RUN_SUMMARY key-value record expose the saved/available/siteTotal/stopReason completeness contract, plus monitorId/newReviews/unchangedReviews when monitoring is on. Set includeCompanySummary to add companySummary records to the same dataset.",
        "properties": {
          "reviews": {
            "type": "string",
            "title": "Company Reviews",
            "description": "Dataset containing one record per Glassdoor employee review.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "readme": "# Glassdoor Review Export - Ratings, Pros, Cons & Replies\r\n\r\nCollect employee reviews from Glassdoor companies by URL, company name, or employer id. Get the overall rating and every sub-rating, pros, cons, advice to management, reviewer job title and location, employment status, helpful votes, language, employer responses, company logo, canonical review URLs, and optional company profile data. No Glassdoor login, cookie, or proxy setup is required. The actor escalates from direct requests to Apify datacenter and residential proxies only when Glassdoor blocks the session.\r\n\r\n## What this actor does\r\n\r\n- Accepts one or many Glassdoor company Review or Overview URLs, company names, or employer ids.\r\n- Reads Glassdoor's public review data through its own JSON endpoint, so it does not need a browser or a logged-in session.\r\n- Returns every review Glassdoor serves, including beyond the roughly 200 reviews the public review page shows.\r\n- Supports exact single or multi-star filtering, employment type(s), current employees only, employer responses only, keyword search, job-title keywords, job function, location, language selection, worldwide review coverage, a recent-date window, and client-side `dateFrom`/`dateTo` ranges.\r\n- Keeps the 25 fields from the previous version and adds canonical review URLs, company logo, language data, employer responses, company context, and optional firmographics.\r\n- Applies an exact post-filter when keyword and star rating are combined, because Glassdoor treats that server-side rating as a minimum, not an exact match.\r\n- Reports a completeness contract (`saved`, `available`, `siteTotal`, `stopReason`) in the run status and in the `RUN_SUMMARY` key-value record.\r\n- Supports incremental monitoring with `onlyNew` and a named `monitorId` state store: per-company review-id watermarks and seen sets, `isNew`/`firstSeenAt` output, optional `emitUnchanged`, and state updates only after a successful dataset push.\r\n- Resolves company and location names with exact/unique matching. Ambiguous or invalid values produce typed warnings instead of silently taking the first autocomplete row.\r\n- Omits fields that Glassdoor does not provide for a review instead of writing empty strings, nulls, or zero placeholders.\r\n- **Empty fields are omitted:** never null, empty strings or empty arrays/objects.\r\n\r\nTypical uses: employer-brand research, culture and sentiment analysis, HR benchmarking, due diligence, recruiting research, and building review datasets for analytics.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `companies` | string list | Any (prefill: Google Reviews URL) | Glassdoor Review or Overview URLs, company names, or employer ids. Add one item per company. |\r\n| `maxItems` | integer 1-50,000 | 100 | Maximum reviews to save across all companies. |\r\n| `maxReviewsPerCompany` | integer 0-50,000 | 0 | Maximum reviews per company. 0 means no per-company limit. |\r\n| `sortBy` | select | Newest first (`mostRecent`) | Newest first, most relevant, oldest first, highest rated, lowest rated, or classic relevance. |\r\n| `location` | text | empty | City, state, metro area, or country, such as New York, NY or London. Resolved automatically through Glassdoor's location search. |\r\n| `jobFunction` | select | Any job function | Administrative, Arts & Design, Business, Consulting, Customer Services & Support, Education, Engineering, Finance & Accounting, Healthcare, Human Resources, Information Technology, Legal, Marketing, Media & Communications, Military & Protective Services, Operations, Other, Product & Project Management, Research & Science, Retail & Food Services, Sales, Skilled Labor & Manufacturing, or Transportation. |\r\n| `postedWithinDays` | select | Any time | Keep only reviews from the last 7, 30, 90, 180, or 365 days. Sorting is forced to newest first. |\r\n| `dateFrom` | text | empty | Keep reviews posted on or after this date (`YYYY-MM-DD`). Applied client-side; sorting is forced to newest first. |\r\n| `dateTo` | text | empty | Keep reviews posted on or before this date (`YYYY-MM-DD`). Applied client-side; sorting is forced to newest first. |\r\n| `rating` | select | Any rating | Keep only reviews with an exact 1-5 star overall rating. |\r\n| `ratings` | string list | empty | Keep reviews with any of several exact star ratings. When set, it takes precedence over `rating`. |\r\n| `employmentType` | select | Any | Full-time (regular), part-time, intern, contract, freelance, or temporary. |\r\n| `employmentTypes` | string list | empty | Keep reviews with any of several employment statuses. When set, it takes precedence over `employmentType`. |\r\n| `onlyCurrentEmployees` | boolean | false | Keep only reviews from current employees. |\r\n| `onlyWithEmployerResponses` | boolean | false | Keep only reviews that have an official employer response. |\r\n| `jobTitleKeywords` | text | empty | Keep reviews whose job title matches these words. Glassdoor may include closely related titles. |\r\n| `keyword` | text | empty | Keep reviews that mention this word or phrase. Combined with a star rating, the actor applies an exact client-side rating filter. |\r\n| `language` | select | English | English, French, German, Dutch, Portuguese, Spanish, Italian, or all languages. |\r\n| `languages` | string list | empty | Collect reviews in any of several languages. When set, it takes precedence over `language`. |\r\n| `includeWorldwideReviews` | boolean | false | Remove Glassdoor's default review criteria and include reviews from all countries. |\r\n| `includeCompanySummary` | boolean | false | Add one `companySummary` record per company with saved, available, site total, stop reason, logo, rating, and URL. |\r\n| `includeCompanyProfile` | boolean | false | Add website, headquarters, size, revenue, industry, CEO, and company sub-ratings to each review. |\r\n| `onlyNew` | boolean | false | Emit only reviews that were not seen in a previous run. Stores a per-company review-id watermark and seen set in the named `monitorId` key-value store. Forces newest-first order. |\r\n| `monitorId` | string | `glassdoor-reviews` | Name of the key-value store that holds monitoring state. Use the same value on every scheduled run. |\r\n| `emitUnchanged` | boolean | false | With `onlyNew`, also emit previously seen reviews that have not changed. Each emitted review gets `isNew: false` and its original `firstSeenAt`. |\r\n\r\n### Example: one company by URL\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"],\r\n  \"maxItems\": 50,\r\n  \"sortBy\": \"mostRecent\"\r\n}\r\n```\r\n\r\n### Example: several companies by name or id\r\n\r\n```json\r\n{\r\n  \"companies\": [\"Microsoft\", \"Amazon\", \"9079\"],\r\n  \"maxItems\": 300,\r\n  \"maxReviewsPerCompany\": 100,\r\n  \"language\": \"eng\"\r\n}\r\n```\r\n\r\n### Example: recent five-star reviews from current employees\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"],\r\n  \"maxItems\": 100,\r\n  \"rating\": \"5\",\r\n  \"onlyCurrentEmployees\": true,\r\n  \"postedWithinDays\": \"90\"\r\n}\r\n```\r\n\r\n### Example: exact date range with several star ratings and languages\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"],\r\n  \"maxItems\": 200,\r\n  \"dateFrom\": \"2026-01-01\",\r\n  \"dateTo\": \"2026-06-30\",\r\n  \"ratings\": [\"1\", \"2\"],\r\n  \"languages\": [\"eng\", \"fra\"]\r\n}\r\n```\r\n\r\n### Example: New York engineers with employer responses\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"],\r\n  \"maxItems\": 50,\r\n  \"location\": \"New York, NY\",\r\n  \"jobFunction\": \"1007\",\r\n  \"onlyWithEmployerResponses\": true\r\n}\r\n```\r\n\r\n### Example: all languages, worldwide, with company profile\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Siemens-Reviews-E3510.htm\"],\r\n  \"maxItems\": 200,\r\n  \"language\": \"all\",\r\n  \"includeWorldwideReviews\": true,\r\n  \"includeCompanyProfile\": true\r\n}\r\n```\r\n\r\n### Example: scheduled incremental monitoring\r\n\r\n```json\r\n{\r\n  \"companies\": [\"https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm\"],\r\n  \"maxItems\": 500,\r\n  \"onlyNew\": true,\r\n  \"monitorId\": \"google-reviews\"\r\n}\r\n```\r\n\r\n## Output\r\n\r\nEach dataset item is one review. The actor keeps these existing fields with the same names:\r\n\r\n`reviewId`, `reviewDate`, `title`, `pros`, `cons`, `advice`, `ratingOverall`, `ratingWorkLifeBalance`, `ratingCultureAndValues`, `ratingDiversityAndInclusion`, `ratingSeniorLeadership`, `ratingCareerOpportunities`, `ratingCompensationAndBenefits`, `ratingCeo`, `ratingBusinessOutlook`, `ratingRecommendToFriend`, `jobTitle`, `location`, `employmentStatus`, `isCurrentJob`, `lengthOfEmployment`, `countHelpful`, `countNotHelpful`, `companyName`, `companyId`.\r\n\r\nNew fields are added beside them:\r\n\r\n| Field | Description |\r\n|---|---|\r\n| `reviewUrl` | Canonical link to the company reviews page with this review's `#Review<id>` anchor. Built from Glassdoor's canonical Reviews URL, so non-ASCII company names such as L'Oréal and Nestlé stay valid. |\r\n| `companyLogo` | Company square logo URL, from the company profile or the review response. |\r\n| `jobTitleId` | Glassdoor's job-title id. |\r\n| `locationId` | Glassdoor's location id. |\r\n| `locationType` | Location type, such as `CITY`. |\r\n| `isFeatured` | Whether Glassdoor marked the review as featured. |\r\n| `languageId` | Review language bucket, such as `eng` or `fra`. |\r\n| `originalLanguageId` | Original language when Glassdoor exposes it. |\r\n| `summaryOriginal`, `prosOriginal`, `consOriginal`, `adviceOriginal` | Original text when Glassdoor exposes it. |\r\n| `translationMethod` | Translation method when Glassdoor exposes it. |\r\n| `hasEmployerResponse` | Whether the employer replied to the review. |\r\n| `employerResponses` | Employer replies, with response text, date, responder job title, and helpful count. |\r\n| `companyRating` | Company's overall rating. |\r\n| `companyReviewCount` | Company's total review count. |\r\n| `companyUrl` | Company's Glassdoor reviews page. |\r\n| `companyRatingDistribution` | Company's star distribution by rating category. |\r\n| `sourceDomain` | Glassdoor domain used for the data. |\r\n| `recordType` | `review` for review rows; `companySummary` for summary rows. |\r\n| `sourceUrl` | Canonical review URL (`reviewUrl`); for company summaries, the company reviews URL. |\r\n| `scrapedAt` | Run timestamp in UTC. |\r\n\r\nWhen `onlyNew` is on, each emitted review also gets these monitoring fields:\r\n\r\n| Field | Description |\r\n|---|---|\r\n| `isNew` | `true` when the review id was never seen by this monitor, `false` for a previously seen review emitted because `emitUnchanged` is on. |\r\n| `firstSeenAt` | UTC timestamp of the first run that saw this review. |\r\n| `lastSeenAt` | UTC timestamp of the current run that saw this review. |\r\n| `changed` | `true` when a previously seen review's tracked content changed since the stored snapshot. |\r\n| `lastChangedAt` | UTC timestamp of the first or latest detected content change. |\r\n\r\nWhen `includeCompanyProfile` is on, each review also gets `companyWebsite`, `companyHeadquarters`, `companySize`, `companyRevenue`, `companyType`, `companyFoundedYear`, `companyIndustry`, `companyCeo`, and `companySubRatings`.\r\n\r\n`companySubRatings` keeps the six category ratings on Glassdoor's 1-5 scale (`overall`, `workLifeBalance`, `cultureAndValues`, `diversityAndInclusion`, `seniorManagement`, `careerOpportunities`, `compensationAndBenefits`) and converts the three fraction fields to 0-100 percentages: `ceoApprovalPct`, `recommendToFriendPct`, and `businessOutlookPct`. A `scale` string documents both scales.\r\n\r\n`lengthOfEmployment` is Glassdoor's tenure bucket; `0` means less than one year, not missing. `ratingRecommendToFriend` uses Glassdoor's values such as `RECOMMEND`, `WONT_RECOMMEND` and `NO_OPINION` when present.\r\n\r\nMissing values are omitted. For example, a review without advice has no `advice` key, and a review without sub-ratings has no sub-rating keys. Booleans such as `isCurrentJob`, `isFeatured`, and `hasEmployerResponse` are always present.\r\n\r\n## Completeness and company summaries\r\n\r\nEvery run reports a completeness contract in the status message and in the `RUN_SUMMARY` key-value record:\r\n\r\n| Field | Meaning |\r\n|---|---|\r\n| `saved` | Reviews written to the dataset. |\r\n| `available` | Server-side review count for the exact filter set, when it is exact. `null` when a client-side filter (keyword + rating, multi-star, date window) makes the server count non-exact. |\r\n| `siteTotal` | Glassdoor's total review count across the processed companies. |\r\n| `stopReason` | Why scraping stopped: `maxItems`, `maxReviewsPerCompany`, `postedWithinDays`, `dateFrom`, `onlyNew`, `source exhausted`, `error`, or `completed`. |\r\n\r\nWhen `includeCompanySummary` is on, the actor also writes one record per company with `recordType: \"companySummary\"` and the same `saved`/`available`/`siteTotal`/`stopReason` fields plus company id, name, logo, rating, URL, and the resolved location. With `onlyNew`, summaries also include `newReviews`, `unchangedReviews`, `monitorId`, and the stored `watermark`. Filter on `recordType` to separate summaries from reviews.\r\n\r\n## Incremental monitoring\r\n\r\nSet `onlyNew` to run the actor on a schedule and receive only reviews that are new since the previous run. Monitoring state lives in a named key-value store whose name is `monitorId` (default `glassdoor-reviews`). Use the same `monitorId` on every run that belongs to the same monitor.\r\n\r\nHow it works:\r\n\r\n- Each company has its own state record with a numeric `reviewId` watermark and a `seen` set of review ids, first-seen timestamps, last-seen timestamps, and content hashes.\r\n- The first run emits all matching reviews (up to `maxItems`) as `isNew: true` and records their ids.\r\n- Later runs read newest first and stop as soon as they reach the stored watermark, so they do not page through the entire history. A run that stops this way reports `stopReason: \"onlyNew\"`.\r\n- A review is emitted only when its id is not in the seen set. Previously seen reviews are skipped by default, so they are not billed twice.\r\n- `emitUnchanged` re-emits previously seen reviews with `isNew: false`, their original `firstSeenAt`, and `changed` set when the tracked review content differs from the stored hash.\r\n- State is written only after the dataset push succeeds. If a push fails, the affected ids are not marked as seen, so the next run retries them.\r\n- `maxItems` and `maxReviewsPerCompany` stop the run early without advancing the watermark past unseen reviews. The next run resumes where the previous one stopped.\r\n- Monitoring state is tied to the current filter set (ratings, employment types, keyword, location, language, date window, and so on). Changing filters starts a fresh baseline for that company.\r\n\r\nOnly reviews above the stored watermark are read, so edits to older reviews are not detected unless `emitUnchanged` is used on a review that is re-encountered. To start over, use a new `monitorId` or delete the named key-value store.\r\n\r\n## How far back and how many reviews\r\n\r\nGlassdoor's public page shows only a slice of a company's reviews. This actor uses Glassdoor's review endpoint, which can return thousands of reviews. For Google, the actor reaches about 74,000 reviews, close to Glassdoor's own total. For smaller companies, it returns everything Glassdoor serves.\r\n\r\nGlassdoor still counts a small number of reviews it does not serve. The actor reports the available count and the site total in the run status, so you can see the gap instead of guessing. Set `language` to all (or list every `languages` value) and `includeWorldwideReviews` to true to reach the broadest set.\r\n\r\n## Languages and countries\r\n\r\nGlassdoor stores reviews in language buckets. Set `language` to collect English, French, German, Dutch, Portuguese, Spanish, Italian, or all languages, or list several values in `languages`. Region-specific Glassdoor URLs are accepted, but the data comes from Glassdoor's global review endpoint; the country domain alone does not create a separate review set. `sourceDomain` records the domain from the input URL.\r\n\r\n## Use cases\r\n\r\n- **Employer-brand and culture research** - compare pros, cons and sub-ratings across companies or locations.\r\n- **HR and recruiting benchmarking** - measure compensation, work-life balance and leadership sentiment by job function or tenure.\r\n- **Due diligence and investment research** - export structured review history, ratings and employer responses for analysis.\r\n- **Voice-of-employee monitoring** - schedule `onlyNew` runs and route new reviews to HR, ops or customer-experience teams.\r\n- **Labor-market datasets** - build review corpora with canonical URLs, language buckets and first-seen timestamps.\r\n\r\n## Data source and limitations\r\n\r\n- Data source: Glassdoor's public review and company endpoints.\r\n- No user credentials, cookies, or proxy configuration are required.\r\n- Reviewer names are not exposed by Glassdoor's public review data. The actor does not attempt to identify reviewers.\r\n- Employer responses are optional and appear only when Glassdoor provides them. Use onlyWithEmployerResponses to keep response-bearing reviews only.\r\n- Glassdoor does not expose original-language or translation text for the sampled reviews; those fields are omitted unless the source provides them.\r\n- Arbitrary date ranges are applied client-side, so very old ranges may require paging through newer reviews first.\r\n- Keyword + exact rating filtering is also client-side because Glassdoor treats the server rating as a minimum. Newest-first order may page through many non-matching reviews; highest-rated or lowest-rated order is faster for sparse exact ratings.\r\n- Company names are resolved through Glassdoor autocomplete with exact/unique matching. For ambiguous names, use the company URL or employer id.\r\n- Regional Glassdoor URLs are accepted for company resolution, but review data still comes from Glassdoor's global endpoint; `sourceDomain` records the input domain.\r\n- Monitoring state is stored in a named key-value store. Use the same `monitorId` across scheduled runs; a different id starts a fresh baseline. State is tied to the current filter set, and edits to reviews older than the stored watermark are not re-read.\r\n- Glassdoor can change its public endpoints without notice. The actor rotates sessions and escalates direct → datacenter → residential proxies on repeated blocks. If a run reports a block or an endpoint error, re-run later or contact support with the run id.\r\n## FAQ\r\n\r\n**Do I need a Glassdoor account or cookie?**\r\nNo. The actor reads public review data without a login, cookie, or user-supplied proxy.\r\n\r\n**Why did I get fewer reviews than `maxItems`?**\r\nThe company may have fewer reviews than requested, Glassdoor's filters may exclude some reviews, or the recent-date window may have been reached. The run status shows the stop reason and the available count out of the site total (for example, available 51,182 of 74,053).\r\n\r\n**Why are some fields missing on some reviews?**\r\nGlassdoor does not require reviewers to provide advice, tenure, sub-ratings, CEO approval, business outlook, or a response. Missing values are omitted, not filled with placeholders.\r\n\r\n**Can I filter by reviewer location or job function?**\r\nYes. Enter a city, state, metro area, or country in `location`; the actor resolves it through Glassdoor's location search before scraping. Select a `jobFunction` category to keep only that function. Ambiguous locations are reported with the chosen candidate and fallbacks, and a zero-result candidate falls back to the next one. If a location cannot be resolved at all, the actor warns and ignores the filter instead of failing the run.\r\n\r\n**Can I filter by an exact date range?**\r\nYes. Set `dateFrom` and `dateTo` (`YYYY-MM-DD`). Glassdoor's endpoint does not accept arbitrary date bounds, so the actor reads newest-first and applies the range client-side. It stops once reviews older than `dateFrom` are reached. `postedWithinDays` remains a shortcut for a recent window.\r\n\r\n**Can I filter by several star ratings, languages, or employment types?**\r\nYes. Use the `ratings`, `languages`, and `employmentTypes` lists. Multi-star and date filters are applied client-side, so the run status marks the server count as non-exact instead of claiming it is the final count.\r\n\r\n**Can I monitor only new reviews?**\r\nYes. Run the actor on a schedule with `onlyNew: true` and the same `monitorId`. The actor stores a per-company review-id watermark and seen set in the named key-value store, emits only reviews it has not seen before, and reports `stopReason: \"onlyNew\"` when it reaches the watermark. Set `emitUnchanged: true` to also receive previously seen reviews with `isNew: false` and change flags. Use a new `monitorId` to start a fresh baseline.\r\n\r\n**What happens with an ambiguous or invalid company or location?**\r\nThe actor no longer silently takes the first autocomplete row. Company names require an exact or unique match; ambiguous names are skipped with a warning that lists candidates. Location candidates are ranked (city/country before state), ambiguous choices are reported, and a zero-result location falls back to the next candidate. An unresolved location is ignored with a warning instead of failing the whole run.\r\n\r\n**Is this affiliated with Glassdoor?**\r\nNo. This actor collects public review data and is not affiliated with, endorsed by, or sponsored by Glassdoor.\r\n\r\n",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Glassdoor Company Reviews",
          "views": {
            "overview": {
              "title": "Review Overview",
              "transformation": {
                "fields": [
                  "title",
                  "ratingOverall",
                  "pros",
                  "cons",
                  "jobTitle",
                  "location",
                  "reviewDate",
                  "companyName",
                  "companyLogo",
                  "languageId",
                  "companyRating",
                  "reviewUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "ratingOverall": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "pros": {
                    "label": "Pros",
                    "format": "text"
                  },
                  "cons": {
                    "label": "Cons",
                    "format": "text"
                  },
                  "jobTitle": {
                    "label": "Job Title",
                    "format": "text"
                  },
                  "location": {
                    "label": "Location",
                    "format": "text"
                  },
                  "reviewDate": {
                    "label": "Date",
                    "format": "text"
                  },
                  "companyName": {
                    "label": "Company",
                    "format": "text"
                  },
                  "companyLogo": {
                    "label": "Company Logo",
                    "format": "image"
                  },
                  "languageId": {
                    "label": "Language",
                    "format": "text"
                  },
                  "companyRating": {
                    "label": "Company Rating",
                    "format": "number"
                  },
                  "reviewUrl": {
                    "label": "Review URL",
                    "format": "link"
                  }
                }
              }
            },
            "monitoring": {
              "title": "Monitoring",
              "transformation": {
                "fields": [
                  "isNew",
                  "changed",
                  "firstSeenAt",
                  "lastSeenAt",
                  "lastChangedAt",
                  "reviewDate",
                  "title",
                  "ratingOverall",
                  "companyName",
                  "jobTitle",
                  "location",
                  "reviewUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "isNew": {
                    "label": "New",
                    "format": "boolean"
                  },
                  "changed": {
                    "label": "Changed",
                    "format": "boolean"
                  },
                  "firstSeenAt": {
                    "label": "First Seen",
                    "format": "text"
                  },
                  "lastSeenAt": {
                    "label": "Last Seen",
                    "format": "text"
                  },
                  "lastChangedAt": {
                    "label": "Last Changed",
                    "format": "text"
                  },
                  "reviewDate": {
                    "label": "Review Date",
                    "format": "text"
                  },
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "ratingOverall": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "companyName": {
                    "label": "Company",
                    "format": "text"
                  },
                  "jobTitle": {
                    "label": "Job Title",
                    "format": "text"
                  },
                  "location": {
                    "label": "Location",
                    "format": "text"
                  },
                  "reviewUrl": {
                    "label": "Review URL",
                    "format": "link"
                  }
                }
              }
            }
          }
        }
      },
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 1024
      }
    },
    "buildNumber": "1.0.8",
    "imageDigest": "2fd125b80edf9918f62066087232e92c9a04b9919b7bd2c4ae11c914a9495ec5",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.005503333333333333
    }
  }
}