---
title: "Amazon scraper"
description: "Scrape Amazon product pages, search results, prices, ratings and customer reviews as structured JSON. One API request from Python, Node.js, the CLI or MCP."
canonical: https://www.zenrows.com/scrape/amazon
updated: 2026-10-20
---

# Amazon scraper

The Zenrows Amazon scraper turns any Amazon product, search or best sellers URL into structured JSON: title, ASIN, brand, price, stock, rating, review counts, feature bullets, images and top customer reviews. You send the URL, Fetch in Adaptive Stealth Mode opens the page, and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: amazon.com
- Returns: Products, prices, ratings, reviews and search results

## Run it: one Amazon product in, JSON out

```json Input
{
  "url": "https://www.amazon.com/dp/B0CFPJYX7P",
  "mode": "auto",
  "extract": "auto",
  "proxy_country": "us"
}
```

```json Output
{
  "product": {
    "asin": "B0CFPJYX7P",
    "title": "Amazon Kindle Paperwhite 16GB (2024 model), 7\" glare-free display and weeks of battery",
    "brand": "Amazon",
    "canonical_url": "https://www.amazon.com/clp/B0CFPJYX7P",
    "main_image": "https://m.media-amazon.com/images/I/71YwNBmu+aL._AC_SY300_SX300_QL70_FMwebp_.jpg"
  },
  "availability": { "status": "In Stock", "ships_from": null, "sold_by": null },
  "badges": { "amazons_choice": true },
  "ratings_summary": {
    "average_rating": 4.6,
    "total_ratings": 23639,
    "five_star_percent": 84,
    "four_star_percent": 8,
    "three_star_percent": 3,
    "two_star_percent": 1,
    "one_star_percent": 4
  },
  "customer_reviews": [
    {
      "review_id": "R1M8ICBJSWGFVQ",
      "author": "E. R.",
      "rating": 5,
      "title": "Hold A Thousand Books in Your Hand",
      "date": "May 31, 2025",
      "verified_purchase": true,
      "helpful_votes": 1418,
      "variation_color": "Black",
      "body": "Imagine holding a thousand books in your hand…"
    }
  ],
  "variations": [
    { "dimension": "Color:", "value": "Black", "is_selected": true }
  ]
}
```

Request and output of a live call to an Amazon product page on Oct 20, 2026, trimmed for length. A field is returned when the page shows it.

## What data can you scrape from Amazon?

Product pages, search results and best sellers lists each come back as their own set of fields. These are the ones teams use most, with the path where each lives in the JSON.

| Field | What it holds | Example |
|---|---|---|
| `product.asin` | Amazon's product ID, the key to join every other dataset | `B0CFPJYX7P` |
| `product.title` | Full listing title | `Amazon Kindle Paperwhite 16GB (2024 model)…` |
| `product.brand` | Brand name shown on the listing | `Amazon` |
| `availability.status` | Stock message | `In Stock` |
| `ratings_summary.average_rating` | Star rating out of 5 | `4.6` |
| `ratings_summary.total_ratings` | Number of ratings | `23639` |
| `ratings_summary.five_star_percent` | Share of each star level, five to one | `84` |
| `customer_reviews[]` | Top reviews: rating, title, body, date, verified purchase, helpful votes | `{ "rating": 5, … }` |
| `feature_bullets[]` | The "About this item" bullets | `7" Paperwhite display…` |
| `technical_specs[]` | Name and value pairs from the specs table | `{ "name": "Display", … }` |
| `variations[]` | Colors, sizes and configurations, with the selected one | `{ "value": "Black" }` |
| `badges.amazons_choice` | Whether the listing carries Amazon's Choice | `true` |
| `results[].price` (search) | The price shown for each product in the search results | `35.99` |
| `results[].list_price` (search) | The struck-through price shown in the search results, when there is one | `35.99` |
| `results[]` (search) | Position, ASIN, title, price, rating, review count, sponsored flag, "bought in past month" | `{ "position": 2, … }` |
| `pagination.next_page_url` (search) | The next page of results, ready to request | `/s?k=wireless+earbuds&page=2…` |

## How to scrape Amazon with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Pick the Amazon URL.** A product page (`/dp/ASIN`), a search (`/s?k=…`), a best sellers list or a brand store all work the same way.
3. **Send it with the default configuration**: Adaptive Stealth Mode to open the page, Extract to return the fields, and the country whose prices you want.
4. **Read `parsed`** from the response. To keep only some fields, list them with their paths and the response returns just those.
5. **Run your full ASIN list in Batch** when one URL works the way you want.

```python Python
# pip install requests
import json
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://www.amazon.com/dp/B0CFPJYX7P",
    "mode": "auto",          # Adaptive Stealth Mode
    "extract": "auto",       # structured JSON
    "proxy_country": "us",   # prices and stock for the US store
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

data = response.json()["parsed"]
ratings = data.get("ratings_summary") or data.get("ratings")
print(data["product"]["title"], ratings["average_rating"])
print(json.dumps(data, indent=2))
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://www.amazon.com/dp/B0CFPJYX7P",
  mode: "auto",
  extract: "auto",
  proxy_country: "us",
});

const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
  signal: AbortSignal.timeout(180_000),
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);

const { parsed } = await response.json();
const ratings = parsed.ratings_summary ?? parsed.ratings;
console.log(parsed.product.title, ratings.average_rating);
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.amazon.com%2Fdp%2FB0CFPJYX7P&mode=auto&extract=auto&proxy_country=us"

# Only the fields you need
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.amazon.com%2Fdp%2FB0CFPJYX7P&mode=auto&extract=auto&proxy_country=us&extract_fields=product.title%2Cproduct.brand%2Cratings_summary.average_rating"
```

```python Python SDK
# pip install zenrows
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
response = client.get(
    "https://www.amazon.com/s?k=wireless+earbuds",
    params={"mode": "auto", "extract": "auto", "proxy_country": "us"},
)
for item in response.json()["parsed"]["results"]:
    print(item["position"], item["asin"], item.get("price"), item.get("rating"))
```

## Input

The scraper takes one Amazon URL per request, plus the options below. The same parameters go into every task of a Batch job, so the input for a thousand products is a list of URLs with these settings.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | Any Amazon page: product (`/dp/ASIN`), search, best sellers, brand store, offers |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when the page needs them |
| `extract` | string | `auto` | Returns the page's fields as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Comma-separated paths to keep, such as `product.title,product.brand` |
| `proxy_country` | string | any | Two-letter country code. Amazon shows prices, stock and delivery for the visitor's location |
| `wait_for` | string | none | A CSS selector to wait for before the page is read |
| `session_id` | integer | none | Reuse the same session across several requests, up to 10 minutes |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto",
    "proxy_country": "us"
  },
  "tasks": [
    { "url": "https://www.amazon.com/dp/B0CFPJYX7P", "external_id": "kindle-paperwhite" },
    { "url": "https://www.amazon.com/dp/B09B8V1LZ3", "external_id": "echo-dot" },
    { "url": "https://www.amazon.com/s?k=wireless+earbuds", "external_id": "search-earbuds" }
  ]
}
```

## Output

Every response is JSON with two keys: `html`, the page as Amazon served it, and `parsed`, the structured record. The shape of `parsed` follows the page type, so a product page and a search page return different groups. Both samples below are trimmed outputs of live requests.

```json Product page
{
  "product": {
    "asin": "B0CFPJYX7P",
    "title": "Amazon Kindle Paperwhite 16GB (2024 model), 7\" glare-free display and weeks of battery",
    "brand": "Amazon",
    "canonical_url": "https://www.amazon.com/clp/B0CFPJYX7P",
    "gallery_images": ["https://m.media-amazon.com/images/I/41Z7RtygkDL._AC_SR40,60_.jpg"]
  },
  "availability": { "status": "In Stock", "ships_from": null, "sold_by": null },
  "badges": { "amazons_choice": true, "sustainability_features": null },
  "feature_bullets": ["Kindle Paperwhite, 7\" Paperwhite display with high contrast ratio and fast page turns."],
  "technical_specs": [
    { "name": "Display", "value": "Amazon's 7\" Paperwhite display technology with built-in light, 300 ppi…" }
  ],
  "ratings_summary": {
    "average_rating": 4.6,
    "total_ratings": 23639,
    "five_star_percent": 84,
    "four_star_percent": 8,
    "three_star_percent": 3,
    "two_star_percent": 1,
    "one_star_percent": 4
  },
  "review_insights": [
    { "summary": "Customers express great satisfaction with the Kindle Paperwhite…", "mention_count": 2296 }
  ],
  "customer_reviews": [
    {
      "review_id": "R1M8ICBJSWGFVQ",
      "author": "E. R.",
      "rating": 5,
      "title": "Hold A Thousand Books in Your Hand",
      "date": "May 31, 2025",
      "verified_purchase": true,
      "helpful_votes": 1418,
      "body": "Imagine holding a thousand books in your hand…"
    }
  ],
  "variations": [
    { "dimension": "Color:", "value": "Black", "is_selected": true, "swatch_image": "https://m.media-amazon.com/images/I/01AtsfCiXHL._SS64_.jpg" }
  ]
}
```

```json Search results
{
  "search_context": {
    "query": "wireless earbuds",
    "total_results_label": "1-16 of over 20,000 results for"
  },
  "results": [
    {
      "position": 2,
      "asin": "B09LD2D1TV",
      "title": "TAGRY Bluetooth Headphones True Wireless Earbuds 60H Playback LED Power Display Earphones…",
      "price": 35.99,
      "list_price": 35.99,
      "rating": 4.4,
      "review_count": 89524,
      "purchased_last_month": "7K+ bought in past month",
      "is_sponsored": true,
      "product_url": "/TAGRY-Bluetooth-Headphones-Earphones-Waterproof/dp/B09LD2D1TV",
      "thumbnail_url": "https://m.media-amazon.com/images/I/7112aOlyUhL._AC_UY218_.jpg"
    },
    {
      "position": 3,
      "asin": "B0HCXPZ3PY",
      "title": "Wireless Earbuds, Bluetooth 5.4 Headphones Bass Stereo Ear Buds with Noise Cancelling Mic…",
      "price": 199.99,
      "rating": 4.9,
      "review_count": 55,
      "purchased_last_month": "500+ bought in past month",
      "is_sponsored": null,
      "product_url": "/Bluetooth-Headphones-Cancelling-Earphones-Waterproof/dp/B0HCXPZ3PY",
      "thumbnail_url": "https://m.media-amazon.com/images/I/61GATDR3pUL._AC_UY218_.jpg"
    }
  ],
  "pagination": {
    "current_page": 1,
    "total_pages": 3,
    "next_page_url": "/s?k=wireless+earbuds&page=2"
  }
}
```

Need a spreadsheet? Load `parsed` into pandas with `pd.json_normalize(...)` and write CSV or Excel. Need the page for an LLM? Ask for Markdown instead of JSON.

## Scrape Amazon from your coding agent

Claude Code, Cursor, Codex and any MCP client can scrape Amazon from a prompt.

The agent calls the same Fetch and Extract request a developer would, so the JSON above is what it reads. Connect the Zenrows MCP server once, or install the CLI and let the agent run it in the terminal.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://www.amazon.com/dp/B0CFPJYX7P" --proxy-country us
```

```text Then ask your agent
Use Zenrows to get the title, price, rating and review count of these
Amazon products and return them as a table sorted by rating:
https://www.amazon.com/dp/B0CFPJYX7P
https://www.amazon.com/dp/B09B8V1LZ3
```

## Scrape Amazon at scale with Batch and Crawl

**Batch** runs a list of Amazon URLs as one job: thousands of products in parallel, with your own ID on each result. Use it for daily price and stock checks across a catalog.

**Crawl** finds the URLs for you. Start it on a brand store or category page, keep the links that contain `/dp/`, and it returns every product page it reaches. Send that list to Batch.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto", "proxy_country": "us" },
    "tasks": [
      { "url": "https://www.amazon.com/dp/B0CFPJYX7P", "external_id": "kindle-paperwhite" },
      { "url": "https://www.amazon.com/dp/B09B8V1LZ3", "external_id": "echo-dot" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# asins.jsonl: one {"url": "...", "external_id": "...", "extract": "auto"} per line
zenrows batch create asins.jsonl --proxy-country us --wait
zenrows batch results <job-id> --out amazon-products.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.amazon.com/stores/Stanley/page/47A7E765-00AF-4F34-AC01-240A7EDD822A",
    "depth": 2,
    "max_pages": 200,
    "include_patterns": ["/dp/"]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto",
        "proxy_country": "us"
      },
      "tasks": [
        {
          "url": "https://www.amazon.com/dp/B0CFPJYX7P",
          "external_id": "amazon"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with Amazon data

| Use case | Data they pull | Who runs it |
|---|---|---|
| Competitor price monitoring | Current and list price, deal badge, seller, stock, per ASIN and country | Retail pricing and ecommerce teams |
| Review and sentiment analysis | Star distribution, top reviews, verified purchase, review insights | Product, CX and market research teams |
| Search rank tracking | Position, sponsored flag and price for a keyword on each results page | Brands and Amazon agencies |
| Product and market research | "Bought in past month", rating, review count, category and best sellers | Sellers, investors and analysts |
| Catalog and listing audits | Title, bullets, images, specs and variations against your own listing data | Brand protection and marketplace teams |
| AI shopping agents and RAG | The full product record, or the page as Markdown | AI and data teams |

## Tips for scraping Amazon

- **Request from the country you sell in.** Amazon prices, stock and delivery change with the visitor's location, so set the country to match the store you track.
- **Use the clean product URL.** `https://www.amazon.com/dp/ASIN` is shorter than the URL in your browser bar and returns the same page. Strip the `ref=` and tracking parameters.
- **Each variation has its own ASIN.** A shirt in five colors is five product pages. Read `variations[]` from one page, then request the others.
- **Follow search pagination from the response.** `pagination.next_page_url` is the next page of results, so a loop until it is empty collects every page of a query.
- **Keep the ASIN as your key.** Use it as the `external_id` in Batch, and every result joins back to your catalog without parsing URLs.
- **Other Amazon stores work the same way.** Point the scraper at amazon.co.uk, amazon.de, amazon.fr, amazon.es, amazon.ca, amazon.in, amazon.com.br, amazon.ae or amazon.se, with the matching country.

## Frequently asked questions

### Is it legal to scrape Amazon?

Collecting publicly available data from Amazon, such as prices, product details and ratings shown to every visitor, is common practice for price monitoring and market research. Reviews can include reviewers' names, and personal data is protected by laws such as the GDPR and the CCPA, so collect only what you have a legitimate reason to use. Check Amazon's terms for your use case and ask your lawyer if you are unsure.

### Is there an official Amazon API for product data?

Amazon has two. The Product Advertising API serves Amazon Associates and requires an approved affiliate account with recent qualifying sales. The Selling Partner API covers a seller's own listings, orders and inventory. Neither returns any product page on demand for any ASIN, which is why teams use a scraper for competitor data.

### What Amazon pages can I scrape?

Product pages ( /dp/ASIN ), search results, best sellers and other category lists, brand stores and offer listings, on amazon.com and the other Amazon country sites. Send the URL as it appears in your browser.

### Can I scrape Amazon prices for a specific country?

Yes. Set the country in the request and Zenrows opens the page from that location, so the price, currency, stock and delivery match what a shopper there sees. To track the same ASIN in several markets, send one request per Amazon domain and country.

### Can I scrape Amazon reviews?

Yes. Product pages return the top customer reviews with rating, title, text, date, helpful votes and the verified purchase flag, plus the star distribution and Amazon's review insights. Run your product URLs in Batch to collect reviews across a catalog.

### How do I scrape Amazon with Python?

Send a GET request to https://api.zenrows.com/v1/ with your API key, the Amazon URL, Adaptive Stealth Mode and Extract turned on, as in the Python example above. The response's parsed key holds the product as a Python dictionary. The zenrows package on PyPI wraps the same request.

### How many Amazon products can I scrape?

Send one URL per request, or a whole list as a Batch job that runs the URLs in parallel and keeps your own ID on each result. One Batch job accepts more than 10,000 URLs, sent inline or as a CSV file.

### Do I need to write or maintain selectors?

No. Extract returns each field by name, so your code reads parsed instead of parsing Amazon's HTML. For a field of your own, send a separate request with CSS selectors instead of Extract.

### Can AI agents scrape Amazon with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the products you want in plain language and the agent calls Fetch and Extract for you.

### Can I scrape Amazon on a schedule?

Yes. Create a scheduled Batch job with your Amazon URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the Amazon scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. Send results to Google Sheets, a database or a data warehouse from the workflow tool you already use. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with the structured record in parsed and the original page in html . You can also ask for the page as Markdown or plain text, which is what most LLM and RAG pipelines want.

## More Amazon scrapers

- [Amazon ASIN scraper](https://www.zenrows.com/scrape/amazon-asin.md)
- [Amazon reviews scraper](https://www.zenrows.com/scrape/amazon-reviews.md)
- [Amazon price scraper](https://www.zenrows.com/scrape/amazon-prices.md)
- [Amazon seller scraper](https://www.zenrows.com/scrape/amazon-sellers.md)
- [Amazon best sellers scraper](https://www.zenrows.com/scrape/amazon-best-sellers.md)

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
