← All articles

How to Scrape Amazon Prices: The Plugin and the Spider Cloud

There are two ways to get Amazon price data, and which one you need depends on volume. For a product page or a keyword search, the Amazon plugin returns everything as clean JSON in a single call. For millions of pages on a schedule, you run your own Scrapy spider on our spider cloud, with every request already routed through the same anti-bot API. This guide covers both, and where the line between them is.

Two problems sink most Amazon price scrapers, and it helps to name them before writing any code:

  1. The bot wall. A plain HTTP request to a /dp/ product page gets Amazon’s “Robot Check” or a 503, not the price. You need a real browser fingerprint and a clean exit IP, rotated.
  2. The currency. This one is quieter and catches people out. Amazon prices every page in the currency of the delivery location it infers from your exit IP. Scrape amazon.com from a random datacenter in Denmark and the price comes back in DKK, or you get a “cannot be shipped to your location” page with no price at all. The scrape “worked”, the number is just wrong.

The plugin solves both for you. Let’s start there.

Scrape one Amazon product as JSON

The product endpoint takes an ASIN (or a full product URL) and returns the fields people actually want: title, brand, price and currency, list price and the discount, availability, rating, review count, seller, feature bullets, categories and images.

curl -X POST "https://api.scrapeunblocker.com/marketplace/amazon-product?asin=B0BSHF7WHW&marketplace=amazon.com" \
  -H "x-scrapeunblocker-key: YOUR_API_KEY"
{
  "asin": "B0BSHF7WHW",
  "title": "Apple 2023 MacBook Pro Laptop M2 Pro chip",
  "brand": "Apple",
  "price": 1999.00,
  "currency": "USD",
  "listPrice": 2499.00,
  "savingsPercent": 20,
  "availability": "In Stock",
  "inStock": true,
  "rating": 4.7,
  "reviewCount": 386,
  "images": ["https://m.media-amazon.com/images/I/61fd2oCrvyL.jpg"]
}

Notice the currency is USD, not whatever the exit IP happened to be. That is the point: proxy_country defaults to the marketplace’s home country - amazon.com to US, amazon.de to DE, amazon.co.uk to GB - and the request is pinned to an ISP exit in that country. The price is in the currency your users expect, with nothing to configure. If you do want a specific delivery region, pass proxy_country yourself.

Search Amazon by keyword

The search endpoint takes a keyword and returns the result cards - ASIN, title, price, list price, rating, review count, a clean product URL, and the sponsored / Prime flags. It is the discovery half: search to get ASINs, then fetch each one’s full detail through the product endpoint.

import requests

BASE = "https://api.scrapeunblocker.com/marketplace"
HEAD = {"x-scrapeunblocker-key": "YOUR_API_KEY"}

# Find products, cheapest first
search = requests.post(
    f"{BASE}/amazon-search",
    params={"keyword": "wireless headphones", "sort": "price_asc"},
    headers=HEAD, timeout=180,
).json()

for card in search["results"][:5]:
    print(card["asin"], card["price"], card["currency"], card["rating"])

# Then pull the full product for the cheapest one
top = search["results"][0]["asin"]
product = requests.post(
    f"{BASE}/amazon-product",
    params={"asin": top},
    headers=HEAD, timeout=180,
).json()
print(product["title"], product["priceRaw"], product["availability"])

You can filter with min_price / max_price, sort by price_asc, price_desc, avg_review or newest, and page with page. Some cards come back with price: null - that is Amazon deferring the price on the search page, or an item that only shows buying options. Those cards stay in the list rather than being dropped, so you always see the full page.

With an SDK

Every official SDK exposes both methods, so you do not build the request yourself:

// Node.js
const product = await su.amazonProduct({ asin: "B0BSHF7WHW" });
const results = await su.amazonSearch("wireless headphones", { sort: "price_asc" });
# Python
product = su.amazon_product(asin="B0BSHF7WHW")
results = su.amazon_search("wireless headphones", sort="price_asc")

Ruby (amazon_search) and PHP (amazonSearch) have the same pair. All of them default the exit to the marketplace’s country, so the currency is handled the same way.

When you need scale: a spider on the cloud

The plugin is the right tool for a product page, a search, a price check, a dashboard that refreshes a few thousand SKUs. When you cross into hundreds of thousands or millions of pages on a schedule - a full category tracked daily, a competitor’s entire catalog, price history across every marketplace - you want a crawler, not a call loop. That is what the spider cloud is for.

It runs your own Scrapy project on our infrastructure, and the important part for Amazon is that every request already goes through the same anti-bot API the plugin uses. You write ordinary Scrapy - spiders, items, pipelines - and the bot wall and exit rotation are handled underneath. You are not building proxy management, retry logic or fingerprinting; you are writing the parse.

A minimal Amazon price spider looks like any other Scrapy spider:

import scrapy

class AmazonPriceSpider(scrapy.Spider):
    name = "amazon_prices"

    def start_requests(self):
        for asin in self.settings.get("ASINS", []):
            yield scrapy.Request(
                f"https://www.amazon.com/dp/{asin}",
                meta={"asin": asin},
            )

    def parse(self, response):
        price = response.css("#corePriceDisplay_desktop_feature_div "
                             ".a-price-whole::text").get()
        yield {
            "asin": response.meta["asin"],
            "title": response.css("#productTitle::text").get(default="").strip(),
            "price": price,
            "scraped_at": self.crawler.stats.get_value("start_time"),
        }

You deploy it with one command from the project root:

su-cloud deploy --notes "amazon price spider"

The fastest way to get there is our Spider Cloud starter template on GitHub - a ready-to-run Scrapy project with a working example spider and the whole deploy -> run -> read-your-data flow already wired up. Click Use this template, drop in your token, and you have a spider running in the cloud in a few minutes; then swap the example for your Amazon spider.

From there you buy the parallelism you need, put it on a schedule (daily, hourly), and read items back as JSON while the job is still running. Jobs, logs, live item counts and stats are all in the dashboard. The spider cloud is our own equivalent of a hosted Scrapy service, with the anti-bot layer built in rather than bolted on - the same layer, whether you call the plugin or run a spider through it.

Which one should you use?

  • A product, a search, a price check, a modest dashboard - the plugin. One call, JSON back, right currency, no infrastructure.
  • A whole catalog, a category tracked on a schedule, price history at millions of pages - a Scrapy spider on the spider cloud. You write the crawl; we handle the blocking and the scale.

Both read the same pages a shopper sees, with your ScrapeUnblocker key and nothing else - no Selling Partner account, no Product Advertising API approval, no affiliate tie. Start with the plugin in the dashboard, and reach for the cloud when the volume asks for it.

Try ScrapeUnblocker free

95%+ success rate · from 0.55€ per 1,000 calls · 500 free requests on signup.

Try it free → See pricing