Getting Trustpilot company review pages into something you can query is a grind: reviews are paginated, replies are nested under each one, and the posting date is not the date the thing happened. I'll show the manual way and where it breaks, then a faster path in Python, REST, and MCP, plus a repo to clone. The faster path is the Trustpilot Reviews API on Apify: company URLs in, one JSON row per review out, built for reputation monitoring, a dated history of what changed.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Does Trustpilot have an API?
Yes, and it's worth being straight about. Trustpilot's own developer API sits behind a business account and its plan limits, scoped to that account's data. If you're a business reading your own reviews, use it; it won't let you point at a competitor with no account relationship. That's the gap a scraper-as-API fills: public review pages in, a fixed JSON shape out, billed per review rather than per plan. This Actor isn't affiliated with Trustpilot and doesn't claim feature parity with their API.
What the Trustpilot Reviews API returns
The Trustpilot Reviews API returns one JSON row per public review: star rating, title and text, posting date and a separate date of experience, verified flag, reviewer country, and any company reply, plus the company's overall rating and star breakdown.
| Field | Example | Notes |
|---|---|---|
reviewRating |
5 |
1 to 5 stars |
dateOfExperience |
2026-07-23T00:00:00.000Z |
When it happened; reviewDate is the posting date |
reviewReplies |
[{ "text": "Thanks for the kind words.", "date": "2026-07-15" }] |
The business's reply, with date |
starBreakdown |
{ "star5": { "count": 4083, "percent": 93 } } |
The 5-to-1 split, counts and percentages |
result_type |
review |
Or error with an error_message, so nothing fails silently |
Who this is for
Brand and CX teams who want the star breakdown as a time series. Competitive analysts who need a rival set in one export, replies included. Data scientists building a customer review dataset with labels attached.
The manual way, and where it breaks
The DIY version is a headless browser that loads the review page, pages through, and parses each card. It works in a quick test. Then you hit a company with four thousand reviews, find that reply text and date of experience live in different parts of the markup, and watch your selectors rot when the layout shifts. At twenty competitors you're running proxies and retries and maintaining infrastructure instead of a rating history.
The failure I care about most is the quiet one. When a script returns zero reviews, you can't tell whether the page moved, the company has no reviews, or you were blocked. An empty result is a claim, and claims need evidence.
The faster way: run the Trustpilot Reviews API
You send a documented JSON input and get a documented JSON output, with nothing to keep alive.
Apify Console
- Open the Trustpilot Reviews API and click Try for free.
- Paste company review-page URLs (or bare domains) into Company URLs and set Max reviews per company.
- Run it and export as JSON, CSV, or Excel.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~trustpilot-reviews-api/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "companyUrls": ["https://www.trustpilot.com/review/www.dugood.org"], "maxReviewsPerCompany": 3 }'
Run endpoint reference: the Apify API docs.
Get customer review data in Python
Call the Actor with apify-client and handle the error rows:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/trustpilot-reviews-api").call(
run_input={
"companyUrls": ["https://www.trustpilot.com/review/www.dugood.org"],
"maxReviewsPerCompany": 25,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item["result_type"] == "error":
print("error:", item["companyUrl"], item["error_message"])
continue
print(item["reviewRating"], item["dateOfExperience"], item["reviewTitle"])
That error branch answers the plausible zero: a URL that returns nothing produces an error row with a plain-language error_message, so a dead page, a company with no reviews, or a datePosted window that excluded everything comes back with a reason. (I'd rather see an error row than a suspiciously clean zero.) The runnable version is the task Get Trustpilot reviews by API from company URLs.
Reputation monitoring on a schedule, for any company
A single run is a check. The value is the trendline: the same input on a schedule, each run appending a dated snapshot with fetched_at, companyOverallRating, and starBreakdown. Because the breakdown carries counts per level, you see a one-star share climbing before the rounded average moves. Save the input as a task, schedule it with 0 7 * * *, and set datePosted to Last 30 days so recurring runs stay small. The task Monitor Trustpilot reputation for any company is already wired this way.
Audit Trustpilot reviews for fake review signals
Every row carries isVerifiedReview and reviewerTotalReviews, so you can weight an established reviewer against a one-time account. The task Audit Trustpilot reviews for fake review signals sets that up. It gives you the signals; the judgement is still yours.
Build a customer review dataset for sentiment analysis
Flat rows of reviewContent with reviewRating attached are already a labelled dataset, and reviewerLocation splits it by market. The task Build a customer review dataset for sentiment analysis exports exactly that shape.
Export Trustpilot reviews to CSV
For spreadsheet people, the task Export Trustpilot reviews to CSV for any company goes straight from company URLs to CSV, no code. Two recipes also exist as Chinese-language tasks: bulk collect Trustpilot reviews and export to CSV and monitor competitor Trustpilot ratings.
Use it from Claude and other MCP clients
Apify exposes the Actor through the Model Context Protocol, so Claude, Claude Code, and Cursor can pull reviews mid-conversation and answer "which competitor replies to complaints" with live data. In Claude Code:
claude mcp add --transport http trustpilot "https://mcp.apify.com/?tools=actors,docs,johnvc/trustpilot-reviews-api"
The task Read Trustpilot reviews in Claude via MCP has a working configuration; read more about Claude Code at claude.ai.
The example repo
johnisanerd
/
Apify-Trustpilot-Reviews-API
Reputation monitoring data from the Trustpilot Reviews API on Apify: a Python (uv) quick-start plus MCP install guides for Claude, Cursor, and ChatGPT. Returns structured JSON reviews, ratings, replies, and star breakdowns.
⭐ Trustpilot Reviews API: Reputation Monitoring Data as Structured JSON
The most efficient, reliable, and developer-friendly way to use the Trustpilot Reviews API.
Actor page: apify.com/johnvc/trustpilot-reviews-api Input schema: apify.com/johnvc/trustpilot-reviews-api/input-schema
Give it one or more company review-page URLs and it returns one clean JSON row per review: the star rating, the review title and full text, the posting date, the separate date of experience, the verified flag, the reviewer's country, and any reply the business posted. Every row also carries company context, so the same pull gives you the overall rating, the total review count, and the full 5-to-1 star breakdown with counts and percentages. It is built API-first and MCP-ready, so you can call it from Python or drive it as a tool from an AI agent.
Video Walkthrough
Text walkthrough
Most people arrive here because dashboards priced for enterprise reputation monitoring do not expose the underlying rows, and the…
A Python quick start that asks for just three reviews, plus MCP walkthroughs for Claude, Cursor, and ChatGPT.
FAQ about scraping Trustpilot reviews
What does the Trustpilot scraper cost?
Per review returned, through one review-scraped event, plus a tiny actor-start event per run. A company that returns no reviews costs nothing, and maxReviewsPerCompany is enforced at the source, so your cap is the ceiling on a run's cost. Current rates are on the Store card.
How do I monitor a competitor's online reputation with this scraper?
Put every competitor URL in one companyUrls array, save it as a task, and attach a weekly schedule such as 0 9 * * 1. Each row carries companyName, companyOverallRating, and starBreakdown, and reviewReplies shows who answers complaints. Start from the Trustpilot Reviews API with datePosted set to Last 30 days.
Can Claude Code or Cursor call this scraper directly?
Yes. Add the hosted Apify MCP server with the Actor preloaded, as above, and it appears as a callable tool. Every row carries a one-line summary an agent can read as is.
How does media monitoring support reputation management alongside a review scraper?
Media monitoring tells you what's being said about you; review data tells you what customers experienced and whether you replied. Run both on the same cadence and a rating dip lines up against that week's coverage; this scraper is the review half.
Is this scraper enough for crisis prevention?
Early warning needs the full star distribution rather than the average, the date of experience separate from the posting date, and a history you keep. This scraper returns the first two and leaves storage and alerting to you. Its hard edges: no company search, so you build the URL list yourself; datePosted accepts four fixed windows, not calendar dates; and no reviewer email addresses.
More from Truffle Pig Data
Same Actor, another angle: the Trustpilot Reviews API write-up on LinkedIn. For B2B software, the G2 Reviews API returns the same kind of row.
Wrapping up
Trustpilot's API serves a business reading its own reviews; for any other company, this is the public data as dated JSON you keep. Try the Trustpilot Reviews API, or clone the example repo and point it at your own company list.

Top comments (0)