# Comparably $1💰 Ratings, Culture, Reviews & Salaries Scraper (`abotapi/comparably-scraper`) Actor

From $1/1K. Extract rich company data from comparably.com using company names or profile URLs. Get ratings, culture scores, CEO approval, employee reviews, salary insights, awards, revenue, headquarters, and more in structured JSON, CSV, or Excel format.

- **URL**: https://apify.com/abotapi/comparably-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Lead generation, Developer tools, Jobs
- **Features:** Limited permissions
- **Stats:** 5 total users, 4 monthly users, 93.8% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

## Comparably Scraper: Company Culture, Ratings, Reviews & Salaries

Comparably Scraper turns Comparably company profiles into structured data. Give it a list of company names or profile URLs and get back one clean record per company: overall rating, culture score and grade, CEO score, 12 culture dimensions, employee reviews, salaries by job title, plus revenue, headquarters, awards and more. Search by name or paste links, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

### Why This Scraper?

- **One clean record per company.** Profile, reviews and salaries all arrive in a single row, not scattered fragments across separate calls.
- **Search by company name.** Type "Google" and the actor derives its profile page directly. No need to hunt for URLs first.
- **Deep profile coverage.** Revenue, phone, headquarters address, website, 12 culture dimensions, metro area, awards and leadership data, all included.
- **Salaries by job title.** Department and amount attached to every company, with a page cap you control.
- **Employee reviews with structure.** The question answered, author label, date and a permalink to each review, walked across as many pages as you allow.
- **Sections on demand.** Switch reviews and salaries on or off per run, and pay only for what you use.
- **Built for monitoring.** Incremental mode returns only new and changed companies on recurring runs, and resume picks up one interrupted run without re-collecting what it already has.

### Use Cases

- **HR and recruiting research:** compare culture scores, CEO ratings and salary bands across a shortlist of employers.
- **Compensation benchmarking:** collect salary-by-title entries across companies to build pay-band models.
- **Competitive and market research:** track how a competitor's public rating, reviews and awards move over time.
- **Sales and lead enrichment:** attach company size signals, headquarters and website to a target account list.
- **Employer brand monitoring:** watch your own company's rating, culture grade and new reviews on a schedule.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live profile.

| Field | Example |
| --- | --- |
| `companyId` | `10000001` |
| `slug` | `"sample-company"` |
| `name` / `fullName` | `"Sample Company"` |
| `url` | `"https://www.comparably.com/companies/sample-company"` |
| `website` | `"http://www.example.com/"` |
| `phone` | `"+1-000-000-0000"` |
| `address` | `"1 Example Plaza, Sample City, CA 00000, USA"` |
| `mission` | `"Sample company mission statement goes here."` |
| `revenue` | `1000000000` |
| `logo` | `"https://cdn.comparably.com/00000000/l/sample-logo.png"` |
| `employeeParticipantCount` | `1000` |
| `totalRatingsCount` | `10000` |
| `overallRating` / `letterGrade` | `4.5` / `"A"` |
| `cultureScore` / `cultureGrade` / `cultureScoreLabel` | `80` / `"A"` / `"Top 10%"` |
| `ceoName` / `ceoScore` / `ceoTotalScore` | `"Jane Doe"` / `"Top 5%"` / `80` |
| `metroName` / `metroGrade` | `"Sample Metro"` / `"B"` |
| `topDimensions` / `bottomDimensions` | 12 culture dimensions with grade, score and percentile (when present) |
| `awardsCount` / `awards` | `10` / list of award objects (when present) |
| `owner` | leadership/ownership data (when present) |
| `relatedCompanies` | companies Comparably lists as related (when present) |
| `reviews` | employee reviews, empty unless enabled |
| `salaries` | salary entries, empty unless enabled |
| `profileRaw` | the complete upstream profile payload, so nothing is lost |

Each item in `reviews` carries a review ID, permalink, the question it answers, the review text, an author label, a date, a posted-ago label and a department. Each item in `salaries` carries a job title, the posted salary or salary-plus-bonus amount, a department, how long ago it was posted and a link to the entry.

### How to Use

1. Pick a **mode**: `search` (company names) or `url` (paste profile links or bare slugs).
2. Fill in the fields for that mode, and switch reviews and salaries on or off.
3. Set **Max companies** (and, for reviews, **Max reviews** / **Max review pages**) to control run size and cost, then click **Start**.
4. Download the dataset as JSON, CSV or Excel, or read it through the API.

**Search by company name (recommended):**

```json
{
  "mode": "search",
  "companies": ["Google", "Microsoft", "Goldman Sachs"],
  "includeReviews": true,
  "includeSalaries": true,
  "maxReviews": 100
}
```

**Direct URLs (or bare slugs):**

```json
{
  "mode": "url",
  "urls": ["https://www.comparably.com/companies/google", "microsoft"]
}
```

#### URL shapes

| Shape | Example | Behaviour |
|---|---|---|
| Company profile | `https://www.comparably.com/companies/google` | One record for the company. |
| Reviews page | `https://www.comparably.com/companies/google/reviews` | Same company record. |
| Reviews page with `?page=N` | `https://www.comparably.com/companies/google/reviews?page=2` | Same record, and the review walk starts at page N. Because it covers only a slice, it never marks tracked companies EXPIRED. |
| Salaries page | `https://www.comparably.com/companies/google/salaries` | Same company record. |
| Bare slug | `google` | Same company record. |

Any other link (another site, or a Comparably page that is not a company page) is skipped with a warning in the log, never silently counted as zero. If nothing in the list is a supported shape the run ends with a clear message. If several URLs point at the same company, it is scraped once.

**Default change:** with `mode` set to `url` and the `urls` field left untouched, the actor now scrapes one example per shape above (five companies) instead of nothing. Set `urls` to your own list to scrape only those.

In search mode, names that do not map directly to a Comparably slug (for example "J.P. Morgan" or "Acme, Inc.") are retried with relaxed slug spellings. A variant is accepted only when that exact profile page loads; if none does, a warning names the tried spellings and the company is skipped. Unrelated companies are never returned.

**Profiles only, fastest and cheapest:**

```json
{
  "mode": "search",
  "companies": ["Apple", "Netflix"],
  "includeReviews": false,
  "includeSalaries": false
}
```

**Lots of reviews for one company:**

```json
{
  "mode": "search",
  "companies": ["Amazon"],
  "includeReviews": true,
  "maxReviews": 1500,
  "maxReviewPages": 20,
  "includeSalaries": false
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/comparably-scraper").call(run_input={"mode": "search", "companies": ["Google"]})
for company in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(company["name"], company["overallRating"], company["cultureGrade"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/comparably-scraper').call({ mode: 'search', companies: ['Google'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one interrupted run: paste its run or dataset ID and the actor skips every company slug it already collected there, so you don't pay twice.
- **Incremental mode** (`incrementalMode`) is for scheduled runs over the same company list. Each company is classified `NEW`, `UPDATED` (with `changedFields`), `UNCHANGED` (suppressed and not billed unless `emitUnchanged` is on), `REAPPEARED` or `EXPIRED` (only after a run that scanned the whole tracked list, and only with `emitExpired`; never when `maxCompanies` capped the run, a pasted URL starts at a later results page, Resume was used, or a company's fetch failed). Any change to a company's ratings, scores, counts, or its review and salary entries makes it `UPDATED`; review order never does, and the relative posted-ago text on reviews and the posted date on salaries are excluded from the comparison (still returned in the output), as are fields listed in `ignoreFieldsForChanges`. `stateKey` names or shares the stored state; leave it empty and the actor derives one automatically from the company list and section settings. With incremental mode off, output is exactly as before.

#### Dataset views and run summary

The dataset has four views in the Console and API: **Companies Overview** (one row per company), **Reviews** (one row per review, unwound from each company), **Salaries** (one row per salary entry) and **Changes** (incremental mode: change type, changed fields, first and last seen). When a run covers more than one input it also stores an `OUTPUT` record in the key-value store with `inputsRequested`, `companiesResolved`, `rowsPushed`, `detailEnriched`, `failedCompanies`, `unparsedInputs` and `incrementalMode`.

#### Fields not added

Extra columns offered by the one rival actor were reviewed and not added; the full upstream profile stays available in `profileRaw` next to the named fields above.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` to resolve company names, `url` for direct profile URLs. |
| `companies` | array | `["Google", "Microsoft"]` | Search mode. Company names, one per line. |
| `urls` | array | one example per URL shape | URL mode. Comparably company URLs (profile, reviews, reviews with `?page=N`, salaries) or bare slugs, one per line. |
| `includeReviews` | boolean | `true` | Attach employee reviews to each record. |
| `maxReviews` | integer | `100` | Reviews per company (maximum 15000; `0` skips reviews). For a deep pull, set it high (for example `1500`) and let `maxReviewPages` bound the walk. |
| `maxReviewPages` | integer | `5` | Safety cap on review pages per company (about 75 reviews per page). |
| `includeSalaries` | boolean | `true` | Attach salary entries to each record. |
| `maxCompanies` | integer | `20` | Maximum companies across all inputs. `0` means unlimited. |
| `proxy` | object | Residential US | Proxy configuration. Residential (US) is recommended; datacenter proxies are refused by the site. |
| `resumeFromRunId` | string | (none) | Continue one interrupted run without re-collecting (or re-billing) companies it already returned. |
| `incrementalMode` | boolean | `false` | Recurring/scheduled monitoring of the same company list; only new, updated and reappeared companies are returned on later runs. |
| `stateKey` | string | (none) | Incremental mode only. Name a monitoring campaign, or leave empty to derive one automatically from the company list and section settings. |
| `emitUnchanged` | boolean | `false` | Incremental mode only. Also return (and bill for) companies unchanged since the last run. |
| `emitExpired` | boolean | `false` | Incremental mode only. Also return (and bill for) companies no longer found, once a run fully scans the tracked list. |
| `ignoreFieldsForChanges` | array | `[]` | Incremental mode only. Fields that never make a company `UPDATED` (still returned in the output); top-level names or nested paths such as `reviews[].author`. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which records are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live profile.

```json
{
  "companyId": 10000001,
  "slug": "sample-company",
  "url": "https://www.comparably.com/companies/sample-company",
  "name": "Sample Company",
  "fullName": "Sample Company",
  "mission": "Sample company mission statement goes here.",
  "website": "http://www.example.com/",
  "phone": "+1-000-000-0000",
  "address": "1 Example Plaza, Sample City, CA 00000, USA",
  "revenue": 1000000000,
  "employeeParticipantCount": 1000,
  "totalRatingsCount": 10000,
  "overallRating": 4.5,
  "letterGrade": "A",
  "cultureScore": 80,
  "cultureGrade": "A",
  "cultureScoreLabel": "Top 10%",
  "ceoName": "Jane Doe",
  "ceoScore": "Top 5%",
  "ceoTotalScore": 80,
  "metroName": "Sample Metro",
  "topDimensions": [
    { "category": "CEO Rating", "grade": "A", "score": "Top 5%", "percent": 5 }
  ],
  "reviews": [
    {
      "reviewId": "00000001",
      "url": "https://www.comparably.com/companies/sample-company/reviews/00000001/sample",
      "question": "Briefly describe your overall experience at your company",
      "text": "Great place to work, supportive team and good growth.",
      "author": "Anonymous Review",
      "date": "2026-01-01",
      "postedAgo": "Posted 10 days ago",
      "department": "Engineering"
    }
  ],
  "salaries": [
    {
      "jobTitle": "Senior Product Manager",
      "salary": "$000,000 Salary + Bonus",
      "department": "Product",
      "postedDate": "Posted more than 30 days ago"
    }
  ]
}
```

### Plan Requirement

Comparably sits behind a bot-protection wall that refuses plain datacenter and consumer connections with an "Access to this page has been denied" (HTTP 403) page. Datacenter proxies do not work here, so do not switch the proxy to a datacenter group. Use Apify Residential proxy with country US (the prefilled default); it is not strictly mandatory because the actor falls back to a backup connection, but it is the dependable choice. The Apify Starter plan and above include Residential proxy access.

On the free plan, which has no Residential proxy, the run logs this notice and continues on a backup connection:

> The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable.

Pages served that way are logged as "Served over the backup connection (the default connection was unavailable)." Some pages may still be refused. If the run's time limit cuts collection short after some companies were already returned, the run ends with a "Partial results: N companies pushed before the run's time limit cut further collection." status. If no page at all can be read, the run fails instead of returning an empty dataset, with one of these messages:

- "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required." (or, if you entered your own proxy URLs, check their credentials).
- "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested Comparably pages."
- "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later."

### FAQ

#### How much does it cost?

You pay per company record returned (one dataset item per company), plus a small extra charge: event `detail-enrichment`, one unit per delivered company record that carries reviews or salaries, charged right after that record is saved. It is one unit per company, not per review or per page, and never applies to unchanged, skipped or failed records (switch both sections off for profiles only). There is also the standard Apify actor-start event. The **Pricing** tab shows the current rates. Use **Max companies**, **Max reviews** and **Max review pages** to cap the cost of any run.

#### Is it legal to scrape Comparably?

This actor collects only publicly available company profile data. You are responsible for how you use it: follow Comparably's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution.

#### Can I get only new or changed companies on a schedule?

Yes. Schedule the actor from the **Schedules** tab and turn on **Incremental mode**. Each run then returns only new, updated and reappeared companies, and unchanged ones are not billed.

#### Why does the proxy setting matter so much?

Comparably refuses datacenter connections with an access-denied page. Residential US is the dependable setting; with a datacenter group, requests are refused and the run fails with a clear message rather than returning an empty dataset. Keep the prefilled Residential (US) proxy unless you have a specific reason to change it.

#### Why did my run fail instead of returning an empty dataset?

If no company name or URL resolves to a real profile, the run stops with a clear message so "nothing matched" is never confused with "the site returned nothing to read". Check your company names or URLs and run it again.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

### 🔗 Want more leads data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>📇 <a href="https://apify.com/abotapi/jobstreet-companies-reviews-scraper"><b>JobStreet</b></a><br>Pull JobStreet company profiles and employee reviews across Malaysia, Singapore...</td><td>💼 <a href="https://apify.com/abotapi/seek-companies-reviews-scraper"><b>SEEK Company Reviews</b></a><br>Scrape SEEK Australia and New Zealand company profiles and employee reviews. Choose...</td></tr>
<tr><td>💼 <a href="https://apify.com/abotapi/repvue-scraper"><b>RepVue Scraper</b></a><br>Scrape RepVue company profiles, RepVue Score, sales-rep reviews, and compensation by role...</td><td>💼 <a href="https://apify.com/abotapi/hiring-cafe-scraper"><b>Hiring.Cafe Jobs</b></a><br>Unlock powerful Hiring.Cafe job data extraction. Use advanced filters or URLs to get 100+...</td></tr>
<tr><td>💼 <a href="https://apify.com/abotapi/remoteok-com-scraper"><b>RemoteOK Jobs Scraper</b></a><br>Scrape RemoteOK jobs by keyword or job URL. Extract title, company, location, remote...</td><td>💼 <a href="https://apify.com/abotapi/francetravail-fr-scraper"><b>France Travail Scraper</b></a><br>Scrape job offers from France Travail with titles, companies, locations, salaries...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/comparably-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

</content>

# Actor input Schema

## `mode` (type: `string`):

How to choose companies. 'Search by name' resolves each company name to its Comparably profile. 'Direct URLs' takes Comparably company URLs you already have.

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

Search mode only. Company names to resolve, one per line (e.g. 'Google', 'Microsoft', 'Goldman Sachs'). Each is matched to its Comparably profile automatically.

## `urls` (type: `array`):

URL mode only. One company per line: a profile URL (/companies/google), a reviews URL (/companies/google/reviews), a reviews URL with ?page=N (the review walk starts at page N), a salaries URL (/companies/google/salaries), or a bare slug like 'netflix'. Every shape resolves to the company's single record. Leave untouched to scrape one example per shape.

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

Attach employee reviews to each company record (text, question, author, date, permalink).

## `maxReviews` (type: `integer`):

Cap on reviews collected per company (default 100, maximum 15000). Set 0 to skip reviews. Bounded by Max review pages.

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

Safety cap on review pages to walk per company (~75 reviews per page).

## `includeSalaries` (type: `boolean`):

Attach salary entries (job title, amount, department) to each company record.

## `maxCompanies` (type: `integer`):

Maximum number of companies to scrape across all inputs. Default 20. Set 0 for unlimited.

## `proxy` (type: `object`):

Comparably admits US residential connections. Residential (US) is strongly recommended; datacenter is refused.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue an interrupted run without returning or charging for companies already collected there. For recurring monitoring of the same company list, use Incremental mode below instead.

## `incrementalMode` (type: `boolean`):

Turn this on for recurring monitoring of the same company list. The first run returns every company as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED companies. A company is UPDATED when anything in its record changes: ratings and scores, counts, or a review or salary entry being added, removed or edited (changedFields names the top-level fields). Relative-date text (the review "posted ago" text and the salary posted date) is excluded from the comparison but still returned in the output, and so are any fields you list in "Ignore fields when detecting changes". Review order never matters. Turn on "Emit unchanged" or "Emit expired" only when you also want those companies returned (and billed). EXPIRED is only produced after a complete scan: not when Max companies capped the run, a pasted URL starts at a later results page, or Resume was used, and never for a company whose fetch failed. State is kept separately per company list and section toggles; use State key when you want to name or deliberately share a monitoring campaign (a shared key only expires companies tracked under the same list and settings). To continue one specific interrupted run instead, use Resume from a previous run above.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the company list and section settings — different lists then never mix state with each other.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return companies that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return companies that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked company list — not when Max companies capped it or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.

## `ignoreFieldsForChanges` (type: `array`):

Incremental mode only. Fields that should never make a company UPDATED. They are still returned in the output. Use a top-level name such as cultureScore, or a nested path such as reviews\[].author or salaries\[].salary. Review posted-ago text and salary posted date are always ignored.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "companies": [
    "Google",
    "Microsoft"
  ],
  "urls": [
    "https://www.comparably.com/companies/google",
    "https://www.comparably.com/companies/microsoft/reviews",
    "https://www.comparably.com/companies/apple/reviews?page=2",
    "https://www.comparably.com/companies/amazon/salaries",
    "netflix"
  ],
  "includeReviews": true,
  "maxReviews": 100,
  "maxReviewPages": 5,
  "includeSalaries": true,
  "maxCompanies": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

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

No description

## `salaries` (type: `string`):

No description

## `changes` (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 = {
    "mode": "search",
    "companies": [
        "Google",
        "Microsoft"
    ],
    "urls": [
        "https://www.comparably.com/companies/google",
        "https://www.comparably.com/companies/microsoft/reviews",
        "https://www.comparably.com/companies/apple/reviews?page=2",
        "https://www.comparably.com/companies/amazon/salaries",
        "netflix"
    ],
    "maxCompanies": 20,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/comparably-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 = {
    "mode": "search",
    "companies": [
        "Google",
        "Microsoft",
    ],
    "urls": [
        "https://www.comparably.com/companies/google",
        "https://www.comparably.com/companies/microsoft/reviews",
        "https://www.comparably.com/companies/apple/reviews?page=2",
        "https://www.comparably.com/companies/amazon/salaries",
        "netflix",
    ],
    "maxCompanies": 20,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/comparably-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 '{
  "mode": "search",
  "companies": [
    "Google",
    "Microsoft"
  ],
  "urls": [
    "https://www.comparably.com/companies/google",
    "https://www.comparably.com/companies/microsoft/reviews",
    "https://www.comparably.com/companies/apple/reviews?page=2",
    "https://www.comparably.com/companies/amazon/salaries",
    "netflix"
  ],
  "maxCompanies": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false
}' |
apify call abotapi/comparably-scraper --silent --output-dataset

```

## MCP server setup

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