Trustpilot Reviews API: Any Company's Reviews as JSON
To get a company's Trustpilot reviews as JSON, call GET /v1/trustpilot/company-reviews with the company's domain in company_domain. The response opens with the business profile (trust score, review counts, categories), then lists reviews with a star rating, title, text, dates and language for each. Each successful call costs 1 credit and a failed call costs nothing. The endpoint is addressed by a company's domain, so one request shape works for any company you look up.
Can you get any company's reviews from Trustpilot's official API?
Trustpilot's developer site describes its Trustpilot for Business API as a way to send invitations, showcase reviews and reply to feedback (Trustpilot Developers, 2026). Access to Trustpilot's global database of business profiles and consumer reviews is listed there as a separate offering, Data Solutions. That page doesn't spell out account requirements for either, so check Trustpilot's terms for the access you'd need.
If you're managing your own reviews, the Business API is described for that job. This guide covers a different shape: one GET addressed by a company's domain, which suits reading reviews for competitors, suppliers, merchants or a list of domains.
How do you make your first call?
You need an API key and one request. Get a free API key, which gives you 1,000 free credits every month after you verify an email address, with no credit card. Keys start with sk_live_ and go in the X-API-Key header, as described in the authentication docs.
Then search for the company to confirm its domain:
curl "https://api.perceptlayer.com/v1/trustpilot/company-search?query=amazon" \
-H "X-API-Key: $API_KEY"
Pass the domain you find to the reviews endpoint:
curl "https://api.perceptlayer.com/v1/trustpilot/company-reviews?company_domain=amazon.com&languages=all" \
-H "X-API-Key: $API_KEY"
You can also run either call in the playground on the Trustpilot API page before writing any code. The quick start covers the same steps for other APIs.
Which endpoints does the Trustpilot API have?
The Trustpilot API has six endpoints, all GET, all 1 credit. Three of them do most of the work for a review workflow: search to resolve a name to a domain, details for the profile, and reviews for the review text itself. The other three list businesses by category, categories and countries.
| Path | Returns | Required parameters | Credits |
|---|---|---|---|
/v1/trustpilot/company-search |
Company Search | query |
1 |
/v1/trustpilot/company-details |
Company Details | company_domain |
1 |
/v1/trustpilot/company-reviews |
Company Reviews | company_domain |
1 |
/v1/trustpilot/businesses |
Businesses | category |
1 |
/v1/trustpilot/categories |
Categories | none | 1 |
/v1/trustpilot/countries |
Countries | none | 1 |
The businesses endpoint lists companies in a category and takes optional trustscore, claimed, country and sort filters. categories and countries take no parameters and return the category and country lists.
What parameters does the company reviews endpoint take?
company-reviews has one required parameter, company_domain (up to 255 characters), and eleven optional ones that filter, sort and page the results. The catalogue documents the types and allowed values below and nothing more, so test a filter in the playground on the Company Reviews page before relying on it.
| Parameter | Type | Notes |
|---|---|---|
company_domain |
string, required | Up to 255 characters |
page |
integer | Page number |
per_page |
integer | Reviews per page |
verified |
boolean | Optional |
with_replies |
boolean | Optional |
query |
string | Up to 200 characters |
rating |
string | Optional |
sort |
string | relevance or recency |
locale |
string | One of 23 values, such as en-US, de-DE, fr-FR, pt-BR, ja-JP |
languages |
string | Review languages; the recorded call below uses all |
fields |
string | Up to 500 characters |
date_posted |
string | any, last_12_months, last_6_months, last_3_months or last_30_days |
A call that sets verified, sort and date_posted looks like this:
curl "https://api.perceptlayer.com/v1/trustpilot/company-reviews?company_domain=amazon.com&verified=true&sort=recency&date_posted=last_30_days" \
-H "X-API-Key: $API_KEY"
What does the response look like?
We recorded a call for Amazon with languages=all. The excerpt below is the start of that response, trimmed with …. It opens with businessUnit, the profile, and the figures are a snapshot, so the counts will differ when you run it.
{
"pageUrl": "https://www.trustpilot.com/review/www.amazon.com?languages=all",
"businessUnit": {
"id": "46ad346800006400050092d0",
"displayName": "Amazon",
"identifyingName": "www.amazon.com",
"numberOfReviews": 49830,
"numberOfReviewsLast12Months": 9156,
"trustScore": 1.5,
"websiteUrl": "https://www.amazon.com",
"stars": 1.5,
"categories": [
{
"id": "shoe_store",
"name": "Shoe Store",
"isPrimary": false
},
…
],
"isClaimed": true,
"isClosed": false,
"countryCode": "GB",
"activity": {
"claimedDate": "2015-02-18T19:08:43.000Z",
"replyBehavior": {
"averageDaysToReply": 0,
"negativeReviewsWithRepliesCount": 0,
"replyPercentage": 0,
"totalNegativeReviewsCount": 7932
},
…
}
},
"reviews": [
{
"text": "Disgusting company run by disgusting and greedy people …",
"rating": 1,
"labels": {
"verification": {
"isVerified": false,
"verificationLevel": "not-verified"
}
},
"title": "Disgusting company run by disgusting…",
"likes": 0,
"source": "Organic",
"dates": {
"experiencedDate": "2026-10-22T00:00:00.000Z",
"publishedDate": "2026-10-23T01:55:36.000Z"
},
"language": "en",
…
},
…
],
"relevantReviews": [ … ],
…
}
The review above is one entry from the recording, with fields trimmed and the consumer block left out. Field names stay as the source uses them, so the response is easy to map into a table. numberOfReviews and numberOfReviewsLast12Months give volume, trustScore and stars give the rating, and activity.replyBehavior holds reply figures for negative reviews: averageDaysToReply: 0, negativeReviewsWithRepliesCount: 0, replyPercentage: 0 and totalNegativeReviewsCount: 7932. Treat them as a snapshot of what the API returned, not as a statement about how Amazon behaves.
Each review carries a rating, a title, text, a likes count, a source, a language code, and a dates object with experiencedDate and publishedDate. labels.verification.isVerified flags verification. In the recording, review text and titles that run long end in ….
Why are there reviews and relevantReviews?
The recorded response has two separate arrays with the same entry shape. Both hold individual reviews with the fields above. In the recording, reviews holds two entries, both published on 2026-10-23, while relevantReviews holds entries published on 2026-10-22 and 2026-10-19, one of them with likes: 2. The recording doesn't show how either list is chosen, so read both and de-duplicate on each entry's id if you merge them.
The filters block comes after the lists. filters.pagination shows currentPage: 1, totalPages: 2340, totalResults: 46782 and perPage: 20, and filters.reviewStatistics.ratings gives star counts: one: 33636, two: 3004, three: 1869, four: 2423 and five: 8898. Note that ratings.total is 49830 while totalNumberOfReviews is 46782 in the same recording, so pick one figure and say which you used. Trustpilot explains how it calculates TrustScore in its Trust Centre (2026), so read that before you compare trustScore across companies with very different review counts.
How do you read these fields in Python?
Call company-search, pick the domain, then call company-reviews and read the profile and the review entries. We have no recorded company-search response, so its fields aren't shown here and the script doesn't parse them. It prints the start of the result so you can find the domain yourself, then sets domain by hand. The fields it reads afterwards are the ones in the Amazon recording.
import json
import os
import requests
BASE = "https://api.perceptlayer.com/v1/trustpilot"
HEADERS = {"X-API-Key": os.environ["API_KEY"]}
def get(path, **params):
r = requests.get(f"{BASE}/{path}", headers=HEADERS, params=params, timeout=30)
r.raise_for_status()
print("credits remaining:", r.headers.get("X-Credits-Remaining"))
return r.json()
search = get("company-search", query="amazon")
print(json.dumps(search)[:500]) # inspect this to find the company's domain
domain = "amazon.com" # set by hand from the search output
data = get("company-reviews", company_domain=domain, languages="all")
unit = data["businessUnit"]
reply = unit["activity"]["replyBehavior"]
print(unit["trustScore"], unit["numberOfReviews"])
print(reply["totalNegativeReviewsCount"], reply["replyPercentage"])
for review in data["reviews"]:
print(
review["rating"],
review["dates"]["publishedDate"],
review["text"][:80],
)
Against the recorded call, the two profile lines read 1.5 49830 and 7932 0, and the loop prints one line per entry in reviews, such as 1 2026-10-23T01:55:36.000Z Disgusting company run by disgusting and greedy people. Two calls cost 2 credits. Loop over data["relevantReviews"] the same way if you want that list too. Skip review["consumer"] unless you have a reason to read it.
How do you get just the company profile?
Call company-details when you only need the profile, such as a trust score for a list of suppliers. It takes company_domain (required) and an optional locale, and costs 1 credit.
curl "https://api.perceptlayer.com/v1/trustpilot/company-details?company_domain=amazon.com" \
-H "X-API-Key: $API_KEY"
It costs the same 1 credit as a company-reviews call. We have no recorded response for this endpoint, so the Company Details page is the place to see its fields.
How do you page through every review?
page and per_page are the paging parameters, both integers. The recording's filters.pagination block reports currentPage, totalPages and perPage, which is the place to check how far you have left to go. Each page is a separate call at 1 credit, so a limit on pages is also a limit on spend.
Two habits are a general paging pattern. Stop when a page comes back with no reviews rather than at a fixed count, and log the X-Credits-Remaining header the API returns on every success. The pagination guide has a safe loop in Python.
What does it cost?
Every Trustpilot endpoint costs 1 credit per successful call, and failed calls cost nothing and return X-Credits-Used: 0. The free tier gives 1,000 credits a month. Purchased credits last 12 months, with no subscription and no seats; the credits docs and pricing page have the detail.
| Pack | Credits | Requests a second included |
|---|---|---|
| Free | 1,000 a month | 1 |
| Starter | 10,000 | 5 |
| Build | 50,000 | 5 |
| Growth | 200,000 | 5 |
| Pro | 500,000 | 5 |
| Scale | 1,000,000 | 10 |
| Volume | 5,000,000 | 20 |
A worked example: checking the trust score of 500 suppliers with company-details is 500 calls × 1 credit = 500 credits, inside the free tier. Pulling 20 review pages for each of 100 companies is 100 × 20 = 2,000 calls × 1 credit = 2,000 credits, which fits the Starter pack's 10,000.
Scaling up, 500,000 review pages is 500,000 calls × 1 credit = 500,000 credits, exactly one Pro pack. See pricing for what credits cost. Rate limits are per account and counted per minute; the pricing page also lists the faster rates you can choose at checkout.
How do you handle errors and limits?
Errors return an HTTP status and a JSON body with error.code, error.message and error.request_id. For this API, check parameter values against the table above: invalid_parameters (422) is the code for bad parameters, alongside not_found (404) and insufficient_credits (402). Rate-limited (429) and temporarily unavailable (503) responses include a Retry-After header with the seconds to wait.
Treat 429 and 503 as retryable after that delay, and 4xx errors as bugs in the request. The errors docs list every code and the rate limits docs cover 429 behaviour. Data is collected from publicly available sources and returned as found at the time of the call.
Can an AI agent call this?
Yes. The MCP server at https://api.perceptlayer.com/mcp exposes search_endpoints, get_endpoint and call_endpoint. The first two only look up the catalogue and cost nothing; call_endpoint takes an endpoint ID and its parameters and spends 1 credit on success only.
An agent can then resolve a company name with company-search, fetch company-reviews and summarise recent complaints. See the MCP docs for setup, and MCP vs function calling for when each approach fits. For other review sources, the Google Maps reviews guide, the App Store reviews guide, the Google Play guide and the Glassdoor guide work the same way.
Next step: run the Amazon call above in the playground on the Trustpilot API page, then swap in the domain you care about.
APIs in this post
Frequently asked questions
Do I need a Trustpilot account to use this?
You need a Perceptlayer API key, which is free to create, and the company's domain. The catalogue documents company_domain as the only required input and no Trustpilot credentials. Trustpilot's official Trustpilot for Business API is described as a way to send invitations, showcase reviews and reply to feedback (Trustpilot Developers, 2026). This endpoint is addressed by a company's domain instead.
How much does it cost to pull a company's reviews?
One credit per successful call, whichever Trustpilot endpoint you use, so 1,000 calls × 1 credit = 1,000 credits. The free tier covers 1,000 credits a month, and failed calls are never billed. Pricing shows what credits cost in the 10,000 to 5,000,000 credit packs.
Do the responses include reviewer names?
Yes. Each review entry in the recording has a consumer object with a display name, an image URL, a country code and a review count. We left that block out of the excerpts and don't reproduce the names. Display names identify real people, so we'd leave them out of anything you publish. Check the terms and any privacy rules that apply to your use before you store them.
Can I filter reviews by star rating or date?
The endpoint has a rating parameter (a string with no allowed values listed) and date_posted, which takes one of any, last_12_months, last_6_months, last_3_months or last_30_days. sort takes relevance or recency. Try the combination in the playground. Each call is 1 credit.
How do I find a company's domain?
Call company-search with query set to the company name. You can narrow it with country, min_rating (any, 3, 4 or 4.5) and min_review_count (any, 25, 50, 100, 250 or 500). Then pass the domain you chose as company_domain to the reviews or details endpoint.