# Indeed Company Reviews Scraper (`mina_safwat/indeed-company-reviews-scraper`) Actor

Scrapes employee reviews from Indeed company pages on any Indeed country site: ratings, titles, text, pros and cons, job titles, locations, dates, helpful votes and sub-ratings, with each company's overall rating.

- **URL**: https://apify.com/mina_safwat/indeed-company-reviews-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Indeed Company Reviews Scraper do?

**Indeed Company Reviews Scraper** collects **employee reviews from Indeed
company pages**: the star rating, review title and text, **pros and cons**,
the reviewer's **job title, location and current or former status**, the
**date**, helpful votes and the five **sub-ratings** (work-life balance, pay
and benefits, job security and advancement, management, culture). Every row
also carries the company's **overall rating and total review count**.

It works on **every Indeed country site**: www.indeed.com, uk.indeed.com,
de.indeed.com, fr.indeed.com, ca.indeed.com, jp.indeed.com and the rest. Paste
a company link or just its name and click **Start**: the prefilled run returns
20 Google reviews in about 10 seconds. Because it runs on the Apify platform,
you also get API access, scheduled runs, integrations (Google Sheets, Make,
Zapier, webhooks), run monitoring and proxy rotation, which matters here
because [Indeed](https://www.indeed.com) checks every visitor for bots.

### Why scrape Indeed company reviews?

- **Employer branding**: follow what your own employees say, by job title,
  location and topic, and see how your rating moves over time.
- **Competitor and talent research**: compare employers on pay, management
  and work-life balance before you hire from them or against them.
- **Investment and market research**: employee sentiment is an early signal
  of trouble or growth at a company.
- **HR analytics and AI datasets**: thousands of labelled reviews with
  ratings, pros and cons for sentiment analysis or model training.

### How to scrape Indeed company reviews

1. Open the company on Indeed, for example `https://www.indeed.com/cmp/Google`,
   and copy the address. The **Reviews** tab link works too. You can also
   type just the name that appears after `/cmp/`, such as `Starbucks`.
2. Optionally, use Indeed's own filters first (job title, location, topic,
   language) and copy the filtered address: those filters are kept.
3. Paste one link per line into **Indeed company links**.
4. Set **Max reviews per company** (0 means all of them) and the sort order.
5. Click **Start**, then download the results when the run finishes.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `companyUrls` | list of links or names | (required) | Indeed `/cmp/` links on any country site, or bare company names. Plain strings and `{"url": "..."}` objects both work, with or without `https://`. |
| `maxReviewsPerCompany` | integer | 100 | Reviews to save per link. `0` saves every review Indeed lists. |
| `sort` | `newest`, `highest`, `lowest` | `newest` | Which reviews come first, and so which ones the limit keeps. A sort in a pasted link wins. |
| `allCountries` | boolean | `true` | On by default: every link, including a uk.indeed.com or de.indeed.com link, returns the company's reviews from **all countries**. Turn it off to get only the reviews Indeed's page shows for that site's own country (US for www.indeed.com, UK for uk.indeed.com). A country or location filter in a pasted link wins. |
| `proxyConfiguration` | proxy | Apify residential | Leave it on residential: Indeed refuses datacenter addresses. |

```json
{
    "companyUrls": [
        "https://www.indeed.com/cmp/Google/reviews",
        "https://uk.indeed.com/cmp/Tesco",
        "https://de.indeed.com/cmp/Siemens/reviews?ftopic=mgmt",
        "Starbucks"
    ],
    "maxReviewsPerCompany": 200,
    "sort": "newest",
    "allCountries": true
}
```

### Output

One row per review. You can download the dataset in various formats such as
JSON, HTML, CSV, or Excel. A real row from a run on 2026-10-20:

```json
{
    "reviewId": "b3ac59eea50d2121",
    "reviewUrl": "https://de.indeed.com/cmp/Siemens/reviews/not-for-courageous-and-innovative-people-yes-men-are-treated-well?id=b3ac59eea50d2121&uid=8789c5f662a7e4818b6446126a2d0017",
    "rating": 1,
    "title": "Not for courageous and innovative people, YES MEN are treated well",
    "text": "Take tasks and deliver on time.\nGenAI uses and use cases.\nManagement is as bad as any other large size organisation, ...",
    "pros": "You only work for 8-9hrs, unless production is down.",
    "cons": "Culture, people, mindset, thought process, approach to any technical problem.",
    "jobTitle": "Senior Software Engineer",
    "location": "Bengaluru, Karnataka",
    "country": "IN",
    "employmentStatus": "former",
    "date": "2026-10-08T17:58:40Z",
    "dateText": "8. Oktober 2026",
    "helpfulCount": 0,
    "unhelpfulCount": 0,
    "workLifeBalanceRating": 4,
    "payBenefitsRating": 2,
    "jobSecurityAdvancementRating": 2,
    "managementRating": 1,
    "cultureRating": 1,
    "companyName": "Siemens",
    "companyRating": 4,
    "companyReviewCount": 11434,
    "companyUrl": "https://de.indeed.com/cmp/Siemens",
    "scrapedAt": "2026-10-20T13:56:00Z"
}
```

#### Data fields

| Field | Description |
|---|---|
| `reviewId` | Indeed's id for the review. Each review is saved once per run. |
| `reviewUrl` | Link to the review on Indeed. |
| `rating` | Overall rating, 1 to 5. |
| `title`, `text` | The review's headline and body. |
| `pros`, `cons` | Pros and cons, when the reviewer wrote them (`null` otherwise; Indeed's newer review form often leaves them out). |
| `jobTitle`, `location`, `country` | The reviewer's job title, city and country code; `null` when not given. |
| `employmentStatus` | `current` or `former` employee. |
| `date` | When the review was submitted, ISO 8601 in UTC, read from Indeed's review id. Indeed shows dates in US time on all sites, so `dateText` can be a day earlier than `date` (UTC). |
| `dateText` | The date as Indeed shows it, in the site's language. |
| `helpfulCount`, `unhelpfulCount` | Readers' "helpful" and "not helpful" votes. |
| `workLifeBalanceRating`, `payBenefitsRating`, `jobSecurityAdvancementRating`, `managementRating`, `cultureRating` | Sub-ratings 1 to 5; `null` when the reviewer skipped them (most short reviews do). |
| `companyName`, `companyRating`, `companyReviewCount`, `companyUrl` | The company's name, overall rating and total reviews on that Indeed site, and its page. |
| `scrapedAt` | When the row was saved (UTC). |

### How much does it cost to scrape Indeed reviews?

You pay per review saved: see the **Pricing** tab for the exact price.
Companies that give nothing (not found, no reviews, unusable link) are never
charged. The platform cost behind it is small: in our test runs 1,000 reviews
took about a minute and used about $0.03 to $0.05 of Apify resources,
mostly residential proxy traffic.

### Tips

- **Get exactly the reviews you need**: filter on Indeed first (job title,
  location, topic such as Management, or language) and paste that link.
- **Newest reviews only**: keep `sort` on `newest` and set a small limit,
  for example 50, and schedule the run weekly.
- **Worst reviews first**: set `sort` to `lowest` to read complaints first.
- Several companies are read in parallel, so one run with many links is
  faster than many runs with one link each.

### FAQ, disclaimers and support

**Is it legal to scrape Indeed reviews?** The Actor reads only public review
pages that anyone can open without an account. Reviews can still contain
personal data, such as job titles and locations, and are protected by Indeed's
terms. Make sure your use complies with those terms and with data-protection
laws such as the GDPR, and do not use the data to identify reviewers.

**Why do I get fewer reviews than the company's review count?** The count
covers every Indeed site and language. With `allCountries` on you get every
country; filters in your link narrow it further.

**What happens to links that give nothing?** Not-found companies, companies
without reviews and links that are not Indeed company pages are skipped
without charge and listed in the **FAILED_INPUTS** record in the run's
key-value store, with the reason. If Indeed refuses a company's pages, that
company is listed too; the run fails only when every company was refused.

**Limitations:** Indeed's bot check refuses many proxy addresses, so the
Actor retries each page up to 8 times from fresh residential addresses. Some
review texts are in the reviewer's language, not the site's. Employer replies
are not included.

Found a problem or need a custom solution? Open an issue on the **Issues**
tab and we'll get back to you.

# Actor input Schema

## `companyUrls` (type: `array`):

Company pages on any Indeed country site, one per line: https://www.indeed.com/cmp/Google/reviews, https://uk.indeed.com/cmp/Tesco, https://de.indeed.com/cmp/Siemens/reviews, or just the company's name as it appears after /cmp/ (for example Starbucks, which uses www.indeed.com). Filters you set on Indeed's review page (job title, location, topic, language, sort) are kept when you paste its address.

## `maxReviewsPerCompany` (type: `integer`):

Stops after this many reviews for each link. Set 0 to save every review Indeed lists for it. Indeed shows 20 reviews per page.

## `sort` (type: `string`):

Which reviews come first, and so which ones a limit keeps. A sort already set in a pasted link wins.

## `allCountries` (type: `boolean`):

On by default: every link returns the company's reviews from all countries, even a uk.indeed.com or de.indeed.com link. Turn it off to keep only the reviews Indeed shows for that site's own country (US reviews on www.indeed.com, UK reviews on uk.indeed.com). A country or location filter in a pasted link wins.

## `proxyConfiguration` (type: `object`):

Leave this on Apify residential proxy: Indeed's bot check refuses datacenter addresses almost every time.

## Actor input object example

```json
{
  "companyUrls": [
    "https://www.indeed.com/cmp/Google/reviews"
  ],
  "maxReviewsPerCompany": 20,
  "sort": "newest",
  "allCountries": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companyUrls": [
        "https://www.indeed.com/cmp/Google/reviews"
    ],
    "maxReviewsPerCompany": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/indeed-company-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "companyUrls": ["https://www.indeed.com/cmp/Google/reviews"],
    "maxReviewsPerCompany": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/indeed-company-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companyUrls": [
    "https://www.indeed.com/cmp/Google/reviews"
  ],
  "maxReviewsPerCompany": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call mina_safwat/indeed-company-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mina_safwat/indeed-company-reviews-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/KzRCq8fOltceMwAWX/builds/e2MxfjTxv6Gbn7Yhm/openapi.json
