How to scrape Amazon product data without getting blocked

Search results, prices, ratings and ASINs from Amazon as JSON: why the DIY approach fails fast, what the data costs, and a tested Python example. August 2026.

Price tracking, competitor monitoring, catalog enrichment: they all start with the same need, Amazon product data as structured fields instead of HTML. This is how to get it reliably, with a tested example and the actual per-request cost.

Why does scraping Amazon directly fail?

Amazon runs some of the most aggressive anti-bot infrastructure on the public web, and it fails you in stages rather than all at once:

  1. Blocks come fast. Datacenter IPs get the robot check within a handful of requests. Residential proxies last longer but cost real money per gigabyte, and Amazon actively profiles session behaviour, not just IPs.
  2. The markup shifts constantly. Amazon A/B tests layouts per marketplace, per category and per session. A parser that works on amazon.com electronics today breaks on amazon.de kitchenware tomorrow.
  3. The silent failure mode is worse than the loud one. Instead of an error page you often get a degraded page: no price, no rating, sponsored results only. Your pipeline keeps running and quietly fills your database with holes.

The result: the DIY route is not one script, it is a proxy budget plus a parser team. If product data is not your product, that is the wrong place to spend engineering time.

The version that works

import requests

API_KEY = "faf_live_..."  # your FastAF key

resp = requests.get(
    "https://api.fastaf.co/v1/amazon",
    params={
        "query": "mechanical keyboard",
        "domain": "com",
    },
    headers={"Authorization": f"Bearer {API_KEY}"},
    timeout=60,
)
resp.raise_for_status()

for item in resp.json()["results"]:
    if item["type"] == "search_product":
        print(f'{item["price"]:>8}  {item["stars"]}★ ({item["total_reviews"]})  {item["asin"]}  {item["title"][:60]}')

We ran exactly this request while writing this post (August 2026). One search returned 16 organic products plus the sponsored-brand blocks, for 1 credit, each product carrying: asin, price and extracted_price (numeric), old_price for strikethrough discounts, stars, total_reviews, number_of_people_bought (“3K+ bought in past month”), is_best_seller, is_amazon_choice, has_prime, limited_time_deal, delivery estimates, and the product URL. The domain parameter switches marketplace (com, co.uk, de, it, …), page paginates, postal_code localises availability and delivery.

Search or product endpoint?

The search endpoint above answers “what ranks for this query and at what price”. For deep data on one listing, pass an ASIN instead:

resp = requests.get(
    "https://api.fastaf.co/v1/amazon",
    params={"resource": "product", "asin": "B0CF3VGQFL", "domain": "com"},
    headers={"Authorization": f"Bearer {API_KEY}"},
    timeout=60,
)

That returns the full product page as fields: bullet points, description, images, variants, seller and buybox information, category ranks. The practical pattern for price tracking is search once to discover ASINs and positions, then hit the product endpoint only for the listings you actually track.

What does Amazon data cost?

An Amazon request on FastAF costs 1 credit, the cheapest endpoint we run, because no JavaScript rendering is needed. Concretely, at August 2026 prices:

Volume Credits Pack that covers it Cost
1,000 products, daily refresh 30,000 (30 days) Growth, $29 ~$11.60 of the pack
10,000 products, daily refresh 300,000 (30 days) Scale, $99 the whole pack
One-off catalog sweep, 50,000 items 50,000 Growth, $29 ~$19.30 of the pack

A failed or blocked request is never billed: credits are reserved when the request starts and returned if no result comes back. The free tier is 500 credits without a card, which is 500 Amazon requests, enough to validate field coverage on your own category before paying anything.

The mistakes that actually cost money

Tracking with search instead of the product endpoint. Search results omit per-seller data and can reorder; ASINs are stable. Discover with search, track with resource=product.

Ignoring extracted_price. The price field is a display string (“$69.99”); extracted_price is the number. Parse-by-regex on display strings is how currency bugs are born.

Refreshing everything at the same rate. Prices on volatile listings (deals, buybox battles) move hourly; long-tail catalog items move weekly. Split your refresh tiers and most of your credit budget disappears.

Assuming one marketplace. The same ASIN can differ in price, availability and even title across com, de and co.jp. If you sell in three markets, track three domain values; it is three credits, not one.