Trustpilot customer reviews of any company by domain or URL. One row per review: star rating, title, text, dates, reviewer country, verified, company reply. Free: TrustScore, star histogram, email, phone. Filters before billing: negative reviews, date range, language, keyword, only new reviews.
Trustpilot started answering a browser that announces itself as HeadlessChrome with a flat 403 bot block instead of the AWS WAF challenge, so no token was ever issued and every run failed ("no aws-waf-token after 90s"). The one-off browser pass now presents its own Chrome user agent without the Headless marker; the challenge solves in about 7 s again and the plain requests carry the same UA. Trustpilot now also refuses many proxy IPs outright with a 403 "identified as coming from a bot" page; the actor treats that page as a bad IP, not an expired token: it switches IP without opening another browser, a browser pass that lands on such an IP gives up at once instead of waiting 90 s, and each token refresh gets up to three fresh IPs. Also fixed: two companies rotating proxy sessions at the same moment could close one session twice and fail a company with a curl TypeError. Same rows, same filters, same price.
2026-10-16 — Keyword Planner and locale documentation
Validated search terminology against Google Ads Keyword Planner and Store shelves. Added localized usage guidance and bounded examples; retained existing English phrases. Clarified locale limitations where measured. No runtime, output fields, defaults, or pricing changed.
price change, 2026-10-12
review $0.0007 → $0.0015 per row (still below the $0.002 and start-fee rivals; the free company row is unchanged). no paying users in the last period, so Apify applied it immediately; nothing else changes — same rows, same free rows, same filters, no start fee, proxy and compute included. Every price mention in the input form, the event text and this README was updated with it.
1.0 — listing: blind-test fixes, 2026-10-12
No behaviour, output or price changed. Five Sonnet testers read the card and the input form for five real requests: 5 of 5 picked this actor and 5 of 5 wrote a valid first call. What they guessed at is now written down: the review row keys in the event text, the company row keys in includeCompanyRow (and that there is no summary-only switch: maxReviewsPerCompany 1 bills one review), that domains work with or without www . or a scheme, the full relative-date grammar of sinceDate ("1 day" included) and that it keeps no memory between runs, what a 1000-review deepPaging sample really is (the newest 200 of each star rating), and that proxy and compute are included in the event price.
1.0 — listing and input form reworded, 2026-10-11
No behaviour, output or price changed; the same inputs return the same rows.
Title tail now carries the head phrases agents type verbatim ("Customer Reviews", "TrustScore"); "Company Reviews" moved into the description. Description names one row per review and its fields, the free company row (TrustScore, star histogram, email, phone) and every filter that runs before billing.
seoTitle names the API; seoDescription (indexed by the Store search) carries the secondary phrases (company reviews, company replies, review monitoring, competitor reviews, complaints) and the German, French and Italian nouns (Bewertungen, Erfahrungen, avis, recensioni).
Pricing event text states the per-1,000 price in words, what is never charged, that there is no start fee and that the run stops at the maximum cost per run set when starting it. Price unchanged.
Input form reordered so the selling filters sit right after the required trio and the cap; deepPaging, sessions, perIp and proxy below. Every field description now opens with the protective sentence, carries a literal example, says what 0/empty means and names the user request it answers. Property names, types, defaults, enums and prefills are byte-identical.
README: new section "Trustpilot scraper for AI agents: which input answers which request?" (when to use / when not, request → input table, row fields and the status/empty contract).
2026-08-30
Reliability: a run that cannot act on its input — a URL from the wrong site, a name nothing resolves to, an empty target list, a number outside the documented range — now ends cleanly with the reason on the run card instead of as a failed run. Nothing is charged in either case; a blocked or throttled source still fails loudly.
Store listing: moved into the categories buyers actually browse (the old Business category has no Store page).
1.0 — 2026-08-29
First release.
Every Trustpilot review of a company by domain or review-page URL: 1-5 rating, title, text, language, review and experience dates, reviewer name, country and lifetime review count, verification level and source, likes, and the company's reply with its date.
Deep paging past Trustpilot's anonymous wall: one filtered view serves at most 200 reviews (page 11 redirects to the login screen), so a bigger request is split across the five star bands — each with its own allowance — merged and de-duplicated, for up to 1000 reviews per company per run. The status row's capped flag says when a walk stopped at the wall rather than at the end of the reviews.
A free company row: TrustScore, stars, total reviews, reviews in the last 12 months, the 1-5 star histogram, the per-language breakdown, categories, website, country, the public contact block (email, phone, address) and the claimed/closed/collecting/verification flags.
Trustpilot's own filters ride in the request — stars (minRating/maxRating), date range, language, verified only, keyword — so rows they drop are never fetched and never billed; requireText and sinceDate run before billing too.
The AWS WAF challenge is solved once in a headless browser (5-20 seconds), and every page is then fetched without a browser on the token it issued, refreshed every four minutes because Trustpilot stops honouring it at about five. Pages come from the review page's own JSON data route, less than half the bytes of the HTML.