Trustpilot Scraper - Reviews, Star Breakdown & Company Stats avatar

Trustpilot Scraper - Reviews, Star Breakdown & Company Stats

Pricing

from $1.20 / 1,000 results

Go to Apify Store
Trustpilot Scraper - Reviews, Star Breakdown & Company Stats

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

Abot API

Maintained by Community

Actor 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. 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.
  • 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.

FieldExample
kind"business" (also "review")
recordId"business:example-shop.test"
identifyingName / displayName"example-shop.test" / "Example Shop"
profileUrl / websiteUrl / logoUrlTrustpilot profile link, company site, logo image
trustScore / stars4.3 / 4 (headline score, 0 to 5, and the rounded star rating)
numberOfReviews / numberOfReviewsLast12Months1000 / 120 (volume, all time and recent)
ratingDistributionexact per-star counts: {oneStar, twoStar, threeStar, fourStar, fiveStar}
ratingDistributionPercentthe same split as percentages
negativeReviewShare / positiveReviewShare15.0 / 80.0 (1-2 star and 4-5 star share of all reviews)
replyPercentage / averageDaysToReply62 / 2 (how often, and how fast, the company answers)
isClaimed / isClosed / isCollectingReviewsprofile status
verifiedByGoogle / verifiedPaymentMethod / verifiedUserIdentitytrust and verification signals
contactEmail / contactPhone / contactAddressthe public contact block
contactCity / contactZipCode / countryCodelocation detail
primaryCategoryName / categoriesclassification
breadcrumbTopLevel / breadcrumbMidLevel / breadcrumbBottomLevelthe category path
reviewLanguagesreview counts per language
reviewsMatchingFiltersreview count under the active review filters
reviewsScraped / verifiedShareOfScraped / repliedShareOfScrapedstats over the reviews this run actually read (a sample, labelled as one)
changeType"NEW", "UPDATED", "UNCHANGED", "REAPPEARED" or "EXPIRED" (incremental mode only)
changedFields / firstSeenAt / lastSeenAtwhat changed, and when first and last seen (incremental mode only)
site / searchMode / scrapedAtwhich 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

  1. Pick a mode: search (keyword or category) or url (paste Trustpilot links or bare company domains).
  2. In search mode, set Search type to keyword (fill Search query) or category (fill Category id); in url mode, fill Trustpilot links or company domains, one per line.
  3. 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.
  4. 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 ApifyClient
client = 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 without resumeFromRunId (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 everything NEW; later runs return only NEW, UPDATED and REAPPEARED, each with changedFields, firstSeenAt and lastSeenAt. emitUnchanged and emitExpired add UNCHANGED / EXPIRED rows too (and bill them), both off by default. EXPIRED is only produced after a run that fully scanned the tracked scope: never when maxItems capped 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; stateKey lets you name a campaign or deliberately share one.
  • Tip: maxItems does not cap EXPIRED rows. Once a run is eligible to detect them, every previously tracked business or review that is no longer found is returned, and billed, as EXPIRED, however many that is; only the normal new-and-changed walk stops at maxItems. If your tracked scope can shrink by a lot between runs (a category losing many businesses, or a search narrowing), budget for EXPIRED separately from maxItems, or leave emitExpired off and check for drops another way.
  • Tip: a review cut off by the per-business limit can be marked EXPIRED. maxReviewsPerBusiness and maxPages do not count as a capped scan. With emitExpired on, 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 as EXPIRED even though it is still on Trustpilot. For review monitoring with emitExpired, set maxReviewsPerBusiness to 0 and maxPages to 0, or treat EXPIRED reviews as "no longer in the window", not "deleted".
  • Tip: overlapping links share one pass per business. In url mode maxItems is 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) than maxItems allows. 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

ParameterTypeDefaultDescription
modestringsearchsearch (keyword or category) or url (paste Trustpilot links or company domains).
searchTypestringkeywordSearch mode only: keyword search or category sweep.
querystringbookshop.orgSearch mode with Search type = Keyword. A company name, brand or domain.
categorystringbook_storeSearch mode with Search type = Category. The Trustpilot category id from the category URL.
urlsarraysampleURL mode only. One entry per line: a profile link, a bare company domain, a category link or a search link.
sitestringwww.trustpilot.comTrustpilot country domain to read. Applies in both modes (a pasted link keeps its own domain).
scrapeReviewsbooleantrueReturn each business's individual reviews as their own rows.
maxReviewsPerBusinessinteger20Per-business review budget (20 reviews per page). 0 = every review.
reviewStarsarray[]Only return reviews with these star ratings. Empty = all ratings.
reviewLanguagestringallTwo-letter language code to restrict reviews to. all reads every language.
reviewSortstringrecencyrecency or relevance.
verifiedOnlybooleanfalseOnly return reviews Trustpilot marks as verified.
reviewsSincestringanyany, last30days, last3months, last6months, or last12months.
reviewKeywordstring(empty)Only return reviews whose text matches this keyword.
fetchDetailsbooleantrueSearch mode only. Reads each business's own profile page for the full star breakdown, reply behavior, status and contact block.
minTrustScoreinteger0Only return businesses whose TrustScore is at least this value (0 to 5).
maxItemsinteger50Hard cap on total rows returned, businesses and reviews together. 0 = no limit.
maxPagesinteger0Upper bound on pages walked per category, search or review list. 0 = as deep as the source serves.
resumeFromRunIdstring(none)Continue one interrupted run.
incrementalModebooleanfalseReturn only new and changed rows on scheduled runs.
stateKeystring(none)Name or share an incremental-mode state.
emitUnchangedbooleanfalseAlso return (and bill) unchanged rows.
emitExpiredbooleanfalseAlso return (and bill) expired rows.
mcpConnectorsarray(none)Optional: send a summary of each row to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.
proxyConfigurationobjectApify ProxyConnection 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.

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.