# Trustpilot Company Score API (`unfenced-group/trustpilot-company-api`) Actor

Look up a company on Trustpilot by domain: TrustScore, stars, total and 12-month review counts, 1 to 5-star distribution, reply rate and speed, claim and verification status, and the latest reviews. HTTP API or up to 50 domains per run.

- **URL**: https://apify.com/unfenced-group/trustpilot-company-api.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 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

## Trustpilot Company Score API

![Trustpilot Company Score API](https://api.apify.com/v2/key-value-stores/ykhoC5fW1IReH1EdJ/records/banner.png)

Look up any company on Trustpilot by its domain and get its TrustScore, star rating, total and 12-month review counts, the full 1 to 5-star distribution, how often and how fast it replies to reviews, and its latest reviews. One company per call over HTTP, or up to 50 per run. No API key required.

***

### Why this API?

#### ⭐ The score and what is behind it

TrustScore and stars alone hide a lot. Each result also carries the 1 to 5-star distribution, the review count of the last 12 months and the average of the newest reviews, so you can see whether a company is improving or slipping.

#### 💬 Reply behaviour

Reply rate, average days to reply, how many negative reviews were answered and when the last reply to a negative review was posted.

#### 🏷️ Company facts

Categories, industry, country, whether the profile is claimed, verified, closed, collecting reviews or carries a consumer alert.

#### 📝 Latest reviews included

Up to 20 of the newest reviews with rating, title, text, date, verification and the company's reply. Reviewer names are never returned.

#### ⚡ Built for apps and agents

One domain in, one JSON answer back in seconds. Ideal for vendor checks, lead scoring, onboarding screens and AI agents that need a trust signal on demand.

***

### Call this actor over HTTP

Besides normal runs, this actor exposes a REST API that answers each request in seconds with JSON. There is no run to start and no dataset to fetch afterwards, which suits apps, automations and AI agents that need one answer at a time. The full interactive reference is on the **Endpoints** tab.

| Endpoint | Returns | Billed as |
|---|---|---|
| `GET /company?domain=…` | One company profile with score, distribution and latest reviews | Per company |

Authenticate with your Apify API token in the `Authorization` header:

```bash
curl -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
  "https://unfenced-group--trustpilot-company-api.apify.actor/company?domain=bol.com&reviews=5"
```

Every response has the shape `{ "count": N, "items": [...] }`, with the same fields as the dataset records below, billed at the same price as a normal run. Errors and domains without a Trustpilot profile return no data and are never billed. POST with a JSON body works the same as GET.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `domains` | array | (required) | Company websites, one per line: a domain (`bol.com`) or a Trustpilot profile URL (`https://www.trustpilot.com/review/bol.com`). Up to 50 per run. |
| `reviews` | integer | `5` | Newest reviews to include per company (0 to 20). Use `0` for the score only. |

Over HTTP, pass one `domain` and optionally `reviews`.

***

### Output schema

One record per company found. Fields Trustpilot does not publish for a company are `null`, never omitted.

| Field | Type | Description |
|---|---|---|
| `domain` | string | The domain you asked for. |
| `companyName` | string | Company name on Trustpilot. |
| `trustpilotUrl` | string | Trustpilot profile page. |
| `websiteUrl` | string | Company website. |
| `trustScore` | number | TrustScore (1.0 to 5.0). |
| `stars` | number | Star rating shown on the profile (in half stars). |
| `numberOfReviews` | integer | Total reviews. |
| `reviewsLast12Months` | integer | Reviews written in the last 12 months. |
| `ratingDistribution` | object | `stars1` … `stars5` counts, `stars1Pct` … `stars5Pct` shares and `total`. |
| `recentAverageRating` | number | Average rating of the 20 newest reviews. |
| `recentReviewsSampled` | integer | Number of reviews behind `recentAverageRating`. |
| `categories` | array | Trustpilot categories. |
| `primaryCategory` | string | Main category. |
| `industry` | string | Top-level industry. |
| `country` | string | Country code of the company. |
| `city` | string | City (null if not published). |
| `isClaimed` | boolean | The company manages its profile. |
| `claimedDate` | string | When the profile was claimed (ISO 8601). |
| `isClosed` / `isTemporarilyClosed` | boolean | Business closed for good / for now. |
| `isCollectingReviews` | boolean | The company actively invites reviews. |
| `hasCollectedIncentivisedReviews` | boolean | Trustpilot flagged incentivised review collection. |
| `isVerifiedBusiness` | boolean | Trustpilot verified the business. |
| `hasConsumerAlert` | boolean | Trustpilot shows a consumer alert. |
| `replyRatePct` | number | Share of negative reviews the company replied to, in percent (Trustpilot's reply rate). |
| `averageDaysToReply` | number | Average days to reply. |
| `negativeReviewsCount` | integer | Negative reviews counted for the reply rate. |
| `negativeReviewsReplied` | integer | How many of those negative reviews have a reply. |
| `lastReplyToNegativeReview` | string | Last reply to a negative review (ISO 8601). |
| `trustpilotBusinessUnitId` | string | Trustpilot's id for the company. |
| `latestReviews[]` | array | Newest reviews: `id`, `url`, `rating`, `title`, `text`, `language`, `publishedAt`, `experienceDate`, `isVerified`, `reviewSource`, `reviewerCountryCode`, `likes`, `hasReply`, `replyText`, `replyDate`. |
| `source` | string | `trustpilot.com`. |
| `scrapedAt` | string | Time of the lookup (ISO 8601). |

#### Example record

```json
{
  "domain": "bol.com",
  "companyName": "Bol",
  "trustpilotUrl": "https://www.trustpilot.com/review/www.bol.com",
  "websiteUrl": "https://www.bol.com",
  "trustScore": 2.6,
  "stars": 2.5,
  "numberOfReviews": 48795,
  "reviewsLast12Months": 4416,
  "ratingDistribution": { "stars1": 16103, "stars2": 2465, "stars3": 1862, "stars4": 6345, "stars5": 22020, "stars1Pct": 33, "stars2Pct": 5.1, "stars3Pct": 3.8, "stars4Pct": 13, "stars5Pct": 45.1, "total": 48795 },
  "recentAverageRating": 1.7,
  "recentReviewsSampled": 20,
  "categories": ["Software Company"],
  "primaryCategory": "Software Company",
  "industry": "Electronics & Technology",
  "country": "NL",
  "city": "Utrecht",
  "isClaimed": true,
  "claimedDate": "2014-08-29T12:26:21.000Z",
  "isClosed": false,
  "isTemporarilyClosed": false,
  "isCollectingReviews": false,
  "hasCollectedIncentivisedReviews": false,
  "isVerifiedBusiness": false,
  "hasConsumerAlert": false,
  "replyRatePct": 99.8,
  "averageDaysToReply": 0.4,
  "negativeReviewsCount": 2524,
  "negativeReviewsReplied": 2519,
  "lastReplyToNegativeReview": "2026-10-13T12:38:55.000Z",
  "trustpilotBusinessUnitId": "47783f3e0000640005020bb9",
  "latestReviews": [
    {
      "id": "6ace57ff11fd699254af943e",
      "url": "https://www.trustpilot.com/reviews/6ace57ff11fd699254af943e",
      "rating": 1,
      "title": "I returned my product over a month ago",
      "text": "I returned my product over a month ago, but I still haven’t received my refund. I have tried contacting the seller, but every time I reach out, they keep postponing the resolution without giving me a clear answer.",
      "language": "en",
      "publishedAt": "2026-10-13T18:10:39.000Z",
      "experienceDate": "2026-09-15T00:00:00.000Z",
      "isVerified": false,
      "reviewSource": "Organic",
      "reviewerCountryCode": "NL",
      "likes": 0,
      "hasReply": true,
      "replyText": "Hi,\n\nThank you for your review. We have sent you a request so that you can provide more information about your order and/or account. We look forward to your response.\n\nKind regards,\nBol",
      "replyDate": "2026-10-14T06:38:35.000Z"
    }
  ],
  "source": "trustpilot.com",
  "scrapedAt": "2026-10-14T07:19:22.373Z"
}
```

***

### Examples

**Score only, for a list of suppliers:**

```json
{ "domains": ["bol.com", "coolblue.nl", "zalando.nl"], "reviews": 0 }
```

**One company with its 20 newest reviews:**

```json
{ "domains": ["revolut.com"], "reviews": 20 }
```

**From Trustpilot profile URLs:**

```json
{ "domains": ["https://www.trustpilot.com/review/www.amazon.com"], "reviews": 5 }
```

**Daily trust monitor (schedule this run every day):**

```json
{ "domains": ["yourcompany.com", "competitor-one.com", "competitor-two.com"], "reviews": 10 }
```

***

### 💰 Pricing

**$0.01 per company** — you only pay for companies returned. Errors and lookups that find nothing are never charged. Domains without a Trustpilot profile are not charged.

| Usage | Cost |
|---|---|
| one company | ~$0.01 |
| 10 companies | ~$0.10 |
| 100 companies | ~$1.00 |
| 1,000 companies | ~$10.00 |

Subscription tiers lower the rate further, down to $0.008 per company at the highest tier. A run start costs $0.00005 and each dataset item $0.00001; HTTP requests are billed per company only.

***

### Performance

| Request | Typical time |
|---|---|
| One company over HTTP | 2–12 seconds |
| 10 companies in one run | about 30–45 seconds |

***

### Known limitations

- Reviewer names are never returned, and the name in a company reply's greeting is removed. Company phone numbers, e-mail addresses and street addresses are left out as well.
- The latest reviews are the 20 newest on the profile in all languages; filtering by language or star is not offered.
- `replyRatePct` and `averageDaysToReply` are Trustpilot's own reply statistics and cover negative reviews only.
- A domain without a Trustpilot profile returns nothing and is not charged.

***

### Technical details

- **Source:** trustpilot.com company profile pages
- **Coverage:** every company with a public Trustpilot profile
- **Retry:** automatic retry with a fresh connection when Trustpilot asks to verify the visitor

***

### Rate this actor

If this scraper does its job, a short review on the **Reviews** tab helps other users find it. Something not working? Open an issue on the **Issues** tab instead — issues get fixed.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

## `domains` (type: `array`):

Company websites to look up on Trustpilot, one per line. A domain (bol.com) or a Trustpilot profile URL (https://www.trustpilot.com/review/bol.com). Up to 50 per run; each company found is one result.

## `reviews` (type: `integer`):

How many of the newest reviews to include with each company (0 to 20). Use 0 for the score only.

## Actor input object example

```json
{
  "domains": [
    "bol.com"
  ],
  "reviews": 5
}
```

# Actor output Schema

## `results` (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 = {
    "domains": [
        "bol.com"
    ],
    "reviews": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/trustpilot-company-api").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 = {
    "domains": ["bol.com"],
    "reviews": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/trustpilot-company-api").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 '{
  "domains": [
    "bol.com"
  ],
  "reviews": 5
}' |
apify call unfenced-group/trustpilot-company-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,unfenced-group/trustpilot-company-api"
        }
    }
}
```

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/EhSEns3IwIXDXPlLw/builds/ePZa4Rm9g3XkH7m9l/openapi.json
