GET
/products/reviews
1 credit
Amazon Product Reviews API
Customer reviews for an ASIN with the rating summary, star breakdown, review bodies, verified-purchase flags, helpful votes and variant attribution.
Known limitation. Amazon serves one fixed set of reviews on this surface.
page, star and sort are accepted but largely ignored upstream, and reviewer names are often absent because Amazon renders a “linkless” variant here. When that happens the response carries a note field explaining it rather than failing.Try it
You are not signed in, so this runs against sample data and costs nothing.
Create a free account to run it against your own key.
Query parameters
| Name | Type | Default | Description |
|---|---|---|---|
|
asin
required |
string | — | Amazon Standard Identification Number. |
| page | integer | 1 | 1-based page number. |
| star | string | — |
Filter by star rating.
allfivefourthreetwoone
|
| sort | string | — |
Review ordering.
helpfulrecent
|
| verified_only | boolean | false | Only verified-purchase reviews. |
| marketplace | string | US | Two-letter marketplace code (US, UK, DE, FR, IT, ES, CA, JP, IN, AU, …). |
| zip | string | — | Delivery postcode. Without one, many listings report “cannot be shipped to your location” and come back with no price or images. Always send it for price-accurate data. |
Request
curl -sS "https://amazoncrawler.com/v1/products/reviews?asin=B07CMS5Q6P&marketplace=US&zip=10001" \
-H "x-api-key: YOUR_API_KEY"
import requests
API_KEY = "YOUR_API_KEY"
response = requests.get(
"https://amazoncrawler.com/v1/products/reviews",
params={
"asin": "B07CMS5Q6P",
"marketplace": "US",
"zip": "10001",
},
headers={"x-api-key": API_KEY},
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
const API_KEY = "YOUR_API_KEY";
const url = new URL("https://amazoncrawler.com/v1/products/reviews");
const params = {
asin: "B07CMS5Q6P",
marketplace: "US",
zip: "10001",
};
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
const response = await fetch(url, {
headers: { "x-api-key": API_KEY },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
console.log(data);
<?php
$apiKey = 'YOUR_API_KEY';
$query = http_build_query([
'asin' => 'B07CMS5Q6P',
'marketplace' => 'US',
'zip' => '10001',
]);
$ch = curl_init("https://amazoncrawler.com/v1/products/reviews?$query");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["x-api-key: $apiKey"],
CURLOPT_TIMEOUT => 30,
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
)
func main() {
u, _ := url.Parse("https://amazoncrawler.com/v1/products/reviews")
q := u.Query()
q.Set("asin", "B07CMS5Q6P")
q.Set("marketplace", "US")
q.Set("zip", "10001")
u.RawQuery = q.Encode()
req, _ := http.NewRequest("GET", u.String(), nil)
req.Header.Set("x-api-key", "YOUR_API_KEY")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
json.NewDecoder(res.Body).Decode(&data)
fmt.Println(data)
}
Response
{
"url": "https://www.amazon.com/product-reviews/B07CMS5Q6P",
"asin": "B07CMS5Q6P",
"note": null,
"page": 1,
"count": 8,
"reviews": [
{
"id": "R3H2KBL1KYTDR0",
"url": "https://www.amazon.com/gp/customer-reviews/R3H2KBL1KYTDR0",
"body": "The Logitech G305 Lightspeed is one of the best wireless gaming mice I've used, especially for the price. Lightweight, comfortable and responsive\u2026",
"date": "June 6, 2026",
"title": "Excellent Wireless Gaming Mouse with Amazing Battery Life",
"author": null,
"images": [],
"rating": 5.0,
"country": "United States",
"variant": "Color: Black Style: Classic Pattern Name: Mouse",
"author_id": null,
"helpful_votes": 11,
"verified_purchase": true
}
],
"summary": {
"rating": 4.6,
"breakdown": {},
"total_ratings": 39364
},
"authenticated": true,
"has_next_page": false,
"filters_applied": false
}
Errors
Beyond the shared error codes, this endpoint returns
422 when a parameter fails validation — the
detail array names the field.
{
"detail": [
{
"loc": ["query", "asin"],
"msg": "Field required",
"type": "missing",
"input": null
}
]
}