Trustpilot Reviews Scraper
Pricing
$2.00 / 1,000 reviews
Trustpilot Reviews Scraper
Scrape Trustpilot reviews for any company: rating, title, text, dates, reviewer and company replies, plus the company profile and its star breakdown. Filter by stars, date, language, keyword or topic.
Pricing
$2.00 / 1,000 reviews
Rating
5.0
(1)
Developer
Zyra
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Get every review for a company on Trustpilot — rating, title, text, dates, reviewer, company replies — plus the company's own profile and its star breakdown, as clean structured JSON.
One company per run. Filter by star rating, date, language, keyword or topic before anything is collected, so you pay for the reviews you actually want.
What you get
One dataset item per review, with the company it belongs to attached to each one. That means a CSV export is a spreadsheet of reviews, one per row, with no unpacking to do.
{"id": "6a9fd4ce9b47cd282c8b408c","url": "https://www.trustpilot.com/reviews/6a9fd4ce...","title": "Geweldige acteurs/zangers","content": "Geweldige acteurs/zangers. Een prachtig verhaal...","rating": 5,"verified": false,"dates": {"written": "2026-09-08T11:26:38.000Z","experience": "2026-09-07T00:00:00.000Z","posted_raw": null},"engagement": { "useful_count": 0, "reply_count": 0 },"replies": [ { "content": "We're sorry to hear this...","date": "2026-09-09T10:00:00.000Z", "author": null } ],"reviewer": { "name": "M. K.", "country": "NL", "reviews_posted_overall": 2 },"company": {"id": "59935d1d0000ff0005a8efd0","name": "Headout","url": "https://www.trustpilot.com/review/headout.com","website": "https://www.headout.com","logo": "https://...","about": "Headout is home to the world's best real-life experiences...","verified": false,"contact": { "email": "support@headout.com", "phone": "+1 347 897 0100" },"location": { "address": "...", "country": "US" },"categories": { "primary": "travel_agency", "other": [],"activity": [...], "breadcrumbs": [...] },"rating": {"score": 4.4,"label": "Excellent","total_reviews": 62859,"distribution": [ { "star": 5, "count": 46343, "percentage": 74.0 }, ... ]}}}
Field reference
Review — the item itself
| Field | Type | Notes |
|---|---|---|
id · url | string | url links straight to the review on Trustpilot |
rating | integer | 1–5 |
title · content | string | content may be null — a rating with no text |
verified | boolean | Verified purchase/experience |
dates.written | ISO 8601 | When the review was posted. Use this one |
dates.experience | ISO 8601 | When the reviewer used the service |
dates.posted_raw | string | Trustpilot's own wording, often a bucket like Last 6 months. null whenever Trustpilot showed an exact date |
engagement.useful_count | integer | "Useful" votes from other readers |
engagement.reply_count | integer | How many company replies |
replies[] | object[] | content, date, author |
reviewer.name | string | Display name |
reviewer.country | string | ISO 3166-1 alpha-2 |
reviewer.reviews_posted_overall | integer | Their lifetime Trustpilot review count |
Company — under company, identical on every row of a run
| Field | Type | Notes |
|---|---|---|
company.id · name · url | string | url is the Trustpilot page, with your filters on it |
company.website | string | The company's own site |
company.logo · about | string | May be null; about may contain HTML |
company.verified | boolean | Whether Trustpilot has verified the business |
company.contact.email · phone | string | May be null |
company.location.address · country | string | Country is ISO 3166-1 alpha-2 |
company.categories.primary | string | Main Trustpilot category |
company.categories.other · activity · breadcrumbs | string[] | |
company.rating.score | number | TrustScore, 1–5 |
company.rating.label | string | Excellent, Great, Average… |
company.rating.total_reviews | integer | Every review the company has, not just those collected |
company.rating.distribution[] | object[] | star, count, percentage, always ordered 5 → 1 |
Timestamps are ISO 8601 UTC with milliseconds (2026-09-08T11:26:38.000Z).
Any field can be null when Trustpilot does not show it.
Input
The only required field is the company.
{"companyDomain": "headout.com","date": "last3months","stars": ["1", "2"],"limit": 100}
| Field | Type | Default | What it does |
|---|---|---|---|
companyDomain | string | — | Required. headout.com, or a Trustpilot URL like https://www.trustpilot.com/review/headout.com (any regional domain works) |
limit | integer | 100 | How many reviews to keep |
date | select | all time | last30days · last3months · last6months · last12months |
stars | multi-select | all | Any of 1–5, combined as OR |
languages | string | all | all, or an ISO 639-1 code such as en |
search | string | — | Only reviews containing this text |
topics | string[] | — | Trustpilot topic slugs; the list differs per company |
verified | any/yes/no | any | Verified reviews only, or unverified only |
replies | any/yes/no | any | Only reviews the company has replied to, or only those without a reply |
sort | select | relevance | relevance or recency |
datePosted | select | — | A second date filter — see the note below |
page | integer | 1 | Start from a later page of the review list |
Pricing
Pay per review actually delivered — you are never charged for a run that returns nothing. The current rates are on this actor's Pricing section above; there are two, and a paid Apify plan pays the lower one.
A free Apify plan gets 5 runs of this actor in total, and each of them keeps at most 10 reviews. Upgrading your Apify plan lifts both limits and moves you to the lower rate.
A run refused for being past the free limit finishes with an empty dataset and a status message saying so. It is not charged, and it does not count as a failure.
Billing is issued in increments of 100 reviews, so the charge always matches what was delivered.
Things worth knowing
limit caps what you keep, filters cap what gets collected. Both reduce
cost, but the filters are the ones that make a run finish sooner. Leaving every
filter empty on a company with 60,000 reviews means collecting all of them.
limit is a ceiling, not a promise. A narrow filter — or Trustpilot simply
having fewer matching reviews — returns less. Asking for 250 might return 206,
and you are billed for the 206.
verified and replies have three states, not two. any applies no
filter at all. yes and no are two different filters — no gives you
unverified reviews only, which is not the same as "don't filter".
date and datePosted are separate filters. date is Trustpilot's own
and the one to use. Setting both applies both, and you get only the reviews
matching each — usually fewer than you expected.
One row per review, and the company repeats on every row. That is what makes a CSV export usable directly. The dataset's Company view shows the profile on its own if that is what you came for.
A company with no matching reviews is a success, not an error. You get an empty dataset and a run that says so. A domain that has no Trustpilot page at all fails the run and tells you so — the two are never confused.
Examples
Recent complaints, for support triage
{ "companyDomain": "headout.com", "stars": ["1", "2"],"date": "last30days", "sort": "recency", "limit": 200 }
English reviews mentioning refunds
{ "companyDomain": "headout.com", "search": "refund","languages": "en", "limit": 100 }
Reviews the company has already answered
{ "companyDomain": "headout.com", "replies": "yes", "limit": 50 }
Support
Runs are asynchronous and typically finish in under a minute; a large
unfiltered collection takes longer. Every run writes an OUTPUT record to the
key-value store with what was requested, what arrived, and what was charged.
If a run fails, its status message says why in plain language — a malformed company domain, a company with no Trustpilot page, or a temporary problem worth retrying.