# Comparably Reviews Scraper (`automation-lab/comparably-company-culture-ratings-reviews`) Actor

Extract public Comparably employee reviews, culture-category scores, CEO ratings, awards, and compensation signals for employer benchmarking.

- **URL**: https://apify.com/automation-lab/comparably-company-culture-ratings-reviews.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.30 / 1,000 item extracteds

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?

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

## Comparably Reviews Scraper

Collect public **Comparably reviews** and company culture ratings for employer benchmarking. Give the Actor Comparably company URLs, slugs, or names and receive typed company profiles plus individual employee survey answers in JSON, CSV, Excel, or any Apify Dataset integration.

The Actor is designed for recurring company watchlists. It returns source-linked records instead of a page-shaped HTML dump, including culture-category grades, CEO and leadership ratings, review text and metadata, visible awards, and compensation signals.

### What can you collect?

| Record | Useful fields |
| --- | --- |
| Company | identity, website, address, revenue signal, participants, rating/review totals |
| Culture | overall score, letter grade, star rating, percentile, category grades |
| Leadership | CEO name, CEO score, leadership and executive-team grades |
| Compensation | compensation and perks/benefits grades and percentile labels |
| Awards | visible award titles and image URLs, remaining award count |
| Employee review | review ID/URL, survey question, normalized category, text, department, date |

Company profiles and employee reviews share the default Dataset so scheduled runs, webhooks, and downstream tools can consume one stable output. Use `recordType` to separate them.

### Who is it for?

- **People analytics teams** benchmark employee sentiment across a watchlist.
- **Recruiting teams** compare leadership, compensation, and workplace-culture signals.
- **Employer-brand teams** review recurring employee feedback by question category.
- **HR technology teams** enrich company records with source-attributed public indicators.
- **Researchers and analysts** export reproducible snapshots for trend analysis.

### Why use it?

Comparably exposes profile metrics and employee answers across multiple page sections. This Actor normalizes those surfaces, keeps source URLs, deduplicates review answers, filters by useful question categories, and handles pagination. It also uses bounded fresh browser identities when Comparably presents an anti-bot challenge; a challenged page is treated as an error, never as an empty successful result.

### Getting started

1. Open the Actor input.
2. Add `companies` such as `google` and `microsoft`, or paste public URLs under `startUrls`.
3. Keep both profile and review output enabled, or disable the record type you do not need.
4. Optionally select review categories and increase `maxReviewPages`.
5. Set `maxItems` to your dataset budget.
6. Run the Actor and open **Dataset → Overview**.
7. Export the results or connect a webhook, Google Sheets, Make, Zapier, or your own API client.

### Input parameters

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `companies` | string array | — | Company names or Comparably slugs. |
| `startUrls` | URL array | Google reviews URL | Public Comparably company/profile/reviews URLs. |
| `includeCompanyProfile` | boolean | `true` | Emit one culture profile per company. |
| `includeReviews` | boolean | `true` | Emit employee review answers. |
| `reviewCategories` | string array | all | Filter reviews to Overall, Leadership, Compensation, Team, Culture & Environment, Interview, Outlook, or Company. |
| `maxReviewPages` | integer | `1` | Review pages per company, from 1 to 20. |
| `maxItems` | integer | `20` | Global company + review record limit. |
| `maxSessionAttempts` | integer | `6` | Fresh US residential browser identities tried per company, bounded at 6. |

At least one company or start URL is required. Non-Comparably URLs, malformed company URLs, empty scope, and a configuration that disables both output types fail clearly.

### Example input

```json
{
  "companies": ["google"],
  "includeCompanyProfile": true,
  "includeReviews": true,
  "reviewCategories": ["Leadership", "Compensation"],
  "maxReviewPages": 2,
  "maxItems": 60
}
```

### Example company output

```json
{
  "recordType": "company",
  "companyId": "23906",
  "companyName": "Google",
  "companySlug": "google",
  "companyUrl": "https://www.comparably.com/companies/google",
  "overallScore": 78,
  "overallGrade": "A",
  "overallPercentile": "Top 10%",
  "starRating": 4.6,
  "ceoName": "Sundar Pichai",
  "ceoScore": 79,
  "cultureDimensions": [
    { "category": "Compensation", "grade": "A+", "percentile": "Top 5%", "percentileValue": 5 }
  ],
  "scrapedAt": "2026-09-04T15:41:00.000Z"
}
```

Values are snapshots of the public source and can change. Optional source fields may be `null`.

### Example review output

```json
{
  "recordType": "review",
  "companyName": "Google",
  "companySlug": "google",
  "reviewId": "3654039",
  "reviewUrl": "https://www.comparably.com/companies/google/reviews/3654039/example",
  "question": "Briefly describe your overall experience at your company",
  "category": "Overall",
  "text": "Public employee answer text appears here.",
  "authorName": "Anonymous Review",
  "department": null,
  "datePublished": "2026-05-16",
  "page": 1
}
```

### Review categories

Categories are derived from the employee survey question, not guessed from sentiment. For example, leadership-team prompts map to `Leadership`, compensation-package prompts map to `Compensation`, and interview-process prompts map to `Interview`. Filtering changes which review rows are returned; it does not alter company profile dimensions.

### How much does it cost to collect Comparably reviews?

The Actor uses pay-per-event pricing: a small one-time **Run started** event plus one **Item extracted** event for each company or review row saved. There is no charge for rejected, duplicate, challenged, or empty parser records.

At the BRONZE rate of **$0.01 per start plus $0.0055 per record**, 20 records cost about **$0.12**, 100 records about **$0.56**, and 1,000 records about **$5.51**. Other Apify plan tiers use their displayed tier price. Your run can also consume normal platform compute and proxy usage according to your Apify plan; `maxItems` gives you a predictable output cap.

### Reliability, retries, and proxy use

Comparably protects company pages with PerimeterX. The Actor requires Apify Residential Proxy with US routing and uses Camoufox to obtain the public server-rendered page. It keeps cookies, browser context, and proxy identity coherent while collecting one company. A challenged identity is retired, and a materially fresh identity is tried up to `maxSessionAttempts`.

Images, fonts, and media are blocked to reduce transfer. If every bounded identity is challenged, the run fails with a non-zero status instead of silently returning no data.

### Pagination and limits

Each review page contains multiple employee survey sections. `maxReviewPages` applies per company; `maxItems` applies to the entire run. The company profile counts as one item when enabled. The Actor stops accepting records when the global limit is reached and deduplicates repeated review/question pairs by stable review ID where available.

### Recurring employer benchmarking

Create an Apify Task with a fixed watchlist and schedule it weekly or monthly. Send each completed Dataset to your warehouse. Join snapshots on `companySlug`, `recordType`, `reviewId`, and `question`; compare `overallScore`, CEO score, category grades, rating totals, and newly observed review IDs over time. The Actor captures snapshots—it does not itself send alerts or calculate historical deltas.

### Spreadsheet and data-pipeline integrations

- Export the Dataset directly as CSV, JSON, XML, or Excel.
- Use the Google Sheets integration for a recurring employer scorecard.
- Trigger Make or Zapier after a successful run.
- Use a webhook to load rows into BigQuery, Snowflake, PostgreSQL, or a data lake.
- Use `recordType=company` for one-row-per-employer tables and `recordType=review` for employee-answer tables.

### Run with the Apify API

Replace `YOUR_TOKEN` with an Apify API token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~comparably-company-culture-ratings-reviews/runs?token=YOUR_TOKEN&waitForFinish=300" \
  -H "Content-Type: application/json" \
  -d '{"companies":["google"],"maxItems":20}'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/comparably-company-culture-ratings-reviews').call({
  companies: ['google', 'microsoft'],
  includeCompanyProfile: true,
  includeReviews: false,
  maxItems: 2,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation-lab/comparably-company-culture-ratings-reviews").call(run_input={
    "companies": ["amazon"],
    "reviewCategories": ["Leadership", "Compensation"],
    "maxReviewPages": 2,
    "maxItems": 60,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Actor to Claude Code through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/comparably-company-culture-ratings-reviews"
```

#### Claude Desktop setup

Use this JSON configuration in Claude Desktop:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/comparably-company-culture-ratings-reviews"
    }
  }
}
```

#### Cursor setup

Add the same MCP URL in **Cursor Settings → MCP → Add server** and name it `apify`.

#### VS Code setup

Add the same HTTP MCP server URL to your VS Code MCP configuration and enable the `apify` server for your workspace.

Example prompts:

- “Collect company-level Comparably culture ratings for Google and Microsoft.”
- “Return up to 50 Amazon leadership and compensation review answers.”
- “Create a table comparing CEO score and culture category grades for this employer watchlist.”

### Legality and responsible use

This Actor collects fields visible on public Comparably company pages. Follow Comparably's terms, robots guidance, applicable database rights, privacy rules, and employment law. Do not use employee feedback to identify anonymous reviewers, make automated high-impact employment decisions, harass individuals, or create discriminatory profiles. Store only the data needed for a legitimate purpose and honor deletion or retention obligations.

### Limitations

- No login, private employer dashboard, private survey response, or historical archive is accessed.
- Comparably can change markup, structured payloads, paging, or anti-bot controls.
- Public profiles differ: some fields, departments, dates, scores, or awards can be absent.
- Visible award cards may be a summary; `remainingAwards` reports the additional count.
- Company-name input is normalized to a slug. If a brand's Comparably slug differs, supply the exact company URL.
- Sentiment classification, change detection, and notifications are downstream workflows, not Actor output.

### Troubleshooting

#### Why did the run fail with a challenge error?

A bounded set of fresh US residential browser identities could not obtain a valid public page. Retry later rather than raising `maxSessionAttempts` repeatedly. The non-zero failure protects pipelines from treating a challenge as an empty dataset.

#### Why are there fewer rows than `maxItems`?

The selected company, pages, or category filter may expose fewer unique matching records. `maxItems` is a cap, not a promised count.

#### Why did a company name fail?

The normalized name may not match Comparably's actual slug. Copy the public company URL into `startUrls`.

### FAQ

#### Can I collect only company scores?

Yes. Enable company profile output and disable employee review output.

#### Can I collect only employee reviews?

Yes. Disable company profile output. The Actor still reads the profile internally to attach canonical company identity to review records, but the profile row is omitted.

#### Does it support multiple companies?

Yes. Add multiple company names, slugs, or URLs. The global `maxItems` limit applies across the watchlist.

#### Does it detect new or changed reviews?

It returns stable review IDs, URLs, questions, dates, and scrape timestamps that your scheduled pipeline can compare. It does not maintain history or send alerts itself.

### Related automation-lab Actors

- [Glassdoor Jobs Scraper](https://apify.com/automation-lab/glassdoor-jobs-scraper) for public job-market workflows.
- [Company Leadership Scraper](https://apify.com/automation-lab/company-leadership-contact-finder) for source-attributed public leadership records from company websites.
- [Website Brand Identity Extractor](https://apify.com/automation-lab/website-brand-identity-extractor) for public company branding and messaging signals.

# Actor input Schema

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

Comparably company slugs or company names, for example google or microsoft.

## `startUrls` (type: `array`):

Public Comparably company profile or reviews URLs. URLs from other domains are rejected.

## `includeCompanyProfile` (type: `boolean`):

Return one company record with identity, overall and category culture scores, CEO rating, awards, and compensation-related signals.

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

Return public employee review answers with question, category, department, date, and source URL metadata.

## `reviewCategories` (type: `array`):

Optional category filter. Leave empty to collect every available category.

## `maxReviewPages` (type: `integer`):

Maximum number of public review pages to collect for each company.

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

Stop after this many company and review records across all companies.

## `maxSessionAttempts` (type: `integer`):

Bounded fresh residential browser sessions attempted per company when Comparably presents an anti-bot challenge.

## Actor input object example

```json
{
  "companies": [
    "google"
  ],
  "startUrls": [
    {
      "url": "https://www.comparably.com/companies/google/reviews"
    }
  ],
  "includeCompanyProfile": true,
  "includeReviews": true,
  "reviewCategories": [],
  "maxReviewPages": 1,
  "maxItems": 20,
  "maxSessionAttempts": 6
}
```

# Actor output Schema

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

Company and review records from this run.

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

Table view of the most useful employer benchmarking fields.

# 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"
    ],
    "startUrls": [
        {
            "url": "https://www.comparably.com/companies/google/reviews"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/comparably-company-culture-ratings-reviews").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"],
    "startUrls": [{ "url": "https://www.comparably.com/companies/google/reviews" }],
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/comparably-company-culture-ratings-reviews").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"
  ],
  "startUrls": [
    {
      "url": "https://www.comparably.com/companies/google/reviews"
    }
  ]
}' |
apify call automation-lab/comparably-company-culture-ratings-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/comparably-company-culture-ratings-reviews"
        }
    }
}

```

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/R9AiKywR5rxMIcuLr/builds/lnHKbmrdbLYnbvOUE/openapi.json
