Trustpilot Scraper: Reviews + Company Contacts, from $0.50/1K
Pricing
from $0.50 / 1,000 reviews
Trustpilot Scraper: Reviews + Company Contacts, from $0.50/1K
Scrape Trustpilot reviews, company ratings and public contact details (email, phone, address). Discover companies by category and country for lead generation. Handles the language filter that hides most reviews of non-English companies. No login, no cookies.
Pricing
from $0.50 / 1,000 reviews
Rating
0.0
(0)
Developer
Alexis Morain
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Share
Trustpilot Scraper — scrape Trustpilot reviews, ratings and company data
A Trustpilot scraper that pulls reviews, star ratings, company profiles and the public contact block of each company: email, phone and postal address, without a login, an account or a cookie of yours. Give it company domains and it returns each company's profile plus its reviews. Give it a category slug and a country instead and it returns the companies ranked in that category, which is a prospect list. Filter reviews by star rating, publication date, verified status or company reply. Schedule it in "new reviews only" mode and each run returns, and charges, only the reviews no previous run delivered, with an optional webhook at the end. Output goes to an Apify dataset you can export to CSV, JSON or Excel, or read through the API. Pricing is pay per event, from $0.50 per 1,000 reviews ($0.80 on the Free plan) and from $2 per 1,000 company profiles ($3 on the Free plan), plus $0.005 per run. A run that delivers nothing costs nothing, because nothing is charged until the first result lands.
Two things make this scraper return more than a naive one. Trustpilot hides reviews written in
languages other than the request language, which can turn a 200-review French company into a
single visible review, and Trustpilot stops serving after 10 pages whatever the advertised page
count. This Actor defaults to every language and, past 200 reviews, splits a profile into
disjoint rating and language cells so each cell gets its own 10-page window. On keobiz.fr that
took the harvest from 200 reviews to 749.
Table of contents
- How to scrape Trustpilot
- Which fields should I fill?
- Input reference
- Filter reviews by stars, date, verified status or reply
- Monitor new Trustpilot reviews: new-only mode and webhook
- Output fields
- Example output
- Scrape Trustpilot from the API
- What people use this Trustpilot scraper for
- Why this Trustpilot scraper
- Pricing
- Limits and what this Actor does not do
- Integrations
- FAQ
How to scrape Trustpilot
The Actor has two jobs and picks between them from what you fill in. Fill company domains to collect reviews, or category slugs to discover companies. Fill both and the Actor runs both jobs in the same run, company reviews first, then category discovery.
Scrape Trustpilot reviews from the Apify Console
- Open the Actor and go to the Input tab.
www.qonto.comis already prefilled, so you can press Start immediately and look at the shape of the output before committing to anything. - Replace it with the companies you care about, one per line. Both a bare domain
(
keobiz.fr) and a full profile URL (https://www.trustpilot.com/review/www.qonto.com) are accepted, and you can mix them. - Set Max reviews per company.
200is one fast pass, newest reviews first. Anything above 200 switches on the rating and language segmentation, which is slower and returns roughly three to four times more. - Leave Review languages on
alland the proxy on residential. Those two defaults are the ones that avoid the two traps of the Trustpilot site, described further down. - Press Start. When the run finishes, open the Storage tab. The dataset has two views, Companies and Reviews, and an Export button for CSV, JSON, Excel and XML.
Discover Trustpilot company data by category
- Leave Company domains empty and fill Category slugs instead, one per line:
accountant,bank,insurance_agency. - Get a slug by opening a category on Trustpilot and taking the last part of the URL.
trustpilot.com/categories/accountantgives the slugaccountant. Underscores are part of the slug. - Set Country to an ISO code (
FR,GB,US,DE) to keep only the companies of that country. Leave it empty to get every country. - Set Max companies per category. Trustpilot caps its own category listings, so a category frequently holds a few dozen companies whatever number you ask for. The run log prints the total Trustpilot claims for that filter so you know you got everything there was.
Getting the domain right
Trustpilot keys a profile on an exact domain string, and qonto.com and www.qonto.com can be
two separate profiles with different review counts. If you are unsure, search the company on
Trustpilot, open its profile, and paste the browser URL into the input. The Actor extracts the
identifier from it, strips the protocol, any path and any query string, and lowercases the
result.
Which fields should I fill?
| If you want to… | Fill in | Example | Leave alone |
|---|---|---|---|
| Read one company's reviews | companyDomains | ["keobiz.fr"] | everything else |
| Monitor your own Trustpilot reviews | companyDomains, reviewMode, lastDays and an Apify schedule | ["www.qonto.com"], new-only, 30 | everything else |
| Get notified when new reviews land | webhookUrl, with reviewMode on new-only | a Zapier, Make or n8n catch hook, or your own endpoint | everything else |
| Read only the complaints | stars | [1, 2] | everything else |
| Keep only verified, or only answered, reviews | verifiedOnly, withRepliesOnly | true | everything else |
| Compare several competitors at once | companyDomains with many lines | ["a.com","b.com","c.com"] | everything else |
| Go past the 200-review wall | maxReviewsPerCompany above 200 | 1000 | everything else |
| Build a prospect list for an industry | categorySlugs and country | ["accountant"], FR | companyDomains |
| Get a company's public email and phone | companyDomains (company mode only) | ["wity.fr"] | — |
| Feed a single-language sentiment model | languages | fr | everything else |
| Run reliably at volume | proxyConfiguration on residential | default | everything else |
One of the two entry fields is mandatory. Everything else already has a working default, and an empty input fails immediately with a message telling you which field to fill rather than a stack trace.
Input reference
| Field | Type | Default | What it does |
|---|---|---|---|
companyDomains | array of strings | empty | Domains or Trustpilot profile URLs to scrape reviews and company data from. One per line. |
categorySlugs | array of strings | empty | Trustpilot category slugs to discover companies from. Filled together with companyDomains, both jobs run. |
country | string | empty | ISO country code filtering category discovery. Ignored in company mode. |
mode | string enum | auto | auto, company or category. Auto reads the job off the filled fields and runs both when both are filled; set it by hand only to run one job from a saved task that keeps both fields filled. |
maxReviewsPerCompany | integer | 200 | Upper bound on reviews per company. Above 200 the rating and language segmentation kicks in. |
maxCompaniesPerCategory | integer | 100 | Upper bound on companies per category, paged 20 at a time. |
languages | string | all | all for every review language, or a single ISO code such as fr or en. |
stars | array of integers | empty (every rating) | Star ratings to keep, from 1 to 5. Filtered by Trustpilot. |
lastDays | integer | empty | Only reviews published in the last N days. Stops paging at the first older review. |
publishedAfter | date, YYYY-MM-DD | empty | Only reviews published on or after that date, midnight UTC. With lastDays too, the more recent date wins. |
verifiedOnly | boolean | false | Only reviews Trustpilot labels as verified. Filtered by Trustpilot. |
withRepliesOnly | boolean | false | Only reviews the company answered. Filtered by Trustpilot. |
sortBy | string enum | recency | recency (newest first) or relevance (Trustpilot's own ranking). |
reviewMode | string enum | all | all returns every matching review. new-only returns, and charges, only reviews no previous run delivered. |
registryKey | string | empty (derived) | Namespace of the new-only registries, one per company. Empty: derived from the review filters. |
webhookUrl | string, secret | empty | URL that receives a JSON summary once the scraping is over. Not sent when the input is rejected. |
proxyConfiguration | object | Apify residential | Proxy settings. Residential is the default and the setting that matters most here. |
Example input, company reviews:
{"companyDomains": ["www.qonto.com", "keobiz.fr"],"maxReviewsPerCompany": 1000,"languages": "all","proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Example input, category discovery:
{"categorySlugs": ["accountant"],"country": "FR","maxCompaniesPerCategory": 50}
Filter reviews by stars, date, verified status or reply
Five optional filters, new in version 0.2. Left empty, they change nothing: you get every review, newest first, as before. They apply to company reviews and are ignored in category discovery.
stars,verifiedOnlyandwithRepliesOnlyare passed to Trustpilot, which does the filtering. Reviews left out are never fetched and never charged. They combine with the segmentation: ask for[1, 2]withmaxReviewsPerCompanyat 1000 and the Actor still splits past the 200-review wall, only over the one and two star cells.lastDaysandpublishedAfterkeep the reviews published after a cut-off. The Actor narrows the search on Trustpilot's side (last 30 days, 3, 6 or 12 months), reads newest first and stops at the first older review, then applies the exact cut-off itself. You are charged only for the reviews returned; the run time follows the pages read, which the early stop keeps to one or two on a weekly window.sortByswitches between newest first and Trustpilot's relevance ranking. Keeprecencywith a date filter: withrelevancethe Actor cannot stop early and has to page through the whole window to find the recent reviews.
Example input for scheduled reputation monitoring: run it every Monday from the Schedules tab and each run returns the past week's reviews and nothing else.
{"companyDomains": ["www.qonto.com"],"lastDays": 7,"maxReviewsPerCompany": 1000}
The same with only the complaints that still wait for an answer is a matter of adding
"stars": [1, 2], then keeping the rows where replyMessage is null.
Monitor new Trustpilot reviews: new-only mode and webhook
A rolling lastDays window returns the same review twice when two windows overlap. Set
reviewMode to new-only and the Actor keeps, for each company, a persistent registry of every
review it already delivered to you, and returns only the ones it never delivered before. A review
you are not shown is a review you are not charged for.
How it behaves:
- The first run returns everything it reads. Nothing has been delivered yet. From the second run on, you get the delta.
- Only what was actually delivered is remembered. If a run stops at your maximum charge limit, the reviews it did not push stay new and come with the next run.
- One registry per company. Add a company to an existing schedule and only that company starts from scratch: the companies you already follow deliver nothing again. Remove one and put it back later, and it picks up its own registry where it left off.
- One feed per set of filters. By default a company's registry is named after the company and
the filters that change which reviews qualify:
stars,verifiedOnly,withRepliesOnlyandlanguages. Two schedules with different filters never pollute each other. ChanginglastDays,publishedAfter,sortByormaxReviewsPerCompanykeeps the same registries. SetregistryKeyto name the feed yourself: it replaces the filters as a namespace, still one registry per company inside it. Two different keys never share anything, and a new key starts over from empty registries. - What it guarantees, exactly. A review delivered once is not delivered again by later runs of the same feed. Two rare cases can repeat a few reviews: a run interrupted in the middle of a company (aborted or timed out; the registry is saved after each company), and two runs of the same feed running at the same time.
maxReviewsPerCompanycaps the reviews read, newest first. The Actor reads that many and returns the unseen ones among them. Run often enough that fewer new reviews land between two runs than that cap.- Company records are refreshed on every run. The profile row (score, review count, contact
block) is pushed and charged each run, as in
allmode. Only reviews are de-duplicated, and category discovery is unchanged.
Add webhookUrl and the Actor POSTs a JSON summary once the scraping is over, with the counters,
the dataset id and the run status. It is sent whatever the outcome: new reviews or none, some or
all companies failed, maximum charge limit reached. It is not sent when the input is rejected at
start, nor when the run is aborted, times out or crashes before the end. Point it at a Zapier,
Make or n8n catch hook, or at your own endpoint, and filter on reviews above 0 to be told only
when something new landed. Chat apps such as Slack or Discord do not accept this payload directly:
their incoming webhooks expect their own message format, so route it through one of those tools.
The URL is stored encrypted and never written to the log. Redirects are not followed, except a
307 or 308, which gets the same POST once; a webhook that fails is logged as a warning and never
fails the run.
Example input for a daily monitoring schedule:
{"companyDomains": ["www.qonto.com", "keobiz.fr"],"reviewMode": "new-only","lastDays": 30,"webhookUrl": "https://hooks.zapier.com/hooks/catch/123456/abcdef/"}
lastDays keeps each run to a page or two per company; new-only removes the overlap between
two windows. What the webhook receives:
{"actor": "trustpilot-scraper","runId": "a1B2c3D4e5F6g7H8i","datasetId": "j9K8l7M6n5O4p3Q2r","mode": "new-only","status": "succeeded","companies": 2,"reviews": 7,"skippedAlreadySeen": 41,"targets": 2,"failedTargets": 0,"chargeLimitReached": false}
status is succeeded, partial when some companies failed, or failed when every target
failed. mode echoes reviewMode.
Output fields
Every record carries a type field, either company or review, and the dataset ships two
views so the Console shows them as two separate tables.
Company record, company mode
This is the full Trustpilot company profile, emitted once per domain before its reviews.
| Field | Type | Description | Example |
|---|---|---|---|
type | string | Always company for this record type | "company" |
id | string | Trustpilot's internal business unit id | "5f8c1b0d9f4a2c0001b7e3a1" |
domain | string | The domain Trustpilot keys the profile on | "keobiz.fr" |
name | string | Company display name | "Keobiz" |
trustScore | number | TrustScore out of 5, one decimal | 4.6 |
stars | number | Star bucket Trustpilot displays | 4.5 |
numberOfReviews | integer | Total reviews Trustpilot advertises | 4512 |
reviewsLast12Months | integer | Reviews published in the last 12 months | 1189 |
isClaimed | boolean | Whether the company claimed its profile | true |
isClosed | boolean | Whether Trustpilot marked the profile closed | false |
countryCode | string | Country of the business unit | "FR" |
categories | array of objects | Categories with id, name, isPrimary | [{"id":"accountant","name":"Accountant","isPrimary":true}] |
websiteUrl | string | Company website as declared on Trustpilot | "https://www.keobiz.fr" |
email | string or null | Public contact email from the profile | "contact@keobiz.fr" |
phone | string or null | Public contact phone | "+33 1 76 41 04 88" |
address | string or null | Street address | "12 rue de la Chaussée d'Antin" |
city | string or null | City | "Paris" |
zipCode | string or null | Postal code | "75009" |
country | string or null | Country from the contact block | "France" |
The contact fields are null when the company never published them. They are the reason this Actor doubles as a lead source: a Trustpilot profile with an email and a phone number is a qualified company record, not just a rating.
Company record, category discovery mode
Discovery rows come from the category listing, which carries less than a profile page. There is no contact block here.
| Field | Type | Description | Example |
|---|---|---|---|
type | string | Always company | "company" |
domain | string | Company domain, usable as input for a review run | "wity.fr" |
name | string | Company display name | "Wity" |
trustScore | number | TrustScore out of 5 | 4.8 |
stars | number | Star bucket | 5 |
numberOfReviews | integer | Total reviews Trustpilot advertises | 612 |
city | string or null | City from the listing | "Paris" |
country | string or null | Country from the listing | "FR" |
categoryId | string | The slug you asked for | "accountant" |
The usual pipeline is two runs: discover the companies of a category, then feed the domain
column back in as companyDomains to get contact details and reviews.
Review record
| Field | Type | Description | Example |
|---|---|---|---|
type | string | Always review | "review" |
id | string | Trustpilot review id, stable across runs | "66b3f0c21e4ab90c2d5f8e71" |
companyDomain | string | Domain of the company the review belongs to | "keobiz.fr" |
rating | integer | Star rating from 1 to 5 | 5 |
title | string | Review headline | "Fast and clear answers" |
text | string | Full review body | "Onboarding took two days and…" |
language | string | ISO code of the language the review is written in | "fr" |
experiencedDate | string, ISO 8601 | Date of the experience the reviewer describes | "2026-07-14T00:00:00.000Z" |
publishedDate | string, ISO 8601 | When the review was published | "2026-07-16T09:12:44.000Z" |
updatedDate | string or null | When the reviewer last edited it | null |
likes | integer | Useful votes the review received | 3 |
isVerified | boolean | Trustpilot's verification label | true |
consumerName | string | Reviewer display name | "Camille D." |
consumerCountry | string | Reviewer country code | "FR" |
consumerReviewCount | integer | How many reviews that account has written | 7 |
replyMessage | string or null | The company's public reply | "Thanks Camille, glad it went well." |
replyDate | string or null | When the company replied | "2026-07-17T08:03:10.000Z" |
replyMessage is what makes response-rate reporting possible: count the reviews under 3 stars
where it is null and you have the backlog of unanswered complaints.
Example output
One company record and one review record, as they land in the dataset:
[{"type": "company","id": "5f8c1b0d9f4a2c0001b7e3a1","domain": "keobiz.fr","name": "Keobiz","trustScore": 4.6,"stars": 4.5,"numberOfReviews": 4512,"reviewsLast12Months": 1189,"isClaimed": true,"isClosed": false,"countryCode": "FR","categories": [{ "id": "accountant", "name": "Accountant", "isPrimary": true },{ "id": "business_management_consultant", "name": "Business Management Consultant", "isPrimary": false }],"websiteUrl": "https://www.keobiz.fr","email": "contact@keobiz.fr","phone": "+33 1 76 41 04 88","address": "12 rue de la Chaussée d'Antin","city": "Paris","zipCode": "75009","country": "France"},{"type": "review","id": "66b3f0c21e4ab90c2d5f8e71","companyDomain": "keobiz.fr","rating": 5,"title": "Fast and clear answers","text": "Onboarding took two days and every question I sent got an answer the same afternoon.","language": "fr","experiencedDate": "2026-07-14T00:00:00.000Z","publishedDate": "2026-07-16T09:12:44.000Z","updatedDate": null,"likes": 3,"isVerified": true,"consumerName": "Camille D.","consumerCountry": "FR","consumerReviewCount": 7,"replyMessage": "Thanks Camille, glad it went well.","replyDate": "2026-07-17T08:03:10.000Z"}]
And a discovery row from category mode:
{"type": "company","domain": "wity.fr","name": "Wity","trustScore": 4.8,"stars": 5,"numberOfReviews": 612,"city": "Paris","country": "FR","categoryId": "accountant"}
Scrape Trustpilot from the API
The Actor runs like any Apify Actor, so it is reachable from the Apify API, from the official
clients, or from plain HTTP. Replace <YOUR_API_TOKEN> with the token on your Apify account
settings page.
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run_input = {"companyDomains": ["www.qonto.com", "keobiz.fr"],"maxReviewsPerCompany": 1000,"languages": "all","proxyConfiguration": {"useApifyProxy": True,"apifyProxyGroups": ["RESIDENTIAL"],},}run = client.actor("alexmorain/trustpilot-scraper").call(run_input=run_input)reviews, companies = [], []for item in client.dataset(run["defaultDatasetId"]).iterate_items():(companies if item["type"] == "company" else reviews).append(item)print(f"{len(companies)} companies, {len(reviews)} reviews")for r in reviews[:5]:print(r["rating"], r["publishedDate"], r["title"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const input = {categorySlugs: ['accountant'],country: 'FR',maxCompaniesPerCategory: 50,};const run = await client.actor('alexmorain/trustpilot-scraper').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();const companies = items.filter((i) => i.type === 'company');console.log(`${companies.length} companies discovered`);for (const c of companies) {console.log(c.name, c.domain, c.trustScore, c.numberOfReviews);}
cURL
Start a run and wait for it to finish, then read the dataset:
curl -X POST "https://api.apify.com/v2/acts/alexmorain~trustpilot-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"companyDomains": ["keobiz.fr"],"maxReviewsPerCompany": 200,"languages": "all"}'
Same call, but asking for a CSV export of the reviews view only:
curl -X POST "https://api.apify.com/v2/acts/alexmorain~trustpilot-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>&format=csv&view=reviews" \-H "Content-Type: application/json" \-d '{"companyDomains": ["keobiz.fr"], "maxReviewsPerCompany": 500}' \-o trustpilot-reviews.csv
That second command is the shortest path to export Trustpilot reviews to CSV: one request, one file, no post-processing.
What people use this Trustpilot scraper for
Trustpilot review monitoring on your own company
Put your own domain in companyDomains, set lastDays to 1 and schedule the run daily on
Apify, or 7 and weekly. Each run returns only the reviews of that window, newest first, with
rating, publishedDate and replyMessage, so a small script can alert on anything below three
stars, or on anything older than 48 hours that still has a null replyMessage.
Trustpilot's own notification emails tell you a review landed; a dataset tells you how the
backlog of unanswered ones is trending, which is the number that actually moves your score.
Trustpilot competitor analysis
Run several domains in one go and you get a comparable table: trustScore, numberOfReviews,
reviewsLast12Months and the full review text for each. The 12-month count next to the total is
the useful pair, because it separates a competitor with a good historical score from one that is
currently collecting reviews. Reading the one and two star reviews of a competitor is the
cheapest customer research there is: people describe, in their own words and for free, exactly
which promise the competitor failed to keep. Those sentences go straight into positioning and
into sales objection handling.
Trustpilot lead generation from company profiles
Category discovery returns the companies ranked in an industry and a country, and a second pass
over those domains returns each profile's public email, phone and postal address. That is a
prospect list built on a signal you cannot buy from a database vendor: these companies care
enough about their reputation to have a claimed Trustpilot profile, and their review volume
tells you how large and how active they are. Filtering the output on trustScore below 4 gives
you the subset with a reputation problem, which is a conversation opener if you sell anything
touching customer experience.
Feeding a sentiment or topic model
Reviews come out with the body text, the star rating, the language code and both dates, which is
the shape a supervised model wants: the rating is the label, the text is the input, the date lets
you window the training set. Because the language filter defaults to all, a multilingual
company's corpus stays multilingual instead of collapsing to whatever language Trustpilot decided
to serve. If your downstream model is monolingual, set languages to that ISO code and the Actor
filters at the source rather than making you throw rows away afterwards.
Due diligence on a supplier or an acquisition target
Before signing with a vendor, pull their full review history and look at the distribution rather
than the headline score. A 4.5 built on 3,000 reviews with a steady flow reads differently from a
4.5 built on 60 reviews that all landed in the same fortnight, and the record gives you both
numbers. isClaimed, isClosed and the reply rate say how the company handles public criticism,
which is a decent proxy for how it will handle your complaint once you are a customer.
Market and category research
Discovery mode over several category slugs and several countries produces a map of who exists in a market, with a rating and a review volume attached to each. It answers the boring questions that usually take a week of manual work: how many players are there, how concentrated is the review volume, which countries have an active local market and which do not.
Why this Trustpilot scraper
The language filter that silently empties a profile. Trustpilot returns only reviews written in the language of the request. A French company with 200 reviews can come back with a single one, and nothing in the output tells you the other 199 were dropped. It looks like a company with no reviews, not like a bug, which is why it survives in scrapers for a long time. This Actor requests every language by default and only narrows it when you explicitly ask.
The 10-page wall. Trustpilot advertises thousands of pages on large profiles and serves at
most ten of them, twenty reviews each. Any scraper that just increments ?page= stops at 200
reviews per company. This one detects that ceiling and splits the profile into disjoint cells by
star rating and by language, using the exact per-rating counts Trustpilot publishes in its own
filter statistics, then walks each cell's own 10-page window and de-duplicates by review id. On
keobiz.fr that returned 749 reviews where a plain paginated scrape returned 200.
No login, no account, no cookies of yours. Everything the Actor reads is server-rendered JSON that Trustpilot embeds in its own public pages. You never hand over credentials, and there is no account of yours to get suspended. A headless browser is used for one thing only, solving the bot-check challenge to obtain an access token, after which all the actual scraping is plain HTTP. That token is cached in a named key-value store between runs, so most runs never start a browser at all. That is why the measured platform cost dropped from $2.43 to $0.32 per 1,000 results, and it is why the per-review price can sit where it does.
Public contact details, not just ratings. The company record carries the email, phone and postal address block that Trustpilot publishes on the profile. Most Trustpilot scrapers return reviews and stop. Those three fields are what turns a review dataset into a prospect list.
Discovery by category and country. You do not need to know the domains in advance. Give a category slug and a country code and the Actor returns the ranked companies, which you then feed back in as input. Scrapers that only accept URLs assume you already have the list, which is usually the hard part.
Failure that stays local. A company that stays blocked is logged with an explanation and skipped; the run keeps the reviews it already collected and moves to the next domain. The run only ends in failure when every single target failed, and it says so in the status message instead of exiting green on an empty dataset.
Pricing
Pay per event. You are charged for what the Actor delivers, and nothing is charged until the first result is pushed, so a run that gets blocked from end to end costs you nothing.
Prices go down with your Apify plan. The Store card shows the lowest one, "from $0.50 per 1,000 reviews".
| Event | Free plan | Starter | Scale | Business and above | When it fires |
|---|---|---|---|---|---|
review-scraped, per 1,000 | $0.80 | $0.70 | $0.60 | $0.50 | Each review pushed to the dataset. |
company-scraped, per 1,000 | $3.00 | $2.60 | $2.20 | $2.00 | Each company record, profile or discovery row. |
run-started, per run | $0.005 | $0.005 | $0.005 | $0.005 | Once, on the first delivered result. Covers the fixed per-run cost. |
apify-actor-start | $0.00005 per GB of memory | same | same | same | Once at container start, per gigabyte allocated. |
Worked examples, Free plan price first, Business price second:
One company, 200 reviews. Run $0.005, profile $0.003, reviews $0.16: $0.168. On Business, $0.005 + $0.002 + $0.10: $0.107.
One company, deep pass with maxReviewsPerCompany at 1000, returning 750 reviews. $0.005 +
$0.003 + $0.60: $0.608. On Business, $0.005 + $0.002 + $0.375: $0.382.
Weekly monitoring with lastDays at 7, 30 new reviews. $0.005 + $0.003 + $0.024: $0.032 a
week. On Business, $0.022.
Daily new-only monitoring of two companies, a quiet day with no new review. $0.005 for the
run + $0.006 for the two profiles: $0.011. On Business, $0.009. Each new review adds $0.0008, or
$0.0005 on Business.
Twenty competitors, 200 reviews each, 4,000 reviews in one run. $0.005 + $0.06 for the twenty profiles + $3.20 for the reviews: $3.265. On Business, $0.005 + $0.04 + $2.00: $2.045.
5,000 reviews collected across a 25-company batch. $4.00 in review events, $0.075 in profiles and the $0.005 run fee: about $4.08. On Business, about $2.56.
Category discovery, 100 companies. $0.005 for the run and $0.30 for the hundred rows: $0.305. On Business, $0.205. Contact details are not in these rows; a second run over the discovered domains adds one profile event per company, $0.003 or $0.002 on Business.
Apify's own compute and residential proxy usage is absorbed in these prices, so the numbers above are what you pay. If you set a maximum charge on the run, the Actor stops as soon as it hits the limit and says so in the status message, rather than continuing to work and getting cut off.
Limits and what this Actor does not do
Trustpilot never serves more than 200 reviews for a single request. The rating and language segmentation pushes that wall back, typically to three or four times more, but it does not remove it. A profile advertising 58,000 reviews will not come back with 58,000 reviews, from this Actor or any other, because Trustpilot does not serve them. Without a review filter, the run log prints what was collected against the advertised total so you always know where you stand; with a filter it does not, because Trustpilot only advertises the total of the whole profile.
Category listings are capped by Trustpilot itself. accountant filtered on France lists a couple
of dozen companies, not every accountant in the country. Raising maxCompaniesPerCategory does
not conjure companies Trustpilot does not rank.
Category discovery rows do not carry email, phone or address. Those come from the profile page,
so getting contact details for discovered companies means a second run in company mode using the
domain column.
De-duplication across runs covers reviews only, and only in new-only mode. Company records
come back on every run, and category discovery returns the full listing each time. Review id
is stable, so it stays the field to join on if you merge datasets yourself.
There is no keyword search over reviews and no topic filter. The Actor exposes the filters Trustpilot itself supports: language, star rating, date, verified status, company reply and sort order.
Reviewer profile URLs, review images, and Trustpilot's invitation metadata are not extracted. What you get is the field list above, nothing more.
Datacenter proxies or no proxy will get large runs blocked. Trustpilot rate-limits by IP, and a single IP holds for roughly 40 to 80 requests before it starts returning 403 whatever token it carries. Residential is the default for that reason, and changing it is the one input change that can break a run.
Scrape public data only, and use it in line with Trustpilot's terms and the law that applies to you. Personal data in reviews is personal data; if you store it, GDPR and its equivalents apply to you the same way they would if you had typed it in yourself.
Integrations
Runs and datasets are Apify platform objects, so everything the platform offers applies here.
Schedule a run daily, hourly or on any cron expression from the Schedules tab. For a push
instead of a poll, set webhookUrl: the Actor posts its own summary with the counters, the
dataset id and the run status, as described in the monitoring section. Apify's platform webhooks
on ACTOR.RUN.SUCCEEDED work too, if you prefer to manage them on your side.
Datasets export to JSON, JSON Lines, CSV, Excel, XML, HTML and RSS, either from the Console
Export button or by adding &format=csv to the dataset items API call. The view=companies and
view=reviews query parameters split the two record types without any client-side filtering, so
a bulk Trustpilot export straight into a spreadsheet is a single URL.
The Actor is also reachable from Apify's MCP server, which lets an agent call it as a tool and
read the results back. Combined with the official apify-client packages for Python and
JavaScript shown above, and Apify's connectors for the usual automation platforms, wiring
Trustpilot company data into an existing pipeline is a configuration job rather than a
development one.
FAQ
Can I scrape Trustpilot without an account? Yes. The Actor never logs in and never uses cookies belonging to you. It reads the JSON that Trustpilot server-renders into its own public pages. You need an Apify account to run the Actor, nothing on the Trustpilot side.
Is scraping Trustpilot legal? Collecting publicly available data is generally lawful in the EU and the US, but that is not blanket permission. Trustpilot's terms of service, your local law and data protection rules such as the GDPR still apply, especially since reviews contain personal data like reviewer names and countries. Use the output for analysis, keep it secure, and take legal advice if you plan to republish it or use it for direct marketing. This is not legal advice.
How many reviews can I export per company? Up to 200 in a single fast pass. Above that, the segmentation typically brings back three to four times more, measured at 749 on a profile where plain pagination gave 200. Very large profiles cannot be exported in full, because Trustpilot itself stops serving beyond a certain depth.
Why do I only get one review for a French or German company?
That is Trustpilot's language filter, and it is exactly the trap this Actor works around. Check
that languages is set to all. If you set it to a specific language code, you get only reviews
written in that language, which on a non-English profile can be almost nothing.
How do I export Trustpilot reviews to CSV?
Run the Actor, open the Storage tab, choose the Reviews view and press Export, or call the API
with format=csv&view=reviews as shown in the cURL example above. Excel, JSON and XML work the
same way.
Can I scrape all companies in a Trustpilot category? You get the companies Trustpilot ranks for that category and country filter, which is capped by Trustpilot, not by the Actor. That is often a few dozen for a narrow national category. The run log prints the total Trustpilot reports so you can tell a cap from a bug.
Does it return the company's email and phone number?
Yes, in company mode, when the company published them on its Trustpilot profile. email,
phone, address, city and zipCode come from the profile's public contact block and are
null when the company left them empty. Category discovery rows do not include them.
Do I need proxies to scrape Trustpilot? Yes, for anything beyond a few dozen requests. Trustpilot rate-limits by IP and a single address gets blocked after roughly 40 to 80 requests. Apify residential proxies are the default input and the proxy cost is included in the price.
Can I monitor new Trustpilot reviews automatically?
Yes. Schedule the Actor with reviewMode set to new-only and lastDays at 30: each run
reads the recent reviews, stops as soon as it reaches older ones, and returns only those no
previous run of the same feed delivered. Rare exceptions: a run interrupted in the middle of a
company, or two runs of the same feed at the same time, can repeat a few reviews. The registry is
kept per company, so you can add companies to a running schedule without paying again for the
ones you already follow. Set webhookUrl to get a JSON summary once each run is over, through
Zapier, Make, n8n or your own endpoint.
How much does it cost to scrape 1,000 Trustpilot reviews? From $0.50 in review events on an Apify Business plan, $0.80 on the Free plan, plus $0.005 for the run and one company profile ($0.002 to $0.003). A single-company run of 1,000 reviews comes to about $0.51 on Business and $0.81 on the Free plan.
What happens if Trustpilot blocks one of my companies? That company is logged with the reason and skipped. Reviews already collected for it are kept, and the run moves on to the next domain. The run only fails outright if every target failed.
Can I scrape Trustpilot reviews by date range or star rating?
Yes. lastDays or publishedAfter set the start of the window, stars keeps the ratings you
want, and verifiedOnly and withRepliesOnly narrow further. There is no keyword filter:
reviews carry text, so search it after export.
Which Trustpilot domain does it use?
www.trustpilot.com. Country-specific domains like fr.trustpilot.com are accepted in the input
as profile URLs, and the Actor extracts the company identifier from them.
Can I use this Actor from an AI agent? Yes, through Apify's MCP server or the standard API. The input schema is small and every field has a description, which is usually enough for an agent to call it correctly on the first try.