---
title: "How to Scrape Amazon Product Data (2026) | Scrape.ly"
description: "How to scrape Amazon prices, ASINs and ratings without code or with Python. Includes a real run, ZIP code pricing, exact costs and limits."
url: https://scrape.ly/blog/how-to-scrape-amazon
markdown: https://scrape.ly/blog/how-to-scrape-amazon.md
---

[Tutorials](https://scrape.ly/blog/category/tutorials.md)

# How to Scrape Amazon: Prices, ASINs and Ratings From Search or Product URLs

Paste an Amazon search or product URL into a ready-made Actor and get one row per product with price, ASIN, rating and review count. This guide covers the no-code steps, the API, ZIP code pricing, a real run and its cost.

[Shelfbright Actor publisher on the Scrape.ly Store](https://scrape.ly/blog/author/shelfbright.md)

- Published

  Oct 22, 2026

- Reading time

  9 min read

![Pixel-art robot with an orange >\_ on its terminal head pulls a parcel from a stack of cardboard boxes marked with the Amazon smile logo and loads it into a crate](https://scrape.ly/media/how-to-scrape-amazon.png?w=1080)

The fastest way to scrape Amazon is to paste a search, category or product URL into a ready-made Actor and export what it saves: one row per product with title, ASIN, price, rating, review count and images. On Scrape.ly that takes a few clicks, or one API call.

This guide shows which fields you get, the no-code steps, and the same job in curl, Python, JavaScript and through an AI agent. It also covers localized prices, so you can see what Amazon shows a shopper in a specific ZIP code. Every number below comes from two real runs on 22 October 2026, including what they cost.

## What data you can get from Amazon

The [Amazon Product Scraper](https://scrape.ly/store/shelfbright/amazon-product-scraper.md) returns one row per product. With **Open each product page** on (the default) you get the full product record. With it off you get the lighter fields shown on the search results page.

| Field                                         | What it holds                                                            |
| --------------------------------------------- | ------------------------------------------------------------------------ |
| `title`                                       | Product name                                                             |
| `asin`                                        | Amazon Standard Identification Number, Amazon's product ID               |
| `url`                                         | Product page URL                                                         |
| `price`                                       | Object with `value` and `currency`, for example `19.99` and `$`          |
| `getPriceBeforeDiscount`                      | The crossed-out price on a search result, when Amazon shows one          |
| `stars`, `reviewsCount`                       | Average rating and number of ratings                                     |
| `monthlyPurchaseVolume`                       | The "bought in past month" text, for example `10K+ bought in past month` |
| `brand`, `breadCrumbs`                        | Brand and category path (from the product page)                          |
| `inStock`, `inStockText`                      | Availability                                                             |
| `features`, `description`, `attributes`       | Bullet points, long description and spec key/value pairs                 |
| `thumbnailImage`, `highResolutionImages`      | Image URLs                                                               |
| `variantAsins`, `variantDetails`              | Sibling variants with their names and ASINs                              |
| `seller`, `shipsFrom`, `returnPolicy`         | The featured seller and the buy-box rows                                 |
| `locationText`, `delivery`, `fastestDelivery` | The "Deliver to" text and the delivery dates on the page                 |

What you won't get: review text as separate rows, or anything behind an Amazon login. On product pages, some blocks (attributes, bestseller ranks, star breakdown, description, A+ content) are not always present.

## How to scrape Amazon without code

1. Open the [Amazon Product Scraper](https://scrape.ly/store/shelfbright/amazon-product-scraper.md) in the Scrape.ly Store.
2. Pick the [Keyboards from a search URL](https://scrape.ly/store/shelfbright/amazon-product-scraper/presets/search-url.md) preset. It fills in this input:

```json
{
  "categoryOrProductUrls": [
    {
      "url": "https://www.amazon.com/s?k=keyboard"
    }
  ],
  "maxItemsPerStartUrl": 5,
  "maxSearchPagesPerStartUrl": 1,
  "scrapeProductDetails": false
}
```

3. Click **Start**. Our run finished in about 6 seconds.
4. Open the dataset and export it as JSON, CSV or Excel.

The input fields that matter most:

- `categoryOrProductUrls` (required): search, category, bestseller or product URLs, plus `a.co` and `amzn.to` short links. Other Amazon domains, such as amazon.de, work too.
- `maxItemsPerStartUrl`: stop after this many products for each URL. Default 10.
- `maxSearchPagesPerStartUrl`: how many result pages to open per search or category. Default 1.
- `scrapeProductDetails`: on by default. Turn it off, as this preset does, when the title, price, rating and image from the search page are enough.
- `zipCode` or `countryCode`: the delivery location, set the way Amazon's "Deliver to" dialog sets it. This one is charged separately, as you'll see below.
- `maxOffers` and `scrapeSellers`: extra seller offers and the featured seller's rating. Both are off by default and charged per use.

Scrape.ly Store Amazon Product Scraper Paste Amazon search, category or product URLs and get one row per product: price, ASIN, rating, review count and images. Export to JSON, CSV or Excel.

[Try it free](https://scrape.ly/store/shelfbright/amazon-product-scraper.md) [Browse the Store](https://scrape.ly/store.md)

## How to scrape Amazon with the API

Create a token under **Settings → API & Integrations** in the dashboard and store it as `SCRAPELY_TOKEN`. This preset runs in a few seconds, so the synchronous endpoint can start it and return the items in one call:

```shell
curl -X POST "https://api.scrape.ly/v2/actors/shelfbright~amazon-product-scraper/run-sync-get-dataset-items"
  -H "Authorization: Bearer $SCRAPELY_TOKEN"
  -H "Content-Type: application/json"
  -d '{"categoryOrProductUrls": [{"url": "https://www.amazon.com/s?k=keyboard"}], "maxItemsPerStartUrl": 5, "maxSearchPagesPerStartUrl": 1, "scrapeProductDetails": false}'
```

The call waits up to 45 seconds and returns a JSON array. Add `?format=csv` to the URL for CSV. A bigger job, such as many search pages with product pages on, can take longer. Then the call answers `408` while the run keeps going. Don't call again, because that starts a second run. Use the asynchronous flow instead:

```shell
# 1. start the run; the response's data.id is the run ID
curl -X POST "https://api.scrape.ly/v2/actors/shelfbright~amazon-product-scraper/runs"
  -H "Authorization: Bearer $SCRAPELY_TOKEN"
  -H "Content-Type: application/json"
  -d '{"categoryOrProductUrls": [{"url": "https://www.amazon.com/s?k=keyboard"}], "maxItemsPerStartUrl": 5, "maxSearchPagesPerStartUrl": 1, "scrapeProductDetails": false}'
# 2. wait (up to 60 s per call; repeat until status is SUCCEEDED)
curl "https://api.scrape.ly/v2/actor-runs/RUN_ID?waitForFinish=60"
  -H "Authorization: Bearer $SCRAPELY_TOKEN"
# 3. read the items (CSV here)
curl "https://api.scrape.ly/v2/actor-runs/RUN_ID/dataset/items?format=csv"
  -H "Authorization: Bearer $SCRAPELY_TOKEN"
```

In Python, install the client with `pip install scrapely-client-python`. `call()` waits for the run however long it takes:

```python
import os
from scrapely_client import ScrapelyClient

client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")

run = client.actor("shelfbright/amazon-product-scraper").call(
    run_input={
        "categoryOrProductUrls": [{"url": "https://www.amazon.com/s?k=keyboard"}],
        "maxItemsPerStartUrl": 5,
        "maxSearchPagesPerStartUrl": 1,
        "scrapeProductDetails": False,
    }
)
print(run.status)  # SUCCEEDED, FAILED, ABORTED or TIMED-OUT
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item["asin"], (item.get("price") or {}).get("value"), item["title"])
```

In JavaScript or Node.js, install it with `npm install scrapely-client`:

```javascript
import { ScrapelyClient } from 'scrapely-client';

const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });

const run = await client.actor('shelfbright/amazon-product-scraper').call({
  categoryOrProductUrls: [{ url: 'https://www.amazon.com/s?k=keyboard' }],
  maxItemsPerStartUrl: 5,
  maxSearchPagesPerStartUrl: 1,
  scrapeProductDetails: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);
```

The [API docs](https://scrape.ly/docs/api-actors.md), the [Python client](https://scrape.ly/docs/client-python.md), the [JavaScript client](https://scrape.ly/docs/client-js.md) and the [dataset API](https://scrape.ly/docs/api-datasets.md) cover the other options.

### With an AI agent (MCP)

Scrape.ly runs a hosted MCP server at `https://api.scrape.ly/mcp`. In Cursor, add it to `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "scrapely": {
      "url": "https://api.scrape.ly/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}
```

In Claude Code, run `claude mcp add --transport http scrapely https://api.scrape.ly/mcp`, then `/mcp` to sign in with OAuth. The agent finds the Actor with `search-actors`, reads its input with `fetch-actor-details`, starts it with `call-actor` and reads the rows with `get-actor-output`. Try a prompt like: "Use scrapely to run shelfbright/amazon-product-scraper on https\://www\.amazon.com/s?k=keyboard with 5 results and no product pages, and give me a CSV of ASIN, title, price and rating." See the [MCP docs](https://scrape.ly/docs/mcp.md) for details.

## A real run: Keyboards from a search URL

We ran the preset on 22 October 2026. It saved 5 products, the run took 6.1 seconds, and it was charged $0.0046 in total.

| title                                                                  | asin       | price.value | stars | reviewsCount | monthlyPurchaseVolume     |
| ---------------------------------------------------------------------- | ---------- | ----------- | ----- | ------------ | ------------------------- |
| Logitech MK270 Full Size Wireless Keyboard and Mouse Combo - Black     | B079JLY5M5 | 19.99       | 4.5   | 111,300      | 10K+ bought in past month |
| Amazon Basics Wired QWERTY Keyboard, Works with Windows, Plug and Pla… | B07WJ5D3H4 | 11.15       | 4.5   | 10,000       | 10K+ bought in past month |
| MOFII Upgraded Wireless Ergonomic Keyboard, BT/2.4Ghz Tri-Mode with N… | B0HFHSJGTF | 59.99       | 4.2   | 338          | —                         |
| Redragon K521 Upgrade Rainbow LED Gaming Keyboard, 104 Keys Wired Mec… | B0DRFGNWV1 | 15.99       | 4.3   | 11,400       | 4K+ bought in past month  |
| AULA F75 Pro Wireless Mechanical Keyboard,75% Hot Swappable Custom Ke… | B0D14N2QZF | 64.99       | 4.6   | 1,800        | 5K+ bought in past month  |

```plaintext
20261022T15:22:53.973Z [Scrapely] Container started (setup 0.8 s)
20261022T15:22:55.286Z [scrapely.actor] INFO  [Scrapely] Initializing API storage for run 59500797f503419a8
20261022T15:22:55.478Z [scrapely.actor] INFO  Starting 1 URL(s), up to 5 results each, without product pages.
20261022T15:22:58.806Z [scrapely.actor] INFO  [Status message]: Finished 1 URL(s): 5 products saved.
20261022T15:22:58.891Z [scrapely.actor] INFO  Run finished in 3.54s of actor code.
20261022T15:22:59.377Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=false
```

Prices ranged from $11.15 to $64.99, and every product was rated between 4.2 and 4.6 stars. Four of the five carried a "bought in past month" figure. `brand` was empty on all five rows because the preset skips product pages, where the brand comes from. The first row's full record also has a `getPriceBeforeDiscount` of $29.99 next to the $19.99 price, `isSponsored: false`, and a `locationText` of "Delivering to Chicago 60602": the location Amazon picked on its own for this request.

### Localized prices and delivery: the ZIP 10001 run

Amazon's price, stock and delivery dates depend on where the order ships. Amazon can even hide the featured price when a product doesn't ship to the visitor's location. To pin a location, set `zipCode` (or `countryCode`). We ran the [2 products delivered to ZIP 10001](https://scrape.ly/store/shelfbright/amazon-product-scraper/presets/url-zip-delivery-location.md) preset the same day:

```json
{
  "categoryOrProductUrls": [
    {
      "url": "https://www.amazon.com/dp/B09X7MPX8L"
    },
    {
      "url": "https://www.amazon.com/dp/0735211299"
    }
  ],
  "maxItemsPerStartUrl": 1,
  "scrapeProductDetails": true,
  "zipCode": "10001"
}
```

It saved both products in 9.6 seconds and was charged $0.0837:

| title                                                                  | asin       | price.value | stars | reviewsCount |
| ---------------------------------------------------------------------- | ---------- | ----------- | ----- | ------------ |
| SANDISK 1TB Extreme microSD Card + Adapter, Up to 190MB/s Read Speeds  | B09X7MPX8L | 244.95      | 4.8   | 149,998      |
| Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad … | 0735211299 | 18.88       | 4.8   | 150,267      |

The SanDisk record shows `locationText` "Deliver to New York 10001", `deliveryLocationApplied: true` and `deliveryLocationShown` "New York 10001". It also has a `delivery` date of Tuesday, October 27 and a `fastestDelivery` of Tomorrow, October 23. If Amazon rejects a ZIP or still shows another place, the row is saved with `deliveryLocationApplied: false` and that product isn't charged the delivery-location fee.

## What it costs

The Actor charges per event. These are its prices:

| Event               | When it is charged                                               | Price   |
| ------------------- | ---------------------------------------------------------------- | ------- |
| `result`            | One product row                                                  | $0.0007 |
| `offer`             | One extra seller offer, only if you set `maxOffers`              | $0.001  |
| `seller`            | The featured seller's rating page, only if `scrapeSellers` is on | $0.001  |
| `delivery-location` | One product whose page showed the country or ZIP you set         | $0.04   |

**Search run:** 5 results × $0.0007 = $0.0035 in event fees. The run was charged $0.0046 in total, because platform usage added $0.000813 of compute, $0.000215 of datacenter proxy traffic and $0.000055 of storage writes.

**ZIP run:** 2 results × $0.0007 = $0.0014, plus 2 delivery locations × $0.04 = $0.08, for $0.0814 in event fees. Compute ($0.001279), proxy traffic ($0.000948) and storage writes ($0.00006) brought the total to $0.0837. The two delivery-location events alone were $0.08 of that.

**At 1,000 products:** 1,000 × $0.0007 = $0.70 in result fees. With a ZIP code on every product, add 1,000 × $0.04 = $40, for $40.70 in event fees. Platform usage comes on top in both cases. So set a delivery location only when the location changes the answer you need.

## Limits and common problems

- **Search depth.** Amazon shows about 20 result pages per search or category (roughly 200 to 250 products). Split a broad search into narrower ones to get more.
- **Blocks.** Search and category pages are the hardest to read. A blocked datacenter exit is retried through residential addresses, and you can turn on `useCaptchaSolver`. A page can still fail with a "blocked" description.
- **Failed URLs.** A URL that can't be read saves no product row and isn't charged. It's listed with the reason in the status message and under `failedInputs` in the run's `OUTPUT` record.
- **Missing prices.** If `price` is empty, the product probably doesn't ship to the proxy's location. Set a matching `proxyCountry` or a `zipCode`.
- **Timeouts on the sync endpoint.** Both runs here finished in under 10 seconds, but the synchronous call stops waiting at 45 seconds. Use the asynchronous flow for larger jobs.
- **Offers.** The offers lookup can return an empty list for a product that otherwise parses.

## Is it legal to scrape Amazon?

The Actor reads public catalog pages and never logs in. Amazon's own [Conditions of Use](https://www.amazon.com/gp/help/customer/display.html?nodeId=508088) (last updated August 14, 2026) are strict, though. They grant a license for personal, non-commercial use that excludes "any collection and use of any product listings, descriptions, or prices" and "any use of data mining, robots, or similar data gathering and extraction tools." Whether those terms bind you, and what follows if you break them, depends on your situation. Product rows rarely contain personal data, but reviews, reviewer names and some seller details can. Once you collect personal data, privacy laws such as the GDPR and the CCPA apply. This is not legal advice. If you plan to use Amazon data commercially, get advice from a lawyer for your case.

## Alternatives

- **Amazon's Creators API.** Amazon has deprecated the [Product Advertising API 5.0](https://webservices.amazon.com/paapi5/documentation/), and calls to it now return `403 Forbidden`. Its successor, the [Creators API](https://affiliate-program.amazon.com/creatorsapi/docs/en-us/introduction), offers SearchItems, GetItems, GetVariations and GetBrowseNodes. It is only open to Amazon Associates with at least 10 qualifying sales in the past 30 days. If you're an active Associate building affiliate content, it's the better choice.
- **Your own Python scraper.** Oxylabs' open [tutorial repository](https://github.com/oxylabs/how-to-scrape-amazon-product-data) builds one with requests, BeautifulSoup and lxml. It's good for learning how the pages are built. You then handle headers, blocks and layout changes yourself.
- **A scraping API plus your own parser.** [Scrapfly's guide](https://scrapfly.io/blog/posts/how-to-scrape-amazon) and [Scrape.do's guide](https://scrape.do/blog/amazon-scraping/) pair Python parsing code with their paid APIs, which deal with blocking. This fits if you want to own the parsing but not the proxies.
- **A headless browser.** Playwright or Selenium gives you full control over what the page does. It's the better choice when you need interactions no ready-made tool covers, at the cost of running browsers and proxies yourself.

## FAQ

### Can you scrape Amazon prices?

Yes. `price` holds the value and currency, and search rows also carry `getPriceBeforeDiscount` when Amazon shows a crossed-out price. For price tracking, save a task with your product URLs and run it on a schedule. Prices depend on the delivery location, so set a `zipCode` if you need comparable numbers over time.

### How do you scrape Amazon by ZIP code?

Set `zipCode` to the ZIP you want, for example `"10001"`. Check `deliveryLocationApplied` and `deliveryLocationShown` on each row to confirm Amazon used it. Each product that showed your location costs $0.04 on top of the $0.0007 result fee.

### Can you scrape Amazon reviews?

This Actor saves no review text rows. Each product row has `stars` and `reviewsCount`, and product pages can add a `starsBreakdown` with the share of each star rating. Review text can contain personal data, so think about privacy law before you collect it with any tool.

### Do you need a proxy or an Amazon account?

No. The Actor needs no login, and proxies are included. It uses datacenter addresses by default and switches to residential addresses when a datacenter exit is blocked.

### How many products can you get from one Amazon search?

Up to the limit you set with `maxItemsPerStartUrl` and `maxSearchPagesPerStartUrl`. Amazon itself stops at about 20 pages per search. For more, run several narrower searches or categories in one input.

Scrape.ly Store Amazon Product Scraper Track Amazon prices, ratings and delivery dates by search, category or ASIN. Pay per product, with ZIP codes and seller extras only when you turn them on.

[Try it free](https://scrape.ly/store/shelfbright/amazon-product-scraper.md) [Browse the Store](https://scrape.ly/store.md)

About the author

[Shelfbright](https://scrape.ly/blog/author/shelfbright.md) Actor publisher on the Scrape.ly Store

Prices, stock and seller data from shops and marketplaces, from Amazon and AliExpress to Vinted and Leboncoin. For price trackers, catalogue teams and resellers. A Scrapely studio.

- [Website](https://scrape.ly/users/shelfbright.md)

Keep reading

## More in Tutorials

- [![Pixel-art robot with a grey terminal head showing an orange >\_ pulls a search result card out of a browser window showing the Google G logo and drops it into a crate](https://scrape.ly/media/scrape-google-search-results.png?w=750)](https://scrape.ly/blog/scrape-google-search-results.md)
  ### [How to Scrape Google Search Results: Rankings, People Also Ask and Related Searches](https://scrape.ly/blog/scrape-google-search-results.md)
  [Scrape Google search results by query and country and get each results page as JSON: organic results with positions, People Also Ask and related searches. Run it without code or from Python, with a real run, the cost per page and Google's terms.](https://scrape.ly/blog/scrape-google-search-results.md)
- [![Pixel-art robot with a grey terminal head showing an orange >\_ pulls a job card off a LinkedIn job board, marked with the LinkedIn logo, and drops it into a crate](https://scrape.ly/media/scrape-linkedin-jobs.png?w=750)](https://scrape.ly/blog/scrape-linkedin-jobs.md)
  ### [How to Scrape LinkedIn Jobs: Titles, Companies and Full Descriptions](https://scrape.ly/blog/scrape-linkedin-jobs.md)
  [Scrape public LinkedIn job listings by keyword and location, with no login: titles, companies, posting dates, seniority, descriptions and company details. Run it without code or from the API, with a real 10-job run and its cost.](https://scrape.ly/blog/scrape-linkedin-jobs.md)
- [![Pixel-art robot with an orange >\_ on its terminal head pulls a pink reel card with a play button out of a phone showing the Instagram logo and a grid of posts, and loads it into a crate of colored tiles](https://scrape.ly/media/scrape-instagram.png?w=750)](https://scrape.ly/blog/scrape-instagram.md)
  ### [How to Scrape Instagram Reels, Posts and Comments Without a Login](https://scrape.ly/blog/scrape-instagram.md)
  [You can scrape Instagram's public profiles, posts, reels and comments without logging in: captions, likes, plays, timestamps and owner details. Here is how, without code or with the API, using a real run on National Geographic's reels.](https://scrape.ly/blog/scrape-instagram.md)

## The internet is full of data. Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

[Get Started Free](https://my.scrape.ly/register) [Chat with Support](mailto:support@scrape.ly?subject=Question%20about%20Scrape.ly\&body=Hi%2C%20I%20have%20a%20question%20about%20Scrape.ly.)

No credit card. No setup calls.
