---
title: "Amazon price scraper"
description: "Scrape Amazon prices as JSON: current and list price, coupon price, lowest offer from other sellers, deal badges, per country. From Python, Node.js, the CLI or MCP."
canonical: https://www.zenrows.com/scrape/amazon-prices
updated: 2026-10-20
---

# Amazon price scraper

The Zenrows Amazon price scraper returns the prices on Amazon search and product pages as JSON: ASIN, title, price, list price, coupon price, the lowest price from other sellers, deal and Amazon badges, sponsored flag and units bought last month. Fetch in Adaptive Stealth Mode opens the page from the country you pick and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: amazon.com
- Returns: Prices, list prices, coupons and other sellers' lowest offers

## Run it: one Amazon search in, every price out

```json Input
{
  "url": "https://www.amazon.com/s?k=coffee+maker",
  "mode": "auto",
  "extract": "auto",
  "proxy_country": "us"
}
```

```json Output
{
  "search_context": { "query": "coffee maker" },
  "results": [
    {
      "position": 5,
      "asin": "B01GJOMWVA",
      "title": "BLACK+DECKER 12-Cup Drip Coffee Maker with Vortex Brewing",
      "price": 34.99,
      "list_price": null,
      "coupon_price": null,
      "more_buying_choices_price": 25.5,
      "discount_percent": null,
      "deal_badge": null,
      "amazon_badge": "overall_pick",
      "is_sponsored": null,
      "purchased_last_month": "30K+ bought in past month",
      "rating": 4.4
    },
    {
      "position": 9,
      "asin": "B0896NP59N",
      "title": "Hamilton Beach 2-Way Programmable Coffee Maker & Single Serve Coffee Maker",
      "price": 84.75,
      "list_price": null,
      "coupon_price": 64.95,
      "more_buying_choices_price": 58.46,
      "discount_percent": null,
      "deal_badge": null,
      "amazon_badge": null,
      "is_sponsored": null,
      "purchased_last_month": "3K+ bought in past month",
      "rating": 4.5
    }
  ],
  "pagination": {
    "next_page_url": "/s?k=coffee+maker&page=2&xpid=FczetvE_vyEdf&qid=1792462432&ref=sr_pg_1"
  }
}
```

Request and output of a live call to an Amazon search page from the US on Oct 20, 2026, trimmed to two of the 60 results on the page.

## What price data can you scrape from Amazon?

A search results page is the densest price source on Amazon: one request returns the price of every product in the list, with the coupon and the cheapest offer from other sellers when Amazon shows them. Product pages add the stock message and the seller of the main offer.

| Field | What it holds | Example |
|---|---|---|
| `results[].asin` | The product ID, the key for a price history | `B01GJOMWVA` |
| `results[].title` | Listing title as shown in the results | `BLACK+DECKER 12-Cup Drip Coffee Maker…` |
| `results[].price` | The price a shopper in the requested country sees | `34.99` |
| `results[].list_price` | The struck-through reference price, when shown | `249` |
| `results[].coupon_price` | The price after the clippable coupon | `64.95` |
| `results[].more_buying_choices_price` | The lowest price among other sellers' offers | `58.46` |
| `results[].discount_percent` | The discount Amazon prints next to the price | `null` |
| `results[].deal_badge` | Deal labels such as limited-time deals | `null` |
| `results[].amazon_badge` | Amazon's own badge on the listing | `overall_pick` |
| `results[].is_sponsored` | Whether the slot is a paid placement | `true` |
| `results[].purchased_last_month` | Amazon's "bought in past month" label, a demand signal next to the price | `30K+ bought in past month` |
| `results[].position` | Rank on the page, to see which price wins the top slots | `5` |
| `pagination.next_page_url` | The next page of the same search | `/s?k=coffee+maker&page=2…` |
| `pricing.currency_code` (product page) | Currency of the product page prices | `USD` |
| `pricing.trade_in_savings_percent` (product page) | The trade-in discount Amazon offers on the listing | `20` |
| `availability.status` (product page) | The stock message next to the price | `In Stock` |

## How to scrape Amazon prices with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Choose the page that matches your list.** A search such as `/s?k=coffee+maker` prices a whole category in one request. A product page, `/dp/ASIN`, prices one item with its stock and seller.
3. **Pick the country of the store.** Amazon prices depend on where the shopper is, so send the country that matches the domain: the US for amazon.com, Great Britain for amazon.co.uk, Germany for amazon.de.
4. **Send it with the default configuration**, Adaptive Stealth Mode plus Extract, and keep only the price fields if that is all you store.
5. **Save each run with a timestamp** in Batch, keyed by ASIN and country, and the price history builds itself.

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

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://www.amazon.com/s?k=coffee+maker",
    "mode": "auto",          # Adaptive Stealth Mode
    "extract": "auto",       # structured JSON
    "proxy_country": "us",   # prices as a US shopper sees them
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

seen_at = datetime.datetime.now(datetime.timezone.utc).isoformat()
for item in response.json()["parsed"]["results"]:
    if item.get("price") is None:
        continue
    print(seen_at, item["asin"], item["price"], item.get("coupon_price"), item.get("more_buying_choices_price"))
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://www.amazon.com/s?k=coffee+maker",
  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();
// Products where another seller undercuts the listed price
const undercut = parsed.results.filter(
  (r) => r.price && r.more_buying_choices_price && r.more_buying_choices_price < r.price,
);
console.log(undercut.map((r) => [r.asin, r.price, r.more_buying_choices_price]));
```

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

# Price fields only
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.amazon.com%2Fs%3Fk%3Dcoffee%2Bmaker&mode=auto&extract=auto&proxy_country=us&extract_fields=results.asin%2Cresults.price%2Cresults.list_price%2Cresults.coupon_price%2Cresults.more_buying_choices_price"
```

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

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
markets = {"us": "https://www.amazon.com/s?k=coffee+maker", "gb": "https://www.amazon.co.uk/s?k=coffee+maker"}
for country, url in markets.items():
    response = client.get(url, params={"mode": "auto", "extract": "auto", "proxy_country": country})
    for item in response.json()["parsed"]["results"][:5]:
        print(country, item["asin"], item.get("price"))
```

## Input

Each request takes one Amazon URL and the settings below. For a price monitor, the input is a list of search or product URLs, each with the country of its store.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | An Amazon search (`/s?k=…`), product page (`/dp/ASIN`) or category page, on any Amazon domain |
| `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 prices and listing fields as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Paths to keep, such as `results.asin,results.price,results.coupon_price` |
| `proxy_country` | string | any | Two-letter country code. Sets which store's prices, currency and delivery you see; match it to the domain |
| `wait_for` | string | none | A CSS selector to wait for before the page is read |
| `session_id` | integer | none | Keep the same session for several requests in a row, up to 10 minutes, when you page through one search |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto",
    "proxy_country": "us"
  },
  "tasks": [
    { "url": "https://www.amazon.com/s?k=coffee+maker", "external_id": "us-coffee-maker" },
    { "url": "https://www.amazon.com/dp/B01GJOMWVA", "external_id": "us-B01GJOMWVA" },
    { "url": "https://www.amazon.co.uk/s?k=coffee+maker", "external_id": "gb-coffee-maker", "zenrows_params": { "proxy_country": "gb" } },
    { "url": "https://www.amazon.de/s?k=kaffeemaschine", "external_id": "de-kaffeemaschine", "zenrows_params": { "proxy_country": "de" } }
  ]
}
```

A task's own settings override the job's, which is how one job prices the same query in three countries.

## Output

The response holds `html`, the page as Amazon served it, and `parsed`, the structured record. On a search page, `parsed.results` is the price list. Fields Amazon does not print for a product come back as `null`, so a missing coupon is `null`, not zero. Both samples are trimmed outputs of live requests from the US.

```json Search results: coffee maker
{
  "search_context": { "query": "coffee maker", "total_results_label": "000 results for" },
  "results": [
    {
      "position": 1,
      "asin": "B0H327XVRD",
      "title": "Nespresso Vertuo Pop+ Coffee & Espresso Maker by De'Longhi, Beige",
      "price": 129.99,
      "list_price": null,
      "coupon_price": null,
      "more_buying_choices_price": null,
      "is_sponsored": true,
      "purchased_last_month": "700+ bought in past month",
      "rating": 4.2,
      "thumbnail_url": "https://m.media-amazon.com/images/I/71GTCT-untL._AC_UL320_.jpg"
    },
    {
      "position": 6,
      "asin": "B0C8B9V7HR",
      "title": "BLACK+DECKER 12-Cup Coffee Maker with Easy On/Off Switch, Easy Pour, Non-Drip Carafe…",
      "price": 24.99,
      "list_price": null,
      "coupon_price": null,
      "more_buying_choices_price": 20.88,
      "is_sponsored": null,
      "purchased_last_month": "10K+ bought in past month",
      "rating": 4.3,
      "thumbnail_url": "https://m.media-amazon.com/images/I/51r-kXmr2jL._AC_UL320_.jpg"
    }
  ]
}
```

```json Search results: wireless earbuds
{
  "results": [
    {
      "position": 5,
      "asin": "B0HD5SJHGH",
      "title": "Open Ear Earbuds, Clip On Wireless Earbuds, 40H Bluetooth 6.0, Black",
      "price": 49.99,
      "coupon_price": 29.99,
      "rating": 4.3,
      "review_count": 6
    },
    {
      "position": 6,
      "asin": "B0FQFB8FMG",
      "title": "Apple AirPods Pro 3 Wireless Earbuds with Active Noise Cancellation",
      "price": 249,
      "list_price": 249,
      "more_buying_choices_price": 183.44,
      "purchased_last_month": "10K+ bought in past month",
      "rating": 4.4,
      "review_count": 16713
    }
  ],
  "pagination": {
    "current_page": 1,
    "total_pages": 3,
    "next_page_url": "/s?k=wireless+earbuds&page=2&xpid=wPBxkose2cjnl&qid=1792461698&ref=sr_pg_1"
  }
}
```

The AirPods row is the pattern price teams watch: Amazon lists the item at 249 while another seller offers it at 183.44. Flatten the results with `pd.json_normalize(parsed["results"])` and append them to a table with the run date.

## Track Amazon prices from your coding agent

Claude Code, Cursor, Codex and any MCP client can check Amazon prices from a prompt, in any country you name.

The agent sends the same Fetch and Extract request as the code above, with the country you ask for, and reads the price fields from `parsed`. 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/s?k=coffee+maker" --proxy-country us
```

```text Then ask your agent
Use Zenrows to search "coffee maker" on amazon.com from the US and on
amazon.co.uk from Great Britain. For the first 20 results in each, return
ASIN, title, price, coupon price and the lowest price from other sellers,
and flag every product where another seller is cheaper than the listed price.
```

## Track Amazon prices at scale with Batch and Crawl

**Batch** runs a price check over your whole list as one job: search pages for category coverage, product pages for the ASINs you care about, each with its country. Put the market and ASIN in the `external_id`, run the job on a schedule, and every result lands ready to append to a price history.

**Crawl** collects the product pages behind a search. Start it on a search URL, keep the links with `/dp/` and the pages of the same query, and it returns every product page it reaches. Use the list as the input of your daily Batch job.

```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/B01GJOMWVA", "external_id": "us-B01GJOMWVA" },
      { "url": "https://www.amazon.com/dp/B0896NP59N", "external_id": "us-B0896NP59N" },
      { "url": "https://www.amazon.co.uk/s?k=coffee+maker", "external_id": "gb-coffee-maker", "zenrows_params": { "proxy_country": "gb" } }
    ]
  }'

# 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)
# prices.jsonl: one line per URL, the country per line
# {"url": "https://www.amazon.com/dp/B01GJOMWVA", "external_id": "us-B01GJOMWVA", "proxy_country": "us", "extract": "auto"}
# {"url": "https://www.amazon.de/s?k=kaffeemaschine", "external_id": "de-kaffeemaschine", "proxy_country": "de", "extract": "auto"}
zenrows batch create prices.jsonl --wait
zenrows batch results <job-id> --out amazon-prices.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/s?k=coffee+maker",
    "depth": 2,
    "max_pages": 300,
    "include_patterns": ["/dp/", "k=coffee+maker"]
  }'
```

**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/s?k=coffee+maker",
          "external_id": "amazon-prices"
        }
      ]
    }'

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

## What teams do with Amazon prices

| Use case | Data they pull | Who runs it |
|---|---|---|
| Competitor price monitoring | Price, list price and coupon per ASIN, daily | Retail pricing and ecommerce teams |
| Repricing for marketplace sellers | Listed price against other sellers' lowest offer | Amazon sellers and repricing tools |
| MAP and reseller enforcement | Prices and offers below the brand's minimum advertised price | Brand protection and channel teams |
| Cross-country price comparison | The same query or ASIN on amazon.com, .co.uk, .de and other stores | Global pricing and expansion teams |
| Deal and coupon tracking | Coupons, deal badges and discounts on a category | Deal sites, affiliates and promo teams |
| Price history for analysis | Timestamped prices per ASIN across months | Analysts, investors and researchers |
| Shopping assistants | Current price and cheapest offer for a product a user asks about | AI and product teams |

## Tips for scraping Amazon prices

- **Always set the country.** On Oct 20, 2026, the same wireless earbuds search returned the TOZO A1 (`B09FT58QQP`) at 19.99 from the US and at 13.96 from a request with no country set. Pick one country per store and keep it fixed across runs.
- **Price categories from search, items from product pages.** The coffee maker search above returned 60 products in one request, so search pages are the efficient way to watch a category. Product pages add stock and the seller, so use them for the ASINs you report on.
- **Store `null` as missing, not zero.** A product with no visible price, no coupon or no other offers returns `null` for that field, and a zero would distort your averages.
- **Watch `more_buying_choices_price` against `price`.** When the first is lower, another seller undercuts the listed offer. For brands, that is often the first sign of an unauthorized reseller.
- **Keep sponsored slots apart.** `is_sponsored` marks paid placements, whose position tells you more about ad spend than about price.
- **Follow `pagination.next_page_url`** to price every page of a query, and use the same session for one query's pages.
- **Key every row by ASIN, country and timestamp.** The ASIN differs between some Amazon stores, so map each market's ASIN to your own SKU before comparing prices.

## Frequently asked questions

### Is it legal to scrape Amazon prices?

Prices, coupons and offers on public Amazon pages are shown to every visitor, and collecting them for price monitoring and market research is common practice. Price data rarely contains personal data, but laws such as the GDPR and the CCPA still apply if you collect any. Check Amazon's terms for your use case and ask your lawyer if you are unsure.

### Is there an official Amazon API for prices?

Amazon's Product Advertising API returns offers and prices to approved Amazon Associates with recent qualifying sales. The Selling Partner API has pricing endpoints for registered sellers, with request limits per account. Teams without either account, or who need the prices a shopper in a given country sees on the page, read them from Amazon's pages instead.

### What Amazon pages can I get prices from?

Search results, product pages ( /dp/ASIN ) and category lists, on amazon.com and the other Amazon country sites. Search pages give a price for every result on the page. Product pages give the price, stock and seller of one item.

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

Yes. Use the Amazon domain of that country and set the matching country in the request. Zenrows opens the page from that location, so the price, currency and delivery match what a local shopper sees. One Batch job can price the same query in several countries.

### Can I see the prices of other sellers?

Yes, at two levels. Search results return the lowest price among other sellers' offers next to the listed price. Product pages name the seller of the main offer when the page shows it. Comparing the two finds the listings where another seller is cheaper.

### How often can I check Amazon prices?

As often as your use case needs. A daily Batch job is the usual pattern, with the ASINs you compete on most closely checked several times a day. Each run is independent, so the schedule is up to you or your workflow tool.

### How do I build an Amazon price tracker in Python?

Send the search or product URL to https://api.zenrows.com/v1/ with Adaptive Stealth Mode, Extract and the country, as in the Python example. Append the ASIN, price, coupon price, other sellers' lowest price and a timestamp to a table on each run, then chart the history per ASIN.

### Can AI agents check Amazon prices 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 price of a product or a category in a given country 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 price 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. A scheduled n8n or Make workflow can write prices to Google Sheets or a database and alert on drops. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with prices as numbers in parsed and the original page in html . You can also ask for the page as Markdown or plain text for an LLM.

### How is this different from the other Amazon scrapers?

This page covers what products cost. The Amazon scraper covers product and search pages as a whole, the Amazon reviews scraper covers what buyers say, and the Amazon ASIN scraper turns a list of ASINs into full product records.

## More Amazon scrapers

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

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