# Indeed Reviews Scraper (`tidyharvest/indeed-reviews-scraper`) Actor

Indeed employee reviews for any company: stars and five sub-ratings, text, pros, cons, reviewer job title and location, employer reply. Filter by city, date or keyword. Built to beat memo23: the same reviews at a third of the price, no start fee. $0.50 per 1,000 reviews.

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

## Pricing

Pay per event

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 Reviews Scraper

Get **Indeed company reviews** for any employer: overall stars and the five sub-ratings (work-life balance, pay and
benefits, job security and advancement, management, culture), the review title and text, pros, cons, the reviewer's
job title, location and whether they still work there, helpful votes and the employer's public reply.
Also collect the **company overview** (ratings by year, work-happiness scores, CEO approval, size, revenue, HQ,
website), **open jobs**, **salaries by job title** and **questions and answers**, plus optional **contact details**
from the company's own website. Paste company page URLs or names and get clean JSON, with no Indeed account.

### What you can do with it

- **Employer-brand and competitor monitoring:** pull reviews of your company and its rivals and compare ratings and complaints.
- **Local labor-market research:** filter reviews by city ("San Diego, CA") and compare pay by job title across employers.
- **Retention and HR analytics:** find what makes staff at similar employers stay or leave.
- **Ongoing tracking:** turn on `newReviewsOnly` and schedule the actor to get only reviews you haven't seen.
- **Lead lists:** company size, revenue, HQ, website and contact details for a list of employers.

### Input

| Field | What it does |
|---|---|
| `companies` | Indeed company page URLs on any Indeed site (`https://www.indeed.com/cmp/Home-Instead`, `https://uk.indeed.com/cmp/...`), the name after `/cmp/`, or a company name. |
| `sections` | What to collect: `reviews` (default), `company`, `jobs`, `salaries`, `questions`. Pick any mix. |
| `maxReviewsPerCompany` | Newest first. 0 = every review. Default 100. |
| `since` | Only reviews on or after this date (YYYY-MM-DD). |
| `location` | Only reviews from one city or state, as Indeed writes it: `San Diego, CA`. |
| `country` | Reviewer country (`US`, `GB`... or `ALL`). Empty = the Indeed site's own country. |
| `newReviewsOnly` | Return only reviews this actor hasn't returned to you before for the same company and filters. |
| `maxItemsPerCompany` | Cap for jobs, salaries and questions per company. Default 100. |
| `includeContacts` | Add emails, phones, social profiles and address from the company's website to its overview row. |
| `keywords` | Keep only reviews, jobs or questions whose text contains one of these. |
| `maxItems` | Hard cap on results for the whole run (also caps your cost). |
| `proxy` | Residential by default (cost included in the price). |

Example:

```json
{ "companies": ["Home Instead", "https://www.indeed.com/cmp/Visiting-Angels"], "sections": ["reviews", "company"], "since": "2025-01-01", "maxReviewsPerCompany": 0 }
```

### Output

Every row has a `type`: `review`, `company`, `job`, `salary` or `question`. A review:

```json
{
  "type": "review", "reviewId": "728ecb4624c0d4e7", "company": "Coast Care", "companySlug": "Coast-Care-1",
  "date": "2026-02-20", "title": "Don't waste your time", "text": "...", "pros": null, "cons": null,
  "ratings": { "overall": 1, "workLifeBalance": null, "compensationAndBenefits": null, "jobSecurityAndAdvancement": null, "management": null, "culture": null },
  "reviewer": { "jobTitle": "Caregiver", "location": null, "country": "US", "isCurrentEmployee": false },
  "helpfulVotes": 2, "unhelpfulVotes": 0,
  "employerResponse": { "text": "Thank you for sharing your feedback...", "date": "2026-06-08" },
  "url": "https://www.indeed.com/cmp/Coast-Care-1/reviews/..."
}
```

A company overview (shortened):

```json
{
  "type": "company", "company": "Home Instead", "rating": 3.6, "reviewCount": 10193,
  "subRatings": { "workLifeBalance": 3.5, "compensationBenefits": 2.8, "jobSecurityAdvancement": 2.9, "management": 3.3, "culture": 3.4 },
  "ratingByYear": [ { "year": 2026, "rating": 3.26 }, { "year": 2025, "rating": 3.56 } ],
  "workHappiness": { "score": 74, "grade": "GREAT", "categories": { "Purpose": 79, "Compensation": 64 } },
  "ceoApproval": 53, "employees": "1,001 to 5,000", "revenue": "$1M to $5M", "founded": 1999, "headquarters": "Omaha, NE",
  "website": "https://www.homeinstead.com", "topJobTitles": [ { "title": "Caregiver", "jobs": 3764, "rating": 3.58 } ],
  "contacts": { "status": "ok", "emails": [], "phones": ["+18886731166"], "socials": { "facebook": "..." } }
}
```

Jobs have `title`, `location`, `salary`, `daysSincePosted`, `easyApply` and a job link; salaries have `jobTitle`, `medianPay`,
`period` and `reports`; questions have `question`, `date`, `answers` and the top `answer` with the answerer's role and location.
The run's key-value store also has a `SUMMARY` with each company's name and review counts.

### Measured results

- Complete: every one of a test company's 57 reviews, review for review and word for word the same as an independent collection.
- Cheap and quick: 117 reviews from two companies in 38 seconds, about $0.05 of platform cost per 1,000 reviews.

### Compared with memo23's Indeed reviews scraper

Same company, same day (Coast Care, 57 reviews):

| | This actor | memo23/apify-indeed-reviews-ppr |
|---|---|---|
| Reviews returned | 57 of 57, identical ids and text | 57 |
| Price per 1,000 reviews | $0.50 (less on paid Apify plans), no start fee | $1.50 + $0.005 per run |
| Two links to the same company | counted once | charged twice (114 results for 57 reviews) |
| Filter by reviewer city or country | built-in fields | not an input field |
| Look up a company by name | yes | page URLs only |
| Company overview, jobs, salaries, Q\&A, new-reviews-only, contact details | yes | yes |

Where memo23 still wins: it offers full job-description pages (Indeed no longer shows those without signing in, so we
leave them out) and lists interview pages (Indeed now sends those links to the company overview).

### Pricing

| Event | Price per 1,000 (Free plan) | What it is |
|---|---|---|
| `review-scraped` | $0.50 | One review |
| `item-scraped` | $0.50 | One job, salary row or question |
| `company-scraped` | $2.00 | One company overview row |
| `contacts-found` | $1.50 | Contact details added to a company row (only when an email or phone is found) |

Paid Apify plans get lower prices. Filters and caps apply before you are charged. A run that finds nothing fails instead
of silently returning an empty dataset.

### Limits and notes

- Sub-ratings are blank when the reviewer skipped them (common on short reviews).
- Reviews are anonymous; only the job title and location the reviewer chose to share are included.
- Contact details are what the company publishes on its own website.
- Public data only, collected without logging in. Indeed's terms restrict automated collection; you are responsible for how you use and republish review text (short quotes for analysis are low risk, republishing the dataset is not).

# Actor input Schema

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

One per line: an Indeed company page URL (https://www.indeed.com/cmp/Home-Instead/reviews), the name after /cmp/ in that URL (Home-Instead), or a company name (Home Instead), which picks Indeed's top match.

## `sections` (type: `array`):

Reviews (default), the company overview (ratings by year, sub-ratings, work-happiness scores, size, revenue, HQ, website, top job titles and locations), open jobs, salaries by job title, and questions people asked with the top answer.

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

Newest reviews first. 0 = every review (large employers have tens of thousands).

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

Date YYYY-MM-DD. Stops at older reviews. Empty = no date limit.

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

Only reviews from this city or state, written as Indeed shows it: "San Diego, CA", "Texas". Empty = all locations.

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

Two-letter country code of the reviewer (US, GB, CA, IN...), or ALL for every country. Empty = the Indeed site's own country (US on indeed.com, GB on uk.indeed.com).

## `newReviewsOnly` (type: `boolean`):

Monitoring mode: return only reviews this actor has not returned before for the same company and filters (remembered across your runs). Paging stops at the first page of already-seen reviews.

## `maxItemsPerCompany` (type: `integer`):

Cap for each of those sections. 0 = all.

## `includeContacts` (type: `boolean`):

Visit the company's own website (from its Indeed profile) and add emails, phones, social profiles and address to the company overview row. Charged only when something is found.

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

Keep a review, job or question only if its text contains one of these. Empty = all.

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

Hard cap for the whole run (also caps your cost). 0 or empty = no limit.

## `proxy` (type: `string`):

Residential is the default and its cost is included in the price. None only works from some home or office networks.

## Actor input object example

```json
{
  "companies": [
    "https://www.indeed.com/cmp/Coast-Care-1/reviews"
  ],
  "sections": [
    "reviews"
  ],
  "maxReviewsPerCompany": 100,
  "newReviewsOnly": false,
  "maxItemsPerCompany": 100,
  "includeContacts": false,
  "proxy": "residential"
}
```

# Actor output Schema

## `reviews` (type: `string`):

One item per review.

# 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/Coast-Care-1/reviews"
    ],
    "sections": [
        "reviews"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyharvest/indeed-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/Coast-Care-1/reviews"],
    "sections": ["reviews"],
}

# Run the Actor and wait for it to finish
run = client.actor("tidyharvest/indeed-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/Coast-Care-1/reviews"
  ],
  "sections": [
    "reviews"
  ]
}' |
apify call tidyharvest/indeed-reviews-scraper --silent --output-dataset

```

## MCP server setup

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