I Built a Real-Time Amazon Data API So You Don't Have to Fight Captchas
If you've ever tried scraping Amazon, you already know the pain.
You write a script. It works once. Maybe twice. Then suddenly:
403 Forbidden- CAPTCHA page
- empty price field
- weird JavaScript-rendered markup
- blocked IP
- broken selector
- “works on my machine” but fails in production
Then you start adding all the fun stuff:
- rotating proxies
- fake user agents
- headless browsers
- session cookies
- human-like delays
- retry logic
- region handling
- price-history storage
At some point, you're not building your actual product anymore. You're maintaining a scraping machine.
That's exactly why I built this API.
You send a keyword or an ASIN.
You get clean, structured JSON back.
No browser to run.
No selectors to maintain.
No CAPTCHA wall to fight.
Just product data, search results, reviews, offers, price history, deals, bestsellers, categories, storefronts, and more.
👉 API link: https://zylalabs.com/api-marketplace/commerce+%26+ecommerce/amazon+scraper+and+product+data+api/14050
What this API is
This is a production-grade Amazon product data API.
Instead of scraping Amazon yourself, you call one REST endpoint and get normalized JSON for:
- product details
- prices
- availability
- ratings
- reviews
- offers
- variations
- deals
- bestsellers
- categories
- storefronts
- brands
- A+ content
- delivery estimates
- price history
- recommendations
- frequently bought together bundles
- autosuggest queries
- and more
It works across 20 Amazon marketplaces using a single API surface.
Need US data? Use ?region=us.
Need Germany? Use ?region=de.
Japan? ?region=jp.
India? ?region=in.
Same endpoints. Same response shape. Different marketplace.
That's the whole idea: make Amazon data boring, predictable, and easy to work with.
Why I built it this way
A lot of scraping tools only solve half the problem.
They give you a proxy, or they give you raw HTML, or they give you a browser automation setup and leave the rest to you.
But the real problem is not just “fetch the page.”
The real problem is:
- keeping the data clean
- handling anti-bot behavior
- handling different regions
- handling price changes
- handling pagination
- handling retries
- handling cache
- handling failures without your app breaking
So this API tries to solve the annoying parts in one place.
What it does for you
- Handles anti-bot logic with human-like pacing, sessions, and CAPTCHA-aware retries.
- Renders pages like a real shopper, so you don't miss data hidden behind dynamic markup.
- Normalizes the response into clean JSON.
- Caches repeated requests, so warm responses return in under 50 ms.
- Tracks price history automatically for product detail calls.
- Supports 20 regions with localized currency, locale, and marketplace behavior.
- Returns structured errors so your code can actually handle failures properly.
In short: you build your app. The API deals with Amazon.
The problem with scraping Amazon yourself
Let's say you want to track the price of an air fryer.
Sounds simple, right?
You open Amazon. You find the product. You see the price.
Then you try to scrape it.
Now you need:
- a working proxy
- a realistic browser fingerprint
- cookies
- retry logic
- CAPTCHA handling
- region-specific URLs
- currency parsing
- availability parsing
- variation handling
- fallback logic when Amazon changes the page structure
And if you want price history?
Now you also need a database, a scheduler, and a mechanism to avoid re-scraping too aggressively.
That's way too much infrastructure for something that should be a simple API call.
With this API, the same task becomes:
python
product = api.product("B0BSHF7WHW", region="us")
print(product["data"]["price"]["price"]["amount"])
That's it.
What you can build with it
This is useful for a lot of real projects:
1. Price drop alerts
Track product prices and notify users when the price falls.
2. Affiliate dashboards
Monitor prices, ratings, reviews, and availability for affiliate products.
3. Product research tools
Compare products across regions, categories, and sellers.
4. Deal aggregators
Pull today's deals and lightning deals into your own deal feed.
5. Competitor monitoring
Track competitor ASINs, offers, and availability.
6. AI shopping assistants
Feed structured product data into LLM-based product recommendation tools.
7. Inventory and catalog sync
Keep your internal product catalog enriched with live Amazon data.
8. Browser extensions
Show price history, ratings, and offers directly in your own extension UI.
Quick start
The API is hosted on RapidAPI and Zylalabs.
Base URL:
Python SDK
python import os import requests class AmazonDataAPI: BASE_URL = "https://zylalabs.com/api-marketplace/commerce+%26+ecommerce/amazon+scraper+and+product+data+api/14050" def __init__(self, api_key=None): self.api_key = api_key or os.getenv("ZYLALABS_KEY") if not self.api_key: raise ValueError("Missing RapidAPI key. Set ZYLALABS_KEY or pass it directly.") self.headers = { "X-ZYLALABS-Key": self.api_key, "X-ZYLALABS-Host": self.HOST, } def _get(self, path, params=None): params = { key: value for key, value in (params or {}).items() if value is not None and value != "" } response = requests.get( f"{self.BASE_URL}/{path}", headers=self.headers, params=params, ) if response.status_code != 200: try: error = response.json() code = error.get("code", "UNKNOWN_ERROR") message = error.get("message", response.text) retry_after = error.get("retry_after") except Exception: code = "UNKNOWN_ERROR" message = response.text retry_after = None raise Exception(f"{code}: {message} (retry_after={retry_after})") return response.json() # Product endpoints def product(self, asin, region="us", nocache=False): return self._get( f"products/{asin}", { "region": region, "nocache": 1 if nocache else None, }, ) def full_product(self, asin, region="us"): return self._get( f"products/{asin}/full", { "region": region, }, ) def reviews(self, asin, region="us", page=1, sort="recent", nocache=False): return self._get( f"products/{asin}/reviews", { "region": region, "page": page, "sort": sort, "nocache": 1 if nocache else None, }, ) def offers(self, asin, region="us", nocache=False): return self._get( f"products/{asin}/offers", { "region": region, "nocache": 1 if nocache else None, }, ) def variations(self, asin, region="us", nocache=False): return self._get( f"products/{asin}/variations", { "region": region, "nocache": 1 if nocache else None, }, ) def price_history(self, asin, region="us", since=None, limit=200): return self._get( f"products/{asin}/price-history", { "region": region, "since": since, "limit": limit, }, ) def aplus(self, asin, region="us"): return self._get( f"products/{asin}/aplus", { "region": region, }, ) def recommendations(self, asin, region="us", nocache=False): return self._get( f"products/{asin}/recommendations", { "region": region, "nocache": 1 if nocache else None, }, ) def qna(self, asin, region="us", nocache=False): return self._get( f"products/{asin}/qna", { "region": region, "nocache": 1 if nocache else None, }, ) def frequently_bought_together(self, asin, region="us", nocache=False): return self._get( f"products/{asin}/fbt", { "region": region, "nocache": 1 if nocache else None, }, ) def videos(self, asin, region="us", nocache=False): return self._get( f"products/{asin}/videos", { "region": region, "nocache": 1 if nocache else None, }, ) def badges(self, asin, region="us"): return self._get( f"products/{asin}/badges", { "region": region, }, ) def promotions(self, asin, region="us"): return self._get( f"products/{asin}/promotions", { "region": region, }, ) def delivery(self, asin, region="us", postal=None, nocache=False): return self._get( f"products/{asin}/delivery", { "region": region, "postal": postal, "nocache": 1 if nocache else None, }, ) # Catalog endpoints def search(self, query, region="us", page=1, nocache=False): return self._get( "search", { "q": query, "region": region, "page": page, "nocache": 1 if nocache else None, }, ) def deals(self, region="us", nocache=False): return self._get( "deals", { "region": region, "nocache": 1 if nocache else None, }, ) def deals_by_category(self, node, region="us", nocache=False): return self._get( f"deals/{node}", { "region": region, "nocache": 1 if nocache else None, }, ) def bestsellers(self, region="us", nocache=False): return self._get( "bestsellers", { "region": region, "nocache": 1 if nocache else None, }, ) def categories(self, region="us", nocache=False): return self._get( "categories", { "region": region, "nocache": 1 if nocache else None, }, ) def category_items(self, node, region="us", nocache=False): return self._get( f"categories/{node}", { "region": region, "nocache": 1 if nocache else None, }, ) def storefront(self, store, region="us", nocache=False): return self._get( f"stores/{store}", { "region": region, "nocache": 1 if nocache else None, }, ) def brand(self, slug, region="us", nocache=False): return self._get( f"brands/{slug}", { "region": region, "nocache": 1 if nocache else None, }, ) def autosuggest(self, query, region="us"): return self._get( "autosuggest", { "q": query, "region": region, }, ) def regions(self): return self._get("regions") ## Example Response { "meta": { "request_id": "prod-9f1c…", "region": "us", "cached": false, "latency_ms": 1834, "retries_used": 0 }, "data": { "asin": "B0BSHF7WHW", "region": "us", "url": "https://www.amazon.com/dp/B0BSHF7WHW", "title": "Instant Vortex Plus 7-in-1 Air Fryer", "brand": "Instant", "price": { "price": { "amount": 99.95, "currency": "USD", "decimal": "." }, "list_price": { "amount": 119.95, "currency": "USD", "decimal": "." }, "savings": { "amount": 20.00, "currency": "USD", "decimal": "." }, "savings_pct": 16.7, "availability": "In Stock" }, "rating": 4.6, "review_count": 41230, "images": [ { "url": "https://m.media-amazon.com/…", "variant": "Main" } ], "features": [ "7-in-1 functionality", "EvenCrisp technology" ], "rank": [ { "category_id": "…", "category_name": "Air Fryers", "rank": 12 } ], "scraped_at": "2026-08-02T14:21:07Z" } } 
