# Indeed Company Reviews Scraper & API (`quarra/indeed-company-reviews-scraper`) Actor

Indeed company reviews from company links or names: overall and sub-ratings, title, text, pros and cons, job title, location, current or former employee, date, helpful votes. All countries or one. Filters by country, city, topic, rating, date, keyword. No reviewer name.

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

## Pricing

from $1.30 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Indeed Company Reviews Scraper & API

Get every employee review of any company on Indeed, in bulk, without an account or API key. Paste company links, slugs
or names. Each review comes back with the overall rating and the detailed ratings (work-life balance, pay and benefits,
job security and advancement, management, culture), title, text, pros and cons when the reviewer wrote them, job title,
work location, current or former employee, date and helpful votes. Reviews from every country or from the countries you
choose, newest first or by rating. Export as JSON, CSV or Excel, or read it through the Apify API.

**No reviewer name, profile or ID.** We deliver what was said about the company, not who said it.

### Quick start

1. Paste one or more companies into **Companies**: the Indeed page (`https://www.indeed.com/cmp/Blue-Bottle-Coffee`,
   from any Indeed country site), the name as written in that link (`Blue-Bottle-Coffee`, `Amazon.com`) or the plain
   name (`Blue Bottle Coffee`).
2. Set **Max reviews per company**.
3. Click **Start** and read the reviews in the run's **Output** tab.

Like any Apify Actor, it can also be run and read through the Apify API, scheduled, and connected to webhooks, Make,
Zapier, n8n or Apify's MCP server for AI agents.

### What it is used for

- **Employer reputation**: what staff say about your company, or the new reviews since last week, every day.
- **Competitor and talent research**: pay, management and culture ratings of the companies you hire against.
- **Market and sector analysis**: the same chain across countries, job titles and cities.
- **Sentiment analysis and AI agents**: one clean record per review, with a stable ID to deduplicate between runs.

### What you get

| | |
|---|---|
| Review ID (stable and unique on Indeed: use it to deduplicate between runs) | yes |
| Overall rating, title and text | yes |
| Detailed ratings: work-life balance, pay and benefits, job security and advancement, management, culture | when given |
| Pros and cons as separate fields | when the reviewer wrote them apart |
| Job title, work location, country | yes / when given |
| Current or former employee | yes |
| Date of the review (UTC, `YYYY-MM-DD`) | yes |
| Helpful and not helpful votes | yes |
| Link of the review and of the company page, company name and ID | yes |
| Reviewer name, profile, ID | **no, never** |

A field Indeed does not give for a review is `null`, never missing. A detailed rating the reviewer did not give is `null`
(never 0). Indeed gives the day of a review, not the time. `language` is the language of the review text (`en-US`, `es-MX`…) when Indeed gives it, `null` otherwise.

### Inputs

- **Companies**: Indeed company links, the name as written in the link, or the plain name. A plain name is matched by
  Indeed, which may open a similar company: check `companyName` in the results (the run says so in the company's note
  when Indeed opened a company whose name differs from what you gave), or use the link. Up to 500 company and country pairs per run.
- **Max reviews per company** and **Max results in total**: counted exactly. **Max results in total** is 1,000 by
  default: raise it when you want more (5 companies × 2,000 reviews = 10,000).
- **Countries**: ISO codes (`US`, `GB`, `DE`, `FR`, `JP`…), one per line. Left empty, the reviews of every country are
  read. With several, each company is read once per country.
- **City**, **Job title**, **Topic**: filters applied by Indeed itself. City needs exactly one country and is written as
  Indeed lists it (`New York, NY`); job title is the exact title Indeed lists (`Cashier`); topic is one of work-life
  balance, pay and benefits, job security and advancement, management, culture.
- **Sort**: newest first (default), highest rating first or lowest rating first. With **Since** or **Until**, the reviews
  are always read newest first, so the reading stops at the date you set.
- **Minimum rating**, **Maximum rating**, **Since**, **Until** (a date such as `2026-01-31`, or a duration such as
  `30 days`) and **Review contains** (up to 50 words, one per line, matched as whole words in the title, text, pros and cons).

Example, through the API:

```json
{
  "companies": ["https://www.indeed.com/cmp/Blue-Bottle-Coffee", "Starbucks"],
  "countries": ["US"],
  "sort": "newest",
  "maxRating": 2,
  "since": "90 days",
  "maxReviewsPerCompany": 500
}
```

### Output

One record per review in the dataset. A shortened review:

```json
{
  "type": "review",
  "status": "ok",
  "reviewId": "1d178689374eb6f5",
  "companySlug": "blue-bottle-coffee",
  "companyName": "Blue Bottle Coffee",
  "companyId": "5b58f6b98508d947",
  "rating": 5,
  "title": "Good training program for new baristas, supportive managers and team",
  "text": "Pros: Solid training program, helpful managers and team, good tip pool\n\nCons: rush times can be busy…",
  "pros": null,
  "cons": null,
  "subratings": null,
  "jobTitle": "Barista",
  "location": "New York, NY",
  "country": "US",
  "employmentStatus": "former",
  "date": "2026-09-28",
  "helpfulVotes": 0,
  "unhelpfulVotes": 0,
  "reviewUrl": "https://www.indeed.com/cmp/Blue-Bottle-Coffee-db772533/reviews/good-training-program-…?id=1d178689374eb6f5",
  "language": null,
  "companyUrl": "https://www.indeed.com/cmp/Blue-Bottle-Coffee-db772533",
  "countryFilter": "ALL",
  "input": "https://www.indeed.com/cmp/Blue-Bottle-Coffee",
  "position": 1,
  "scrapedAt": "2026-10-22T05:18:28Z"
}
```

- `status`: `ok` (delivered, charged) or `error` (free; `errorCode` and `error` say why, `retryable` says if a later
  run may work). A company that does not exist on Indeed gets a free `company_not_found` record.
- `position` is the rank of the review in the chosen sort for that company (and country).
- `subratings` holds `workLifeBalance`, `compensationAndBenefits`, `jobSecurityAndAdvancement`, `management` and
  `culture` (1 to 5); one the reviewer skipped is `null`.
- `country` is the country of the review; `countryFilter` is the country you asked for, or `ALL`.

The run summary (counts per company, name, Indeed's overall rating and review count, why the run stopped, notes) is the
`OUTPUT` record of the run's key-value store.

### Pricing

Pay per event. Reviews cost less on higher Apify plans:

| Apify plan | Review |
|---|---|
| Free | $1.40 per 1,000 |
| Starter (Bronze) | $1.40 per 1,000 |
| Scale (Silver) | $1.35 per 1,000 |
| Business (Gold) and above | $1.30 per 1,000 |

On every plan, the run start is $0.005 per GB of memory (1 GB minimum; $0.005 at the default 256 MB). So 1,000 reviews of
one company come to $1.405 on the Free plan and $1.305 on Business.

Never charged: reviews that do not match your filters, error records, repeats (a review already delivered in the same
run is skipped). Set **Maximum cost per run** in the run options and the run stops before going over it, with the
results delivered so far.

### Limits

- **Every review, every country**: Indeed lists the reviews of a company 20 per page with no depth limit; the Actor
  reads them all (about 20 reviews a second on a large company). The company's total is read from Indeed, so the reading
  stops at the last review.
- **Ratings**: Indeed has no rating filter but can sort by rating. Without **Since** or **Until**, a rating range is read
  from the matching end (lowest first for 1 and 2 stars, highest first for 4 and 5) and the reading stops as soon as the
  ratings leave the range, so one-star reviews of a very large company are fast; they then come by rating, not by date.
  Only ranges that touch 1 or 5 stars work this way (for example 1, 1-2, 4-5, 5). A range in the middle (3, 2-3-4) or
  two separate ratings (1 and 5) are read newest first and filtered here, so on a very large company set **Max reviews per
  company**. With **Since** or **Until**, the reviews are read newest first and filtered here.
- **Words** are filtered here (only one plain word of 3 letters or more is searched by Indeed itself). An expression on a
  company with tens of thousands of reviews means reading many pages, which takes time; reviews that do not match are not
  charged. Set **Max reviews per company** or **Since** to bound it.
- **Dates** have no time of day and are in UTC. **Since** counts whole days: `1 day` keeps every review dated yesterday
  or today.
- **Companies with similar names**: a plain name is resolved by Indeed. Use the link when it matters.
- **Language**: `language` is filled only for the reviews where Indeed says it; the others are `null`.
- If a run stops early (your maximum cost, Max results in total, its timeout), every company it did not read in full
  and gave nothing for gets a free `not_read` record, so no input is ever left without an answer.
- Anything missing from a result is said: in the run's status, in the `note` of each company in the `OUTPUT` record, or
  in a free error record. If Indeed limits access during a run, the run says so and keeps what it delivered; running it
  again later gives the rest.

### FAQ

**Do I need an Indeed account or API key?** No.

**Why are reviewer names not included?** They are personal data and most uses (reputation, sentiment, research) do not
need them. The review ID and link let you find any review on Indeed.

**What if the run is restarted by the platform (migration or reboot)?** It resumes where it was: results already in
the dataset are not delivered or charged again. If it cannot (its saved progress is missing), it stops at once and says
so: what is in the dataset is not charged again, and a new run gives the rest.

**Is it legal?** It collects public reviews shown to any visitor of Indeed, without reviewer names. Check the rules that
apply to your use of the data.

**Does the Actor send anything to Quarra?** Only when a run fails or runs out of time: the Actor, its build, the error
type, the line of our code where it happened, and the memory and time the run was given, so we can fix it fast. Never
your input, your results, your account or the run ID.

# Actor input Schema

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

One per line: the Indeed page of the company (https://www.indeed.com/cmp/Blue-Bottle-Coffee, any Indeed country site), its name in the link (Blue-Bottle-Coffee) or its name (Blue Bottle Coffee). A name is matched by Indeed, which may open a similar company: check 'companyName' in the results, or use the link.

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

Stop a company after this many reviews (per country when you set several).

## `maxItems` (type: `integer`):

Stop the run after this many charged reviews, all companies together. Default 1,000: raise it when you want more (for example 5 companies × 2,000 reviews = 10,000).

## `countries` (type: `array`):

Only reviews from these countries, one ISO code per line (US, GB, DE, FR, JP…). Empty: reviews from every country. Each company is read once per country.

## `location` (type: `string`):

Only reviews written about this work location, as Indeed lists it (for example 'New York, NY'). Needs exactly one country in 'Countries'.

## `jobTitle` (type: `string`):

Only reviews by people with this job title, as Indeed lists it (for example 'Cashier').

## `topic` (type: `string`):

Only reviews that Indeed files under this topic.

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

Order of the reviews. With 'Since' or 'Until', the reviews are always read newest first.

## `minRating` (type: `integer`):

Keep only reviews with at least this many stars (1 to 5). Empty keeps all.

## `maxRating` (type: `integer`):

Keep only reviews with at most this many stars. Set both to 1 for one-star reviews only.

## `since` (type: `string`):

Only reviews from this date on: 2026-01-31, or a duration such as '30 days', '3 months'. Empty keeps all.

## `until` (type: `string`):

Only reviews up to this date (included). Empty keeps all.

## `keywords` (type: `array`):

Keep only reviews whose title, text, pros or cons contain one of these words, as a whole word (not case-sensitive). One per line, 50 at most.

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

Connection. Keep the default (automatic). Costs are included in the price.

## Actor input object example

```json
{
  "companies": [
    "https://www.indeed.com/cmp/Blue-Bottle-Coffee"
  ],
  "maxReviewsPerCompany": 20,
  "maxItems": 1000,
  "sort": "newest",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every record with all its fields, and free error records.

## `overview` (type: `string`):

One line per review.

## `summary` (type: `string`):

Counts per company, why the run stopped, errors.

# 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": [
        "https://www.indeed.com/cmp/Blue-Bottle-Coffee"
    ],
    "maxReviewsPerCompany": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("quarra/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 = {
    "companies": ["https://www.indeed.com/cmp/Blue-Bottle-Coffee"],
    "maxReviewsPerCompany": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("quarra/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 '{
  "companies": [
    "https://www.indeed.com/cmp/Blue-Bottle-Coffee"
  ],
  "maxReviewsPerCompany": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call quarra/indeed-company-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,quarra/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/fEV1irwmMUwbxPCLe/builds/hXkeTbd5ZHQP7a7pF/openapi.json
