Trustpilot Scraper: Reviews + Company Contacts, from $0.50/1K avatar

Trustpilot Scraper: Reviews + Company Contacts, from $0.50/1K

Pricing

from $0.50 / 1,000 reviews

Go to Apify Store
Trustpilot Scraper: Reviews + Company Contacts, from $0.50/1K

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

Alexis Morain

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

12 days ago

Last modified

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

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

  1. Open the Actor and go to the Input tab. www.qonto.com is already prefilled, so you can press Start immediately and look at the shape of the output before committing to anything.
  2. 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.
  3. Set Max reviews per company. 200 is 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.
  4. Leave Review languages on all and the proxy on residential. Those two defaults are the ones that avoid the two traps of the Trustpilot site, described further down.
  5. 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

  1. Leave Company domains empty and fill Category slugs instead, one per line: accountant, bank, insurance_agency.
  2. Get a slug by opening a category on Trustpilot and taking the last part of the URL. trustpilot.com/categories/accountant gives the slug accountant. Underscores are part of the slug.
  3. 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.
  4. 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 inExampleLeave alone
Read one company's reviewscompanyDomains["keobiz.fr"]everything else
Monitor your own Trustpilot reviewscompanyDomains, reviewMode, lastDays and an Apify schedule["www.qonto.com"], new-only, 30everything else
Get notified when new reviews landwebhookUrl, with reviewMode on new-onlya Zapier, Make or n8n catch hook, or your own endpointeverything else
Read only the complaintsstars[1, 2]everything else
Keep only verified, or only answered, reviewsverifiedOnly, withRepliesOnlytrueeverything else
Compare several competitors at oncecompanyDomains with many lines["a.com","b.com","c.com"]everything else
Go past the 200-review wallmaxReviewsPerCompany above 2001000everything else
Build a prospect list for an industrycategorySlugs and country["accountant"], FRcompanyDomains
Get a company's public email and phonecompanyDomains (company mode only)["wity.fr"]—
Feed a single-language sentiment modellanguagesfreverything else
Run reliably at volumeproxyConfiguration on residentialdefaulteverything 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

FieldTypeDefaultWhat it does
companyDomainsarray of stringsemptyDomains or Trustpilot profile URLs to scrape reviews and company data from. One per line.
categorySlugsarray of stringsemptyTrustpilot category slugs to discover companies from. Filled together with companyDomains, both jobs run.
countrystringemptyISO country code filtering category discovery. Ignored in company mode.
modestring enumautoauto, 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.
maxReviewsPerCompanyinteger200Upper bound on reviews per company. Above 200 the rating and language segmentation kicks in.
maxCompaniesPerCategoryinteger100Upper bound on companies per category, paged 20 at a time.
languagesstringallall for every review language, or a single ISO code such as fr or en.
starsarray of integersempty (every rating)Star ratings to keep, from 1 to 5. Filtered by Trustpilot.
lastDaysintegeremptyOnly reviews published in the last N days. Stops paging at the first older review.
publishedAfterdate, YYYY-MM-DDemptyOnly reviews published on or after that date, midnight UTC. With lastDays too, the more recent date wins.
verifiedOnlybooleanfalseOnly reviews Trustpilot labels as verified. Filtered by Trustpilot.
withRepliesOnlybooleanfalseOnly reviews the company answered. Filtered by Trustpilot.
sortBystring enumrecencyrecency (newest first) or relevance (Trustpilot's own ranking).
reviewModestring enumallall returns every matching review. new-only returns, and charges, only reviews no previous run delivered.
registryKeystringempty (derived)Namespace of the new-only registries, one per company. Empty: derived from the review filters.
webhookUrlstring, secretemptyURL that receives a JSON summary once the scraping is over. Not sent when the input is rejected.
proxyConfigurationobjectApify residentialProxy 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, verifiedOnly and withRepliesOnly are 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] with maxReviewsPerCompany at 1000 and the Actor still splits past the 200-review wall, only over the one and two star cells.
  • lastDays and publishedAfter keep 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.
  • sortBy switches between newest first and Trustpilot's relevance ranking. Keep recency with a date filter: with relevance the 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, withRepliesOnly and languages. Two schedules with different filters never pollute each other. Changing lastDays, publishedAfter, sortBy or maxReviewsPerCompany keeps the same registries. Set registryKey to 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.
  • maxReviewsPerCompany caps 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 all mode. 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.

FieldTypeDescriptionExample
typestringAlways company for this record type"company"
idstringTrustpilot's internal business unit id"5f8c1b0d9f4a2c0001b7e3a1"
domainstringThe domain Trustpilot keys the profile on"keobiz.fr"
namestringCompany display name"Keobiz"
trustScorenumberTrustScore out of 5, one decimal4.6
starsnumberStar bucket Trustpilot displays4.5
numberOfReviewsintegerTotal reviews Trustpilot advertises4512
reviewsLast12MonthsintegerReviews published in the last 12 months1189
isClaimedbooleanWhether the company claimed its profiletrue
isClosedbooleanWhether Trustpilot marked the profile closedfalse
countryCodestringCountry of the business unit"FR"
categoriesarray of objectsCategories with id, name, isPrimary[{"id":"accountant","name":"Accountant","isPrimary":true}]
websiteUrlstringCompany website as declared on Trustpilot"https://www.keobiz.fr"
emailstring or nullPublic contact email from the profile"contact@keobiz.fr"
phonestring or nullPublic contact phone"+33 1 76 41 04 88"
addressstring or nullStreet address"12 rue de la Chaussée d'Antin"
citystring or nullCity"Paris"
zipCodestring or nullPostal code"75009"
countrystring or nullCountry 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.

FieldTypeDescriptionExample
typestringAlways company"company"
domainstringCompany domain, usable as input for a review run"wity.fr"
namestringCompany display name"Wity"
trustScorenumberTrustScore out of 54.8
starsnumberStar bucket5
numberOfReviewsintegerTotal reviews Trustpilot advertises612
citystring or nullCity from the listing"Paris"
countrystring or nullCountry from the listing"FR"
categoryIdstringThe 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

FieldTypeDescriptionExample
typestringAlways review"review"
idstringTrustpilot review id, stable across runs"66b3f0c21e4ab90c2d5f8e71"
companyDomainstringDomain of the company the review belongs to"keobiz.fr"
ratingintegerStar rating from 1 to 55
titlestringReview headline"Fast and clear answers"
textstringFull review body"Onboarding took two days and…"
languagestringISO code of the language the review is written in"fr"
experiencedDatestring, ISO 8601Date of the experience the reviewer describes"2026-07-14T00:00:00.000Z"
publishedDatestring, ISO 8601When the review was published"2026-07-16T09:12:44.000Z"
updatedDatestring or nullWhen the reviewer last edited itnull
likesintegerUseful votes the review received3
isVerifiedbooleanTrustpilot's verification labeltrue
consumerNamestringReviewer display name"Camille D."
consumerCountrystringReviewer country code"FR"
consumerReviewCountintegerHow many reviews that account has written7
replyMessagestring or nullThe company's public reply"Thanks Camille, glad it went well."
replyDatestring or nullWhen 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 ApifyClient
client = 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".

EventFree planStarterScaleBusiness and aboveWhen it fires
review-scraped, per 1,000$0.80$0.70$0.60$0.50Each review pushed to the dataset.
company-scraped, per 1,000$3.00$2.60$2.20$2.00Each company record, profile or discovery row.
run-started, per run$0.005$0.005$0.005$0.005Once, on the first delivered result. Covers the fixed per-run cost.
apify-actor-start$0.00005 per GB of memorysamesamesameOnce 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.