Amazon Buy Box + Offers Agent
Pricing
from $20.00 / 1,000 asin checks
Amazon Buy Box + Offers Agent
Check Amazon ASINs for the Buy Box winner, stock, and landed-cost offers. Returns structured JSON. Failed checks are never billed.
Pricing
from $20.00 / 1,000 asin checks
Rating
0.0
(0)
Developer
Buzzi Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share
Check Amazon ASINs for the Buy Box winner, stock, and competing offers with landed cost (item plus shipping). Pass ASINs or /dp/ URLs and get one structured JSON snapshot per marketplace × ASIN. Failed checks are written with a typed error (BLOCKED, RATE_LIMIT, PARSE, NETWORK) and are never billed.
Why use it
- MAP and pricing teams who need the live Buy Box seller, not just a list price.
- Third-party sellers tracking whether Amazon or another seller holds the box.
- Agents and MCP clients that want one structured record per ASIN instead of HTML.
Each run can take ASINs or product URLs (/dp/, /gp/product/, /gp/aw/d/, ?asin=), snapshot amazon.com, amazon.co.uk, and amazon.de, and pull competing offers from Amazon’s All Offers Display with price plus shipping.
What data you get
One dataset item per marketplace × ASIN. Download JSON, CSV, or Excel from the run, or read items from the default dataset API.
| Field | What you get |
|---|---|
asin, marketplace, url | Identity of the check |
title, brand, image | Product facts |
buyBox | Winning offer: sellerName, sellerId, isAmazon, fulfilledBy, price |
inStock, availabilityText | Best-effort stock. availabilityText is visible copy only |
cannotShip | true when Amazon will not ship to the selected postal code |
offers[] | Landed-cost rows (price, shipping, landedPrice, seller, condition) |
lowestOffer | Cheapest landed offer among offers |
scrapedAt | ISO-8601 timestamp |
ok | true only when the snapshot parsed |
error, errorDescription | Typed failure. null on success |
Error codes
| Code | Meaning |
|---|---|
BLOCKED | CAPTCHA, robot check, or automated-access interstitial |
RATE_LIMIT | HTTP 429/503 or throttle copy |
PARSE | HTML loaded but title or Buy Box could not be extracted, or the ASIN was missing from input |
NETWORK | Timeouts, DNS, connection errors, other 4xx/5xx |
How to run
- Add ASINs and/or Amazon product URLs. At least one parseable ASIN is required.
- Keep marketplace
comfor amazon.com, or addco.uk/de. Extra marketplaces inalsoCheckMarketplaceseach produce their own row. - Leave
postalCodeas 92618 (Irvine, CA) for a US deliver-to example, or set a local postcode for UK or Germany. - Leave
proxyGroupasUNBLOCKERunless you need sticky residential IPs. - Run the Actor on the Apify platform. Free-plan proxy only works from a platform run, not from a laptop.
{"asins": ["B014I8SSD0", "B004U3Y8OM"],"marketplace": "com","includeAllOffers": true,"maxOffers": 20,"postalCode": "92618","proxyGroup": "UNBLOCKER","dryRun": true}
Set dryRun to true when you want dataset items without billing.
Proxy and deliver-to
Amazon.com blocks datacenter and AUTO Apify Proxy groups. Unblocker is the Amazon.com default on Free and paid Apify. Residential US is the fallback when you need sticky IPs so the deliver-to ZIP holds, or when the account has no Unblocker units.
| Setting | Default | Why |
|---|---|---|
| Apify Proxy | On | Required for production. Free-plan proxy only works from Actors on the platform |
proxyGroup | UNBLOCKER | Production default. Unblocker plus ZIP 92618 is the recommended amazon.com path. Residential alone is more likely to hit RATE_LIMIT |
| Country | Omitted on Unblocker. US on residential | Country targeting shrinks the Unblocker pool. Residential US plus California (CA) matches ZIP 92618 |
| Concurrency | 1 | Higher parallelism burns proxy budget and raises RATE_LIMIT |
postalCode | 92618 | Location cookies and Amazon’s address-change request run before /dp/ |
Empty API input ({} or { "useApifyProxy": true }) defaults to Unblocker. The Console proxy widget may still show RESIDENTIAL. Set proxyGroup to UNBLOCKER. Do not put UNBLOCKER under apifyProxyGroups. Set useApifyProxy: false only for local debugging.
Residential fallback
Use proxyGroup: RESIDENTIAL when you need sticky US IPs so deliver-to cookies hold across home, address-change, product page, and offers, or if the account has no Unblocker units.
| Unblocker (default) | Residential (fallback) | |
|---|---|---|
| Select | proxyGroup: "UNBLOCKER" | proxyGroup: "RESIDENTIAL" |
| Sticky IP | No. Location cookies may not hold | Yes, about 30 minutes |
| Country / CA | Omitted | Forced US, plus CA |
| Billing | 10 Unblocker units per successful request | Residential GB |
| Free plan | Separate Unblocker unit allotment (often large on Free) | About 20 GB/month residential credit |
{ "asins": ["B014I8SSD0"], "proxyGroup": "RESIDENTIAL", "dryRun": true }
If your account has Unblocker units, you can also pick Unblocker on the proxy widget. Setting proxyGroup to UNBLOCKER is enough.
Watch Proxy usage. Each ASIN fetches home, address-change, the product page, and optional offers. Requests are HTML only (no images or JavaScript). CAPTCHA retries download HTML again. Unblocker bills those hops in units, so one ASIN can use several successful requests before retries.
Why postalCode matters
Buy Box, shipping eligibility, and landed price are location-specific. If deliver-to is unset, or the proxy IP geolocates somewhere the item cannot ship, the page often still has title, brand, and image, but:
buyBoxis missing- availability becomes “This item cannot be shipped to your selected delivery location…”
The Actor sets Amazon’s deliver-to location before fetching product pages. Default 92618 is Irvine, CA, an example US ZIP. Use a local postcode for co.uk and de.
Input
See the Input tab for the full form. Non-obvious fields:
| Field | Type | Default | Notes |
|---|---|---|---|
asins | string[] | 10-character ASINs | |
productUrls | string[] | Amazon URLs. ASIN is extracted from /dp/ and related paths | |
marketplace | com | co.uk | de | com | Primary storefront |
alsoCheckMarketplaces | same enum[] | [] | Extra storefronts. Each pair is its own output row |
includeAllOffers | boolean | true | Fetch All Offers Display and return competing offers |
maxOffers | integer | 20 | Cap per snapshot (1–50) |
postalCode | string | 92618 | Deliver-to ZIP or postal code. Alias: zipCode |
proxyGroup | RESIDENTIAL | UNBLOCKER | UNBLOCKER | Amazon.com default. Select RESIDENTIAL as a sticky-IP fallback |
proxyCountry | US | GB | DE | US | Used when the proxy widget has no country and the group is residential. amazon.com needs US. Ignored for Unblocker |
monitorMode | boolean | false | Reserved. Always a one-shot snapshot |
dryRun | boolean | false | Write items, do not bill |
proxyConfiguration | proxy | Widget may show RESIDENTIAL + US | proxyGroup (default UNBLOCKER) overrides this |
Output
One dataset item per marketplace × ASIN. Successful rows include Buy Box, stock, and landed-cost offers. Failed rows stay in the dataset with a typed error so you can retry only those ASINs.
Example success shape:
{"asin": "B014I8SSD0","marketplace": "com","url": "https://www.amazon.com/dp/B014I8SSD0","title": "Amazon Basics HDMI Cable, 6ft, 4K@60Hz","brand": "Amazon Basics","buyBox": {"sellerName": "Amazon.com","sellerId": "ATVPDKIKX0DER","isAmazon": true,"fulfilledBy": "Amazon","price": { "value": 4.8, "currency": "USD" }},"inStock": true,"cannotShip": false,"availabilityText": "In Stock","offers": [{"sellerName": "Amazon.com","isAmazon": true,"fulfilledBy": "Amazon","price": { "value": 4.8, "currency": "USD" },"shipping": { "value": 0, "currency": "USD", "isFree": true },"landedPrice": { "value": 4.8, "currency": "USD" }}],"lowestOffer": {"sellerName": "Amazon.com","landedPrice": { "value": 4.8, "currency": "USD" }},"ok": true,"error": null,"scrapedAt": "2026-09-09T00:00:00.000Z"}
Field names match the table in What data you get. offers is populated when includeAllOffers is true and All Offers Display parsed.
Pricing
You pay asin_check only when a snapshot succeeds (ok: true). Failed checks (BLOCKED, RATE_LIMIT, PARSE, NETWORK) are written to the dataset and are never billed. Invalid input that never becomes a snapshot is not billed either.
Store price is about $0.02 per successful asin_check. Apify may also record a platform start event on each run.
Set dryRun: true to write dataset items without billing. Use that for a first run, CI, or local tests.
MCP and agents
Each dataset item is a JSON object with ok, a typed error, and nested buyBox / offers. Point an MCP client at the default dataset ({{links.apiDefaultDatasetUrl}}/items) or run the Actor via the Apify MCP server and read items directly. Failed checks stay in the dataset, so an agent can retry only BLOCKED or RATE_LIMIT without paying for those attempts.
Default proxyGroup is UNBLOCKER. You can omit it or pass proxyGroup: "UNBLOCKER" explicitly. Do not put UNBLOCKER under apifyProxyGroups. Use proxyGroup: "RESIDENTIAL" for the sticky-IP fallback.
Risks and limitations
- Amazon terms. Scraping Amazon storefronts may violate Amazon’s terms. Use this Actor only where you have a lawful basis. This is not an official Amazon API.
- Blocking. Datacenter IPs are frequently challenged. The Actor defaults to Apify Unblocker (residential US is a fallback) and retries CAPTCHA or throttle pages with a new session before writing
BLOCKEDorRATE_LIMIT. It does not execute JavaScript. Some Buy Box layouts that hydrate late will surface asPARSE. - Selector drift. Amazon A/B-tests
#buybox,#merchantInfoFeature_feature_div,#tabular-buybox, and All Offers Display markup. Parsers can miss a new layout until they are updated. - Stock is heuristic.
inStockis derived from availability copy (In Stock,Currently unavailable,Auf Lager, and similar), not warehouse quantity. - Deliver-to is required for a real Buy Box. Default ZIP is 92618 (Irvine, CA), an example US deliver-to. A missing or out-of-area location is modeled as
cannotShip: truewithinStock: false. Product identity is still returned when it parsed. Tax and Prime benefits are not modeled. Shipping is parsed from offers or delivery strings when present. Missing shipping is treated as0. - Monitor mode is reserved. The Actor always returns a one-shot snapshot. It does not store previous winners or emit change events.
Local development
Requires Node.js 20+ and the Apify CLI.
npm installnpm testapify run --input-file=test/input.sample.json
The sample input sets dryRun: true. Without Apify Proxy credentials, Amazon will often return BLOCKED or RATE_LIMIT after retries. That is expected locally: the Actor still writes a typed error item and does not bill.
License
Apache-2.0