Skip to main content
Feed sentiment analysis, surface product issues, and mine customer language for marketing copy. Returns review id, ASIN, product title, review text, date, rating, likes, username, avatar, attached images and video, plus the associated product details. This scraper job is asynchronous. You’ll receive a jobId, and can fetch results via polling or webhook delivery.

Request Cost

Each row of data returned consumes 10 credits from your balance.
Credits are deducted only for successful rows.

Example Request

curl --request POST \
  --url 'https://api.hasdata.com/scrapers/amazon-product-reviews/jobs' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <your-api-key>' \
  --data '{"limit":100,"asins":["B096NP4QWH","https://www.amazon.com/Semwiss-Womens-Comfortable-Pointed-Leopard/dp/B0B11MFHKX"],"domain":"www.amazon.com"}'
const axios = require('axios').default;

const options = {
  method: 'POST',
  url: 'https://api.hasdata.com/scrapers/amazon-product-reviews/jobs',
  headers: {'Content-Type': 'application/json', 'x-api-key': '<your-api-key>'},
  data: {
    limit: 100,
    asins: [
      'B096NP4QWH',
      'https://www.amazon.com/Semwiss-Womens-Comfortable-Pointed-Leopard/dp/B0B11MFHKX'
    ],
    domain: 'www.amazon.com'
  }
};

try {
  const { data } = await axios.request(options);
  console.log(data);
} catch (error) {
  console.error(error);
}
import requests

url = "https://api.hasdata.com/scrapers/amazon-product-reviews/jobs"

payload = {
    "limit": 100,
    "asins": ["B096NP4QWH", "https://www.amazon.com/Semwiss-Womens-Comfortable-Pointed-Leopard/dp/B0B11MFHKX"],
    "domain": "www.amazon.com"
}
headers = {
    "Content-Type": "application/json",
    "x-api-key": "<your-api-key>"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
<?php

$payload = [
    "limit" => 100,
    "asins" => ["B096NP4QWH", "https://www.amazon.com/Semwiss-Womens-Comfortable-Pointed-Leopard/dp/B0B11MFHKX"],
    "domain" => "www.amazon.com",
];

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.hasdata.com/scrapers/amazon-product-reviews/jobs",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode($payload),
  CURLOPT_HTTPHEADER => [
    "Content-Type: application/json",
    "x-api-key: <your-api-key>",
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
String json = """
  {
    "limit": 100,
    "asins": [
      "B096NP4QWH",
      "https://www.amazon.com/Semwiss-Womens-Comfortable-Pointed-Leopard/dp/B0B11MFHKX"
    ],
    "domain": "www.amazon.com"
  }
""";
RequestBody requestBody = RequestBody.create(json, mediaType);

Request request = new Request.Builder()
  .url("https://api.hasdata.com/scrapers/amazon-product-reviews/jobs")
  .post(requestBody)
  .addHeader("Content-Type", "application/json")
  .addHeader("x-api-key", "<your-api-key>")
  .build();

Response response = client.newCall(request).execute();
using System.Net.Http;
using System.Text;

var client = new HttpClient();

var json = """
{
  "limit": 100,
  "asins": [
    "B096NP4QWH",
    "https://www.amazon.com/Semwiss-Womens-Comfortable-Pointed-Leopard/dp/B0B11MFHKX"
  ],
  "domain": "www.amazon.com"
}
""";
var content = new StringContent(json, Encoding.UTF8, "application/json");

var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.hasdata.com/scrapers/amazon-product-reviews/jobs")
{
    Content = content,
};
request.Headers.Add("x-api-key", "<your-api-key>");

using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
require 'net/http'
require 'uri'
require 'json'

uri = URI("https://api.hasdata.com/scrapers/amazon-product-reviews/jobs")
payload = {
  "limit" => 100,
  "asins" => ["B096NP4QWH", "https://www.amazon.com/Semwiss-Womens-Comfortable-Pointed-Leopard/dp/B0B11MFHKX"],
  "domain" => "www.amazon.com",
}

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri)
request["Content-Type"] = 'application/json'
request["x-api-key"] = '<your-api-key>'
request.body = payload.to_json

response = http.request(request)
puts response.read_body
use reqwest::blocking::Client;
use serde_json::json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let payload = json!({
        "limit": 100,
        "asins": [
            "B096NP4QWH",
            "https://www.amazon.com/Semwiss-Womens-Comfortable-Pointed-Leopard/dp/B0B11MFHKX"
        ],
        "domain": "www.amazon.com"
    });
    let res = client
        .post("https://api.hasdata.com/scrapers/amazon-product-reviews/jobs")
        .header("Content-Type", "application/json")
        .header("x-api-key", "<your-api-key>")
        .json(&payload)
        .send()?
        .text()?;
    println!("{}", res);
    Ok(())
}
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	payload := []byte(`{
  "limit": 100,
  "asins": [
    "B096NP4QWH",
    "https://www.amazon.com/Semwiss-Womens-Comfortable-Pointed-Leopard/dp/B0B11MFHKX"
  ],
  "domain": "www.amazon.com"
}`)

	req, _ := http.NewRequest("POST", "https://api.hasdata.com/scrapers/amazon-product-reviews/jobs", bytes.NewBuffer(payload))
	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("x-api-key", "<your-api-key>")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()

	responseBody, _ := io.ReadAll(res.Body)
	fmt.Println(string(responseBody))
}

Job Parameters

limit
number
required
Reviews per product
asins
string[]
required
Enter ASINs or URLs of products you want to get reviews from. Each ASIN/URL must be on a different line.
domain
string
required
Amazon domain to use. Default is www.amazon.com.

Getting Results

Webhooks

Receive real-time updates when your scraper job starts, completes, or collects data.

Results API

Use the Results API to fetch your data using the jobId, with support for polling and pagination.

Stopping a Job

Cancel an active scraper job early if it’s no longer needed or you want to save credits.