# Trustpilot Company Scraper (`datascrapers/trustpilot-scraper`) Actor

Collect Trustpilot company listings, optional profile details, and optional reviews from search queries, categories, or company URLs.

- **URL**: https://apify.com/datascrapers/trustpilot-scraper.md
- **Developed by:** [Farhan Ali](https://apify.com/datascrapers) (community)
- **Categories:**
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.97 / 1,000 company records

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

**Trustpilot Company Scraper** creates a structured dataset of companies collected from [Trustpilot](https://www.trustpilot.com). Each dataset item represents one company and can include name, TrustScore, stars, review counts, location, categories, optional profile details (contact, verification, activity, rating breakdown), and optional nested reviews. Query the source with search terms (`searchQueries`), category slugs (`categoryIds`), or Trustpilot search, category, or review URLs (`startUrls`). Control the result limit with `maxItems`, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, XML, or another supported format.

### Dataset at a glance

| Property | Value |
|---|---|
| Source | trustpilot.com |
| Record unit | One Trustpilot company, with optional nested reviews |
| Input methods | Search terms (`searchQueries`), category slugs or URLs (`categoryIds`), and/or Trustpilot URLs (`startUrls`) |
| Main identifiers | `companyId`, profile URL (`url`), `identifyingName` |
| Delivery | Apify Dataset and API |
| Export formats | JSON, CSV, Excel, XML, HTML (Apify dataset exports) |
| Update model | Fresh records per Actor run |
| Pricing | $1 / 1,000 companies; +$1.50 / 1,000 company details; +$1.50 / 1,000 reviews; Actor start $0.00005 |

### Coverage and available records

The Actor collects public Trustpilot companies from one or more entry points. Provide at least one of `searchQueries`, `categoryIds`, or `startUrls`.

- **Search-based**: `searchQueries` (for example `Clothing store in United States` or `dog trainer`). `country` is an ISO code that scopes search and category results (default `US`).
- **Category-based**: `categoryIds` accepts slugs such as `cats_dogs` or `clothing_store`, or a category page URL.
- **URL-based**: `startUrls` accepts search, category, or company review URLs (for example `https://www.trustpilot.com/review/sportdecals.com`).

Record types and limits:

- **Listing-level companies** are always collected: identifiers, TrustScore, stars, review counts, location, categories, and status flags when Trustpilot returns them.
- **Company details** are conditional: claimed status, verification, contact, activity, rating breakdown, and similar companies are returned when `scrapeCompanyDetails` is enabled (default `false`) and charged as `company-details`.
- **Reviews** are conditional: a nested `reviews` array is returned when `scrapeReviews` is enabled (default `false`) and charged **per review**. `maxReviews` caps reviews per company (default `5`; `0` = all).
- **Result cap**: `maxItems` limits companies (`0` means unlimited; console prefill `10`).

Known exclusions: content Trustpilot only shows after login is not collected; each run captures profile state at run time (no historical snapshots); reviews are nested on the company record and are never separate dataset rows.

### Data dictionary

Field names below match dataset record JSON properties exactly. Fields marked *conditional* appear only when the corresponding input toggle is enabled.

#### Company listing fields

| Field | Type | Nullable | Description | Example |
|---|---|---:|---|---|
| `companyId` | string | No | Trustpilot company identifier; recommended deduplication key | `597650820000ff0005a75542` |
| `name` | string | Yes | Company name | `Red Tuna Shirt Club` |
| `identifyingName` | string | Yes | Domain-style identifying name | `redtunashirtclub.com` |
| `url` | string | Yes | Trustpilot review-profile URL | `https://www.trustpilot.com/review/redtunashirtclub.com` |
| `website` | string | Yes | Company website | `https://redtunashirtclub.com` |
| `logoUrl` | string | Yes | Logo image URL | `https://s3-eu-west-1.amazonaws.com/tpd/logos/597650820000ff0005a75542/0x0.png` |
| `stars` | number | Yes | Star rating | `5.0` |
| `trustScore` | number | Yes | TrustScore | `4.9` |
| `numberOfReviews` | number | Yes | Total review count | `3467` |
| `numberOfReviewsLast12Months` | number | Yes | Reviews in the last 12 months | `317` |
| `email` | string | Yes | Email when shown on the listing or details | `hello@redtunashirtclub.com` |
| `phone` | string | Yes | Phone when shown | `888-411-1704` |
| `location` | object | Yes | `{address, city, zipCode, country}` | See example record |
| `country` | string | Yes | Country as shown | `US` |
| `countryCode` | string | Yes | ISO country code used for the query | `US` |
| `categories` | object\[] | Yes | `{id, name, isPrimary}` | `[{"id": "clothing_store", "name": "Clothing Store", "isPrimary": false}]` |
| `isRecommended` | boolean | Yes | Recommended flag | `false` |
| `isVerified` | boolean | Yes | Verified flag | `true` |
| `isClaimed` | boolean | Yes | Claimed-profile flag | `true` |
| `isClosed` | boolean | Yes | Closed flag | `false` |
| `isTemporarilyClosed` | boolean | Yes | Temporarily closed flag | `false` |
| `isCollectingReviews` | boolean | Yes | Whether the profile is collecting reviews | `true` |
| `source` | string | Yes | Seed type (`search`, category, or URL) | `search` |
| `searchQuery` | string | Yes | Search term that produced the record | `Clothing store in United States` |
| `listingType` | string | Yes | Listing source label | `search` |

#### Company detail fields (conditional — `scrapeCompanyDetails`)

| Field | Type | Nullable | Description | Example |
|---|---|---:|---|---|
| `verification` | object | Yes | `{verifiedByGoogle, verifiedPaymentMethod, verifiedUserIdentity}` | See example record |
| `contactInfo` | object | Yes | Contact object (email, phone, city, country, zip) | See example record |
| `reviewRatings` | object | Yes | Star-count breakdown (`total`, `one`–`five`) | See example record |
| `activity` | object | Yes | Activity object when Trustpilot returns it | Object as returned by the source |
| `similarCompanies` | array | Yes | Similar-company list when shown | Array as returned by the source |
| `hasCollectedIncentivisedReviews` | boolean | Yes | Incentivised-review flag | Flag when shown |
| `locationsCount` | number | Yes | Location count when shown | Count when shown |

#### Review fields (conditional — `scrapeReviews`)

Each company record may include a `reviews` array. One review object:

| Field | Type | Nullable | Description | Example |
|---|---|---:|---|---|
| `id` | string | No | Review identifier | `6a71d8f487df15bb35928f39` |
| `title` | string | Yes | Review title | `My son loved getting these each month…` |
| `text` | string | Yes | Review body | `My son loved getting these each month...` |
| `rating` | number | Yes | Star rating | `5` |
| `language` | string | Yes | Language code | `en` |
| `likes` | number | Yes | Like count | `1` |
| `source` | string | Yes | Review source label | `Shopify` |
| `publishedDate` | string | Yes | Published timestamp (ISO 8601) | `2026-08-04T14:20:04.000Z` |
| `isVerified` | boolean | Yes | Verified-review flag | `true` |
| `consumerDisplayName` | string | Yes | Reviewer display name | `Sandra Lincoln` |
| `consumerCountryCode` | string | Yes | Reviewer country | `US` |

`reviewsScraped` is the number of reviews attached to that company in this run.

### Example dataset record

Company from search `Clothing store in United States` with `scrapeCompanyDetails` and `scrapeReviews` on (`maxReviews: 5`). The `reviews` array is shortened to one object.

```json
{
  "companyId": "597650820000ff0005a75542",
  "name": "Red Tuna Shirt Club",
  "identifyingName": "redtunashirtclub.com",
  "url": "https://www.trustpilot.com/review/redtunashirtclub.com",
  "website": "https://redtunashirtclub.com",
  "logoUrl": "https://s3-eu-west-1.amazonaws.com/tpd/logos/597650820000ff0005a75542/0x0.png",
  "stars": 5.0,
  "trustScore": 4.9,
  "numberOfReviews": 3467,
  "email": "hello@redtunashirtclub.com",
  "phone": "888-411-1704",
  "location": {
    "address": "",
    "city": "Houston",
    "zipCode": "77005",
    "country": "US"
  },
  "country": "US",
  "categories": [
    {"id": "printed_clothing_store", "name": "Printed Clothing Store", "isPrimary": false},
    {"id": "clothing_store", "name": "Clothing Store", "isPrimary": false}
  ],
  "isRecommended": false,
  "isVerified": true,
  "source": "search",
  "searchQuery": "Clothing store in United States",
  "listingType": "search",
  "numberOfReviewsLast12Months": 317,
  "countryCode": "US",
  "isClaimed": true,
  "isClosed": false,
  "isTemporarilyClosed": false,
  "isCollectingReviews": true,
  "verification": {
    "verifiedByGoogle": false,
    "verifiedPaymentMethod": true,
    "verifiedUserIdentity": false
  },
  "contactInfo": {
    "email": "hello@redtunashirtclub.com",
    "city": "Houston",
    "country": "US",
    "phone": "888-411-1704",
    "zipCode": "77005"
  },
  "reviewRatings": {
    "total": 3467,
    "one": 19,
    "two": 12,
    "three": 39,
    "four": 169,
    "five": 3228
  },
  "reviews": [
    {
      "id": "6a71d8f487df15bb35928f39",
      "title": "My son loved getting these each month…",
      "text": "My son loved getting these each month and reading about the charter. A great gift for the fisherman in your life!",
      "rating": 5,
      "language": "en",
      "likes": 1,
      "source": "Shopify",
      "publishedDate": "2026-08-04T14:20:04.000Z",
      "isVerified": true,
      "consumerDisplayName": "Sandra Lincoln",
      "consumerCountryCode": "US"
    }
  ],
  "reviewsScraped": 5
}
```

The record above was produced with this input:

```json
{
  "searchQueries": ["Clothing store in United States"],
  "country": "US",
  "maxItems": 3,
  "scrapeCompanyDetails": true,
  "scrapeReviews": true,
  "maxReviews": 5
}
```

### Query and input reference

| Input | Type | Required | Default | Accepted values | Description |
|---|---|---:|---|---|---|
| `searchQueries` | array (string) | No\* | — (prefill `Clothing store in United States`) | Company search terms | Search entry point |
| `country` | string | No | `US` | ISO country code (`US`, `GB`, `DE`, `FR`, …) | Scopes search and category results |
| `categoryIds` | array (string) | No\* | — | Category slugs or category page URLs | Category entry point |
| `startUrls` | array (requestListSources) | No\* | — | Trustpilot search, category, or `/review/…` URLs | URL entry point |
| `maxItems` | integer | No | `0` | `0` or any positive integer | Maximum companies; `0` = unlimited (console prefill `10`) |
| `scrapeCompanyDetails` | boolean | No | `false` | `true` / `false` | Attach profile details (charged as company details) |
| `scrapeReviews` | boolean | No | `false` | `true` / `false` | Attach nested reviews (charged per review) |
| `maxReviews` | integer | No | `5` | `0` or any positive integer | Review cap per company; `0` = all |
| `proxyConfiguration` | object | No | Apify proxy, `RESIDENTIAL` | Apify proxy groups or custom proxies | Residential proxies are recommended |

\* Provide `searchQueries`, `categoryIds`, and/or `startUrls` — at least one source is required.

Minimal request:

```json
{ "searchQueries": ["Clothing store in United States"], "country": "US" }
```

Advanced request (details and capped reviews):

```json
{
  "searchQueries": ["Clothing store in United States"],
  "country": "US",
  "maxItems": 10,
  "scrapeCompanyDetails": true,
  "scrapeReviews": true,
  "maxReviews": 5,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Retrieve the data through the API

Records are delivered through the Apify Actor and Dataset APIs — not an official Trustpilot API.

1. Start the Actor with a JSON input (console or API).
2. Wait for the run to finish, or use a synchronous endpoint if you want the response inline.
3. Retrieve items from the run's default dataset.
4. Paginate or export the dataset.

Python example:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR-APIFY-TOKEN")

run_input = {
    "searchQueries": ["Clothing store in United States"],
    "country": "US",
    "maxItems": 3,
    "scrapeCompanyDetails": True,
    "scrapeReviews": True,
    "maxReviews": 5,
}

run = client.actor("datascrapers/trustpilot-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item.get("trustScore"), item.get("numberOfReviews"))
```

Apify generates ready-to-run Python, JavaScript, and cURL examples on the Actor's [API tab](https://apify.com/datascrapers/trustpilot-scraper/api). Do not put a real API token in shared code or URLs.

### Data quality and record handling

- **Conditional fields**: details and reviews appear only when their toggles are enabled. Listing-only runs return a leaner company record.
- **Source changes**: Trustpilot page structure and values can change; unreadable fields are omitted or returned as null rather than fabricated.
- **Deduplication**: within a run, companies are identified by `companyId`. Across runs, records are appended.
- **Failures**: one failed company or review page does not stop the run. The run stops if a spending limit is reached.
- **Normalization**: `stars`, `trustScore`, and `rating` are numeric. `publishedDate` is ISO 8601. Review text comes from Trustpilot.

### Export and pipeline examples

| Destination | Recommended method | Typical use |
|---|---|---|
| PostgreSQL / Supabase | Dataset API poll or webhook consumer | Store company scores and nested reviews |
| Google Sheets | Apify Google Sheets integration | Share competitor shortlists |
| CRM / lead tools | Dataset API or completion webhook | Website, email, and phone from claimed profiles |
| S3 / cloud storage | Scheduled export via Apify scheduler + integration | Archival of reputation snapshots |

### Pricing and cost examples

The Actor uses pay-per-event pricing. Each run also charges a one-time Actor start. Residential proxies are recommended. Proxy and compute are billed by your Apify plan. Event charges may be tiered on Apify paid plans.

| Event | Trigger | Rate |
|---|---|---|
| Actor start | Once per run | $0.00005 |
| `dataset-item` (Company record) | Each company written to the dataset | $0.001 / company ($1 / 1,000) |
| `company-details` (Company Details) | Profile enrichment (`scrapeCompanyDetails`) | $0.0015 / company ($1.50 / 1,000) |
| `review` (Review) | Each nested review (`scrapeReviews`) | $0.0015 / review ($1.50 / 1,000) |

Example costs (Actor start negligible; plan-tier discounts not applied):

| Records | Configuration | Estimated base cost |
|---:|---|---:|
| 1,000 | Companies only | $1.00 |
| 1,000 | Companies + details | $2.50 |
| 1,000 | Companies + details + 5 reviews each | $10.00 |

Estimates depend on the verified pricing model and the options selected for the run.

### Limitations and responsible data use

- The Actor collects publicly accessible Trustpilot company and review data only.
- Field availability depends on what Trustpilot renders at run time; contact and verification fields can be missing.
- The Actor does not provide historical snapshots unless you store them yourself.
- Large runs should use residential proxies; without them, coverage may degrade.
- You are responsible for compliance with Trustpilot's terms of service, applicable privacy law, and any contractual obligations before using the data.

### Dataset questions

#### What does one dataset item represent?

One Trustpilot company. Reviews, when requested, nest in `reviews` on that company.

#### Which field should I use as a unique identifier?

`companyId` is the recommended deduplication key. `url` and `identifyingName` are reasonable secondary keys.

#### Are fields nullable or conditional?

Yes. Details and reviews exist only when their toggles are enabled. Email, phone, and some status flags can be empty when Trustpilot does not show them.

#### Can I retrieve the records as CSV or JSON?

Yes. The dataset can be exported as JSON, CSV, Excel, XML, or HTML from the Apify Console, and queried through the Dataset API. Nested `reviews` flatten according to the export format.

#### Does the Actor return historical data?

No. Each run captures profile and review state at run time. To track TrustScore or new reviews, schedule repeated runs and store the outputs yourself.

#### What counts as a billable result?

Actor start once per run ($0.00005), a company charge per company ($0.001), a company-details charge when details are collected ($0.0015), and a review charge per nested review ($0.0015).

### Related datasets from Data Scrapers

- **[Yelp Scraper](https://apify.com/datascrapers/yelp-scraper)** — Local-business ratings that can be joined to Trustpilot companies by name or website.
- **[Tripadvisor Reviews Scraper](https://apify.com/datascrapers/tripadvisor-reviews-scraper)** — Travel and hospitality reviews for the same reputation pipelines.
- **[Google Play Store App Reviews](https://apify.com/datascrapers/playstore-app-reviews)** — App reviews that pair with Trustpilot product and brand comments.
- **[Clutch.co Company Scraper](https://apify.com/datascrapers/clutch-scraper)** — B2B company ratings and reviews for service-provider analysis.
- **[Glassdoor Jobs Scraper](https://apify.com/datascrapers/glassdoor-jobs-scraper)** — Employer ratings that sit beside Trustpilot consumer scores.

### Data Scrapers support

Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.

# Actor input Schema

## `searchQueries` (type: `array`):

Company search terms on Trustpilot (e.g. "clothing", "Clothing store in United States", "dog trainer"). Primary input for AI agents — no URL required.

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

ISO country code that scopes search and category results (e.g. US, GB, DE, FR). Default is United States.

## `categoryIds` (type: `array`):

Trustpilot category slugs or category page URLs (e.g. "cats\_dogs", "clothing\_store", "https://www.trustpilot.com/categories/cats\_dogs").

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

Search, category, or company review URLs copied from trustpilot.com (e.g. https://www.trustpilot.com/search?query=clothing, https://www.trustpilot.com/categories/cats\_dogs, https://www.trustpilot.com/review/sportdecals.com).

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

Maximum number of companies to scrape (0 = unlimited)

## `scrapeCompanyDetails` (type: `boolean`):

Visit each company profile and extract claimed status, verification, contact, activity, and similar companies. Charged as company-details.

## `scrapeReviews` (type: `boolean`):

Fetch reviews for each company. Each review is charged as review. Use Max reviews per company to cap how many are collected.

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

Maximum number of reviews to scrape per company (0 = all reviews). Default is 5.

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

Apify proxy settings. Residential proxies are recommended.

## Actor input object example

```json
{
  "searchQueries": [
    "Clothing store in United States"
  ],
  "country": "US",
  "maxItems": 10,
  "scrapeCompanyDetails": false,
  "scrapeReviews": false,
  "maxReviews": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset of scraped Trustpilot companies

## `runStats` (type: `string`):

Record counts and run timestamps

# 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 = {
    "searchQueries": [
        "Clothing store in United States"
    ],
    "country": "US",
    "maxItems": 10,
    "scrapeCompanyDetails": false,
    "scrapeReviews": false,
    "maxReviews": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascrapers/trustpilot-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 = {
    "searchQueries": ["Clothing store in United States"],
    "country": "US",
    "maxItems": 10,
    "scrapeCompanyDetails": False,
    "scrapeReviews": False,
    "maxReviews": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("datascrapers/trustpilot-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 '{
  "searchQueries": [
    "Clothing store in United States"
  ],
  "country": "US",
  "maxItems": 10,
  "scrapeCompanyDetails": false,
  "scrapeReviews": false,
  "maxReviews": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call datascrapers/trustpilot-scraper --silent --output-dataset

```

## MCP server setup

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