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
0
Bookmarked
1
Total users
1
Monthly active users
8 hours 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.
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 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, 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. - 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. |
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. 0 = no limit. |
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. |
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
Trustpilot refuses ordinary connections on every route. The actor tries the connection you configure first and, only once that one has been refused on this run, switches once to Apify Proxy's enhanced connection 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. If your plan cannot open that tier, the run fails with a clear message instead of quietly returning zero rows.
FAQ
How much does it cost?
You pay per row returned, business profile or review, plus a one-time business-profile enrichment charge 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 charge. The Pricing tab shows the current rates. 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:
| ๐ GoWork FR & DE Company Reviews and Profile Scraper Extract company profiles from GoWork France and Germany, including contact details... | ๐ฑ Google Play Reviews Collect Google Play reviews and ratings for any app across country storefronts. Search by... |
| ๐ฑ TrustMate.io Scrape complete company review histories from TrustMate.io. Paste company profile URLs... | ๐ท๏ธ bol.com Scraper Scrape bol.com products: title, price, list price and discount, EAN, brand, images... |
| ๐จ Rover Pet Care Scraper Scrape Rover.com pet-care providers: sitter search by city, rates per stay type, ratings... | ๐ BBB Scraper Scrape bbb.org (Better Business Bureau, USA & Canada) business profiles: BBB rating... |
๐ Browse all abotapi scrapers
๐ฌ Support & custom scrapers
- ๐ 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 abotapi@proton.me or message Telegram @abotapi.
- โญ Enjoying it? A quick review on the actor page helps other users find it.