Amazon Reviews API. Top customer reviews, page by page.
Top customer reviews of a product, by marketplace. We handle the proxies, blocks and platform changes.
Amazon Reviews API at a glance
Returns the top customer reviews an Amazon product page shows, from the product's link, short link or ASIN, on any Amazon marketplace outside the US. Each review has its star rating, title, full text and language, the reviewer with their profile link, the variation bought, whether the purchase is verified, how many people found it helpful, its photos and videos, and the date and country it was written in.
GET /v1/amazon/reviews
- 1 credit per page, $0.75–$1.97 per 1,000 pages
- 19 typed fields null when unknown
- 20 top customer reviews per page, Amazon's top reviews: the marketplace's own first, then other countries'
urlis all it needs, e.g.https://www.amazon.co.uk/dp/B003AIF4Q4
Send one request. Get up to 20 top customer reviews back.
Copy the request in your language, or hand it to your agent. Sign up for an API key and your first 100 credits are free.
$ npm install socialtapurl = https://www.amazon.co.uk/dp/B003AIF4Q4const params = new URLSearchParams({
url: "https://www.amazon.co.uk/dp/0735211299",
});
const res = await fetch(`https://socialtap.dev/v1/amazon/reviews?${params}`, {
headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, page, meta } = body;
console.log(data, meta.credits_charged);import os
import requests
res = requests.get(
"https://socialtap.dev/v1/amazon/reviews",
params={"url": "https://www.amazon.co.uk/dp/0735211299"},
headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, page, meta = body["data"], body["page"], body["meta"]
print(data, meta["credits_charged"])require "json"
require "net/http"
uri = URI("https://socialtap.dev/v1/amazon/reviews")
uri.query = URI.encode_www_form('url' => 'https://www.amazon.co.uk/dp/0735211299')
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("SOCIALTAP_API_KEY")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(req) }
body = JSON.parse(res.body)
raise "#{body["error"]["code"]}: #{body["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
pp body["data"]
puts body["meta"]["credits_charged"]<?php
$query = http_build_query([
'url' => 'https://www.amazon.co.uk/dp/0735211299',
]);
$ch = curl_init('https://socialtap.dev/v1/amazon/reviews?' . $query);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['x-api-key: ' . getenv('SOCIALTAP_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
throw new RuntimeException($body['error']['code'] . ': ' . $body['error']['message']);
}
print_r($body['data']);
echo $body['meta']['credits_charged'], PHP_EOL;package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
"os"
)
func main() {
q := url.Values{}
q.Set("url", "https://www.amazon.co.uk/dp/0735211299")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/amazon/reviews?"+q.Encode(), nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
var body struct {
Data json.RawMessage `json:"data"`
Page json.RawMessage `json:"page"`
Meta map[string]any `json:"meta"`
Error *struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
log.Fatal(err)
}
if body.Error != nil {
log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
}
fmt.Println(string(body.Data), body.Meta["credits_charged"])
}curl -G 'https://socialtap.dev/v1/amazon/reviews' \
--data-urlencode 'url=https://www.amazon.co.uk/dp/0735211299' \
-H "x-api-key: $SOCIALTAP_API_KEY"{
"data": [
{
"approximate_fields": [
"published_at"
],
"author": {
"avatar_url": null,
"display_name": "A B Hann",
"id": "amzn1.account.AFOIQIFVHELUIDZNA3PZAAHUQH6A",
"is_verified": null,
"url": "https://www.amazon.co.uk/gp/profile/amzn1.account.AFOIQIFVHELUIDZNA3PZAAHUQH6A",
"username": null
},
"country_code": "GB",
"id": "R26NWF54CTYPDH",
"is_incentivized": false,
"is_verified_purchase": true,
"language": "en",
"media": [],
"metrics": {
"helpful_count": 25
},
"platform": "amazon",
"platform_specific": {},
"product_id": "0735211299",
"published_at": "2026-03-04T00:00:00Z",
"rating": 5,
"text": "Atomic Habits completely changed the way I think about progress and self-improvement. Instead of focusing on huge life overhauls, it breaks everything down into small, practical changes that actually feel manageable.\n\nWhat I appreciated most is how actionable the advice is. The s…",
"title": "Simple Ideas, Powerful Results",
"unknown_fields": [],
"url": "https://www.amazon.co.uk/gp/customer-reviews/R26NWF54CTYPDH",
"variant_id": "1847941834",
"variant_title": "Format: Paperback"
},
{
"approximate_fields": [
"published_at"
],
"author": {
"avatar_url": "https://m.media-amazon.com/images/S/amazon-avatars-global/ce2aa141-d825-444f-859e-e735d5e639d2._CR0%2C0%2C500%2C500_SX460_SX48_.jpeg",
"display_name": "John M",
"id": "amzn1.account.AGRCKXSEGOJY6VKWXVUZBOSJ35SA",
"is_verified": null,
"url": "https://www.amazon.co.uk/gp/profile/amzn1.account.AGRCKXSEGOJY6VKWXVUZBOSJ35SA",
"username": null
},
"country_code": "GB",
"id": "R2R5XY27STL9YL",
"is_incentivized": false,
"is_verified_purchase": true,
"language": "en",
"media": [],
"metrics": {
"helpful_count": 12
},
"platform": "amazon",
"platform_specific": {},
"product_id": "0735211299",
"published_at": "2026-09-10T00:00:00Z",
"rating": 5,
"text": "Atomic Habits has genuinely changed the way I look at several areas of my life. Rather than focusing on dramatic overnight transformations, it helped me understand the power of small, consistent actions and how they gradually shape our identity and future.\n\nOne of the most impact…",
"title": "A Powerful Book That Changed My Outlook",
"unknown_fields": [],
"url": "https://www.amazon.co.uk/gp/customer-reviews/R2R5XY27STL9YL",
"variant_id": "1847941834",
"variant_title": "Format: Paperback"
},
{
"approximate_fields": [
"published_at"
],
"author": {
"avatar_url": null,
"display_name": "Rodrigo Ferreira",
"id": "amzn1.account.AECVB7TIUUBFDS43YI24MB2B6ILQ",
"is_verified": null,
"url": "https://www.amazon.co.uk/gp/profile/amzn1.account.AECVB7TIUUBFDS43YI24MB2B6ILQ",
"username": null
},
"country_code": "GB",
"id": "RQW3OS75ABF74",
"is_incentivized": false,
"is_verified_purchase": true,
"language": "en",
"media": [
{
"alt_text": null,
"duration_ms": null,
"expires_at": null,
"height": null,
"thumbnail_url": "https://m.media-amazon.com/images/I/61ezPtvAdKL._SY500_.jpg",
"type": "image",
"url": "https://m.media-amazon.com/images/I/61ezPtvAdKL.jpg",
"width": null
},
{
"alt_text": null,
"duration_ms": null,
"expires_at": null,
"height": null,
"thumbnail_url": "https://m.media-amazon.com/images/I/517WaERYwEL._SY500_.jpg",
"type": "image",
"url": "https://m.media-amazon.com/images/I/517WaERYwEL.jpg",
"width": null
},
{
"alt_text": null,
"duration_ms": null,
"expires_at": null,
"height": null,
"thumbnail_url": "https://m.media-amazon.com/images/I/61+X8YMvgVL._SY500_.jpg",
"type": "image",
"url": "https://m.media-amazon.com/images/I/61+X8YMvgVL.jpg",
"width": null
}
],
"metrics": {
"helpful_count": 7
},
"platform": "amazon",
"platform_specific": {},
"product_id": "0735211299",
"published_at": "2026-07-09T00:00:00Z",
"rating": 4,
"text": "I haven’t finished the entire book yet, but I’ve read enough to understand its core message. The idea that tiny, consistent changes compound into major long‑term transformation is genuinely useful, and it’s helped me pay more attention to small wins I normally overlook. I’ve alre…",
"title": "Helpful framework for small improvements, but oversimplifies the mental side of habit change",
"unknown_fields": [],
"url": "https://www.amazon.co.uk/gp/customer-reviews/RQW3OS75ABF74",
"variant_id": "1847941834",
"variant_title": "Format: Paperback"
}
],
"page": {
"has_more": false,
"next_cursor": null,
"next_cursor_expires_at": null,
"end_reason": "platform_limit"
},
"meta": {
"request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
"platform": "amazon",
"source": "page",
"is_cached": false,
"credits_charged": 1,
"latency_ms": 0,
"fetched_at": "2026-10-25T12:00:00Z",
"input": {
"kind": "product",
"id": "0735211299",
"url": "https://www.amazon.co.uk/dp/0735211299"
},
"credits_remaining": 9999,
"client_request_id": null,
"warnings": []
}
}import { SocialTap } from "socialtap";
const client = new SocialTap(); // apiKey defaults to process.env.SOCIALTAP_API_KEY
const res = await client.amazon.reviews.list({ url: "https://www.amazon.co.uk/dp/0735211299" });
console.log(res.data);
console.log(res.credits.charged, res.meta.request_id);import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) throws Exception {
String query = "url=" + encode("https://www.amazon.co.uk/dp/0735211299");
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://socialtap.dev/v1/amazon/reviews?" + query))
.header("x-api-key", System.getenv("SOCIALTAP_API_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
// An error is {"error": {"code", "message", ...}}; success is {data, meta}, meta.credits_charged its price.
if (response.statusCode() >= 400) throw new RuntimeException(response.body());
System.out.println(response.body());
}
static String encode(String value) {
return URLEncoder.encode(value, StandardCharsets.UTF_8);
}
}using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("SOCIALTAP_API_KEY"));
var query = string.Join("&",
"url=" + Uri.EscapeDataString("https://www.amazon.co.uk/dp/0735211299"));
var res = await http.GetAsync("https://socialtap.dev/v1/amazon/reviews?" + query);
using var body = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
if (!res.IsSuccessStatusCode)
{
var error = body.RootElement.GetProperty("error");
throw new Exception($"{error.GetProperty("code")}: {error.GetProperty("message")}");
}
Console.WriteLine(body.RootElement.GetProperty("data"));
Console.WriteLine(body.RootElement.GetProperty("meta").GetProperty("credits_charged"));// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let res = reqwest::blocking::Client::new()
.get("https://socialtap.dev/v1/amazon/reviews")
.query(&[("url", "https://www.amazon.co.uk/dp/0735211299")])
.header("x-api-key", env::var("SOCIALTAP_API_KEY")?)
.send()?;
let ok = res.status().is_success();
let body: serde_json::Value = res.json()?;
if !ok {
return Err(format!("{}: {}", body["error"]["code"], body["error"]["message"]).into());
}
println!("{} {}", body["data"], body["meta"]["credits_charged"]);
Ok(())
}200 OK · GET https://socialtap.dev/v1/amazon/reviewsLong arrays and strings are shortened here. Real responses are complete.Docs One schema on 2 platforms.
The response reference lists every field, its type and when it is null. See the full schema.
Null means unknown
A field Amazon doesn't show is null, never zero or an empty string, so a real zero always means zero.
What it accepts
The product: its link on any Amazon marketplace (amazon.co.uk/dp/B003AIF4Q4, with or without the title before /dp/, /gp/product/, /gp/aw/d/, /product-reviews/ and the older /exec/obidos/ASIN/ links), a short link (amzn.to, a.co/d/, amzn.eu/d/, amzn.asia/d/, amzn.com), or its ASIN alone (B003AIF4Q4, or a book's ISBN-10) with country.
Write one parser
Amazon and TikTok Shop answer in these fields, so the code that reads one reads them all.
platformstring- Platform ID (tiktokshop, …).
idstring- Platform-native review ID (string).
product_idstring- ID of the product reviewed (equals product.id); null only for a review of something other than a product.
urlstring- Permalink, when the platform has one (TikTok Shop reviews have none).
ratinginteger- Star rating, 1 to 5; null when the review gives none.
titlestring- The review's headline; null when it has none.
textstring- Review body as plain text; null for a rating without text.
languagestring- BCP-47 language of text, when the platform states it.
Live data from 33 platforms.
What teams build with the Amazon Reviews API.
Read what buyers say about a product in each country
Collect review photos and videos for product research
Watch the top reviews on a competitor's listing
Compare how a product is received across marketplaces
Good to know before you build.
- Amazon shows reviews to signed-out visitors on every marketplace but amazon.com, which asks them to sign in: an amazon.com product answers private_or_unavailable. Send its link or ASIN with country set to another marketplace (GB, CA, DE, …) to read that marketplace's reviews of it.
- You get the reviews the product page shows, in its order: the marketplace's own top reviews, then top reviews from other countries. Amazon's full review pages need a login, so when a product has more reviews the list ends with page.end_reason platform_limit.
- Texts are in the language the reviewer wrote them in: language says which. Dates are days, listed in approximate_fields.
- A review can be of another variation or edition of the product: variant_id is the item bought and variant_title its options.
- The review's own link (url) opens for signed-in visitors only. The reviewer's profile link is public.
1 credit per page. Failed requests are free.
Buy credits once and spend them on any endpoint, on any platform.
| Source | Price per successful page | Per 1,000 pages |
|---|---|---|
Public page page | 1 credit | $0.75–$1.97 |
- Cache hits are free.
- Credits from packs and top-ups never expire.
- A monthly plan's credits are spent first, and what is left of them ends at each renewal.
- Prices exclude tax: sales tax is added at checkout where it applies.
- Outside the US, plans and packs are sold to businesses: checkout asks for your VAT, GST or other business tax ID.
Questions about the Amazon Reviews API.
More in the API reference.
Why does an amazon.com product return no reviews?
Can I get every review of a product?
How much does the Amazon Reviews API cost?
How do I get the next page?
Try it on a link you already have.
Paste it in the playground, or copy the request into your code.
- No credit card
- Failed requests are free
- Works on all 218 endpoints