Amazon ASIN Scraper & Seller Listing
Pricing
Pay per usage
Amazon ASIN Scraper & Seller Listing
Amazon ASIN Scraper quickly extracts product data using ASINs. Get titles, prices, ratings, reviews, variations, images, features, seller info, and stock details. Ideal for research, monitoring, and product analytics with clean, structured JSON output.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Amazon ASIN Scraper — Buy Box, Seller Offers and Hijacker Data
Amazon ASIN Scraper pulls the full product record for a list of ASINs plus every merchant competing for the buy box, read live from Amazon's All-Offers-Display panel: seller ID, feedback percentage, FBA status, ships-from and price for each offer, the isolated buy-box winner, the price gap to the cheapest merchant, and — when you supply your own allow-list — exactly which sellers on the listing are not authorized. Built for brand-protection teams, repricers and e-commerce agencies who need seller-level detail an ordinary product scraper does not return. Works logged out, no Amazon account required.
What is Amazon ASIN Scraper?
Amazon ASIN Scraper is an Apify Actor that takes a list of ASINs or product URLs and returns, per ASIN, the standard product record (title, price, rating, images, variants, bestseller rank) plus an offers[] array built by paging through Amazon's offer panel. It runs entirely logged out — no Amazon account, cookie or seller credential is used.
It does not return individual customer review text. Amazon serves no review widget on the product page or any of its review surfaces when the request is unauthenticated, so reviewsCount and starsBreakdown are returned but individual review bodies are not — that field was removed from the output entirely rather than shipped as a column that is always empty.
- Give it ASINs directly, or paste full
/dp/or/gp/product/URLs — both are accepted and reduced to the ASIN automatically - Every competing offer comes back with the seller's ID, name, feedback percentage, rating count, FBA flag and ships-from location
- The buy-box winner is isolated from the rest of the offer list, with the price gap to the cheapest competing offer computed for you
- Supply your own list of authorized seller IDs or storefront names and every other seller on the listing is flagged in
unauthorizedSellers[] - Filter the offer list by condition (new / used / all), set the delivery postcode and language, and pick a storefront domain and exit country to match
- Export as JSON, CSV or Excel, or read the dataset straight through the Apify API
What Amazon offer data is publicly available to scrape?
Everything this Actor returns is visible to any anonymous visitor who opens the listing and expands the offer panel. What sits behind Amazon's own Seller Central or Advertising accounts is seller contact information and account-level analytics, not the offer panel itself.
| Data category | Publicly available (what this Actor reads) | Behind a Seller Central / Advertising account |
|---|---|---|
| Product title, price, images, variants, bestseller rank | ✅ Public | — |
| Star rating and the rating histogram | ✅ Public | — |
| Every offer on the panel: seller ID, seller name, feedback %, FBA flag, ships-from, price | ✅ Public | — |
| Buy-box winner and the price gap to the lowest offer | ✅ Public (computed from the public panel) | — |
| A+ content, brand story, product comparison modules | ✅ Public | — |
| Individual customer review text | ❌ Not served logged out on any surface | Only via the review pages themselves, when rendered |
| Seller email, phone, VAT/registration number | ❌ | Amazon Seller Central account |
| Sales history, advertising spend, account health | ❌ | Amazon Seller Central / Ads account |
Amazon ASIN Scraper only returns what the offer panel already shows a logged-out visitor. Nothing behind a seller login.
What data can I extract with Amazon ASIN Scraper?
Every ASIN is one dataset row carrying the full product record. Fields group into product identity, price and delivery, ratings, media, variants, merchant/bestseller context, page health, and — the reason this build exists — the offer list and buy-box intelligence.
Product identity and page context
| Field | Description |
|---|---|
asin | The ASIN as supplied (or extracted from a pasted URL) |
originalAsin | Same value as asin, kept for parity with the base scraper's output shape |
title | Product title |
url | /gp/product/{asin} listing URL |
unNormalizedProductUrl | /dp/{asin} URL, with ?language= appended when language is set |
input | The /dp/{asin} URL that was actually requested |
breadCrumbs | Category breadcrumb trail, joined with > |
position | Sequential counter, incremented as each ASIN finishes processing (reflects completion order under concurrency, not necessarily input order) |
Price, availability and delivery
| Field | Description |
|---|---|
price | {value, currency} — the listing's own current price, null if the page has no price of its own |
listPrice | {value, currency} — the struck-through reference price, null if none or identical to price |
priceRange | Text price range shown on multi-variant listings |
shippingPrice | {value, currency} — shipping cost shown on the product page itself |
inStock | Boolean stock flag |
inStockText | Raw availability text the flag was read from |
condition | Item condition of the primary listing (e.g. New) |
delivery | Primary delivery promise text |
fastestDelivery | Fastest delivery promise text, when a faster option is shown |
returnPolicy | Return policy text |
support | Product support message text |
Ratings and questions
| Field | Description |
|---|---|
stars | Average star rating |
starsBreakdown | {"5star": 0.57, "4star": 0.29, ...} — share of ratings per star bucket, read from the histogram |
reviewsCount | Total rating count |
answeredQuestions | Count from the "Ask a question" link, when present |
hasReviews | true when reviewsCount is a positive number |
reviewsLink | /product-reviews/{asin} URL |
Brand and media
| Field | Description |
|---|---|
brand | Brand or storefront name |
author | Author name, on books |
thumbnailImage | Primary image URL |
galleryThumbnails | Thumbnail image URLs |
highResolutionImages | Full-resolution image URLs |
videosCount | Count of product videos detected |
aPlusContent | {title, rawText, rawImages, rawVideos, modules} — A+ module content, null when absent |
brandStory | {title, image, items} — brand-story carousel content, null when absent |
aPlusContent, brandStory, galleryThumbnails and highResolutionImages are all forced empty/null when includeRichMedia is false — everything else in the record is unaffected.
Description, specs and variants
| Field | Description |
|---|---|
description | Product description text |
bookDescription | Book/editorial description, only populated when description is empty |
features | Bullet-point feature list |
attributes | [{key, value}] — the technical-details table |
productOverview | [{key, value}] — the "Product overview" mini-table, when present |
importantInformation | "Important information" section text |
sustainabilityFeatures | {summary, certifications}, null when the listing carries no Climate Pledge Friendly content |
variantAsins | ASINs of sibling variants (size/color/style) |
variantDetails | [{name, thumbnail, images, asin, price}] per variant |
variantAttributes | [{key, value}] — the twister's own selected attribute labels |
productComparison | {products: [{asin, title, thumbnail, price, stars, reviewsCount}]} — Amazon's own comparison table, when shown |
Merchant page context, bestsellers and badges
| Field | Description |
|---|---|
seller | {name, id, url, reviewsCount, averageRating} for the page's byline merchant — null when nothing was found (not an all-null placeholder) |
shipsFrom | "Ships from" text read from the tabular buy box |
visitStoreLink | Absolute URL to the seller's storefront |
bestsellerRanks | [{rank, category, url, categoryNodeId}] — every rank shown, not just the top one |
topBestsellerRank | bestsellerRanks[0].rank, flattened for the dataset table |
topBestsellerCategory | bestsellerRanks[0].category, flattened for the dataset table |
isAmazonChoice | Boolean Amazon's Choice badge flag |
amazonChoiceText | Badge text, e.g. Amazon's Choice for "wireless earbuds" |
monthlyPurchaseVolume | Social-proof text, e.g. "500+ bought in past month" |
locationText | Delivery location shown in the page's nav bar |
loadedCountryCode | Two-letter delivery country the page actually rendered for |
aiReviewsSummary | {text, keywords} — Amazon's AI-generated review summary and per-aspect sentiment, when the widget is present |
Page health
| Field | Description |
|---|---|
pageHealthy | false when the page rendered in a degraded state (e.g. an unqualified buy box, or the detail sections never loaded) |
pageHealthNote | Reason code: unqualified_buy_box_no_price, unqualified_buy_box, or detail_sections_missing |
Offers, buy box and the hijacker check
This is the group that makes the record a competitive-offer monitor rather than a plain product scraper, and every field in it comes from the same offer panel, paged and de-duplicated.
| Field | Description |
|---|---|
offers | Array of offer objects — see the structure below |
offerCount | Offers actually returned in this row (≤ maxOffersPerAsin) |
totalOfferCount | Amazon's own reported offer count for the listing, read once from the unfiltered first page — independent of maxOffersPerAsin and offerCondition |
offersStatus | ok, not_listed (HTTP 404 — no offer panel on this storefront), failed, parse_failed, or skipped (when maxOffersPerAsin is 0) |
buyBoxSeller | {id, name, url, positivePercent, ratingCount, isAmazon, isAmazonFulfilled, shipsFrom} — null when the listing has no featured offer |
buyBoxSellerName, buyBoxSellerId, buyBoxPositivePercent, buyBoxIsFba, buyBoxIsAmazon | Flat mirrors of buyBoxSeller, present because the Apify dataset table cannot address nested keys as columns |
buyBoxPrice | {value, currency} — the buy-box offer's price |
buyBoxIsAuthorized | Whether the buy-box seller is on your authorizedSellers list — null when no list was supplied |
lowestOfferPrice | {value, currency} — the cheapest priced offer among the ones returned |
lowestOfferSeller | Name of the seller holding the lowest offer |
priceGapToLowest | buyBoxPrice.value − lowestOfferPrice.value, rounded to 2 decimals — null if either side is missing |
priceGapToLowestPercent | The same gap as a percentage of the buy-box price |
unauthorizedSellers | [{sellerId, sellerName, sellerPositivePercent, price, condition, isBuyBoxWinner}] — every offer that failed the allow-list check |
unauthorizedSellerCount | unauthorizedSellers.length — null when no allow-list was supplied |
unauthorizedSellerNames | Comma-joined names/IDs from unauthorizedSellers, for a single-column view |
hasUnauthorizedSeller | true/false once an allow-list is supplied, null when it is not — false is never returned as a fabricated all-clear |
Each entry in offers[]:
| Field | Description |
|---|---|
sellerId | Merchant ID, parsed from the seller= query parameter on the seller link |
sellerName | Seller storefront name |
sellerUrl | Absolute URL to the seller's storefront |
sellerPositivePercent | Feedback percentage, e.g. 100 |
sellerRating | Seller star rating out of 5 |
sellerRatingCount | Number of seller ratings behind that score |
isAmazonSeller | true when the offer is sold by Amazon itself |
isAmazonFulfilled | FBA flag, parsed from the offer's isAmazonFulfilled= marker; inferred true when shipsFrom starts with "Amazon" and the marker is absent |
shipsFrom | Ships-from location text |
condition | This offer's condition heading, e.g. Used - Very Good |
price | {value, currency} |
shippingPrice | {value, currency}, null when shipping is free or not shown |
isPrime | Boolean Prime-eligibility flag |
isBuyBoxWinner | true for the single pinned/featured offer, false for every other row |
Locale, condition and page-health fields
Targeting on this Actor happens mostly on the way in, not by filtering an output list, because each run is scoped to the ASINs you supply rather than a search result. offerCondition narrows offers[] to new or used before it is written — used/renewed/collectible/refurbished are all treated as one grade. amazonDomain, proxyCountry, language and zipCode together decide which storefront, currency and delivery promises the page renders with. On the output side, pageHealthy and offersStatus are the two fields worth filtering a run on before trusting the rest of a row — a false/non-ok row means the page rendered in a degraded state or the offer panel could not be reached, not that the listing genuinely has no data.
🤖 Add-on: Need more Amazon data?
Amazon Brand Research Scraper, Amazon Product Scraper With Keyword Rank Tracking and Amazon Today's Deals Scraper & Affiliate Link Builder cover the catalogue, ranking and deals side of Amazon from the same account — useful alongside this Actor when the job extends past a fixed ASIN list.
Why not build an Amazon buy-box monitor yourself?
Amazon's official Product Advertising API (PA-API) is built for affiliates, not competitive monitoring: it requires an active Associates account with qualifying sales activity to keep working, and it does not expose the multi-seller offer list this Actor returns — no per-seller feedback percentage, no FBA flag, no buy-box-versus-lowest-offer gap. If your use case is generating affiliate links from a catalogue you already have Associates access to, PA-API is the supported route. If your use case is watching who else is selling on your listing, PA-API has no endpoint for that at all, which is the actual reason a scraper exists for this job rather than a documentation gap.
Building the offer side yourself means reverse-engineering the panel Amazon actually serves. The legacy /gp/offer-listing/{ASIN} path now redirects, and the AJAX endpoint documented by older scrapers 404s — the live surface is a different auto-load fragment, requested with XHR headers and a /dp/{ASIN} referer on the same session cookies as the product page, or offer prices come back priced in the exit IP's currency instead of the storefront's. Inside that panel, the visible price for each offer is not readable from .a-offscreen any more — it now renders blank, and the real digits live in aria-hidden spans split across four separate elements that have to be reassembled. And the panel is paginated 10 offers at a time, so a listing with 80 competing merchants takes eight separate requests to read in full.
Use the official PA-API for affiliate link generation against your own Associates account. Use Amazon ASIN Scraper when you need to see the competing offers on a listing at all.
How to use Amazon ASIN Scraper
Amazon ASIN Scraper runs on Apify. Start it from the Apify Console or call it through the Apify API.
- Open Amazon ASIN Scraper on Apify and click Try for free
- Paste one or more ASINs, or full
/dp/or/gp/product/URLs, into ASINs or product URLs — this is the only required input - Set Storefront domain and Exit country to match — a mismatched pair gets served a robot-check page instead of the real listing
- Optionally paste your known-good merchant IDs or storefront names into Authorized seller IDs or names to turn on the hijacker check
- Click Start, then export the dataset as JSON, CSV or Excel, or read it through the Apify API
How to scale to bulk ASIN monitoring
asins is a list — paste as many ASINs or product URLs as you need, one per line. Each is fetched independently under its own concurrency slot, so a run of 200 ASINs does not wait on any single slow listing. Set maxOffersPerAsin to 0 on a run where you only need the product record (title, price, rating) and not the competitive offer list — that halves the requests per ASIN, since the offers request is skipped entirely.
What can you do with Amazon buy-box and offer data?
- 🚨 A brand-protection manager monitoring a catalogue of ASINs supplies the brand's authorized reseller IDs in
authorizedSellers, schedules a daily run, and filters the dataset forhasUnauthorizedSeller: trueto get same-day alerts on new hijackers. - 🏢 An e-commerce agency running buy-box audits for several clients keeps one input file of ASINs per client, sets
offerCondition: "new", and reportsbuyBoxSellerNameandpriceGapToLowestPercentback as a weekly competitive snapshot. - 📊 A pricing or repricing team pulls
offers[]for their own ASINs to see the full competitive price ladder — not just the featured price — and reacts before a competitor's undercut reaches the buy box. - 🤖 An AI engineer building a marketplace-monitoring agent indexes
offers,buyBoxSellerandunauthorizedSellersper ASIN so an agent tool can answer "who is undercutting us on this listing right now" against live data instead of a stale export.
How does Amazon ASIN Scraper handle blocking?
Amazon's block page is a 200 status carrying an HTML shell rather than the real listing, so the Actor checks the response body against known markers (captcha, robot check, /errors/validateCaptcha, and the automated-access warning text) rather than trusting the status code alone. A healthy /dp/ page runs 1–2.3 MB; anything under roughly 50 KB is treated as a block shell and retried with a fresh proxy session rather than parsed and returned as a thin, broken record.
When proxyCountry is set to US, each response is additionally checked for US delivery markers (deliveryCountry, the nav-bar location text, the USD currency flag) before it is accepted, with extra retries budgeted specifically for that verification. useCaptchaSolver — labelled Hardened retry mode in the input — does not call or bill any third-party CAPTCHA service; toggling it on raises the retry ceiling from 3 attempts to 6 on storefronts that keep blocking. Every retry backs off exponentially with jitter, and each retry after the first rotates to a fresh proxy session rather than reusing the one that just got blocked.
⚠️ maxOffersPerAsin accepts values up to 300 in the input schema, but the offer panel is paged 10 offers at a time and paging is capped at 20 pages internally — so the practical ceiling on any single ASIN is 200 offers, even if you request more. totalOfferCount always reports Amazon's real total regardless of this cap, so you can tell whether you saw the full list.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
asins | ✅ Yes | array | One ASIN per line, e.g. B07GBZ4Q68. Full /dp/ and /gp/product/ URLs are also accepted and reduced to their ASIN automatically. Every ASIN costs one product request plus one offers request. | ["B07GBZ4Q68", "B0CJ4V4TRP"] |
amazonDomain | No | string | The marketplace to read the listing and its offers from. Default "amazon.com". | "amazon.co.uk" |
maxOffersPerAsin | No | integer | Upper bound on offers returned per listing. The pinned buy-box offer is always the first entry. Set 0 to skip the offers request entirely and run as a plain product scraper. Minimum 0, maximum 300, default 30. | 50 |
offerCondition | No | string | Restrict offers[] by item condition, read from each offer's heading. Enum: "all" (All conditions), "new" (New only), "used" (Used / renewed / collectible only). Default "all". | "new" |
authorizedSellers | No | array | Merchant IDs (the seller= value in an Amazon seller link) and/or exact storefront names. Matching is case-insensitive and either field can match. Leave empty and hasUnauthorizedSeller is returned as null. | ["A1J8OBDYLWZ573", "Essentialsmerchant"] |
treatAmazonAsAuthorized | No | boolean | When the allow-list is in use, decides whether offers sold directly by Amazon are exempt from the unauthorized check. Only has an effect when authorizedSellers is non-empty. Default true. | true |
language | No | string | Sent as ?language=… and in Accept-Language. Leave on auto to take the storefront's own default. Enum: "" (Auto), "en", "en_US", "en_GB", "de", "fr", "es", "it", "nl", "pl", "pt", "pt_BR", "sv", "tr", "cs", "da", "ja", "zh_CN", "zh_TW", "hi". Default "en". | "de" |
zipCode | No | string | Optional destination postcode (10001, SW1A 1AA). The delivery cookie is primed before scraping so offer prices and delivery promises reflect that address. Leave blank to use whatever location the exit IP resolves to. Default "". | "10001" |
proxyCountry | No | string | Residential exit location for every request. Match this to your storefront — a US exit against a non-US Amazon domain is served a robot-check shell. Enum: "AUTO_SELECT_PROXY_COUNTRY", "US", "GB", "DE", "FR", "ES", "IT", "CA", "AU", "JP", "IN", "BR", "MX", "NL", "PL", "TR", "SE", "AE". Default "AUTO_SELECT_PROXY_COUNTRY". | "US" |
includeRichMedia | No | boolean | A+ modules, brand-story cards and the full image gallery dominate the size of each record; a seller-monitoring run rarely reads them. Turn off for a much smaller dataset — core product fields, ranks, ratings and all offer fields are unaffected. Default true. | false |
useCaptchaSolver | No | boolean | Hardened retry mode. No third-party CAPTCHA solver is used or billed for. On: raises the retry ceiling from 3 to 6, with a fresh proxy session on every retry. Slower, worth it only on storefronts that block hard. Default false. | false |
proxyConfiguration | No | object | Full override: Apify proxy groups (Residential recommended for Amazon) or your own proxy URLs. Most runs should leave this untouched. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Common pitfall: proxyCountry and amazonDomain have to agree. A US residential exit against amazon.co.uk, or vice versa, gets served a robot-check shell rather than the real page — this is the single most common cause of a run coming back with pageHealthy: false on every row.
Example input
{"asins": ["B07GBZ4Q68", "B0CJ4V4TRP", "B07KQWR72Z"],"amazonDomain": "amazon.com","maxOffersPerAsin": 30,"offerCondition": "new","authorizedSellers": ["A1J8OBDYLWZ573", "Essentialsmerchant"],"treatAmazonAsAuthorized": true,"proxyCountry": "US","includeRichMedia": false}
⬆️ Output
Typed, normalized JSON — one row per ASIN, written to the dataset as each one finishes. The keyed-by-ASIN result is also stored under OUTPUT in the run's default key-value store. Export as JSON, CSV or Excel, or read the dataset through the Apify API.
Only successful, non-empty rows are charged under the row_result event. A row is pushed but not charged when the fetch failed, when the HTML could not be parsed, or when the result is empty (no title, no price and no offers) — each of those carries an error field (fetch_failed, parse_error: …, or empty_result) so the failure is visible in the dataset rather than silently dropped. Filter clean, billed rows with item.get("error") is None.
Example output
{"asin": "1250301696","originalAsin": "1250301696","title": "The Silent Patient","url": "https://www.amazon.com/gp/product/1250301696?smid=","unNormalizedProductUrl": "https://www.amazon.com/dp/1250301696","input": "https://www.amazon.com/dp/1250301696","breadCrumbs": "Books > Literature & Fiction > Genre Fiction","position": 1,"price": { "value": 28.99, "currency": "$" },"listPrice": null,"priceRange": null,"shippingPrice": null,"inStock": true,"inStockText": "In Stock","condition": "New","delivery": "FREE delivery","fastestDelivery": "Or fastest delivery Tomorrow","returnPolicy": "Returnable until Jan 31, 2027","support": null,"stars": 4.5,"starsBreakdown": { "5star": 0.57, "4star": 0.29, "3star": 0.11, "2star": 0.02, "1star": 0.01 },"reviewsCount": 84213,"answeredQuestions": null,"hasReviews": true,"reviewsLink": "https://www.amazon.com/product-reviews/1250301696","brand": "Celadon Books","author": "Alex Michaelides","thumbnailImage": "https://m.media-amazon.com/images/I/81JAftTeHzL._SY425_.jpg","galleryThumbnails": ["https://m.media-amazon.com/images/I/81JAftTeHzL._SL75_.jpg"],"highResolutionImages": ["https://m.media-amazon.com/images/I/81JAftTeHzL._SL1500_.jpg"],"videosCount": 0,"aPlusContent": null,"brandStory": null,"description": "The Silent Patient is a shocking psychological thriller...","bookDescription": null,"features": ["Instant #1 New York Times bestseller", "A Read With Jenna Book Club pick"],"attributes": [{ "key": "Publisher", "value": "Celadon Books" }],"productOverview": [],"importantInformation": null,"sustainabilityFeatures": null,"variantAsins": [],"variantDetails": [],"variantAttributes": [],"productComparison": null,"seller": { "name": "Essentialsmerchant", "id": "AR6XG8XBD2ANX", "url": "https://www.amazon.com/sp?seller=AR6XG8XBD2ANX", "reviewsCount": 403, "averageRating": 5.0 },"shipsFrom": "Amazon.com","visitStoreLink": "https://www.amazon.com/sp?seller=AR6XG8XBD2ANX","bestsellerRanks": [{ "rank": 6, "category": "Murder Thrillers", "categoryNodeId": "9536065011", "url": "https://www.amazon.com/gp/bestsellers/books/9536065011/" }],"topBestsellerRank": 6,"topBestsellerCategory": "Murder Thrillers","isAmazonChoice": false,"amazonChoiceText": null,"monthlyPurchaseVolume": "1K+ bought in past month","locationText": "Deliver to New York 10001","loadedCountryCode": "US","aiReviewsSummary": null,"pageHealthy": true,"pageHealthNote": null,"offers": [{"sellerId": "AR6XG8XBD2ANX","sellerName": "Essentialsmerchant","sellerUrl": "https://www.amazon.com/sp?seller=AR6XG8XBD2ANX","sellerPositivePercent": 100,"sellerRating": 5.0,"sellerRatingCount": 403,"isAmazonSeller": false,"isAmazonFulfilled": true,"shipsFrom": "Amazon.com","condition": "New","price": { "value": 28.99, "currency": "$" },"shippingPrice": null,"isPrime": true,"isBuyBoxWinner": true},{"sellerId": "A2QVWT0ESGUXPH","sellerName": "ThriftBooks-Phoenix","sellerUrl": "https://www.amazon.com/sp?seller=A2QVWT0ESGUXPH","sellerPositivePercent": 88,"sellerRating": 4.5,"sellerRatingCount": 420813,"isAmazonSeller": false,"isAmazonFulfilled": false,"shipsFrom": "ThriftBooks-Phoenix","condition": "Used - Very Good","price": { "value": 6.49, "currency": "$" },"shippingPrice": { "value": 0.0, "currency": "$" },"isPrime": false,"isBuyBoxWinner": false}],"offerCount": 2,"totalOfferCount": 81,"offersStatus": "ok","buyBoxSellerName": "Essentialsmerchant","buyBoxSellerId": "AR6XG8XBD2ANX","buyBoxPositivePercent": 100,"buyBoxIsFba": true,"buyBoxIsAmazon": false,"buyBoxSeller": {"id": "AR6XG8XBD2ANX","name": "Essentialsmerchant","url": "https://www.amazon.com/sp?seller=AR6XG8XBD2ANX","positivePercent": 100,"ratingCount": 403,"isAmazon": false,"isAmazonFulfilled": true,"shipsFrom": "Amazon.com"},"buyBoxPrice": { "value": 28.99, "currency": "$" },"buyBoxIsAuthorized": true,"lowestOfferPrice": { "value": 6.49, "currency": "$" },"lowestOfferSeller": "ThriftBooks-Phoenix","priceGapToLowest": 22.5,"priceGapToLowestPercent": 77.61,"unauthorizedSellers": [{"sellerId": "A2QVWT0ESGUXPH","sellerName": "ThriftBooks-Phoenix","sellerPositivePercent": 88,"price": { "value": 6.49, "currency": "$" },"condition": "Used - Very Good","isBuyBoxWinner": false}],"unauthorizedSellerCount": 1,"unauthorizedSellerNames": "ThriftBooks-Phoenix","hasUnauthorizedSeller": true}
How do you filter and target specific listings?
Because each run is scoped to a fixed ASIN list rather than a search, targeting happens through the input parameters rather than a post-run filter — get these four right and the rest of the record follows.
- Storefront and exit country must match. Set
amazonDomainto the marketplace you actually want andproxyCountryto the matching residential exit. A mismatched pair is the single most common cause of a run coming back withpageHealthy: falseon every row, because the exit IP gets served a robot-check shell instead of the real listing. - Condition scoping.
offerCondition: "new"is the right setting for hijacker and MAP monitoring — used, renewed and collectible listings are a separate problem with their own sellers.buyBoxSellerand the buy-box columns are always derived from the unfiltered offer set regardless of this setting, so ausedfilter never silently nulls the buy-box fields; onlyoffers[],lowestOfferPriceand the price-gap columns are computed against the filtered subset. - The allow-list decides what "unauthorized" means.
authorizedSellersaccepts merchant IDs and storefront names interchangeably, matched case-insensitively.treatAmazonAsAuthorizedonly matters once that list is non-empty — leave it on for retail-vendor listings where Amazon itself is expected to sell, turn it off if Amazon Retail appearing on your listing is itself the alert you want. - Volume control.
maxOffersPerAsincaps how deep the pagination goes (10 offers per request), and0skips the offers request entirely for a plain-product run. There is no volume control on the ASIN list itself — every ASIN you supply is processed.
{ "asins": ["B0CJ4V4TRP"], "amazonDomain": "amazon.de", "proxyCountry": "DE", "language": "de" }
{ "asins": ["B0CJ4V4TRP"], "offerCondition": "new", "authorizedSellers": ["A1J8OBDYLWZ573", "MyBrand Official"], "treatAmazonAsAuthorized": false }
{ "asins": ["B0CJ4V4TRP"], "maxOffersPerAsin": 0 }
How does it work?
Amazon ASIN Scraper requests /dp/{asin} for the product record, then walks the offer panel's own auto-load endpoint page by page — 10 offers per page — until it reaches maxOffersPerAsin or runs out of pages. The buy-box winner is captured from the unfiltered first page before offerCondition is applied, so a condition filter can never silently drop the buy-box columns even when it excludes the winning offer itself.
A response is only accepted as the real page once it clears three checks: no known block markers in the body, a byte size consistent with a genuine /dp/ render (not a ~4 KB robot-check shell returned with a 200 status), and — when proxyCountry is US — delivery-country markers confirming the page actually rendered for a US address. A degraded-but-technically-200 page (Amazon's "unqualified buy box" variant, or a page whose detail sections never loaded) is still returned, but flagged via pageHealthy and pageHealthNote rather than silently reported as a normal, priceless listing.
Only publicly visible offer-panel data is collected. No account, cookie or seller session is used.
Integrations
Amazon ASIN Scraper is an Apify Actor, so it works with anything that can call the Apify API or consume a dataset.
Calling Amazon ASIN Scraper from Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<YOUR_USERNAME>/amazon-asin-scraper-buy-box-sellers").call(run_input={"asins": ["B07GBZ4Q68", "B0CJ4V4TRP"],"offerCondition": "new","authorizedSellers": ["A1J8OBDYLWZ573"],})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("error") is None and item.get("hasUnauthorizedSeller"):print(item["asin"], item["buyBoxSellerName"], item["unauthorizedSellerNames"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
Export to spreadsheets or CRM
Export the dataset as CSV directly from the Console or via the API, and map asin, title, buyBoxSellerName, priceGapToLowest, hasUnauthorizedSeller and unauthorizedSellerNames straight into a Google Sheets or CRM column — those five are already flat values, not nested objects, so no transform step is needed before import.
Is it legal to scrape Amazon ASIN and offer data?
Scraping publicly listed product and offer data is broadly treated as permissible where the data is accessible without authentication, and Amazon ASIN Scraper collects only what the offer panel already shows a logged-out visitor.
A listing's price, seller ID, storefront name and feedback percentage are commercial marketplace records, not personal data about a private individual — so the personal-data regimes that govern profile or reviewer scraping do not attach to this output the way they would to a social-profile scraper. What does apply is contractual and database-related: Amazon's terms of service, and any local database or unfair-competition rules covering systematic reuse of a compiled listing.
Consult legal counsel for commercial applications involving bulk storage or republication of extracted seller and pricing data.
❓ Frequently asked questions
What happens if an ASIN has zero third-party offers, or no buy box winner?
offers[] comes back with whatever the panel actually showed — for a listing with only Amazon's own offer, that is one entry. When there is no featured/pinned offer at all, Amazon renders "No featured offers available" and buyBoxSeller is returned as null rather than an arbitrary offer being promoted into that slot. priceGapToLowest and the percentage gap are null whenever either side of the comparison is missing.
Can I get the full seller offer list along with the product record?
Yes, by default. maxOffersPerAsin defaults to 30 and every field returned is documented in the Output section above — seller ID, feedback percentage, FBA flag, ships-from, condition and price on every offer. Set maxOffersPerAsin: 0 if you only want the product record and none of the offer requests.
How accurate is the seller and price data?
The Actor returns exactly what the offer panel shows at request time — no field is filled from a different product's page or a cached value. A dedicated fix in this build stops a documented bug where a listing with no price of its own returned a different ASIN's price pulled from a "customers also viewed" carousel; price now returns null in that case instead. Accuracy beyond that depends on how current Amazon's own render is, which changes constantly on a competitive listing.
How many offers and ASINs can I get per run?
Every ASIN costs one product request plus one offers request (unless maxOffersPerAsin is 0, which skips the offers request). Per ASIN, maxOffersPerAsin accepts up to 300, but the offer panel is paged 10 at a time and paging is capped at 20 pages internally, so the practical ceiling is 200 offers even if you request more — totalOfferCount always reports Amazon's real total so you know whether you saw everything. There is no cap on how many ASINs you can list in one run.
How does the authorized-sellers hijacker check work?
Supply merchant IDs and/or exact storefront names in authorizedSellers — matching is case-insensitive and either field can match. Every offer that is not on that list, and is not Amazon itself when treatAmazonAsAuthorized is on, lands in unauthorizedSellers[], with hasUnauthorizedSeller and buyBoxIsAuthorized as ready-made alert columns. Leave authorizedSellers empty and both of those come back null, not false — with nothing to compare against, false would read as a false all-clear.
Are failed or empty rows billed?
No. Fetch failures, parse errors, and rows with no title, price or offers are still pushed to the dataset — each carrying an error field so you can see what happened — but they are not charged under the row_result event. Filter for clean, billed rows with item.get("error") is None.
Does Amazon ASIN Scraper work with Claude, ChatGPT and AI agent frameworks?
Yes. It is callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make a request — LangChain, CrewAI, n8n, a hand-written tool definition — can invoke it and receive typed JSON back with no parsing step.
How does Amazon ASIN Scraper compare to other Amazon buy-box and offer scrapers?
Checked on the Apify Store on 2026-07-26: xmiso_scrapers/amazon-sellers-leads-scraper-from-asin-list targets Amazon France and Germany specifically and documents business-registration fields (VAT number, phone, email, registered business name) that this Actor does not attempt to collect, but its README states a 100-ASIN cap per run. clearpath/amazon-buybox-api documents cross-run change tracking — priceChanged, buyboxWinnerChanged, isNewSeller — by diffing against a saved snapshot on scheduled runs, which this Actor does not do; it covers 8 domains at a flat $29/month rental. santhej/amazon-product-scraper covers search, product-detail and review modes but documents no per-offer seller list or buy-box comparison at all. What this Actor documents that the others do not: the allow-list hijacker check (authorizedSellers → unauthorizedSellers[]), the buy-box-to-lowest-offer price gap computed against the unfiltered offer set, and pay-per-event pricing where failed or empty rows are pushed but not charged.
Can I use Amazon ASIN Scraper without an Amazon seller account or API key?
Yes. No Amazon account, cookie, seller credential or API key is required — the Actor reads only what a logged-out visitor sees. The one credential you need is your Apify token.
Does Amazon ASIN Scraper scrape customer review text?
No. Amazon serves no review widget on any surface when the request is logged out, so individual review bodies are not returned — the function that produced them was removed rather than shipped as a column that is always empty. reviewsCount, stars and the starsBreakdown histogram are returned; review text is not.
🔗 Related scrapers
| Scraper Name | What it extracts |
|---|---|
| Amazon Brand Research Scraper | Amazon catalogue and brand-level research data |
| Amazon Product Scraper With Keyword Rank Tracking | Product records with keyword-position tracking |
| Amazon Today's Deals Scraper & Affiliate Link Builder | Today's Deals listings with affiliate link generation |
Conclusion
Amazon ASIN Scraper turns a list of ASINs into a competitive-offer feed: the full product record, every seller on the listing with their feedback score and FBA status, the isolated buy-box winner, the price gap to the cheapest merchant, and — for anyone running brand protection — an allow-list check that names exactly which sellers do not belong on the listing. Start a run from the Apify Console or call it through the Apify API with apify_client.
💬 Your feedback
Found a bug, or need an offer-panel field that Amazon renders but this Actor doesn't yet capture? Open an issue on the Actor's Issues tab. Reports that include the exact ASIN and storefront domain are the fastest to reproduce and fix.