Trustpilot APIuk.trustpilot.com ↗
Access Trustpilot UK company reviews, trust scores, star ratings, categories, and blog posts via 9 structured endpoints. Filter reviews by date, language, and stars.
What is the Trustpilot API?
This API provides structured access to Trustpilot UK data across 9 endpoints, covering company search, paginated reviews, trust scores, category listings, and blog content. The get_company_reviews endpoint alone supports filtering by star rating (1–5), date range, language code, and sort order, returning individual review text, consumer details, and company reply fields in a single response.
curl -X GET 'https://api.parse.bot/scraper/bb2e1c0f-26df-4ad6-b6a0-874d5bc47c6f/search_companies?page=1&limit=20&query=Amazon' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace uk-trustpilot-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Trustpilot Data API Client
Comprehensive API for Trustpilot review data, company insights, categories, and blog content.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Any, Optional
class ParseClient:
"""Client for interacting with the Trustpilot Data API through Parse."""
def __init__(self, api_key: Optional[str] = None):
"""Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "bb2e1c0f-26df-4ad6-b6a0-874d5bc47c6f"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key must be provided or set in PARSE_API_KEY environment variable")
def _call(self, endpoint: str, method: str = "POST", **params) -> dict[str, Any]:
"""Make a request to the Parse API.
Args:
endpoint: API endpoint name
method: HTTP method (GET or POST)
**params: Query parameters or request body
Returns:
API response as dictionary
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
if method == "GET":
response = requests.get(url, headers=headers, params=params)
else: # POST
response = requests.post(url, headers=headers, json=params)
response.raise_for_status()
return response.json()
def search_companies(self, query: str, limit: int = 20, page: int = 1) -> dict[str, Any]:
"""Search for companies by name or keyword.
Args:
query: Search keyword (e.g., 'John Lewis')
limit: Max results per page (default: 20)
page: Page number (default: 1)
Returns:
Dictionary containing matching companies with basic info
"""
return self._call(
"search_companies",
method="GET",
query=query,
limit=limit,
page=page
)
def get_company_overview(self, domain: str) -> dict[str, Any]:
"""Get the summary/overview for a company by its domain.
Args:
domain: Company domain (e.g., 'www.johnlewis.com')
Returns:
Dictionary containing trust score, star rating, review count, and AI summary
"""
return self._call(
"get_company_overview",
method="GET",
domain=domain
)
def get_company_reviews(
self,
domain: str,
language: Optional[str] = None,
stars: Optional[str] = None,
page: int = 1,
date: Optional[str] = None,
sort: str = "recency"
) -> dict[str, Any]:
"""Get paginated reviews for a company with optional filtering.
Args:
domain: Company domain
language: ISO language code (e.g., 'en')
stars: Filter by star rating (1-5)
page: Page number (default: 1)
date: Date filter (last30days, last3months, last6months, last12months)
sort: Sort order (recency or relevance)
Returns:
Dictionary containing reviews and pagination info
"""
params = {
"domain": domain,
"page": page,
"sort": sort
}
if language:
params["language"] = language
if stars:
params["stars"] = stars
if date:
params["date"] = date
return self._call("get_company_reviews", method="GET", **params)
def get_reviews_for_month(
self,
domain: str,
month: int = 7,
year: int = 2025,
max_pages: int = 50
) -> dict[str, Any]:
"""Get all reviews for a specific month and year.
Args:
domain: Company domain
month: Target month (1-12)
year: Target year
max_pages: Max pages to scan
Returns:
Dictionary containing reviews from the specified month
"""
return self._call(
"get_reviews_for_month",
method="GET",
domain=domain,
month=month,
year=year,
max_pages=max_pages
)
def get_categories(self) -> dict[str, Any]:
"""Get the hierarchical category structure of Trustpilot.
Returns:
Dictionary containing category hierarchy
"""
return self._call("get_categories", method="GET")
def get_category_companies(self, category_id: str, page: int = 1) -> dict[str, Any]:
"""Get companies listed under a specific category.
Args:
category_id: Category ID (slug) e.g., 'bank'
page: Page number (default: 1)
Returns:
Dictionary containing companies in the category
"""
return self._call(
"get_category_companies",
method="GET",
category_id=category_id,
page=page
)
def get_company_top_mentions(
self,
domain: Optional[str] = None,
business_unit_id: Optional[str] = None
) -> dict[str, Any]:
"""Get top mention tags/topics extracted from reviews for a company.
Args:
domain: Company domain (will be resolved to ID if provided)
business_unit_id: Business Unit ID (hash)
Returns:
Dictionary containing top topics/mentions
"""
params = {}
if domain:
params["domain"] = domain
if business_unit_id:
params["business_unit_id"] = business_unit_id
return self._call("get_company_top_mentions", method="GET", **params)
def get_similar_companies(self, domain: str) -> dict[str, Any]:
"""Get similar companies users also viewed.
Args:
domain: Company domain
Returns:
Dictionary containing similar business units
"""
return self._call(
"get_similar_companies",
method="GET",
domain=domain
)
def get_blog_posts(self) -> dict[str, Any]:
"""Get recent blog posts from the Trustpilot blog.
Returns:
Dictionary containing featured article and pillar articles
"""
return self._call("get_blog_posts", method="GET")
def main():
"""Practical workflow: Compare companies within a category and analyze their reviews."""
client = ParseClient()
print("=" * 70)
print("Trustpilot Data API - Competitive Analysis Workflow")
print("=" * 70)
# Step 1: Get all available categories
print("\n[Step 1] Fetching Trustpilot categories...")
categories = client.get_categories()
# Find a specific category (e.g., banks or department stores)
target_category = None
for category in categories.get("categories", []):
if category["categoryId"] == "department_store":
target_category = category
break
if target_category:
print(f"✓ Found category: {target_category['displayName']}")
# Step 2: Get top companies in the category
print(f"\n[Step 2] Getting top companies in '{target_category['displayName']}'...")
category_companies = client.get_category_companies(
category_id=target_category["categoryId"],
page=1
)
companies_list = category_companies["businessUnits"]["businesses"][:3]
print(f"✓ Retrieved {len(companies_list)} top companies")
# Store company data for comparison
company_analysis = []
# Step 3: For each company, gather detailed insights
for idx, company in enumerate(companies_list, 1):
print(f"\n[Step 3.{idx}] Analyzing {company['displayName']}...")
domain = company["identifyingName"]
company_id = company["businessUnitId"]
# Get company overview
overview = client.get_company_overview(domain=domain)
# Get recent reviews
reviews_data = client.get_company_reviews(
domain=domain,
page=1,
sort="recency"
)
# Get top mentions
mentions = client.get_company_top_mentions(domain=domain)
# Compile analysis
analysis = {
"name": company["displayName"],
"domain": domain,
"unit_id": company_id,
"reviews_count": company["numberOfReviews"],
"stars": company.get("stars"),
"trust_score": company.get("trustScore"),
"recent_reviews": reviews_data.get("reviews", [])[:3],
"top_topics": mentions.get("topics", [])[:5]
}
company_analysis.append(analysis)
print(f" ✓ Rating: {analysis['stars']}⭐ | Trust Score: {analysis['trust_score']}")
print(f" ✓ Total Reviews: {analysis['reviews_count']:,}")
print(f" ✓ Retrieved {len(analysis['recent_reviews'])} recent reviews")
print(f" ✓ Identified {len(analysis['top_topics'])} top discussion topics")
# Step 4: Comparative analysis
print("\n" + "=" * 70)
print("COMPARATIVE ANALYSIS")
print("=" * 70)
print("\n[Ratings Comparison]")
for company in company_analysis:
print(f" {company['name']:30} {company['stars']}⭐ ({company['trust_score']} trust score)")
print("\n[Review Volume]")
for company in company_analysis:
print(f" {company['name']:30} {company['reviews_count']:,} reviews")
print("\n[Recent Review Sentiment]")
for company in company_analysis:
if company["recent_reviews"]:
ratings = [r.get("rating", 0) for r in company["recent_reviews"]]
avg_rating = sum(ratings) / len(ratings) if ratings else 0
print(f" {company['name']:30} Last 3 reviews avg: {avg_rating:.1f}⭐")
print("\n[Top Discussion Topics]")
for company in company_analysis:
topics = ", ".join([t.get("displayName", "Unknown") for t in company["top_topics"][:3]])
print(f" {company['name']:30} {topics}")
# Step 5: Deep dive into best-performing company
best_company = max(company_analysis, key=lambda x: x["stars"] if x["stars"] else 0)
print("\n" + "=" * 70)
print(f"DEEP DIVE: {best_company['name']}")
print("=" * 70)
print(f"\n[Filtering reviews by rating...]")
positive_reviews = client.get_company_reviews(
domain=best_company["domain"],
stars="5",
page=1
)
print(f" 5-star reviews found: {len(positive_reviews.get('reviews', []))}")
# Check for similar companies
print(f"\n[Finding competitors...]")
similar = client.get_similar_companies(domain=best_company["domain"])
if similar.get("similarBusinessUnits"):
print(f" Users also compared with:")
for comp in similar["similarBusinessUnits"][:3]:
comp_name = comp.get("businessUnitDisplayName", "Unknown")
comp_rating = comp.get("stars", "N/A")
print(f" - {comp_name} ({comp_rating}⭐)")
# Step 6: Blog insights
print(f"\n[Latest Trustpilot Insights]")
blog = client.get_blog_posts()
if blog.get("featuredArticle"):
featured = blog["featuredArticle"]
print(f" Featured: {featured.get('title', 'N/A')}")
print(f" Published: {featured.get('date', 'N/A')}")
print("\n" + "=" * 70)
print("✓ Analysis complete! Use this data for competitive benchmarking.")
print("=" * 70)
if __name__ == "__main__":
main()Search for companies by name or keyword. Returns list of matching companies with basic info, trust score, and review count.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number |
| limit | integer | Max results per page |
| queryrequired | string | Search keyword (e.g. 'John Lewis') |
{
"type": "object",
"fields": {
"totalHits": "integer total number of matching companies",
"totalPages": "integer total number of pages",
"businessUnits": "array of company objects with businessUnitId, displayName, identifyingName, score, numberOfReviews, categories"
},
"sample": {
"data": {
"totalHits": 480,
"searchMode": "keyword",
"totalPages": 24,
"businessUnits": [
{
"score": {
"stars": 4,
"trustScore": 4.1
},
"categories": [
{
"id": "department_store",
"name": "Department store",
"primary": true
}
],
"displayName": "John Lewis ",
"businessUnitId": "46d5517e000064000500ceba",
"identifyingName": "www.johnlewis.com",
"numberOfReviews": 101650
}
]
},
"status": "success"
}
}About the Trustpilot API
Company Search and Overview
The search_companies endpoint accepts a keyword query and returns matching companies with their businessUnitId, displayName, score, numberOfReviews, and category assignments. For deeper company data, get_company_overview takes a domain string (e.g. www.johnlewis.com) and returns the full businessUnit object including contact info, activity data, an AI-generated aiSummary with modelVersion, and a similarBusinessUnits array. The trustScore and rating fields are exposed at the top level of the overview response, making it straightforward to compare companies without additional calls.
Review Retrieval and Filtering
get_company_reviews is the primary reviews endpoint. It accepts domain, optional stars (1–5), language (ISO code), date (one of last30days, last3months, last6months, last12months), sort (recency or relevance), and page. The reviews array in the response includes id, title, text, rating, multiple date fields, a consumer object, and any company reply. The pagination object exposes currentPage, totalPages, and totalReviews. For time-bounded collection, get_reviews_for_month accepts a year, month (1–12), and optional max_pages cap, returning all reviews posted in that calendar month.
Categories and Company Discovery
get_categories returns the full Trustpilot category hierarchy with categoryId, displayName, and nested subCategories — no inputs required. get_category_companies then accepts a category_id slug (e.g. bank, department_store) and a page number, returning a paginated list of businesses in that category including totalHits and perPage metadata. get_similar_companies takes a domain and returns companies users also viewed, with trustScore, stars, and numberOfReviews for each.
Mentions and Blog Content
get_company_top_mentions returns review-derived topic tags for a company. It accepts either a domain or a business_unit_id directly (the latter is available from search_companies results), returning an array of topic objects with id and displayName. get_blog_posts requires no inputs and returns Trustpilot's blog content organised by pillar category (trendsintrust, reviewsmatter, buywithconfidence, trustpilotstories), plus a featuredArticle object with title, slug, date, thumbnail, and pillar.
The Trustpilot API is a managed, monitored endpoint for uk.trustpilot.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when uk.trustpilot.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official uk.trustpilot.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate competitor trust scores and review counts by querying multiple domains via
get_company_overview. - Monitor negative reviews in near-real time by filtering
get_company_reviewswithstars=1anddate=last30days. - Build a category-browsing tool that lists top-reviewed UK businesses using
get_categoriesandget_category_companies. - Extract recurring customer pain points from review-derived topics using
get_company_top_mentions. - Pull all reviews for a specific month for trend analysis using
get_reviews_for_monthwithyearandmonthinputs. - Surface AI-generated company summaries from the
aiSummaryfield inget_company_overviewfor comparison dashboards. - Identify market adjacencies by pulling
similarBusinessUnitsfor a target company domain.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Trustpilot have an official developer API?+
What does `get_company_reviews` return and how does filtering work?+
reviews array and a pagination object. Each review includes id, title, text, rating, date fields, a consumer object, and a company reply if one exists. You can narrow results with the stars parameter (1–5), language (ISO code), date (last30days, last3months, last6months, last12months), and sort (recency or relevance). Combine any subset of these filters in a single request.Can I retrieve reviews posted in a specific calendar month?+
get_reviews_for_month handles this. Pass domain, year, and month (1–12). The endpoint paginates through recent reviews and returns only those matching the target month, with a count and a filtered reviews array. The optional max_pages parameter bounds how far back it scans, which matters for companies with high review volume.Does the API expose individual reviewer profiles or review verification status?+
consumer object with basic identity data, and review text, rating, and dates are present, but detailed reviewer profiles or verification badges are not surfaced as distinct fields. You can fork this API on Parse and revise it to add an endpoint targeting that data if it becomes a requirement.