Trustpilot Scraper at a glance
Trustpilot Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes row type, recordid, change type (incremental mode), identifyingname and business, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.20 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 29 options
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.
What Trustpilot Scraper can do
- 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. ratingDistribution and ratingDistributionPercent are 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.
Choose what to collect
These inputs let you configure Trustpilot Scraper - Reviews, Star Breakdown & Company Stats. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Search finds businesses by keyword or sweeps a whole Trustpilot category. URL mode reads the exact Trustpilot links (or bare company domains) you paste. |
searchTypestring | Search mode only. Keyword searches Trustpilot's business index; Category sweeps every business listed under one Trustpilot category id. |
querystring | Search mode with Search type = Keyword. A company name, brand or domain, for example "bookshop.org" or "nike". |
categorystring | Search mode with Search type = Category. The Trustpilot category id from the category page URL, for example "book_store" from https://www.trustpilot.com/categories/book_store. Also accepts a full category URL. |
urlsarray | URL mode only. One entry per line. Accepts a Trustpilot profile link (https://www.trustpilot.com/review/bookshop.org), optionally with page, stars, languages, sort, verified or date filters, a bare company domain (bookshop.org), a category link (https://www.trustpilot.com/categories/book_store), the category index (https://www.trustpilot.com/categories), a search link (https://www.trustpilot.com/search?query=nike), or a link on a country domain (https://uk.trustpilot.com/review/www.etsy.com). Category, search and index links are walked forward; profile links and domains are read as single businesses. Multi-value supported. |
sitestring | Which Trustpilot country domain to read. Applies in BOTH modes (a pasted link keeps its own domain). Examples: www.trustpilot.com (global), uk.trustpilot.com, de.trustpilot.com, fr.trustpilot.com, nl.trustpilot.com, dk.trustpilot.com, it.trustpilot.com, es.trustpilot.com. Each domain fronts the same business data but ranks and localises its category listings for that market. |
scrapeReviewsboolean | Return each business's individual reviews as their own rows (reviewer display name, rating, title, text, verification badge, dates, and the company's reply). Turn this off to return business profiles only. 💲 In Search mode, turning this ON (or Fetch business details) reads each discovered business's own profile page and charges the profile-enrichment event once per business returned. |
Show 22 more inputs
| Input | What it controls |
|---|---|
maxReviewsPerBusinessinteger | How many reviews to return for each business (20 per page). This is a per-business budget, not the run cap: Max items below is what bounds the whole run. Use 0 to take every review Trustpilot serves for the active filters. |
reviewStarsarray | Only return reviews with these star ratings. Leave empty for all ratings. Applied by Trustpilot itself, so the star breakdown on the business row still reports the FULL distribution while the review rows are narrowed. |
reviewLanguagestring | Two-letter language code to restrict reviews to, for example "en", "de", "it". The default "all" reads every language: Trustpilot itself defaults to the visitor's language and silently hides the rest, which is why a business with 45,986 reviews shows only 30,234 to a default English visitor. |
reviewSortstring | Order Trustpilot returns reviews in. |
verifiedOnlyboolean | Only return reviews Trustpilot marks as verified (an invitation or a confirmed purchase behind them). Applied by Trustpilot itself. |
reviewsSincestring | Only return reviews published within this window. Applied by Trustpilot itself. |
reviewKeywordstring | Only return reviews whose text matches this keyword, for example "refund" or "delivery". Leave empty for all reviews. Applied by Trustpilot itself. |
withRepliesboolean | Only return reviews the business has replied to. Applied by Trustpilot itself. |
publishedAfterstring | Only return reviews published at or after this ISO date or datetime, for example 2026-01-15 or 2026-01-15T08:00:00Z. Under the default recency sort, reading stops as soon as older reviews appear. Leave empty for no cut-off. |
fetchDetailsboolean | Search mode only (a pasted profile link or domain always returns full details). Reads each discovered business's own profile page to add the exact star-distribution breakdown, reply behaviour, claim and verification status, full contact block and category breadcrumb. Turn it off to return only what the listing card carries. 💲 Charges the profile-enrichment event once per business returned, as described in the section caption. |
minTrustScoreinteger | Only return businesses whose TrustScore is at least this value (0 to 5). Leave at 0 for all businesses. Applied after each business is read, in both modes. |
maxItemsinteger | Hard cap on the total number of rows returned across the whole run, counting business profiles and review rows together. Values above 100000 are rejected; 0 means no item limit (the run then stops when the results run out or at the internal page cap). |
maxPagesinteger | Upper bound on how many pages each category, search or business review list is walked through. Defaults wide open (0), so Max items is the only cap that stops a run early. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large pull without returning, or charging for, rows already collected there. Use this after an interrupted run. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns every business and review as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED rows. A row is UPDATED when any returned field changed (for example trust score, review count, a review's text, rating or reply); it is compared field by field. Excluded from comparison, though still returned: scrape time, the sample-based review shares and counts for this run, review likes and the reviewer's lifetime review count. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each search and review-filter setup; use State key to name or deliberately share a monitoring campaign. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search and review-filter settings. |
emitUnchangedboolean | Off by default. Turn on to also return rows that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have. |
emitExpiredboolean | Off by default. Turn on to also return rows that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked scope: not when Max items capped it, not when a page could not be read, and not when Resume was used. This returns, and bills, extra synthetic rows. |
ignoreFieldsForChangesarray | Optional. Field names to leave out of UPDATED detection, on top of the built-in exclusions (scrape time, sample-based review shares, review likes and the reviewer's lifetime review count never trigger UPDATED). Use a plain name (for example trustScore) or a dotted path (for example location.city) for a field that is noisy in your setup. Ignored fields are still returned in the output. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output. |
notionParentPageUrlstring | URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
kindRow typerecordIdrecordIdchangeTypeChange type (incremental mode) (text)identifyingNameidentifyingNamedisplayNameBusinessprofileUrlTrustpilot profile (link)websiteUrlWebsite (link)trustScoreTrustScorestarsStarsnumberOfReviewsReviews (total)numberOfReviewsLast12MonthsnumberOfReviewsLast12MonthsreviewsMatchingFiltersReviews matching the active filtersShow 43 more fields
ratingDistributionStar breakdown (counts) (object)ratingDistributionPercentStar breakdown (%) (object)negativeReviewShare1-2 star share (%)positiveReviewShare4-5 star share (%)verifiedShareOfScrapedVerified share of reviews read (%)repliedShareOfScrapedReplied share of reviews read (%)reviewsScrapedreviewsScrapedreplyPercentageCompany reply rate (%)averageDaysToReplyaverageDaysToReplyisClaimedClaimed (boolean)isClosedisClosedprimaryCategoryNameprimaryCategoryNamecontactEmailContact emailcontactPhoneContact phonecontactCitycontactCitycountryCodecountryCodereviewIdreviewIdreviewUrlReview (link)businessIdentifyingNamebusinessIdentifyingNameratingReview ratingtitleReview titletextReview textlanguagelanguageisVerifiedVerified review (boolean)verificationLevelverificationLevellikeslikesexperiencedDateExperienced (date)publishedDatePublished (date)replyTextCompany replyreplyPublishedDatereplyPublishedDateconsumerDisplayNameReviewerconsumerCountryCodeconsumerCountryCodeconsumerNumberOfReviewsconsumerNumberOfReviewsauthorNameauthorNamecountrycountrysitesitesearchModesearchModescrapedAtScraped at (date)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)businessDisplayNamebusinessDisplayNamebusinessTrustScorebusinessTrustScoreExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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,
"twoStar": 5,
"threeStar": 5,
"fourStar": 20,
"fiveStar": 60
},
"negativeReviewShare": 15,
"positiveReviewShare": 80,
"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,
"site": "www.trustpilot.com",
"searchMode": "search",
"scrapedAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Trustpilot Scraper return?
The documented output for Trustpilot Scraper includes row type, recordid, change type (incremental mode), identifyingname, business, trustpilot profile, website and trustscore. Availability of each field depends on the source page and the selected mode.
How much does Trustpilot Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
