Skip to content

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.

Published
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
In this article
  1. What data you can get from Amazon
  2. How to scrape Amazon without code
  3. How to scrape Amazon with the API
  4. With an AI agent (MCP)
  5. A real run: Keyboards from a search URL
  6. Localized prices and delivery: the ZIP 10001 run
  7. What it costs
  8. Limits and common problems
  9. Is it legal to scrape Amazon?
  10. Alternatives
  11. FAQ
  12. Can you scrape Amazon prices?
  13. How do you scrape Amazon by ZIP code?
  14. Can you scrape Amazon reviews?
  15. Do you need a proxy or an Amazon account?
  16. How many products can you get from one Amazon search?

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 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 in the Scrape.ly Store.
  2. Pick the Keyboards from a search URL preset. It fills in this input:
json
{
  "categoryOrProductUrls": [
    {
      "url": "https://www.amazon.com/s?k=keyboard"
    }
  ],
  "maxItemsPerStartUrl": 5,
  "maxSearchPagesPerStartUrl": 1,
  "scrapeProductDetails": false
}
  1. Click Start. Our run finished in about 6 seconds.
  2. 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.

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, the Python client, the JavaScript client and the dataset API 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 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
Text
2026-10-22T15:22:53.973Z [Scrapely] Container started (setup 0.8 s)
2026-10-22T15:22:55.286Z [scrapely.actor] INFO  [Scrapely] Initializing API storage for run 59500797f503419a8
2026-10-22T15:22:55.478Z [scrapely.actor] INFO  Starting 1 URL(s), up to 5 results each, without product pages.
2026-10-22T15:22:58.806Z [scrapely.actor] INFO  [Status message]: Finished 1 URL(s): 5 products saved.
2026-10-22T15:22:58.891Z [scrapely.actor] INFO  Run finished in 3.54s of actor code.
2026-10-22T15: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 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.

The Actor reads public catalog pages and never logs in. Amazon's own Conditions of Use (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, and calls to it now return 403 Forbidden. Its successor, the Creators API, 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 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 and Scrape.do's guide 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.

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.

  • amazon
  • ecommerce
  • price monitoring
  • python
  • api

About the author

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.

//Keep reading\\

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.

No credit card. No setup calls.