# Trustpilot Scraper — Company Data & Reviews (`b2b_leads/trustpilot-real-time-data-scraper`) Actor

Scrape Trustpilot in real time: company search, category browse, full profiles with website, email and phone, plus customer reviews. Export ratings, review counts and lead contacts as JSON, CSV or Excel. Fast, reliable, proxy included — no code needed.

- **URL**: https://apify.com/b2b_leads/trustpilot-real-time-data-scraper.md
- **Developed by:** [Emmanuel](https://apify.com/b2b_leads) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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.

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

## Trustpilot Real-Time Data

Turn the world's biggest review directory into a clean, structured dataset. **Trustpilot Real-Time Data** collects companies — name, website, email, phone, rating, review volume and categories — plus the individual customer reviews behind that rating. Search by keyword, browse by category, enrich full company profiles, and stream every row to your dataset (and your own systems) as it is collected.

> **Free plan:** runs on the Apify free plan are limited to a **2-result free trial** per run. Upgrade to a paid Apify plan for full, unlimited output. Paying users get the complete result set, capped only by the `Max total items` you set.

### Who it's for

- **Agencies & local SEO** building prospect lists and reputation dashboards
- **Brand & competitor intelligence** teams tracking ratings and review volume over time
- **E-commerce & SaaS teams** monitoring their own reputation and their rivals'
- **Researchers & analysts** studying review sentiment across markets and categories
- **RevOps / growth** teams enriching CRMs with company contact details
- **AI agents & automations** that need a live, structured feed of company trust data

### Use cases

1. **Competitor benchmarking** — collect every competitor in a category and compare rating, review volume and review velocity.
2. **Lead generation** — search your niche, enrich each company, and export website, email and phone straight into your CRM.
3. **Reputation monitoring** — pull recent reviews on your own profile on a schedule and alert Slack when sentiment dips.
4. **Sentiment & topic analysis** — feed review text (author, rating, date, language) into an LLM or a data warehouse.
5. **Category market maps** — browse a category to build a complete map of who competes in it and how they are rated.
6. **Watchlist tracking** — paste a list of profile links and collect exactly those companies on a recurring schedule.

### Feature matrix

| Feature | Default | What it does |
| --- | --- | --- |
| **Company search** | ✅ On | Search Trustpilot by keyword. One row per company: name, domain, website, email, phone, rating, review volume, categories. |
| **Company details** | ✅ On | Enriches each company **in place** with its full profile: verified status, registered address, all categories, response behaviour, freshest rating and review volume. Never filters rows out. |
| **Category browse** | ⬜ Off | Discover every company listed under one or more categories. |
| **Reviews** | ⬜ Off | Collect customer reviews as their own rows (author, rating, title, text, date, language, helpful votes, company reply). Capped per company. |
| **Scrape By URL** | ⬜ Off | Collect specific company profiles from pasted links or bare domains. |
| **Webhook** | — | Also POST every new record to your own URL (JSON or Slack), in addition to the dataset. |

### Input reference

Every row is saved to the dataset no matter which features you enable; **Company details** only adds fields to the same row.

#### 🔎 Company search (on by default)

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `enableCompanySearch` | boolean | `true` | Turn keyword search on/off. |
| `searchTasks` | array | `airbnb`, `stripe` | One row per keyword: `query` (required), `country` (optional market code, e.g. `uk`), `maxResults`. |
| `searchMaxResults` | integer | `10` | Default companies per keyword when a task omits `maxResults`. |
| `maxPagesPerTask` | integer | `3` | Safety cap on how many result pages to walk per task. |

#### 🏢 Company details (on by default)

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `enableCompanyDetails` | boolean | `true` | Adds the full profile to each company row. Adds a little extra time per record. |

#### 🗂️ Category browse (off by default)

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `enableCategoryBrowse` | boolean | `false` | Turn category discovery on/off. |
| `categories` | string list | `[]` | Category slugs, e.g. `electronics_technology`, `travel_vacation`, `money_insurance`. |
| `categoryMaxResults` | integer | `50` | Companies to collect per category. |

#### ⭐ Reviews (off by default)

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `enableReviews` | boolean | `false` | Collect reviews as separate rows. |
| `reviewUrls` | string list | `[]` | Company links or bare domains, e.g. `stripe.com` or `https://www.trustpilot.com/review/stripe.com`. |
| `maxReviewsPerCompany` | integer | `30` | Cap per company (1–500). |

#### 🔗 Scrape By URL (off by default)

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `enableScrapeByUrl` | boolean | `false` | Collect specific company profiles. |
| `scrapeUrls` | string list | `[]` | Company links or bare domains. |

#### ⚙️ Output & limits

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `maxItems` | integer | `1000` | Global cap on total dataset rows across all features. |
| `concurrency` | integer | `8` | Parallel detail lookups (1–8). Higher is faster and uses the same number of requests. |

#### 🔔 Delivery

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `webhookUrl` | string | `""` | Optional extra real-time push per record. |
| `webhookFormat` | `json` | `slack` | `json` | `json` = full record; `slack` = Slack-ready message. |

#### 🌐 Connection

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `proxyConfiguration` | object | Apify residential, US | Change the market country here, or supply custom proxy URLs. |

#### ⚡ Speed & cost

- The first-ever run clears the site's connection challenge with a short browser warm-up and saves the session; **every later run reuses that saved session and starts collecting immediately** (a stale session self-heals with a fresh warm-up).
- Search and category pages are fetched one page ahead, so page latency hides behind detail enrichment instead of adding to the run time.
- `concurrency` (default `8`) controls parallel detail lookups; raising it shortens wall time without adding requests.

#### Example input

```json
{
  "enableCompanySearch": true,
  "searchTasks": [
    { "query": "airbnb", "maxResults": 10 },
    { "query": "stripe", "maxResults": 10 }
  ],
  "enableCompanyDetails": true,
  "enableReviews": true,
  "reviewUrls": ["stripe.com"],
  "maxReviewsPerCompany": 30,
  "maxItems": 500
}
```

### Output

Each run writes to the default **dataset** and a per-run summary to the **OUTPUT** key-value record.

#### Company row (key fields)

`type`, `featureType`, `platform`, `companyId`, `name`, `domain`, `profileUrl`, `website`, `email`, `phone`, `address`, `city`, `postalCode`, `country`, `countryCode`, `rating`, `stars`, `reviewCount`, `reviewCountLast12Months`, `categories`, `categoryIds`, `primaryCategory`, `topLevelCategory`, `midLevelCategory`, `isClaimed`, `isClosed`, `verification`, `responseRate`, `averageDaysToReply`, `claimedDate`, `profileImageUrl`, `detailsFetched`, `searchQuery`, `searchTaskLabel`, `categoryId`, `position`, `scrapedAt`.

#### Review row (key fields)

`type`, `featureType`, `platform`, `reviewId`, `companyId`, `companyName`, `companyDomain`, `companyUrl`, `rating`, `title`, `text`, `language`, `author`, `authorId`, `authorReviewCount`, `authorCountryCode`, `date`, `experiencedDate`, `likes`, `source`, `verified`, `replyText`, `replyDate`, `scrapedAt`.

A field stays empty when the company simply does not publish that detail — a company is never dropped for missing data.

### Webhooks

Set `webhookUrl` and every new record is POSTed as it is collected — in addition to the dataset. Delivery failures never stop the run.

**JSON** (`webhookFormat: "json"`) posts the full record object:

```json
{ "type": "company", "name": "Stripe", "domain": "stripe.com", "rating": 1.6, "reviewCount": 17510, "website": "https://stripe.com" }
```

**Slack** (`webhookFormat: "slack"`) posts a Slack-ready payload, e.g. for a company:

```json
{ "text": ":office: *Stripe*\n*Rating:* 1.6/5  •  *Reviews:* 17510\n*Website:* https://stripe.com" }
```

Works with Slack incoming webhooks, Zapier, Make, n8n, Google Sheets and any CRM that accepts a JSON POST.

### Use it from an AI agent (Apify MCP)

This Actor is callable through the **Apify MCP server**, so an agent can run it and reason over the results directly. Add this Actor to your MCP client and ask:

> "Use Trustpilot Real-Time Data to find the top reviewed payment companies and list their ratings, review counts and websites."

The agent runs the Actor, receives the structured company rows, and answers from them — no glue code required.

### FAQ

**Do I need a proxy?** Apify's residential proxy is enabled by default and is all most runs need. If you want a specific market, change the country in the Connection section.

**What about the free plan?** Free (non-paying) accounts receive a **2-result sample** per run and finish cleanly with an upgrade note. Paid plans get the full result set.

**How fresh is the data?** Every run reads live company profiles and reviews at the moment it runs — ratings and review counts reflect the run time.

**How do I keep a list up to date?** Save your input as a task and schedule it (hourly/daily/weekly). Only new rows change, so you get a clean time series.

**Can I get emails and phone numbers?** Yes — these are included on company rows whenever the company publishes them. Some companies publish none.

**Does turning on Company details reduce my results?** No. Details enrich each row in place; they never remove companies.

### Notes

- Memory: 512 MB default. Timeout: 10,000 seconds.
- Results stream to the dataset as they are collected, so even very large runs stay light.

# Actor input Schema

## `enableCompanySearch` (type: `boolean`):

Search Trustpilot by company keyword. Enabled by default. Every match is exported with company name, website, email, phone, rating, review volume and categories.

## `searchTasks` (type: `array`):

Primary input. Add one row per keyword. Optional country routes the search to a regional Trustpilot market (e.g. "uk", "de").

## `searchMaxResults` (type: `integer`):

Default maximum companies per search task. Override per task in the list above.

## `maxPagesPerTask` (type: `integer`):

How many result pages of the same search or category to collect (safety cap for very large runs).

## `enableCompanyDetails` (type: `boolean`):

Enrich every company in place with its full profile: verified status, registered address, all categories, response behaviour, and the freshest rating and review volume. Every company is still exported even when a profile has little detail — this adds a little extra time per record.

## `enableCategoryBrowse` (type: `boolean`):

Discover companies listed under a Trustpilot category (e.g. "electronics_technology", "travel", "banking"). Off by default.

## `categories` (type: `array`):

Category slugs to browse, one per line (e.g. electronics_technology, travel_vacation, money_insurance).

## `categoryMaxResults` (type: `integer`):

Maximum companies to collect from each category.

## `enableReviews` (type: `boolean`):

Collect customer reviews for specific companies as their own dataset rows (author, rating, title, text, date, language, helpful votes, company reply). off by default because it adds extra records per company.

## `reviewUrls` (type: `array`):

Trustpilot company links or bare domains to collect reviews from (e.g. https://www.trustpilot.com/review/stripe.com or stripe.com), one per line.

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

Maximum number of reviews to collect from each company.

## `enableScrapeByUrl` (type: `boolean`):

Collect specific Trustpilot company profiles instead of searching.

## `scrapeUrls` (type: `array`):

Trustpilot company links or bare domains (e.g. https://www.trustpilot.com/review/stripe.com), one per line.

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

Global cap on total dataset rows across all features. Set high for large runs (e.g. 10000+). NOTE: on the Apify free plan this Actor is limited to a 2-result free trial per run; upgrade to a paid Apify plan for full, unlimited output. See the README 'Free plan & paid plans' section.

## `concurrency` (type: `integer`):

How many detail lookups to run in parallel (1–8). Higher is faster and uses the same number of requests; 8 is a good default.

## `webhookUrl` (type: `string`):

Optional. Every record is always saved to the run's dataset — this webhook is an ADDITIONAL real-time push. When set, each new record is also POSTed to this URL (CRM, Slack incoming webhook, Zapier, Make, Google Sheets).

## `webhookFormat` (type: `string`):

json = full record object; slack = Slack-friendly message payload.

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

Apify residential proxy (United States) is enabled by default for reliable collection.

## Actor input object example

```json
{
  "enableCompanySearch": true,
  "searchTasks": [
    {
      "query": "airbnb",
      "maxResults": 10
    },
    {
      "query": "stripe",
      "maxResults": 10
    }
  ],
  "searchMaxResults": 10,
  "maxPagesPerTask": 3,
  "enableCompanyDetails": true,
  "enableCategoryBrowse": false,
  "categories": [],
  "categoryMaxResults": 50,
  "enableReviews": false,
  "reviewUrls": [],
  "maxReviewsPerCompany": 30,
  "enableScrapeByUrl": false,
  "scrapeUrls": [],
  "maxItems": 1000,
  "concurrency": 8,
  "webhookUrl": "",
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Complete dataset with every company and review row from all enabled features in this run.

## `companies` (type: `string`):

Company rows from search, category browse and scrape-by-url.

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

Review rows collected for specific companies.

## `runSummary` (type: `string`):

Per-run metadata: totals, enabled features, spending-limit status, and the paywall object (detected, isPaying, pricingTier, limited, blocked, freeTierMaxItems).

# 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 = {
    "enableCompanySearch": true,
    "searchTasks": [
        {
            "query": "airbnb",
            "maxResults": 10
        },
        {
            "query": "stripe",
            "maxResults": 10
        }
    ],
    "searchMaxResults": 10,
    "maxPagesPerTask": 3,
    "enableCompanyDetails": true,
    "enableCategoryBrowse": false,
    "categoryMaxResults": 50,
    "enableReviews": false,
    "maxReviewsPerCompany": 30,
    "enableScrapeByUrl": false,
    "maxItems": 1000,
    "concurrency": 8,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_leads/trustpilot-real-time-data-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 = {
    "enableCompanySearch": True,
    "searchTasks": [
        {
            "query": "airbnb",
            "maxResults": 10,
        },
        {
            "query": "stripe",
            "maxResults": 10,
        },
    ],
    "searchMaxResults": 10,
    "maxPagesPerTask": 3,
    "enableCompanyDetails": True,
    "enableCategoryBrowse": False,
    "categoryMaxResults": 50,
    "enableReviews": False,
    "maxReviewsPerCompany": 30,
    "enableScrapeByUrl": False,
    "maxItems": 1000,
    "concurrency": 8,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("b2b_leads/trustpilot-real-time-data-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 '{
  "enableCompanySearch": true,
  "searchTasks": [
    {
      "query": "airbnb",
      "maxResults": 10
    },
    {
      "query": "stripe",
      "maxResults": 10
    }
  ],
  "searchMaxResults": 10,
  "maxPagesPerTask": 3,
  "enableCompanyDetails": true,
  "enableCategoryBrowse": false,
  "categoryMaxResults": 50,
  "enableReviews": false,
  "maxReviewsPerCompany": 30,
  "enableScrapeByUrl": false,
  "maxItems": 1000,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call b2b_leads/trustpilot-real-time-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2b_leads/trustpilot-real-time-data-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/235UTzzCdS5GanlfT/builds/AiedYeQQX8pZHa6pr/openapi.json
