Trustpilot Scraper - Reviews, Star Breakdown & Company Stats
Pricing
from $1.20 / 1,000 results
Trustpilot Scraper - Reviews, Star Breakdown & Company Stats
Scrape Trustpilot business profiles and reviews on any country domain: TrustScore, the exact 1-5 star distribution in counts and percentages, reply rate, claim and verification status, contact block, plus reviews with verification badge and company reply. Keyword, category sweep or pasted links.
Pricing
from $1.20 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
2
Bookmarked
3
Total users
3
Monthly active users
a day ago
Last modified
Categories
Share
Trustpilot Scraper: Reviews, Star Breakdown & Company Stats
Scrape Trustpilot business profiles and their reviews, on any Trustpilot country domain. Get the exact 1 to 5 star distribution in counts and percentages, the negative and positive review share, how often a company replies and how fast, whether the profile is claimed, and the full public contact block, alongside individual reviews with their verification badge and any company reply. Search by keyword, sweep a whole category, or paste exact links, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- Two-kind dataset, one export. Business profiles and reviews come back in the same dataset, told apart by
kind. Every review row also carries the business's identity and TrustScore, so a review export stands on its own. - The exact star breakdown, not an estimate.
ratingDistributionandratingDistributionPercentare the counts Trustpilot itself reports, not derived from whatever sample of reviews this run happened to read. - Reply behavior, measured. How often a company answers, how fast, and how many negative reviews got a reply at all.
- Trust and verification signals. Claimed status, closed status, Google verification, payment and identity verification, and any consumer alerts on the profile.
- The full public contact block. Email, phone, address, city, zip code and country, as published on the profile.
- Three ways to find businesses. Keyword search, a whole category swept end to end, or paste exact profile, category and search links (or bare company domains) mixed freely.
- Built for schedules. Incremental mode returns only new and changed rows on recurring runs, and a refused run fails loudly instead of returning an empty dataset.
Use Cases
- Reputation monitoring: track a brand's TrustScore, star distribution and reply rate over time.
- Competitive research: compare companies' review volume, verification rate and how fast each answers complaints.
- Customer feedback mining: pull review text and ratings to find recurring complaint or praise themes.
- Lead sourcing: sweep a whole Trustpilot category for companies above (or below) a TrustScore threshold.
- Support and reputation ops: watch for new negative reviews and reply gaps as they appear.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
kind | "business" (also "review") |
recordId | "business:example-shop.test" |
identifyingName / displayName | "example-shop.test" / "Example Shop" |
profileUrl / websiteUrl / logoUrl | Trustpilot profile link, company site, logo image |
trustScore / stars | 4.3 / 4 (headline score, 0 to 5, and the rounded star rating) |
numberOfReviews / numberOfReviewsLast12Months | 1000 / 120 (volume, all time and recent) |
ratingDistribution | exact per-star counts: {oneStar, twoStar, threeStar, fourStar, fiveStar} |
ratingDistributionPercent | the same split as percentages |
negativeReviewShare / positiveReviewShare | 15.0 / 80.0 (1-2 star and 4-5 star share of all reviews) |
replyPercentage / averageDaysToReply | 62 / 2 (how often, and how fast, the company answers) |
isClaimed / isClosed / isCollectingReviews | profile status |
verifiedByGoogle / verifiedPaymentMethod / verifiedUserIdentity | trust and verification signals |
contactEmail / contactPhone / contactAddress | the public contact block |
contactCity / contactZipCode / countryCode | location detail |
primaryCategoryName / categories | classification |
breadcrumbTopLevel / breadcrumbMidLevel / breadcrumbBottomLevel | the category path |
reviewLanguages | review counts per language |
reviewsMatchingFilters | review count under the active review filters |
reviewsScraped / verifiedShareOfScraped / repliedShareOfScraped | stats over the reviews this run actually read (a sample, labelled as one) |
changeType | "NEW", "UPDATED", "UNCHANGED", "REAPPEARED" or "EXPIRED" (incremental mode only) |
changedFields / firstSeenAt / lastSeenAt | what changed, and when first and last seen (incremental mode only) |
site / searchMode / scrapedAt | which country domain was read, which mode found it, and when |
kind: "review" rows carry reviewId, reviewUrl, rating, title, text, language, likes, isVerified, verificationLevel, experiencedDate, publishedDate, hasReply, replyText, replyPublishedDate, consumerDisplayName, consumerCountryCode and consumerNumberOfReviews, plus the business's identifying name, display name, profile URL and TrustScore denormalised onto every row so a review export stands on its own. A review row's recordId follows the same fictional pattern as the business sample below, for example review:00000000000000000000000.
Output tabs and run summary
The Output tab offers four views over the same dataset: Overview (every field), Businesses (profile columns), Reviews (review columns plus the business they belong to) and Changes (change type, changed fields, first and last seen, for incremental runs). Each run also stores a run summary under the key OUTPUT in the key-value store: businesses, reviews, rejected pages, failures and narrowed links (a pasted link with filters or a later page, which is a deliberate partial read and not a failure), in total and per input target.
How to Use
- Pick a mode:
search(keyword or category) orurl(paste Trustpilot links or bare company domains). - In search mode, set Search type to
keyword(fill Search query) orcategory(fill Category id); in url mode, fill Trustpilot links or company domains, one per line. - Set the domain and the review filters (stars, language, verified, age, keyword); every filter is applied by Trustpilot itself through its own review URL, so a narrowed run reads fewer pages instead of downloading everything and discarding most of it. Switch Scrape reviews and Fetch business details on or off.
- Set Max items to control run size and cost, then click Start.
Keyword search:
{"mode": "search","searchType": "keyword","query": "nike","maxItems": 50}
Category sweep with a TrustScore floor:
{"mode": "search","searchType": "category","category": "book_store","minTrustScore": 4,"maxItems": 100}
URL shapes
| Shape | Example | Behaviour |
|---|---|---|
| Business profile | https://www.trustpilot.com/review/bookshop.org | One business plus its reviews |
| Profile with review filters | https://www.trustpilot.com/review/www.amazon.com?page=2&stars=5&languages=all&sort=recency&verified=true | Pasted page, stars, languages, sort, verified and date override the matching inputs for that link; the run counts as a partial scope, so it never marks other reviews as expired |
| Category | https://www.trustpilot.com/categories/book_store | Businesses of the category, walked forward |
| Category, later page | https://www.trustpilot.com/categories/book_store?page=2 | Starts at page 2 |
| Keyword search | https://www.trustpilot.com/search?query=nike | Businesses matching the keyword |
| Country domain profile | https://uk.trustpilot.com/review/www.etsy.com | Same as a profile, read on that country domain |
| Category index | https://www.trustpilot.com/categories | Sweeps every top-level category, bounded by Max items and Max pages; a warning is logged if the index cannot be read |
The Trustpilot links or company domains field is pre-filled with one example of each shape. If you start URL mode without changing it, the run scrapes all of these examples (bounded by Max items; each example points at a different business, category or search, so none is skipped as a duplicate), so clear the field or replace the links with your own first.
URL mode, mixed links, only negative reviews:
{"mode": "url","urls": ["https://www.trustpilot.com/review/example-electronics.test","https://de.trustpilot.com/review/example-shop.de"],"reviewStars": ["1", "2"],"maxReviewsPerBusiness": 100}
Recurring monitoring setup:
{"mode": "search","searchType": "keyword","query": "nike","incrementalMode": true,"emitExpired": true,"stateKey": "nike-watch"}
A bare company domain works in url mode: it is the same thing Trustpilot uses in its own profile URL, so example-shop.test and https://www.trustpilot.com/review/example-shop.test resolve to the same business.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/trustpilot-reviews-scraper").call(run_input={"mode": "search", "searchType": "keyword", "query": "nike"})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["kind"], row.get("displayName") or row.get("title"))
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/trustpilot-reviews-scraper').call({mode: 'search', searchType: 'keyword', query: 'nike',});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Why reviewLanguage defaults to "all"
Trustpilot's own visitor view defaults to the visitor's language and silently hides the rest. This actor asks for every language unless you narrow it, so numberOfReviews on the business row and the review rows this run returns agree with each other. On a business with reviews in many languages, leaving this at the default can mean noticeably more rows than a narrowed run.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset id, and the actor skips every row it already collected there, so you don't pay twice. - Tip: resume skips a business as a whole. If the earlier run already returned a business row but stopped partway through its reviews (interrupted, or cut off by
maxItems), the resumed run skips that business entirely, so its remaining reviews are not collected. To finish that business, run it again as its own profile link withoutresumeFromRunId(this also returns, and bills, the reviews you already have for it). - Tip: resume and incremental mode don't share memory. Rows a resumed run skips are not written into the incremental state. If the interrupted run never saved its state (it stopped before finishing), the next scheduled incremental run returns those rows again as
NEW, and bills them. - Incremental mode (
incrementalMode) is for a schedule over the same search and review-filter setup. The first run marks everythingNEW; later runs return onlyNEW,UPDATEDandREAPPEARED, each withchangedFields,firstSeenAtandlastSeenAt.emitUnchangedandemitExpiredaddUNCHANGED/EXPIREDrows too (and bill them), both off by default.EXPIREDis only produced after a run that fully scanned the tracked scope: never whenmaxItemscapped it, never when a page could not be read, never when the run stopped early near its time limit, never when a pasted link narrowed the scope, and never on a resumed run. State is kept separately per search and per review-filter setup;stateKeylets you name a campaign or deliberately share one. A row isUPDATEDwhen a returned field changed. These fields are returned but never compared:scrapedAt, the sample-based review shares and counts of this run, reviewlikesandconsumerNumberOfReviews.ignoreFieldsForChangesadds your own (plain names or dotted paths such aslocation.city); it applies to the stored baseline too, so changing it does not cause a wave ofUPDATEDrows. - Tip:
maxItemsdoes not capEXPIREDrows. Once a run is eligible to detect them, every previously tracked business or review that is no longer found is returned, and billed, asEXPIRED, however many that is; only the normal new-and-changed walk stops atmaxItems. If your tracked scope can shrink by a lot between runs (a category losing many businesses, or a search narrowing), budget forEXPIREDseparately frommaxItems, or leaveemitExpiredoff and check for drops another way. - Tip: a review cut off by the per-business limit can be marked
EXPIRED.maxReviewsPerBusinessandmaxPagesdo not count as a capped scan. WithemitExpiredon, a review tracked last run that falls outside this run's window (for example, pushed down by newer reviews when sorted by recency, with the default limit of 20) is returned and billed asEXPIREDeven though it is still on Trustpilot. For review monitoring withemitExpired, setmaxReviewsPerBusinessto0andmaxPagesto0, or treatEXPIREDreviews as "no longer in the window", not "deleted". - Tip: overlapping links share one pass per business. In url mode
maxItemsis split evenly across the pasted links, and each business is read at most once per run. If a category link reaches a business first and its share runs out partway through that business's reviews, a later profile link for the same business is skipped, so you get fewer of its reviews (and fewer rows in total) thanmaxItemsallows. List the profile link before the category link, or run it separately.
Send results into your apps (MCP connectors)
Set mcpConnectors to pipe every returned row into the tools you already use over Model Context Protocol. Authorize a connector under Apify, Settings, API & Integrations, then select it here. Notion gets a page per item (set notionParentPageUrl); other connectors get a best-effort write or digest. maxNotifyListings caps how many rows go to each connector. None of this changes the dataset: the complete record always stays in the Apify dataset.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keyword or category) or url (paste Trustpilot links or company domains). |
searchType | string | keyword | Search mode only: keyword search or category sweep. |
query | string | bookshop.org | Search mode with Search type = Keyword. A company name, brand or domain. |
category | string | book_store | Search mode with Search type = Category. The Trustpilot category id from the category URL. |
urls | array | sample | URL mode only. One entry per line: a profile link, a bare company domain, a category link or a search link. |
site | string | www.trustpilot.com | Trustpilot country domain to read. Applies in both modes (a pasted link keeps its own domain). |
scrapeReviews | boolean | true | Return each business's individual reviews as their own rows. |
maxReviewsPerBusiness | integer | 20 | Per-business review budget (20 reviews per page). 0 = every review. |
reviewStars | array | [] | Only return reviews with these star ratings. Empty = all ratings. |
reviewLanguage | string | all | Two-letter language code to restrict reviews to. all reads every language. |
reviewSort | string | recency | recency or relevance. |
verifiedOnly | boolean | false | Only return reviews Trustpilot marks as verified. |
reviewsSince | string | any | any, last30days, last3months, last6months, or last12months. |
reviewKeyword | string | (empty) | Only return reviews whose text matches this keyword. |
withReplies | boolean | false | Only return reviews the business has replied to (applied by Trustpilot). |
publishedAfter | string | (empty) | Only return reviews published at or after this ISO date or datetime; under recency sort, paging stops once older reviews appear. |
fetchDetails | boolean | true | Search mode only. Reads each business's own profile page for the full star breakdown, reply behavior, status and contact block. |
minTrustScore | integer | 0 | Only return businesses whose TrustScore is at least this value (0 to 5). |
maxItems | integer | 50 | Hard cap on total rows returned, businesses and reviews together. Maximum 100000; 0 = no item limit (the internal page cap still applies). |
maxPages | integer | 0 | Upper bound on pages walked per category, search or review list. 0 = as deep as the source serves. |
resumeFromRunId | string | (none) | Continue one interrupted run. |
incrementalMode | boolean | false | Return only new and changed rows on scheduled runs. |
stateKey | string | (none) | Name or share an incremental-mode state. |
emitUnchanged | boolean | false | Also return (and bill) unchanged rows. |
emitExpired | boolean | false | Also return (and bill) expired rows. |
ignoreFieldsForChanges | array | (none) | Fields to leave out of change detection (still returned). |
mcpConnectors | array | (none) | Optional: send a summary of each row to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. |
proxyConfiguration | object | Apify Proxy | Connection settings. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"kind": "business","recordId": "business:example-shop.test","identifyingName": "example-shop.test","displayName": "Example Shop","profileUrl": "https://www.trustpilot.com/review/example-shop.test","websiteUrl": "https://example-shop.test","trustScore": 4.3,"stars": 4,"numberOfReviews": 1000,"numberOfReviewsLast12Months": 120,"ratingDistribution": { "oneStar": 100, "twoStar": 50, "threeStar": 50, "fourStar": 200, "fiveStar": 600 },"ratingDistributionPercent": { "oneStar": 10.0, "twoStar": 5.0, "threeStar": 5.0, "fourStar": 20.0, "fiveStar": 60.0 },"negativeReviewShare": 15.0,"positiveReviewShare": 80.0,"replyPercentage": 62,"averageDaysToReply": 2,"isClaimed": true,"isClosed": false,"primaryCategoryName": "Book Store","contactEmail": "support@example-shop.test","contactPhone": "(555) 010-0100","contactCity": "Sample City","countryCode": "US","reviewsScraped": 20,"verifiedShareOfScraped": 85.0,"site": "www.trustpilot.com","searchMode": "search","scrapedAt": "2026-01-01T00:00:00.000Z"}
Plan Requirement
An Apify paid plan with proxy access is required. Trustpilot refuses ordinary connections on every route, including Apify datacenter and residential proxies, and only Apify Proxy's enhanced connection tier is served. The actor tries the connection you configure first and, once that one has been refused on this run, switches once to the enhanced tier and stays there for the rest of the run, so the wasted first probe is paid once per run rather than once per page. Keep Apify Proxy enabled. Enhanced-tier fetches are slow (often 17 to 28 seconds per page), so large runs take a while: set a generous run timeout and use Max items to bound the run. If your plan does not include proxy access, the run stops within seconds with a clear message instead of quietly returning zero rows.
FAQ
How much does it cost?
Three events are billed, all shown on the Pricing tab: a result for every row returned (business profile or review), a business profile enrichment for each returned business whose own profile page was read after finding it in a search or category listing (including a pasted search or category link), and the actor start. The enrichment charge is applied one business at a time, right after that business row is saved, so it is never billed for a row that was not returned (not for suppressed, unchanged or failed rows). maxReviewsPerBusiness accepts up to 1000 (or 0 for every review), and maxPages is bounded internally at 500 pages per scope. Use Max items to cap the cost of any run.
Is it legal to scrape Trustpilot?
This actor collects only publicly available business and review data, and nothing behind a sign-in wall. You are responsible for how you use it: follow Trustpilot's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Reviews are user-generated content and may be subject to third-party rights.
Can I get only new or changed reviews on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared rows, and unchanged ones are not billed unless you also turn on Emit unchanged.
Does Max items limit everything a run returns?
It limits the normal walk of new and changed rows. If you also turn on Emit expired, a run that fully scans its tracked scope returns, and bills, one EXPIRED row for every previously tracked business or review that is no longer found, however many that is; that part is not bounded by Max items. Leave Emit expired off, or budget for it separately, if your tracked scope can shrink by a lot between runs.
Why does a business show a full star breakdown sometimes and nulls other times?
The star-distribution breakdown, reply stats, verification and contact block only come from the business's own profile page. In Search mode that requires Fetch business details (or Scrape reviews) to be on; with both off, or on a business whose profile page could not be read, those fields ship as explicit nulls rather than being silently left out of the row.
Why did my run fail instead of returning an empty dataset?
If Trustpilot refuses every request, or your plan cannot open the enhanced connection tier, the run stops with a clear message so "no matches" is never confused with "nothing could be read". Run it again in a few minutes. If only some pages could not be read, you still get what was found, with a warning in the log.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ More scrapers you might like
Pair this actor with these related scrapers from the same team:
| ๐ฑ TrustMate.io Scrape complete company review histories from TrustMate.io. Paste company profile URLs... | ๐ฑ Google Play Reviews Collect Google Play reviews and ratings for any app across country storefronts. Search by... |
| ๐ Yellow Pages AU Scrape business listings from Yellow Pages Australia by type and location. Get names... | ๐ ProductReview.com.au Scraper Scrape ProductReview.com.au products, businesses and customer reviews. Search by... |
| ๐ BBB Scraper Scrape bbb.org (Better Business Bureau, USA & Canada) business profiles: BBB rating... | ๐ GoWork FR & DE Company Reviews and Profile Scraper Extract company profiles from GoWork France and Germany, including contact details... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.