# Trustpilot Company List — Every Company on the Site (`thenetaji/trustpilot-company-list-scraper`) Actor

The complete list of companies on Trustpilot: 874,063 profiles, as the exact keys the other four Trustpilot Actors take as input. It is a list of names rather than a dataset of scores, and it is where a whole-market study starts instead of a keyword guess.

- **URL**: https://apify.com/thenetaji/trustpilot-company-list-scraper.md
- **Developed by:** [The Netaji](https://apify.com/thenetaji) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.04 / 1,000 company keys

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 List Scraper

The Actor exports the complete list of companies on Trustpilot: 874,063 profiles, as the exact keys
the other four Trustpilot Actors take as input. It is the starting point for any piece of work whose
scope is "the whole site" rather than one category or one search phrase.

The boundary matters and is worth stating before anything else: this returns names and nothing else.
There is no score, no review count and no location on a row. What it gives is a complete population
rather than a sample, which is what a market study, a sampling frame or a bulk enrichment job needs
and what a keyword search cannot produce. Feeding the `domain` column into
[Trustpilot Company Scraper](https://apify.com/thenetaji/trustpilot-company-scraper) then attaches
the scores, the reply behaviour and the contact details to as many of them as the budget allows.

Where companies are wanted with their numbers already attached,
[Trustpilot Category Scraper](https://apify.com/thenetaji/trustpilot-category-scraper) and
[Trustpilot Search Scraper](https://apify.com/thenetaji/trustpilot-search-scraper) are the right
Actors instead.

### Accepted input

`maxItems` caps how many company keys are saved and defaults to 1000; a value of `0` lets the run
continue to the end of the index. `shard` selects which slice of the index to start from, `0` to
`17`, and defaults to `0`. `offset` selects where to start inside that slice and defaults to `0`.

```json
{
  "maxItems": 1000,
  "shard": 0,
  "offset": 0
}
```

`shard` and `offset` are resume points rather than filters. A run started at a given slice continues
into the following slices on its own and stops at `maxItems`.

### Response fields

```json
{ "domain": "www.budgetair.com", "shard": 0, "position": 1 }
{ "domain": "happen.com", "shard": 0, "position": 2 }
```

| Field | What it says |
| --- | --- |
| `domain` | The company's key on Trustpilot, in the canonical spelling, and the exact value the Reviews and Company Actors take. |
| `shard` | Which slice of the index the key came from, `0` to `17`. |
| `position` | Where the key sits inside that slice, counting from 1. |

`shard` and `position` together are a stable address within the index, and they are what a later run
resumes from.

### Resuming a long walk

The run log ends by naming the settings that continue the walk:

```
Continue this walk with Start Shard 3 and Start Offset 12000
```

Entering those values as `shard` and `offset` on the next run resumes exactly where the previous one
stopped; nothing is re-read and nothing is skipped. A full export of 874,063 keys is a long run
whatever cap is set, and this is how it is split across several.

### Questions

**Where does the figure 874,063 come from, and is it an estimate?**
It was counted. Trustpilot publishes its index in 18 slices; slices 0 to 16 hold exactly 50,000
companies each and slice 17 holds 24,063, which is why the total is 874,063 rather than 900,000. The
run does not assume that division: it reads the number of slices and the length of the slice it is
currently reading from each response, so the walk stays correct if Trustpilot publishes a nineteenth
slice or the final slice grows. A window requested past the end of a slice returns an empty result
rather than an error, and the run moves on to the next slice.

**Why does a key here cost so much less than a row from the other Trustpilot Actors?**
Because the source is different in kind. The index is a published file that is read once and paged
out of memory, whereas every row from the other Actors comes from reading a company or directory
page. Pricing a name from a cached file at the same rate as a page fetch would not have been honest,
so it is priced far below them.

**Why do some keys contain a slash, and can they be trimmed?**
They cannot. Roughly one key in four hundred is a hostname followed by a path. Counted across three
slices, which is 150,000 real keys, 371 carried a path: `rac.co.uk/insurance`,
`lloydsbank.com/insurance.html` and `mercedes-benz.co.uk/passengercars/finance.html` among them.
`rac.co.uk/insurance` and `rac.co.uk` are different companies with different review counts, and both
return a real record, so a key truncated at the first slash does not fail; it silently returns the
other company. A small number of keys are internationalised and published un-punycoded: 13 of those
same 150,000, including `kørkort.dk`, `lähitapiola.fi` and `colisprivé.fr`. Both kinds are accepted
unchanged by the other Trustpilot Actors, and neither should be trimmed or converted first.

**Why do some keys start with `www.` and others not?**
Because Trustpilot files them that way, and the prefix is part of the spelling rather than
decoration: `trustpilot.com/review/amazon.com` redirects to `/review/www.amazon.com`. That is much of
the value of having the index at all; every key here is the canonical spelling, so nothing downstream
has to guess.

**What happens with a `shard` above 17?**
The input accepts `0` to `17`, which is what the index currently holds, so a higher value is rejected
before any request is made rather than after one.

**Is a key from this list guaranteed to still have a profile?**
No. The index reflects what Trustpilot published when the file was generated, and a company can close
or be removed afterwards. Keys that no longer resolve are reported and skipped by
[Trustpilot Company Scraper](https://apify.com/thenetaji/trustpilot-company-scraper) rather than
ending its run, so a list of five hundred that contains a few dead keys still returns the rest.

**Does the index cover companies outside the English-language site?**
Not necessarily. The index read here is the English-language one, which implies siblings for other
locales and therefore more than 874,063 profiles worldwide. Those have not been measured, so no claim
is made about them.

**Can this be chained to the other Actors automatically?**
Not within one run. `domain` from this dataset is passed to
[Trustpilot Company Scraper](https://apify.com/thenetaji/trustpilot-company-scraper) or
[Trustpilot Reviews Scraper](https://apify.com/thenetaji/trustpilot-reviews-scraper) as their
`domain` input, which is a list, so the two steps chain through the Apify API with no string
manipulation in between.

### Related Actors

[Trustpilot Company Scraper](https://apify.com/thenetaji/trustpilot-company-scraper) turns keys from
this list into full company records.
[Trustpilot Search Scraper](https://apify.com/thenetaji/trustpilot-search-scraper) is the better
starting point where a company is known by name rather than needed in bulk.

# Actor input Schema

## `shard` (type: `integer`):

Which slice of Trustpilot's company index to start from, 0 to 17. The run continues into the next slice on its own, so this is a resume point rather than a filter.

## `offset` (type: `integer`):

Where to start inside the starting slice. Use it with Start Shard to continue a walk that stopped — the run log prints both when it finishes.

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

Maximum company keys to save. Set 0 to keep going to the end of the index. The run log prints where it stopped so the next run can continue from there.

## Actor input object example

```json
{
  "shard": 0,
  "offset": 0,
  "maxItems": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

All records scraped by this run

# 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 = {
    "shard": 0,
    "offset": 0,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("thenetaji/trustpilot-company-list-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 = {
    "shard": 0,
    "offset": 0,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("thenetaji/trustpilot-company-list-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 '{
  "shard": 0,
  "offset": 0,
  "maxItems": 100
}' |
apify call thenetaji/trustpilot-company-list-scraper --silent --output-dataset

```

## MCP server setup

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