Trustpilot All Reviews Scraper π°$0.5+ Β· No Cap Β· Incremental
/memo23/trustpilot-scraper-ppeasync$0.003 / result[From π°$0.50/1K] Export every Trustpilot review β past the ~200-review web cap. Incremental mode: pull only reviews newer than a date, so daily syncs stay cheap. 40+ fields, company replies, ratings, reviewer country. Filter by star, language, date, verified. Brand search, regional domains. Runs as an Apify actor (20β120 s); results are dataset rows.
Charged per returned row plus the flat fee.
startUrlsarrayEnter one item per row. Each value can be a Trustpilot `/review/` or `/users/` URL, a Trustpilot `/search?query=β¦` URL (the query is extracted and resolved via autosuggest, same as the Search filters field), a company URL, or a bare slug such as `bankfive`. Wrong `/review/` slugs trigger a Trustpilo
searchTermsarrayOne brand name per row, e.g. `nike`, `noom`, `marcovasco`. The scraper resolves each to its canonical business unit and (when 'Expand regional domains' is on) also sweeps every regional sibling on Trustpilot's index.
reviewInsightsbooleanAdds one `review_insights` row per company: rating breakdown & sentiment split, the recurring consumer complaint themes (delivery, refunds, support, billing, trustβ¦), top negative-review terms, and request snippets. Deterministic β instant, no AI credits or keys required. Billed per company analyzed (default false)
painPointAnalysisbooleanAdds a single `painPointAnalysis` row per company alongside the reviews: the top complaint themes (each with a severity score and how often it recurs), the missing features users keep asking for, quick wins, overall sentiment, and a short summary β the 'what should we fix / build next' teardown, str (default false)
enrichEmailsbooleanIf enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort. (default false)
qualifyByPaymentbooleanRequires "Enrich with contact emails". Scans each business's website β reusing the pages already fetched for email discovery, so no extra cost or time β for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds tak (default false)
scrapeAllReviewsbooleanControls the language scope requested from Trustpilot. **Enabled (default)**: requests every language available on the BU β maximizes coverage but mixes locales (e.g. a `.com` URL returns Italian, French, German reviews alongside English). **Disabled**: the scraper derives a single language from the (default true)
filterStarsarrayLimit reviews to specific star ratings. Leave empty to include all ratings (1β5). (default [])
samplingstringOnly matters when **Limit** is smaller than the brand's review count. **Balanced** (default) gives each star rating an equal share of the budget, so you see plenty of rare 1β and 2β reviews. **Representative** splits the budget to match the brand's actual rating mix β if a brand is 80% five-star, so (default "balanced")
balanced, proportional
filterLanguagesarrayISO 639-1 codes (e.g. `en`, `de`, `fr`, or `unknown` for reviews Trustpilot couldn't classify). Leave empty to auto-discover and sweep all languages found on each business unit. **This is the right knob to use if you want to restrict results to one language** β locale subdomains in start URLs (e.g.
filterDateRangestringServer-side rolling date window. Equivalent to Trustpilot's own 'Date posted' filter. Only these values are accepted; anything else is rejected. For an exact cutoff, use the 'Only scrape reviews newer than' field below β they compose (the more restrictive one wins). (default "all")
all, last30days, last3months, last6months, last12months
filterVerifiedOnlybooleanEquivalent to Trustpilot's own 'Verified reviews' toggle. Applied server-side, so non-verified reviews are filtered out before they reach you β no wasted requests. The canonical output's `isVerified` reflects truth (derived from `verificationLabel.type === 'verified'`; the raw response boolean is mi (default false)
filterRepliesOnlybooleanEquivalent to Trustpilot's own 'Reviews with replies' toggle. Applied server-side, so reviews without replies are filtered out before they reach you. (default false)
filterCountriesarrayISO 3166-1 alpha-2 country codes to keep, e.g. `US`, `GB`, `DE`. Matched against the reviewer's profile country (`consumer.countryCode`). Leave empty to keep all countries. Trustpilot has no server-side country filter, so this is applied client-side β non-matching reviews still cost a request and th
sortBystringHow each review stream is ordered. `auto` uses `recent` (`createdAt:desc`), which pages to the end of a business's review history. `Most relevant` is capped by Trustpilot at 200 reviews per rating bucket, so pick it only when you specifically want their relevance ranking and are happy with a 200-ite (default "auto")
auto, relevancy, recent
expandRegionalDomainsbooleanAfter resolving each input, also fetch every regional sibling on Trustpilot's index that matches the same brand (e.g. `nike` β `nike.com`, `nike.uk`, `nike.de`, `nike.dk`, β¦). Strict displayName matching keeps unrelated brands out. Shared `maxItems` budget across siblings. (default true)
strictNameMatchbooleanWhen ON, reject autosuggest hits whose business name doesn't look like your query (e.g. `FACTORHY Avocats` β `Omega Avocats` is rejected because the only shared word is the generic `avocats`). Useful when you'd rather see `BU not found` than reviews from an adjacent-but-wrong company. When OFF (defa (default false)
splitDatasetsbooleanWhen ON, reviews go to the default dataset (clean, one row per review, no embedded `company`/`stats`/`transparency`) and BU metadata goes to a per-run sibling dataset named `businessUnits-` (one row per unique BU). Each review carries a `businessUnitId` you can JOIN on. The exact dataset id is writt (default false)
flattenCompanyDatabooleanWhen ON, each review gets flat top-level company columns β `companyName`, `companyDomain`, `companyWebsite`, `companyTrustScore`, `companyStars`, `companyTotalReviews`, `companyCountryCode`, `companyUrl` β instead of (or alongside) the nested `company` object. Ideal for CSV/Excel exports where neste (default false)
emitInputStatusbooleanWhen ON (default), any input that returns no reviews (brand not found on Trustpilot, empty business unit, or everything excluded by your filters) gets one diagnostic row in a per-run dataset named `inputStatus-` β with a machine-readable `reason` and a human-readable `detail`. The exact dataset id i (default true)
lastDaysintegerScrape only reviews published in the last N days β e.g. **7** for a weekly run, **1** for daily. The window is recalculated every run, so a scheduled task always picks up exactly what's new without you editing a date. Ideal for keeping a database in sync. Leave empty to ignore. If you also set an ex
startDatestringFormat YYYY-MM-DD, e.g., 2022-02-20. Used as a hard chronological cutoff: when set, the scraper switches to `sort=createdAt:desc` and short-circuits pagination as soon as it crosses the date.
includeCompanyDetailsbooleanWhen enabled, each review item is enriched with the `company` block (display name, identifying domain, country, total review count, β¦). (default false)
includeStatsbooleanWhen enabled, each review item is enriched with the `stats` block (total review count, per-star rating distribution, β¦). (default false)
includeTransparencybooleanWhen enabled, each review item is enriched with the `transparency` block (collecting method distribution, stars breakdown by method, monthly data, etc.). (default false)
includeCompanyAdditionalFieldsbooleanOn-demand enrichment. When enabled, each review's `company` block is augmented with `subscription` β Trustpilot's own published plan flags for that company (`isPayingCustomer`, `hasSubscription`, `isClaimed`, `claimedDate`, `isAskingForReviews`, `isUsingAIResponses` and more) β plus `consumerAlert`, (default false)
maxItemsintegerPer-input cap. With 3 inputs and `maxItems=30`, you can collect up to 90 reviews total (30 per input). When 'Expand regional domains' is on, this budget is shared across the primary BU and all its regional siblings. (default 10000)
maxConcurrencyintegerMaximum number of inputs being processed in parallel (each input runs many sequential page fetches). (default 10)
minConcurrencyintegerMinimum number of inputs that will be processed at the same time. (default 1)
maxRequestRetriesintegerNumber of times the scraper will retry a failed request before giving up. (default 3)
proxyobjectLeave empty β the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.
| Field | Type | Required | Description |
|---|---|---|---|
| startUrls | array | β | Enter one item per row. Each value can be a Trustpilot `/review/` or `/users/` URL, a Trustpilot `/search?query=β¦` URL (the query is extracted and resolved via autosuggest, same as the Search filters field), a company URL, or a bare slug such as `bankfive`. Wrong `/review/` slugs trigger a Trustpilo |
| searchTerms | array | β | One brand name per row, e.g. `nike`, `noom`, `marcovasco`. The scraper resolves each to its canonical business unit and (when 'Expand regional domains' is on) also sweeps every regional sibling on Trustpilot's index. |
| reviewInsights | boolean | β | Adds one `review_insights` row per company: rating breakdown & sentiment split, the recurring consumer complaint themes (delivery, refunds, support, billing, trustβ¦), top negative-review terms, and request snippets. Deterministic β instant, no AI credits or keys required. Billed per company analyzed (default false) |
| painPointAnalysis | boolean | β | Adds a single `painPointAnalysis` row per company alongside the reviews: the top complaint themes (each with a severity score and how often it recurs), the missing features users keep asking for, quick wins, overall sentiment, and a short summary β the 'what should we fix / build next' teardown, str (default false) |
| enrichEmails | boolean | β | If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort. (default false) |
| qualifyByPayment | boolean | β | Requires "Enrich with contact emails". Scans each business's website β reusing the pages already fetched for email discovery, so no extra cost or time β for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds tak (default false) |
| scrapeAllReviews | boolean | β | Controls the language scope requested from Trustpilot. **Enabled (default)**: requests every language available on the BU β maximizes coverage but mixes locales (e.g. a `.com` URL returns Italian, French, German reviews alongside English). **Disabled**: the scraper derives a single language from the (default true) |
| filterStars | array | β | Limit reviews to specific star ratings. Leave empty to include all ratings (1β5). (default []) |
| sampling | string (balanced, proportional) | β | Only matters when **Limit** is smaller than the brand's review count. **Balanced** (default) gives each star rating an equal share of the budget, so you see plenty of rare 1β and 2β reviews. **Representative** splits the budget to match the brand's actual rating mix β if a brand is 80% five-star, so (default "balanced") |
| filterLanguages | array | β | ISO 639-1 codes (e.g. `en`, `de`, `fr`, or `unknown` for reviews Trustpilot couldn't classify). Leave empty to auto-discover and sweep all languages found on each business unit. **This is the right knob to use if you want to restrict results to one language** β locale subdomains in start URLs (e.g. |
| filterDateRange | string (all, last30days, last3months, last6months, last12months) | β | Server-side rolling date window. Equivalent to Trustpilot's own 'Date posted' filter. Only these values are accepted; anything else is rejected. For an exact cutoff, use the 'Only scrape reviews newer than' field below β they compose (the more restrictive one wins). (default "all") |
| filterVerifiedOnly | boolean | β | Equivalent to Trustpilot's own 'Verified reviews' toggle. Applied server-side, so non-verified reviews are filtered out before they reach you β no wasted requests. The canonical output's `isVerified` reflects truth (derived from `verificationLabel.type === 'verified'`; the raw response boolean is mi (default false) |
| filterRepliesOnly | boolean | β | Equivalent to Trustpilot's own 'Reviews with replies' toggle. Applied server-side, so reviews without replies are filtered out before they reach you. (default false) |
| filterCountries | array | β | ISO 3166-1 alpha-2 country codes to keep, e.g. `US`, `GB`, `DE`. Matched against the reviewer's profile country (`consumer.countryCode`). Leave empty to keep all countries. Trustpilot has no server-side country filter, so this is applied client-side β non-matching reviews still cost a request and th |
| sortBy | string (auto, relevancy, recent) | β | How each review stream is ordered. `auto` uses `recent` (`createdAt:desc`), which pages to the end of a business's review history. `Most relevant` is capped by Trustpilot at 200 reviews per rating bucket, so pick it only when you specifically want their relevance ranking and are happy with a 200-ite (default "auto") |
| expandRegionalDomains | boolean | β | After resolving each input, also fetch every regional sibling on Trustpilot's index that matches the same brand (e.g. `nike` β `nike.com`, `nike.uk`, `nike.de`, `nike.dk`, β¦). Strict displayName matching keeps unrelated brands out. Shared `maxItems` budget across siblings. (default true) |
| strictNameMatch | boolean | β | When ON, reject autosuggest hits whose business name doesn't look like your query (e.g. `FACTORHY Avocats` β `Omega Avocats` is rejected because the only shared word is the generic `avocats`). Useful when you'd rather see `BU not found` than reviews from an adjacent-but-wrong company. When OFF (defa (default false) |
| splitDatasets | boolean | β | When ON, reviews go to the default dataset (clean, one row per review, no embedded `company`/`stats`/`transparency`) and BU metadata goes to a per-run sibling dataset named `businessUnits-` (one row per unique BU). Each review carries a `businessUnitId` you can JOIN on. The exact dataset id is writt (default false) |
| flattenCompanyData | boolean | β | When ON, each review gets flat top-level company columns β `companyName`, `companyDomain`, `companyWebsite`, `companyTrustScore`, `companyStars`, `companyTotalReviews`, `companyCountryCode`, `companyUrl` β instead of (or alongside) the nested `company` object. Ideal for CSV/Excel exports where neste (default false) |
| emitInputStatus | boolean | β | When ON (default), any input that returns no reviews (brand not found on Trustpilot, empty business unit, or everything excluded by your filters) gets one diagnostic row in a per-run dataset named `inputStatus-` β with a machine-readable `reason` and a human-readable `detail`. The exact dataset id i (default true) |
| lastDays | integer | β | Scrape only reviews published in the last N days β e.g. **7** for a weekly run, **1** for daily. The window is recalculated every run, so a scheduled task always picks up exactly what's new without you editing a date. Ideal for keeping a database in sync. Leave empty to ignore. If you also set an ex |
| startDate | string | β | Format YYYY-MM-DD, e.g., 2022-02-20. Used as a hard chronological cutoff: when set, the scraper switches to `sort=createdAt:desc` and short-circuits pagination as soon as it crosses the date. |
| includeCompanyDetails | boolean | β | When enabled, each review item is enriched with the `company` block (display name, identifying domain, country, total review count, β¦). (default false) |
| includeStats | boolean | β | When enabled, each review item is enriched with the `stats` block (total review count, per-star rating distribution, β¦). (default false) |
| includeTransparency | boolean | β | When enabled, each review item is enriched with the `transparency` block (collecting method distribution, stars breakdown by method, monthly data, etc.). (default false) |
| includeCompanyAdditionalFields | boolean | β | On-demand enrichment. When enabled, each review's `company` block is augmented with `subscription` β Trustpilot's own published plan flags for that company (`isPayingCustomer`, `hasSubscription`, `isClaimed`, `claimedDate`, `isAskingForReviews`, `isUsingAIResponses` and more) β plus `consumerAlert`, (default false) |
| maxItems | integer | β | Per-input cap. With 3 inputs and `maxItems=30`, you can collect up to 90 reviews total (30 per input). When 'Expand regional domains' is on, this budget is shared across the primary BU and all its regional siblings. (default 10000) |
| maxConcurrency | integer | β | Maximum number of inputs being processed in parallel (each input runs many sequential page fetches). (default 10) |
| minConcurrency | integer | β | Minimum number of inputs that will be processed at the same time. (default 1) |
| maxRequestRetries | integer | β | Number of times the scraper will retry a failed request before giving up. (default 3) |
| proxy | object | β | Leave empty β the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies. |
Run it
Or ask your agent: it will call inspect for this schema and run it over MCP.