# Indeed Company Reviews Scraper + Insights (`a7_data/indeed-company-reviews-insights`) Actor

Scrape Indeed company reviews and get a computed summary in the same run: rating distribution, current-vs-former employee gap, per-job-title and per-location breakdowns, monthly trend, and top complaint terms. No AI keys required.

- **URL**: https://apify.com/a7\_data/indeed-company-reviews-insights.md
- **Developed by:** [Mototsugu Ohki](https://apify.com/a7_data) (community)
- **Categories:** Jobs, Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Indeed Company Reviews Scraper + Insights

### What does Indeed Company Reviews Scraper do?

It scrapes **employee reviews from Indeed company pages** — ratings, review text, job title, location,
whether the reviewer still works there — and then, in the same run, returns a **computed summary of what
those reviews add up to**. Point it at [indeed.com](https://www.indeed.com) company names like `Google` or
`Walmart` and you get both the rows and the analysis, ready for a spreadsheet, a dashboard, or an LLM.

Every other Indeed reviews scraper hands you a pile of rows and leaves the counting to you. This one also
tells you **which job titles are unhappy, whether people sour on the company before they leave, how the
rating moved month by month, and which words dominate the one-star reviews**.

Running on Apify means you get scheduling, a REST API, webhooks, integrations with Make/Zapier/n8n, and
proxy rotation without configuring any of it yourself.

### Why use it?

- **Competitive HR intelligence** — see how a rival employer is actually rated by the people doing the work,
  broken out by role and site.
- **Pre-acquisition and vendor due diligence** — a company whose current employees rate it far lower than
  its leavers did is a company in the middle of something.
- **Recruiting** — find out what candidates read about your client before the interview, and which roles
  have the worst reputation to sell.
- **Job seekers and career sites** — compare employers on the dimensions that matter (management, pay,
  work-life balance) rather than a single star rating.
- **Feeding an LLM** — the summary row is compact, numeric, and already deduplicated, so it fits in a prompt
  without you paying to summarize thousands of raw reviews.

### How to use it

1. Click **Try for free** and sign in to Apify.
2. Put one or more company names into **Companies** — `Google`, `Walmart`, or a full URL like
   `https://www.indeed.com/cmp/Amazon.com/reviews`.
3. Leave **Max reviews per company** at 20 for a fast overview, or raise it when you want the review text.
4. Click **Start**. A 20-review run finishes in well under a minute.
5. Download the dataset as **JSON, CSV, Excel, or HTML**, or pull it from the API.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `companies` | array | `["Google"]` | Company names or Indeed review URLs. `Home Depot` becomes `Home-Depot`. |
| `maxReviewsPerCompany` | integer | `20` | Reviews per company. Indeed serves 20 per page, ~20–30s per page. |
| `country` | string | `US` | Two-letter code to filter reviews by country. |
| `includeReviews` | boolean | `true` | Output the individual review rows. |
| `includeInsights` | boolean | `true` | Output the per-company summary row. |
| `filterTopic` | string | — | Work-life balance, pay and benefits, job security, management, or culture. |
| `filterJobTitle` | string | — | e.g. `Software Engineer`. |
| `filterLocation` | string | — | e.g. `New York, NY`. |
| `maxConcurrency` | integer | `2` | Keep it low. Higher values cause more failures, not faster runs. |

```json
{ "companies": ["Google", "Microsoft", "https://www.indeed.com/cmp/Amazon.com/reviews"] }
```

### Output

Two kinds of rows land in one dataset. Download as JSON, CSV, Excel, or HTML.

#### `type: "review"` — one row per review

```json
{
  "type": "review",
  "company": "Google",
  "reviewId": "6dbdd4271e192b00",
  "title": "Great place to work",
  "text": "The full review text as written by the reviewer.",
  "overallRating": 5,
  "ratings": {
    "workLifeBalance": 4,
    "compensationAndBenefits": 5,
    "jobSecurityAndAdvancement": 3,
    "management": 4,
    "cultureAndValues": 5
  },
  "jobTitle": "Senior Software Engineer",
  "normalizedJobTitle": "Senior Software Engineer",
  "location": "Mountain View, CA",
  "country": "US",
  "isCurrentEmployee": false,
  "submissionDate": "2026-08-17",
  "helpfulCount": 3,
  "reviewUrl": "https://www.indeed.com/cmp/Google/reviews/..."
}
```

#### `type: "company_insights"` — one row per company

```json
{
  "type": "company_insights",
  "company": "Walmart",
  "overview": {
    "overallRating": 3.4,
    "totalReviewCount": 282938,
    "categoryRatings": { "management": 3.1, "workLifeBalance": 3.3 },
    "ratingDistribution": { "star1": { "count": 44000, "share": 0.155 } },
    "polarization": { "extremeShare": 0.48, "note": "..." },
    "topics": [{ "name": "Management", "count": 21000, "rating": 3.0 }]
  },
  "sample": { "analysedReviewCount": 200, "coverage": 0.0007, "failedPages": 0 },
  "employmentStatus": {
    "currentEmployees": { "reviewCount": 66, "averageRating": 2.42 },
    "formerEmployees":  { "reviewCount": 134, "averageRating": 2.69 },
    "gap": -0.27
  },
  "byJobTitle": [
    { "key": "Cashier", "reviewCount": 11, "averageRating": 3.73 },
    { "key": "Personal Shopper", "reviewCount": 13, "averageRating": 2.31 }
  ],
  "byLocation": [{ "key": "Austin, TX", "reviewCount": 3, "averageRating": 1.67 }],
  "trend": [{ "month": "2026-08", "reviewCount": 100, "averageRating": 2.51 }],
  "complaintTerms": {
    "basedOnReviewCount": 96,
    "terms": [{ "term": "management", "reviewCount": 46, "share": 0.479 }]
  },
  "mostHelpfulReviews": [{ "overallRating": 2, "helpfulCount": 37, "reviewUrl": "https://www.indeed.com/cmp/..." }]
}
```

Those Walmart numbers are from a real run: of 200 reviews sampled, **"management" appears in 46 of the
low-rated ones**, cashiers rate the job 3.73 while personal shoppers rate it 2.31, and current employees
score it *lower* than the people who already left.

### Data fields

| Field | Description |
|---|---|
| `overallRating` | 1–5 stars for the review as a whole |
| `ratings.*` | Five optional sub-ratings; `null` when the reviewer skipped the question |
| `jobTitle` / `normalizedJobTitle` | Role as written, and Indeed's normalized form |
| `location` / `country` | Where the reviewer worked |
| `isCurrentEmployee` | `true` if they still work there |
| `submissionDate` | ISO date |
| `helpfulCount` / `unhelpfulCount` | Votes from other readers |
| `overview.*` | Company-wide figures covering **all** reviews, not just the sampled ones |
| `employmentStatus.gap` | Current-employee average minus former-employee average |
| `byJobTitle` / `byLocation` | Average rating and count per group (groups under 3 reviews are omitted) |
| `trend` | Monthly review count and average rating |
| `complaintTerms` | Words most common in one- and two-star reviews |

### Getting a cheap overview

Leave `maxReviewsPerCompany` at `20`. One page per company gives you the **full rating distribution,
category ratings and topic breakdown for the company's entire review history** — Indeed exposes those on
the first page — plus 20 recent reviews. That is enough to compare fifty employers without paying to pull
thousands of rows.

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

**This Actor is currently free to use.** There is no per-result charge — you pay only your own Apify
platform usage (compute and proxy), which is covered by the free tier for ordinary runs. The default run
(one company, 20 reviews) uses well under a cent of platform usage and finishes in about 20 seconds.

Two knobs keep platform usage down. `includeReviews: false` gives you summaries only, which is the
cheapest way to compare many employers. `includeInsights: false` gives you raw rows only.

### Tips

- Comparing many employers? Pass them all in `companies` with `maxReviewsPerCompany: 20` and
  `includeReviews: false`. One row per company, fast, cheap.
- Investigating one employer? Raise `maxReviewsPerCompany` to 200–500 so the per-job-title and
  per-location breakdowns rest on a real sample, and watch `sample.coverage`.
- Only care about one problem area? `filterTopic: "mgmt"` pushes the filter to Indeed itself, so the whole
  run is about management reviews.
- Scheduling it weekly and diffing the `trend` array is the cheapest way to catch a company's rating
  turning.

### FAQ

**Does it need an OpenAI or Anthropic key?** No. Every number in the summary is arithmetic over the rows
that were fetched. Nothing is sent to a language model, and results are identical for identical input.

**Why is `coverage` low?** A company can have hundreds of thousands of reviews and you asked for 200. The
`overview` block is still complete — only the `sample` blocks reflect the subset.

**Why are sub-ratings often `null`?** Indeed makes them optional. `null` means the reviewer skipped that
question. Averages ignore skipped answers and report `answeredCount` so you can judge how solid each is.

**Can I get reviews for a specific role or office?** Yes — `filterJobTitle` and `filterLocation` push the
filter to Indeed, so the entire run targets that slice.

**Does it return reviewer names?** No. Indeed does not publish them and this Actor does not invent them.
Output is limited to what the reviewer chose to publish: rating, text, job title, location, and tenure status.

**Why did some pages fail?** Pages are fetched through Apify Proxy, which occasionally returns a
transient error. The Actor retries; anything still missing is reported in `sample.failedPages` rather
than silently dropped.

### Limitations and legal

- Only pages that Indeed's `robots.txt` permits for general crawlers are fetched. Login-gated pages,
  individual member pages, and the review submission flow are out of scope.
- Deep pagination is slower and less reliable than the first few pages. Thousands of reviews for a single
  company means a long run.
- **Unofficial and independent.** Not affiliated with, authorized by, endorsed by, or sponsored by Indeed
  or Recruit Holdings.
- This Actor collects publicly available information and does not return reviewer names. Reviews are
  nonetheless written by real people, and the combination of job title, location and tenure can be
  identifying in a small workplace. Review text may also mention third parties.
- **You are the data controller for whatever you collect.** You are responsible for having a lawful basis
  under the privacy laws that apply to you (GDPR/UK GDPR if you handle data about people in the EU or UK),
  and for complying with the source site's terms.
- Do not use this data to identify, contact, or retaliate against individual reviewers, to make decisions
  about individual people, or to match reviews against HR, CRM or social media records.

### Support

Found a bug or want a field that is not here? Open an issue on the **Issues** tab and it will be read.

# Actor input Schema

## `companies` (type: `array`):

Company names or Indeed company review URLs. A name like `Google` is turned into `https://www.indeed.com/cmp/Google/reviews`. Names with spaces become hyphenated, e.g. `Home Depot` → `Home-Depot`. 1回の実行で最大200社まで。

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

How many individual reviews to collect per company. Indeed returns 20 per page, and each page takes 20-30 seconds. The company-level summary (rating distribution, category ratings, topic breakdown for ALL of the company's reviews) comes from the first page, so the default of 20 already gives you the full overview. Raise it when you want the review text itself or bigger per-job-title and per-location samples.

## `country` (type: `string`):

Two-letter country code to filter reviews by, e.g. `US`, `GB`, `IN`. Leave as `US` for the default Indeed domain.

## `includeReviews` (type: `boolean`):

Push one dataset item per review. Turn this off if you only want the per-company summary.

## `includeInsights` (type: `boolean`):

Push one dataset item per company containing the computed summary: rating distribution, current-vs-former employee gap, per-job-title and per-location breakdowns, monthly trend, and the most common terms in low-rated reviews. Computed with plain arithmetic — no AI credits or API keys needed.

## `filterTopic` (type: `string`):

Restrict reviews to one Indeed topic.

## `filterJobTitle` (type: `string`):

Restrict reviews to one job title, e.g. `Software Engineer`.

## `filterLocation` (type: `string`):

Restrict reviews to one location, e.g. `New York, NY`.

## `maxConcurrency` (type: `integer`):

How many pages to fetch at once. Keep this low — Indeed pages are fetched through an unblocking proxy and higher concurrency makes failures more likely, not the run faster.

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

Indeed blocks plain requests. This Actor defaults to Apify's Unblocker, which is what makes the pages reachable. Changing this is only useful if you know your own proxy gets through.

## Actor input object example

```json
{
  "companies": [
    "Google"
  ],
  "maxReviewsPerCompany": 20,
  "country": "US",
  "includeReviews": true,
  "includeInsights": true,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "companies": [
        "Google"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("a7_data/indeed-company-reviews-insights").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 = {
    "companies": ["Google"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("a7_data/indeed-company-reviews-insights").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 '{
  "companies": [
    "Google"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call a7_data/indeed-company-reviews-insights --silent --output-dataset

```

## MCP server setup

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

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/dqbMlMyZLvrCzOIz2/builds/b0FghYaSKzbAl3JHQ/openapi.json
