List reviews for a product
Returns reviews for a product. Publishable keys see only approved reviews.
Secret keys can filter by any status including pending and rejected.
The response always includes an aggregate summary block with the average
rating and star distribution across all approved reviews for the product,
regardless of the status filter applied to the reviews array.
Marketplace: A marketplace operator key may read approved reviews for a
product belonging to one of its merchants. When using an operator key,
store_id (the merchant who owns the product) is required.
Rate limit: 300 requests/hour per API key.
curl --request GET \
--url https://api.tybritelabs.com/v1/reviews \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.tybritelabs.com/v1/reviews"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tybritelabs.com/v1/reviews', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tybritelabs.com/v1/reviews",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tybritelabs.com/v1/reviews"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tybritelabs.com/v1/reviews")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tybritelabs.com/v1/reviews")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"reviews": [
{
"id": "aabbccdd-1234-5678-abcd-ef0123456789",
"product_id": "7d425c0a-50e7-4e39-af79-6f7945f9dfa8",
"variant_id": null,
"order_id": null,
"customer_id": "550e8400-e29b-41d4-a716-446655440000",
"customer_name": "Jane Doe",
"rating": 5,
"title": "Absolutely love it",
"body": "Best purchase I've made this year. Quality is outstanding.",
"media_urls": [],
"status": "approved",
"rejection_reason": null,
"helpful_count": 12,
"verified_purchase": true,
"created_at": "2026-05-20T10:00:00Z",
"updated_at": "2026-05-21T08:00:00Z"
}
],
"pagination": {
"limit": 20,
"has_more": false,
"next_cursor": null
},
"summary": {
"total_reviews": 47,
"average_rating": 4.6,
"five_star": 28,
"four_star": 12,
"three_star": 4,
"two_star": 2,
"one_star": 1,
"verified_count": 31
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"details": "The 'email' field is required"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid Authorization header"
}
}{
"error": {
"code": "forbidden",
"message": "This operation requires a secret key. Publishable keys cover catalogue reads and the actions a shopper takes for themselves."
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests for this API key. Please slow down and try again shortly.",
"remaining": 0,
"reset": 1706198400
}
}{
"error": {
"code": "server_error",
"message": "An unexpected error occurred"
}
}Authorizations
API Key Authentication
Use your API key in the Authorization header:
Authorization: Bearer tybrite_sk_live_YOUR_KEY
Key Types:
Secret Keys (Server-Side Only):
- Format:
tybrite_sk_live_*(production) ortybrite_sk_test_*(sandbox) - Full read/write access to all endpoints
- ⚠️ NEVER expose in client-side code or public repositories
- Required for: every write a shopper does not make for themselves, authentication, payment verification, AI recommendations
Publishable Keys (Client-Safe):
- Format:
tybrite_pk_live_*(production) ortybrite_pk_test_*(sandbox) - Catalogue reads, plus the actions a shopper takes for themselves
- ✅ Safe for client-side JavaScript, mobile apps, and public code
- Allowed for: browsing products, search, CMS content, pricing queries, cart and wishlist, reviews, storefront events, and the Agent API's quotes, cart drafts and checkout intents
Endpoint-Specific Requirements:
- Authentication endpoints (
/v1/auth/*): Secret key required - Payment verification (
POST /v1/payments/verify): Secret key required - AI Recommendations (
POST /v1/recommendations): Secret key required - Semantic Search (
POST /v1/search): Both key types allowed (read-only operation) - Shopper actions (cart, wishlist, reviews, storefront events, Agent API quotes, cart drafts and checkout intents): Both key types allowed
- All other write operations: Secret key required
- All read operations: Both key types allowed
Using a publishable key for restricted operations returns 403 Forbidden.
Query Parameters
Filter reviews for this product. Required.
Marketplace operator key only — and required for operator keys. The merchant that owns the product whose reviews you are reading. Ignored when using a single-store key.
Further filter to reviews that mention a specific variant.
Review status filter. Publishable keys always see only approved regardless
of this parameter. Secret keys can pass pending, rejected, or all.
approved, pending, rejected, all Filter to reviews with this exact star rating.
1 <= x <= 5Sort order: newest/oldest by submission date; highest/lowest by rating.
newest, oldest, highest, lowest Number of reviews to return per page.
1 <= x <= 100Pagination cursor from the previous response's pagination.next_cursor.
Omit for the first page.
curl --request GET \
--url https://api.tybritelabs.com/v1/reviews \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.tybritelabs.com/v1/reviews"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tybritelabs.com/v1/reviews', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tybritelabs.com/v1/reviews",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tybritelabs.com/v1/reviews"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tybritelabs.com/v1/reviews")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tybritelabs.com/v1/reviews")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"reviews": [
{
"id": "aabbccdd-1234-5678-abcd-ef0123456789",
"product_id": "7d425c0a-50e7-4e39-af79-6f7945f9dfa8",
"variant_id": null,
"order_id": null,
"customer_id": "550e8400-e29b-41d4-a716-446655440000",
"customer_name": "Jane Doe",
"rating": 5,
"title": "Absolutely love it",
"body": "Best purchase I've made this year. Quality is outstanding.",
"media_urls": [],
"status": "approved",
"rejection_reason": null,
"helpful_count": 12,
"verified_purchase": true,
"created_at": "2026-05-20T10:00:00Z",
"updated_at": "2026-05-21T08:00:00Z"
}
],
"pagination": {
"limit": 20,
"has_more": false,
"next_cursor": null
},
"summary": {
"total_reviews": 47,
"average_rating": 4.6,
"five_star": 28,
"four_star": 12,
"three_star": 4,
"two_star": 2,
"one_star": 1,
"verified_count": 31
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"details": "The 'email' field is required"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid Authorization header"
}
}{
"error": {
"code": "forbidden",
"message": "This operation requires a secret key. Publishable keys cover catalogue reads and the actions a shopper takes for themselves."
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests for this API key. Please slow down and try again shortly.",
"remaining": 0,
"reset": 1706198400
}
}{
"error": {
"code": "server_error",
"message": "An unexpected error occurred"
}
}
