# Trustpilot Company Comparison: Ratings, Replies & Trend (`vncntlabs/trustpilot-company-comparison`) Actor

Compare 2-5 Trustpilot companies side by side: share of 1-2 star reviews in the last 30 days vs the prior 30, a getting-worse flag, weekly velocity, reply rate, TrustScore and raw reviews. Licensed DataForSEO data, no scraping. Not affiliated with Trustpilot.

- **URL**: https://apify.com/vncntlabs/trustpilot-company-comparison.md
- **Developed by:** [VNCNT Labs](https://apify.com/vncntlabs) (community)
- **Categories:** Lead generation, Marketing, E-commerce
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 raw reviews

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 Company Comparison: Ratings, Replies & Trend

Compare **2 to 5 Trustpilot companies side by side**. For each company the Actor takes the newest reviews (up to 200, the DataForSEO ceiling) and writes one comparison row with:

- the **share of 1-2 star reviews in the last 30 days vs the prior 30**, and a **getting-worse** flag when that share went up
- **weekly review velocity**
- **reply rate** and median reply lag
- **TrustScore**, **snapshot date** and **sample size**
- the star mix and verified share

A free **side-by-side** row lines the companies up in one table, so a question like "Printful vs Printify vs Gooten: who is getting worse right now?" has a direct answer. Raw reviews are a second dataset view. There is also a **search** mode (a keyword in, Trustpilot companies out) and an **only-new** option for scheduled checks.

Reply rate and reply lag are also computed by other Trustpilot tools on the Apify Store. What is distinctive here is the 2-5 company comparison row, the getting-worse flag on the 1-2 star share, weekly velocity, snapshot date and sample size, and licensed DataForSEO data with no scraping of trustpilot.com.

**This Actor is not affiliated with, endorsed by, or connected to Trustpilot.**

Built for:

- **Brand and reputation teams** comparing their company with two or three rivals on Trustpilot.
- **Agencies** that need a weekly snapshot of who is getting worse, who replies, and how fast reviews are arriving.
- **Analysts** who want a dated, sized sample rather than a single TrustScore.

You pay a small **Actor start**, then **per comparison row** (or per search hit) and **per raw review delivered**. Companies that can't be found, failed requests, empty searches, filtered and already-seen reviews are free.

### What you get

| Row (`type`) | What's in it | Charged |
|---|---|---|
| `comparison` | one per company: `trustScore`, `totalReviews`, `starCounts` / `starShares`, `lowStarShareLast30`, `lowStarSharePrior30`, `gettingWorse`, `replyRate`, `medianReplyLagHours`, `verifiedShare`, `reviewsPerWeek`, `sampleSize`, `snapshotAt`, `sampleNewestAt` / `sampleOldestAt`, `priorPeriodComplete`, `lowSample` | `business` when the company was found |
| `sideBySide` | one rollup with a `table` of those rows, `gettingWorseCompanies` and a short `summary` | free |
| `review` | raw review: `rating`, `title`, `text`, `publishedAt`, `verified`, `companyReply`, `companyReplyAt`, `reviewUrl`, `language` | `review` |
| `company` | search mode: `domain`, `companyName`, `trustScore`, `totalReviews`, `trustpilotUrl` | `business` |
| `skipped` | inputs that couldn't be used and why | free |

**Reviewer names are left out by default.** Turn on **Include reviewer names and profile links** only if you have a lawful basis to process that data.

The getting-worse flag is `true` when the share of 1-2 star reviews in the last window is higher than in the prior window, `false` when it is not, and `null` when one or both windows have no rated reviews in the sample. If a busy company has more than 200 reviews in 30 days, the prior window may be missing from the sample: `priorPeriodComplete` and `lowSampleReason` say so.

### Input examples

Printful vs Printify vs Gooten, comparison rows plus 50 raw reviews each (this is the prefilled input):

```json
{
  "mode": "compare",
  "companies": ["printful.com", "printify.com", "gooten.com"],
  "maxReviewsPerCompany": 50
}
```

Comparison only, no raw reviews:

```json
{ "companies": ["printful.com", "printify.com"], "rawReviews": "none" }
```

Weekly check: a fresh snapshot every time, but only new raw reviews are charged:

```json
{
  "companies": ["printful.com", "printify.com", "gooten.com"],
  "onlyNewReviews": true,
  "monitorId": "pod-weekly",
  "maxReviewsPerCompany": 50
}
```

Search Trustpilot for a category:

```json
{ "mode": "search", "searchKeywords": ["print on demand"], "maxSearchResults": 40 }
```

**Tips**

- Paste the company's website domain (`printful.com`) or its Trustpilot page (`https://www.trustpilot.com/review/printful.com`). Use the domain exactly as it appears in that link.
- Comparison always fetches up to the newest 200 reviews so the 30-vs-prior-30 window is as complete as the provider allows. `maxReviewsPerCompany` only caps how many raw review rows are delivered.
- `periodDays` (default 30, 7 to 90) is the window length on both sides of the getting-worse flag.
- **Only new reviews** remembers delivered review IDs in a key-value store in your Apify account (`trustpilot-company-comparison`), one history per setup or per **Monitor id**.

### Output example (one comparison row)

```json
{
  "type": "comparison",
  "domain": "printful.com",
  "companyName": "Printful",
  "trustScore": 4.3,
  "totalReviews": 12840,
  "lowStarShareLast30": 0.18,
  "lowStarSharePrior30": 0.12,
  "gettingWorse": true,
  "replyRate": 0.64,
  "medianReplyLagHours": 22.5,
  "reviewsPerWeek": 41.2,
  "sampleSize": 200,
  "snapshotAt": "2026-11-11T15:10:00Z",
  "priorPeriodComplete": true,
  "status": "ok",
  "trustpilotUrl": "https://www.trustpilot.com/review/printful.com"
}
```

The numbers above are illustrative. Your run will show the live snapshot. The dataset has three views: **Comparison**, **Raw reviews** and **Search results**. Export to CSV, Excel or JSON, or connect it to Slack, email, Zapier or Make.

### Pricing (pay per event)

| Event | Price | When it is charged |
|---|---|---|
| Actor start | $0.005 | once per run |
| `business` | $0.001 | one comparison row, or one company found in search mode |
| `review` | $0.0005 | one raw review delivered |

Failed lookups, companies with no Trustpilot page, empty searches, skipped inputs and (in only-new mode) reviews you already received are not charged.

A typical 3-company comparison with 50 raw reviews each costs about $0.083 (start + 3 comparison rows + 150 reviews). A search of 20 companies is $0.025.

### Data source and limits

Reviews and search results come from **DataForSEO's licensed Business Data API** (`business_data/trustpilot/reviews` and `/search`). The Actor does not scrape trustpilot.com and does not use a paid AI model.

- Trustpilot reviews are capped at the newest **200 per company** per run (a provider limit).
- Search returns up to **140 companies** per keyword.
- The Apify free plan is capped at 2 companies and 50 raw reviews per company per run; any paid Apify plan unlocks the full limits.
- Slow provider queues are hedged with one priority retry after 60 seconds, and the wait is capped so a run cannot sit past its deadline.

Public review texts belong to their authors and to Trustpilot. Use this data in line with applicable law, including the GDPR where it applies.

[Privacy policy](https://vncntlabs.com/privacy/)

# Actor input Schema

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

Compare: 2-5 company domains in, one comparison row each plus raw reviews. Search: a keyword in, Trustpilot companies out (domain, TrustScore, review count).

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

2 to 5 company website domains or Trustpilot review pages, one per line (example: <code>printful.com</code> or <code>https://www.trustpilot.com/review/printful.com</code>). Comparison uses each company's newest 200 reviews (the DataForSEO ceiling).

## `searchKeywords` (type: `array`):

Used in search mode. One keyword or category per line, e.g. <code>print on demand</code> or <code>web hosting</code>. Up to 5 per run.

## `maxSearchResults` (type: `integer`):

Search mode only. Up to 140 companies per keyword (DataForSEO ceiling).

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

How many raw review rows to deliver per company (newest first, 0 for none). The comparison row always uses up to the newest 200 reviews, even if this is lower.

## `rawReviews` (type: `string`):

Raw reviews are a second dataset view. Set to none (or max 0) if you only want the comparison rows.

## `periodDays` (type: `integer`):

The getting-worse flag compares the share of 1-2 star reviews in the last N days with the prior N days. Default 30.

## `onlyNewReviews` (type: `boolean`):

For a scheduled run: still write a fresh comparison snapshot, but only deliver (and charge) raw reviews not seen in earlier runs of this monitor.

## `monitorId` (type: `string`):

Optional name for the only-new history (letters, digits, underscores and dashes). If empty, a hash of the company list is used.

## `includeReviewerDetails` (type: `boolean`):

Off by default. When on, raw review rows include the reviewer's display name, profile link, location and review count as Trustpilot showed them.

## Actor input object example

```json
{
  "mode": "compare",
  "companies": [
    "printful.com",
    "printify.com",
    "gooten.com"
  ],
  "maxSearchResults": 20,
  "maxReviewsPerCompany": 50,
  "rawReviews": "all",
  "periodDays": 30,
  "onlyNewReviews": false,
  "includeReviewerDetails": false
}
```

# Actor output Schema

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

No description

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

No description

## `search` (type: `string`):

No description

## `all` (type: `string`):

No description

## `summary` (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 = {
    "companies": [
        "printful.com",
        "printify.com",
        "gooten.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vncntlabs/trustpilot-company-comparison").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "companies": [
        "printful.com",
        "printify.com",
        "gooten.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vncntlabs/trustpilot-company-comparison").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "printful.com",
    "printify.com",
    "gooten.com"
  ]
}' |
apify call vncntlabs/trustpilot-company-comparison --silent --output-dataset

```

## MCP server setup

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

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/Zrn0JXjA7fRNs1crN/builds/WrZEn7UWF8ANgwSQ3/openapi.json
