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
- Open the Amazon Product Scraper in the Scrape.ly Store.
- Pick the Keyboards from a search URL preset. It fills in this input:
{
"categoryOrProductUrls": [
{
"url": "https://www.amazon.com/s?k=keyboard"
}
],
"maxItemsPerStartUrl": 5,
"maxSearchPagesPerStartUrl": 1,
"scrapeProductDetails": false
}- Click Start. Our run finished in about 6 seconds.
- 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, plusa.coandamzn.toshort 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.zipCodeorcountryCode: the delivery location, set the way Amazon's "Deliver to" dialog sets it. This one is charged separately, as you'll see below.maxOffersandscrapeSellers: 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:
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:
# 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:
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:
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:
{
"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 |
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=falsePrices 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:
{
"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
failedInputsin the run'sOUTPUTrecord. - Missing prices. If
priceis empty, the product probably doesn't ship to the proxy's location. Set a matchingproxyCountryor azipCode. - 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 (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.
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.




