Read Trustpilot reviews and TrustScore with one API
The Trustpilot API returns company reviews, TrustScore and profile data as clean JSON.
12 active endpoints. Every call is 1 credit.
- POST/trustpilot/v1/company/reviews
- POST/trustpilot/v1/company/details
- POST/trustpilot/v1/category/browse
- POST/trustpilot/v1/category/companies
- POST/trustpilot/v1/category/recently-reviewed
- POST/trustpilot/v1/category/newest
- POST/trustpilot/v1/category/details
- +5 more
What Trustpilot endpoints does ReefAPI ship?
12 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Trustpilot API
3 of 12 endpoints, ready to run
The profile without the reviews: TrustScore, the star rating, how many reviews exist and how they split across one to five stars. This is the call you plan a full pull with.
{ "ok": true, "meta": { "api": "trustpilot", "endpoint": "company/details", "mode": "live", "latency_ms": 3314.4, "record_count": 1, "cache_hit": false }, "data": { "company": { "domain": "gossby.com", "business_unit_id": "5dc962f10fdaf000012b2f08", "name": "Gossby", "trust_score": 4.2, "stars": 4, "number_of_reviews": 37665, "number_of_reviews_last_12_months": 1321, "rating_distribution": { "one": 3924, "two": 1110, "three": 1516, "four": 2829, "five": 28286, "total": 37665 }, "categories": [ "Gift Shop", "Clothing Store", "Hobby Store" ], "is_claimed": true, "is_closed": false, "is_temporarily_closed": false, "is_collecting_reviews": false, "claimed_date": "2019-11-15T04:26:53.000Z", "reply_behavior": { "reply_percentage": 100, "average_days_to_reply": 0.24, "negative_reviews_with_replies": 222, "total_negative_reviews": 222, "last_reply_to_negative": "2026-08-26 03:03:09 UTC" }, "verification": { "verified_payment_method": false, "verified_user_identity": true, "verified_by_google": true }, "locations_count": 0, "website_url": "https://gossby.com", "website_title": "gossby.com", "profile_image_url": "//s3-eu-west-1.amazonaws.com/tpd/logos/5dc962f10fdaf000012b2f08/0x0.png", "contact_email": "[email protected]", "contact_phone": "(585) 366 8846", "contact_address": "6901 Riverport Dr", "contact_city": "Louisville", "contact_country": "US", "contact_zip": "40258", "rankings": [], "breadcrumb": [ "Shopping & Fashion", "Clothing & Underwear", "Clothing Store" ], "topics": [ { "topic": "Order", "summary": null, "sentiment": null }, { "topic": "Delivery service", "summary": null, "sentiment": null }, { "topic": "Product", "summary": null, "sentiment": null } ], "description": null, "ai_summary": null } } }
How the Trustpilot API works
Trustpilot is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
One call to plan the pull, five to collect it
A single reviews call stops at 200 no matter what you ask for. Star buckets do not overlap, so the way to a thousand reviews is five narrow calls instead of one wide one — and the profile call tells you in advance how many sit in each bucket.
{"company": "gossby.com"}rating_distribution gives you {one, two, three, four, five, total}. Any bucket under 200 will come back whole.
{"company": "gossby.com", "rating": "1", "maxReviews": 200}One bucket per call. Repeat for 2, 3, 4 and 5 — measured, the buckets share no review ids.
{"company": "gossby.com", "maxReviews": 200}The unfiltered call last. It is the newest 200 across all stars, so it only adds whatever posted since.
About a thousand unique reviews for a large company, and everything for a small one. Reviews are metered per 50 rows returned, so those six calls cost 24 credits, not 6.
curl -X POST https://api.reefapi.com/trustpilot/v1/company/details \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"company":"lendingclub.com"}'{
"ok": true,
"data": { … },
"meta": {
"api": "trustpilot",
"endpoint": "company/details",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}TrustScore, stars and the star distribution are three different numbers
A Trustpilot page shows one rating, but the payload carries three views of it and they do not agree by design. trust_score is Trustpilot's own weighted score, stars is that score rounded for display, and rating_distribution is the raw count of reviews per star, whose arithmetic mean is a fourth number again. Every figure below came from a measured company/details call.
| Field | What it is | Measured |
|---|---|---|
| trust_score | A float from 1 to 5 with one decimal. Trustpilot's own weighted score, which favors recent reviews. | gossby.com 4.2, amazon.com 1.6, ryanair.com 1.3 |
| stars | trust_score rounded to the nearest half. A display value, never more precise than the score. | 4.2 became 4.0, 1.6 became 1.5, and 1.3 also became 1.5 |
| mean of rating_distribution | Not returned, and not equal to trust_score. Compute it only if you want the unweighted average. | gossby averages 4.339 against a TrustScore of 4.2; amazon.com averages 2.020 against 1.6 |
| rating_distribution | Keys are the English words one, two, three, four and five, plus total. Not "1" through "5". | {one: 3924, two: 1110, three: 1516, four: 2829, five: 28283, total: 37662} |
| number_of_reviews vs number_of_reviews_last_12_months | A lifetime count and a trailing-year count, both on the company object. | 37662 lifetime against 1321 in the last twelve months |
| business_unit_id | 24 hex characters. review_id and reviewer_id use the same shape. | 5dc962f10fdaf000012b2f08 for gossby.com; a review came back as 6a8df0a36dc0d1236b16f7b0 |
| is_verified vs verification_level | A boolean and a string, carrying different information. | false with "not-verified", false with "invited", true with "verified" |
| source | How the review reached Trustpilot. | "Organic" and "BasicLink" both appeared on one company |
| published_date vs experience_date | ISO 8601 UTC. experience_date is date-only, so its time is always midnight. | published 2026-08-25T21:44:35.000Z about an experience dated 2026-08-24T00:00:00.000Z |
| page and maxReviews | The logged-out view holds 20 reviews per page across 10 pages, so 200 per view is the ceiling. | A capped call returned status "PARTIAL" with a notes field saying so |
The company actions and the category actions name their fields differently. company/details returns business_unit_id with categories as plain strings; category/companies returns businessUnitId with categories as objects of {categoryId, displayName, isPrimary, isPredicted}. Do not point one parser at both.
Can you get all of them, and what does a thousand cost
Measured against the live site on 2026-08-27 on gossby.com (37,665 reviews) and exhalecoffee.com. Two of these rows go against us. They are here because a buyer who discovers the 200 ceiling after building on us is a refund, and a buyer who reads it here is a customer.
Reviews are billed per 50 rows returned, not per call: a 200-review pull is 4 credits and the five-bucket strategy above is 20. Failed calls are free, so a company that turns out to have 60 reviews costs 2 credits, not 20.
Against us: 200 rows, whatever you ask for. maxReviews 200, 1,000 and 5,000 all returned exactly 200 — the schema's 20,000 maximum is the parameter's range, not the public view's depth. page moves the window rather than extending it (page 3 returned 160) and walls at page 10.
One star rating per call. Measured on gossby: the 1-star call and the 3-star call each returned their own 200 and shared zero review ids; the unfiltered call overlapped each only partly. Five buckets is about a thousand unique reviews on a company with 37,665.
Every result carries total_reviews, completeness_pct and status. A 3-star pull on exhalecoffee.com came back 87 of 87, status COMPLETE; the same call on gossby came back 200 with status PARTIAL. You never have to infer it.
On 200 rows: review id, star rating, title, body, language, published date, experience date and verified flag on every single one; the company's reply on 98%. Nothing in this set came back as an empty string.
What people build with Trustpilot
The jobs this data is most often used for.
endpoints
credit per call
Support and reputation teams call company/reviews to monitor new reviews and TrustScore changes for their own domain.
Market researchers use category/companies to benchmark every competitor's rating in a category.
Review-aggregation platforms pull company/details to show a live TrustScore without maintaining a scraper.
What Trustpilot data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/trustpilot/v1/company/details \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"company":"lendingclub.com"}'import requests
r = requests.post(
"https://api.reefapi.com/trustpilot/v1/company/details",
headers={"x-api-key": REEF_KEY},
json={
"company": "lendingclub.com"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Trustpilot.
Get a free key →Why does trust_score not match the average of rating_distribution?▾
Because TrustScore is a weighted score rather than an arithmetic mean. It gives more weight to recent reviews and to a company's review volume, so it lags the raw average when a company's older reviews were better. Measured: gossby.com's distribution averages 4.339 but its TrustScore is 4.2, and amazon.com's distribution averages 2.020 against a TrustScore of 1.6. If you want the unweighted average, compute it from rating_distribution yourself, since both numbers arrive in the same response.
What is the difference between trust_score and stars?▾
stars is trust_score rounded to the nearest half, and that is all it is. Measured across three companies: 4.2 became 4.0, 1.6 became 1.5, and 1.3 also became 1.5. So stars carries strictly less information, and two companies half a point apart can end up sharing the same star value. Sort and threshold on trust_score, and use stars only when you are rendering a star graphic.
Why does rating_distribution use words as keys?▾
Because that is Trustpilot's own shape, and we pass it through rather than renaming keys you may later want to match against their site. The object is {one, two, three, four, five, total}, so distribution["5"] is undefined and distribution.five is 28283. total is included, and it equalled number_of_reviews on every company measured (37662 for gossby.com), which makes it a cheap integrity check on your own ingestion.
is_verified is false but verification_level says "invited". What does that mean?▾
They answer different questions. verification_level describes where the review came from, and the measured values are "verified", "invited" and "not-verified", while is_verified is true only for the first of those. So an invited review is a real review the company solicited, not a verified purchase. The separate source field names the mechanism: "Organic" for someone who found the page themselves, "BasicLink" for an invitation link. Filtering with verified=true does work, returning only rows where is_verified is true and verification_level is "verified".
I asked for reviews and got fewer than the company has. Why?▾
The logged-out Trustpilot view serves 20 reviews per page across at most 10 pages, so 200 per view is the ceiling and a larger maxReviews will not break it. The response says so plainly: a measured call returned scraped_count 5 against total_reviews 37662, status "PARTIAL", completeness_pct 0.0 and a notes field reading "Limited by maxReviews=5; 37662 reviews exist. Raise maxReviews (up to 200) for more." Read status and notes instead of assuming the array you received is everything.
What is the difference between published_date and experience_date?▾
published_date is when the review was posted and carries a real time; experience_date is when the customer says the purchase or interaction happened and is date-only, so its time component is always 00:00:00. A measured review was published 2026-08-25T21:44:35.000Z about an experience dated 2026-08-24T00:00:00.000Z. Use published_date for recency and monitoring, and experience_date if you are correlating reviews against your own order dates. updated_date stays null unless the reviewer edited it.
Several profile fields came back null or empty. Which ones should I not count on?▾
On the three companies measured, rankings[] was empty on all of them, amazon.com and ryanair.com included, and description, ai_summary and every topics[].summary and topics[].sentiment came back null. topics[] itself was populated with 15 topic labels such as "Order" and "Delivery service", just without their summaries. Treat those fields as opportunistic: render them when they exist, and do not build a page section that breaks when they are null.
What does reply_behavior actually tell me?▾
How responsive the business is, with the negative-review case broken out separately, which is the number worth watching. A measured company returned reply_percentage 99.5495, average_days_to_reply 0.24, and negative_reviews_with_replies 221 out of total_negative_reviews 222, plus last_reply_to_negative as a "YYYY-MM-DD HH:MM:SS UTC" string. reply_percentage is an unrounded float, so round it at display time. It sits alongside verification{verified_payment_method, verified_user_identity, verified_by_google}, which are three independent booleans rather than one trust flag.
What is the Trustpilot API?▾
Trustpilot API is a ReefAPI endpoint group for company reviews, ratings and profiles. It returns live JSON through POST requests under /trustpilot/v1.
Is the Trustpilot API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Trustpilot calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Trustpilot login or account?▾
No login to Trustpilot is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Trustpilot data?▾
The page example is captured from a live company/reviews call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Trustpilot API use?▾
Trustpilot actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Trustpilot from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call trustpilot actions with the same key, credit pool and JSON envelope used by normal REST requests.
14 Reputation & Reviews APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Trustpilot, you are one call away from the rest of the category — no second contract, no second integration.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-27.