{
  "data": {
    "id": "Ba5qcfQYtbXGbViXs",
    "actId": "XjOVCjhbnY2TsHduO",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-10T16:04:27.903Z",
    "finishedAt": "2026-11-10T16:04:37.787Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 9758,
      "runTimeSecs": 9.758,
      "computeUnits": 0.010842222222222222,
      "imageSizeBytes": 3149750272
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Amazon Offers Scraper Input\",\n  \"description\": \"Scrape every seller offer for one or more Amazon ASINs from the All-Offers-Display (\\\"Other Sellers on Amazon\\\") panel. Provide ASINs and/or full product URLs.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"asins\": {\n      \"title\": \"ASINs\",\n      \"type\": \"array\",\n      \"description\": \"Amazon ASINs to fetch offers for, e.g. `B0DCH8VDXF`. Provide at least one ASIN or product URL.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [\n        \"B0DXXYS4BJ\"\n      ]\n    },\n    \"productUrls\": {\n      \"title\": \"Product URLs\",\n      \"type\": \"array\",\n      \"description\": \"Full Amazon product URLs (any `/dp/{ASIN}` link). The marketplace domain and ASIN are both extracted from each URL. Provide at least one ASIN or product URL.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"conditions\": {\n      \"title\": \"Condition filter\",\n      \"type\": \"string\",\n      \"description\": \"Only emit offers of this condition. Amazon's offer panel surfaces 4 distinct condition buckets -- New, Used, Collectible, and Renewed (Amazon Renewed program) -- each matched exactly (\\\"Used only\\\" never silently includes Collectible/Renewed offers).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"ALL\",\n        \"NEW\",\n        \"USED\",\n        \"COLLECTIBLE\",\n        \"RENEWED\"\n      ],\n      \"enumTitles\": [\n        \"All conditions\",\n        \"New only\",\n        \"Used only\",\n        \"Collectible only\",\n        \"Renewed only\"\n      ],\n      \"default\": \"ALL\",\n      \"prefill\": \"ALL\"\n    },\n    \"fulfillmentTypes\": {\n      \"title\": \"Fulfillment type filter\",\n      \"type\": \"array\",\n      \"description\": \"Only emit offers with this fulfillment type. Derived from Amazon's own explicit \\\"Ships from\\\"/\\\"Sold by\\\" labels: FBA (Fulfilled by Amazon -- ships from Amazon, sold by a third-party seller), AMAZON (sold and shipped by Amazon itself), FBM (Fulfilled by Merchant -- the seller ships it themselves). Leave empty for no filter. Offers where the fulfillment type couldn't be confidently derived are excluded whenever a filter is set (but still included when this filter is empty).\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"FBA\",\n          \"FBM\",\n          \"AMAZON\"\n        ],\n        \"enumTitles\": [\n          \"Fulfilled by Amazon (FBA)\",\n          \"Fulfilled by Merchant (FBM)\",\n          \"Sold and shipped by Amazon\"\n        ]\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"maxOffersPerProduct\": {\n      \"title\": \"Max offers per ASIN\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on the number of offer records emitted per ASIN (the buy-box/pinned offer counts as one). The actor pages through Amazon's offer list 10 offers at a time until this cap, Amazon's reported total, or a bounded 10-page safety ceiling is reached.\",\n      \"minimum\": 1,\n      \"maximum\": 50,\n      \"default\": 20,\n      \"prefill\": 5\n    },\n    \"deliveryCountry\": {\n      \"title\": \"Delivery country\",\n      \"type\": \"string\",\n      \"description\": \"2-letter destination country. Offer sets are destination-dependent; also selects the default marketplace domain for bare ASINs (ignored when `productUrls` supplies its own domain).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"US\",\n        \"CA\",\n        \"MX\",\n        \"BR\",\n        \"GB\",\n        \"DE\",\n        \"FR\",\n        \"IT\",\n        \"ES\",\n        \"NL\",\n        \"SE\",\n        \"PL\",\n        \"TR\",\n        \"AE\",\n        \"SA\",\n        \"IN\",\n        \"SG\",\n        \"AU\",\n        \"JP\",\n        \"EG\",\n        \"IE\",\n        \"BE\",\n        \"ZA\"\n      ],\n      \"enumTitles\": [\n        \"(default - United States)\",\n        \"United States\",\n        \"Canada\",\n        \"Mexico\",\n        \"Brazil\",\n        \"United Kingdom\",\n        \"Germany\",\n        \"France\",\n        \"Italy\",\n        \"Spain\",\n        \"Netherlands\",\n        \"Sweden\",\n        \"Poland\",\n        \"Turkey\",\n        \"United Arab Emirates\",\n        \"Saudi Arabia\",\n        \"India\",\n        \"Singapore\",\n        \"Australia\",\n        \"Japan\",\n        \"Egypt\",\n        \"Ireland\",\n        \"Belgium\",\n        \"South Africa\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"US\"\n    },\n    \"postalCode\": {\n      \"title\": \"Postal / ZIP code\",\n      \"type\": \"string\",\n      \"description\": \"Destination postal code to refine delivery estimates. Optional.\",\n      \"editor\": \"textfield\",\n      \"prefill\": \"10001\"\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"description\": \"Uses the free AUTO (datacenter) proxy group by default. Some marketplaces (e.g. amazon.co.uk, amazon.de) drop datacenter connections outright, so the actor fast-fails a network-level timeout on a target and automatically retries it once under a RESIDENTIAL session -- a bounded fallback, never the default.\",\n      \"editor\": \"proxy\",\n      \"prefill\": {\n        \"useApifyProxy\": true\n      },\n      \"default\": {\n        \"useApifyProxy\": true\n      }\n    }\n  },\n  \"required\": []\n}",
    "readme": "# Amazon All Offers & Buy Box Tracker\r\n\r\nScrape **every seller offer** for one or more Amazon ASINs from the All-Offers-Display panel (the \"Other Sellers on Amazon\" / \"See All Buying Options\" list). Get condition, price, seller name and rating, ships-from, delivery estimate, and which offer currently wins the buy box -- for as many products as you need, across multiple marketplaces and destinations.\r\n\r\n## What this actor does\r\n\r\n- **Input by ASIN or by product URL** -- mix and match freely\r\n- **Every offer, not just the buy box** -- new, used, and third-party seller offers on the same listing, paged through Amazon's own 10-at-a-time offer list up to your cap\r\n- **Condition filter** -- restrict to New, Used, Collectible, or Renewed only, or All (each matched exactly -- a \"Used only\" filter never silently includes Collectible/Renewed offers)\r\n- **Fulfillment type filter** -- restrict to Fulfilled by Amazon (FBA), Fulfilled by Merchant (FBM), or sold-and-shipped-by-Amazon\r\n- **Destination-aware** -- set a delivery country / postal code, since offer sets and delivery estimates change by destination\r\n- **Buy-box detection** -- the current buy-box winner is explicitly flagged, never guessed from list position\r\n- **Empty fields are omitted**\r\n\r\n## Output per offer\r\n\r\n- `productAsin` -- the product ASIN this offer belongs to\r\n- `offerPosition` -- 1-based order the offer appeared in on the page (buy box is always position 1)\r\n- `condition`, `subCondition` -- e.g. `\"Used\"` / `\"Like New\"`\r\n- `conditionBucket` -- normalized `\"NEW\"` / `\"USED\"` / `\"COLLECTIBLE\"` / `\"RENEWED\"` bucket, derived from the localized condition heading only when this actor has live-verified that word (never guessed)\r\n- `conditionNote` -- extra condition detail text, when Amazon shows one\r\n- `price` -- `{ value, currency, display }`\r\n- `unitPrice` -- `{ value, currency, display }`, when Amazon shows a per-unit price\r\n- `listPrice` -- `{ value, currency, display }`, the strikethrough \"List Price\" Amazon shows for this specific offer, only present when Amazon's own DOM carries it (typically the pinned/buy-box offer on a discounted item) -- never derived/computed\r\n- `savingsPercent` -- integer percent-off (e.g. `30` for \"-30%\"), only present alongside a real `listPrice`\r\n- `deliveryEstimate` -- the delivery promise text shown for this offer\r\n- `isFreeDelivery` -- `true`/`false`, only when Amazon gives explicit evidence either way (a stated shipping charge, a zero delivery price, or \"FREE delivery\"); omitted when ambiguous\r\n- `shippingPrice` -- `{ value, currency, display }`, only present when Amazon shows an explicit paid-shipping amount (read from Amazon's own structured delivery-price field when the visible text omits the amount)\r\n- `isPrime` -- `true` when Amazon's own delivery-benefit flag says Prime, `false` when it explicitly says paid shipping; omitted when the flag is absent/unknown\r\n- `shipsFrom` -- who ships the item\r\n- `soldBy` -- `{ name, sellerId, profileUrl }`\r\n- `sellerRating`, `sellerRatingsCount` -- third-party seller reputation, when Amazon shows a rating line for that seller\r\n- `sellerPositivePercent12m` **or** `sellerPositivePercentLifetime` -- the positive-feedback percentage, exactly one of the two depending on which real period Amazon measured it over (sellers with a full 12-month history get \"% positive over last 12 months\"; newer sellers get \"% positive over lifetime\" instead) -- never conflated into one field, since they cover different windows\r\n- `fulfillmentType` -- `\"FBA\"` / `\"FBM\"` / `\"AMAZON\"`, derived from Amazon's own \"Ships from\"/\"Sold by\" labels; omitted when the combination is ambiguous (e.g. a named third-party fulfillment center)\r\n- `isBuyBoxWinner` -- `true` only for the pinned/buy-box offer, never inferred from position\r\n- `maxQuantity` -- highest quantity selectable for this offer, when a quantity control is shown\r\n- `couponText` -- any coupon/promotion text shown on the offer row\r\n- `marketplace` -- `{ countryCode, domain, marketplaceId, currency, language }`\r\n- `requestContext` -- `{ productAsin, sourceUrl, canonicalUrl, deliveryCountry, postalCode }`\r\n- `page` -- `{ classification: \"SUCCESS\", totalOfferCount, moreOffersAvailable }`. `totalOfferCount` is Amazon's own reported total offer count for the ASIN (when available). The actor repeatedly expands Amazon's \"See N more options\" panel toggle, which pages through the same server-side offer list 10 offers at a time, until Amazon's own total, the requested `maxOffersPerProduct` headroom, or a bounded 10-page ceiling is reached. `moreOffersAvailable: true` therefore means the listing genuinely has more offers than the actor captured (typically a very large used-book listing beyond 100 candidates); check this field rather than assuming the cap was always fully honored.\r\n- `recordType: \"offer\"`, `scrapedAt`\r\n\r\n## Output: status records\r\n\r\nWhen an ASIN's page can't be classified as a normal offers page (not found, invalid ASIN, sign-in wall, CAPTCHA, rate-limited, or a genuinely empty offers panel), the actor emits one explicit status record instead of silently returning zero rows. Likewise, when offers were found but every single one was removed by the `conditions`/`fulfillmentTypes` filters, one `FILTERED_OUT` status record is emitted (carrying Amazon's real `totalOfferCount`) so an empty result set is never ambiguous:\r\n\r\n- `productAsin`, `marketplace`, `requestContext`\r\n- `page.classification` -- one of `NOT_FOUND`, `INVALID_ASIN`, `AUTH_REQUIRED`, `CAPTCHA`, `ROBOT_CHECK`, `DOG_PAGE_503`, `RATE_LIMITED`, `NO_OFFERS`, `FILTERED_OUT`, etc.\r\n- `recordType: \"status\"`, `scrapedAt`\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `asins` | array | – | ASINs to fetch, e.g. `B0DCH8VDXF` |\r\n| `productUrls` | array | – | Full `/dp/{ASIN}` product URLs (marketplace domain auto-detected) |\r\n| `conditions` | string | `ALL` | `ALL` / `NEW` / `USED` / `COLLECTIBLE` / `RENEWED` |\r\n| `fulfillmentTypes` | array | `[]` (no filter) | Any of `FBA` / `FBM` / `AMAZON`; leave empty for no filter |\r\n| `maxOffersPerProduct` | int | `20` | Hard cap on offers emitted per ASIN (1-50) |\r\n| `deliveryCountry` | string | – | 2-letter destination country; also picks the default marketplace domain |\r\n| `postalCode` | string | – | Destination ZIP/postal code |\r\n| `proxyConfiguration` | object | AUTO | Apify proxy config |\r\n\r\nAt least one of `asins` or `productUrls` must be provided.\r\n\r\n## Limitations\r\n\r\n- The All-Offers-Display list is followed for up to 10 pages / 100 candidates per ASIN; `page.moreOffersAvailable` reports when more exist.\r\n- Stock quantity is not published on offer rows; only `maxQuantity` from the quantity selector is available.\r\n- Identical offers (same seller, price, condition and note) are collapsed as duplicates.\r\n- Condition words outside the live-verified translation set can under-match `USED`/`COLLECTIBLE`/`RENEWED` filters on non-English marketplaces; use `ALL` to inspect the real condition text.\r\n- Amazon page URLs are canonical but may return 503 to bare scripted requests; they render normally in a browser.\r\n\r\n### Example: single ASIN, all conditions\r\n\r\n```json\r\n{\r\n  \"asins\": [\"B0DCH8VDXF\"],\r\n  \"conditions\": \"ALL\",\r\n  \"maxOffersPerProduct\": 10\r\n}\r\n```\r\n\r\n### Example: multiple ASINs, new only, destination-aware\r\n\r\n```json\r\n{\r\n  \"asins\": [\"B0DXXYS4BJ\", \"B0DCH8VDXF\"],\r\n  \"conditions\": \"NEW\",\r\n  \"deliveryCountry\": \"US\",\r\n  \"postalCode\": \"10001\",\r\n  \"maxOffersPerProduct\": 20\r\n}\r\n```\r\n\r\n### Example: by product URL, UK marketplace\r\n\r\n```json\r\n{\r\n  \"productUrls\": [\"https://www.amazon.co.uk/dp/B0DCH8VDXF\"],\r\n  \"conditions\": \"ALL\"\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Price monitoring** -- track how many sellers compete on a listing and at what price\r\n- **Buy-box tracking** -- monitor which seller currently owns the buy box over time\r\n- **Repricing intelligence** -- see competitor pricing, condition, and shipping terms side by side\r\n- **Seller research** -- discover which third-party sellers list a given ASIN and their ratings\r\n- **Arbitrage / reselling** -- compare New vs Used pricing spreads on the same product\r\n\r\n## FAQ\r\n\r\n**What is the All-Offers-Display panel?** It's the list Amazon shows when you click \"See All Buying Options\" or \"X used & new\" on a product page -- every seller currently offering that ASIN, not just the buy-box winner.\r\n\r\n**Why do offer sets change by destination?** Amazon only shows offers a seller can actually ship to your delivery address. Setting `deliveryCountry`/`postalCode` makes the results match what a real shopper in that location would see.\r\n\r\n**Why is `sellerRating` sometimes missing?** Amazon only shows an independent seller-rating line for third-party sellers. Offers fulfilled and sold directly by Amazon (or \"Amazon Resale\") don't carry a separate rating line, so the field is correctly omitted rather than fabricated.\r\n\r\n**How is `fulfillmentType` determined?** From Amazon's own \"Ships from\" and \"Sold by\" labels on each offer row -- `FBA` (Fulfilled by Amazon) when Amazon ships it but a third party sold it, `AMAZON` when Amazon both sold and shipped it, `FBM` (Fulfilled by Merchant) when the ships-from and sold-by names match (the seller ships it themselves). If the combination is ambiguous (e.g. a named third-party fulfillment center), the field is omitted rather than guessed.\r\n\r\n**Why is `isFreeDelivery`/`shippingPrice` sometimes missing?** Only set when Amazon's delivery text gives explicit evidence either way (\"FREE delivery...\" or a stated shipping charge). An ambiguous delivery estimate with no free/paid wording leaves both fields omitted rather than assuming free.\r\n\r\n**What's the difference between `USED` and `COLLECTIBLE`/`RENEWED` in the condition filter?** Amazon's own AOD panel surfaces up to 4 distinct top-level condition buckets on the same listing -- `New`, `Used`, `Collectible` (rare/specialty copies, common on books/media), and `Renewed` (Amazon's official refurbishment program). Each `conditions` filter value matches its own bucket exactly -- selecting `USED` will never silently include a `Collectible` or `Renewed` offer. Use `ALL` if you want every condition together.\r\n\r\n**Does the `conditions` filter work on non-English marketplaces?** The output `condition` field always shows Amazon's own real, localized text (e.g. Polish \"Nowe\", Dutch \"Nieuw\", Italian \"Nuovo\" for New-condition offers) -- it's never translated or altered. The `conditions` input filter itself recognizes the English bucket names plus a small, evidence-based set of live-verified translations: New-condition words for Polish/Dutch/Italian/German/Japanese/Spanish/French, plus Used/Collectible words for Japanese (\"中古商品\"/\"コレクター商品\"), German (\"Gebraucht\"), Italian (\"Usato\"/\"Da collezione\"), Spanish (\"De 2ª mano\"), and French (\"D'occasion\"). Filtering by `USED`/`COLLECTIBLE`/`RENEWED` on a marketplace whose offers render those buckets in a language this actor hasn't yet verified a translation for may under-match (real offers in that bucket excluded rather than risking a wrong match) -- use `ALL` and inspect the real `condition` text yourself if you need every bucket on an untranslated marketplace.\r\n\r\n**Why did I get a status record instead of offers?** The ASIN's page didn't classify as a normal offers listing -- it may be invalid, geo-restricted, temporarily rate-limited, or genuinely have no additional offers beyond the buy box. The `page.classification` field tells you exactly why.\r\n\r\n**I set `maxOffersPerProduct` to 50 but got fewer offers back -- is that a bug?** No -- `maxOffersPerProduct` is a cap, not a guarantee. The actor pages through Amazon's own offer list (10 offers per page) until it reaches your cap, Amazon's reported total, or the 10-page (100-candidate) safety ceiling, so ordinary listings are fully covered. Popular used-book listings can genuinely have more offers than that ceiling, and a filter can remove some captured rows. Every returned offer record's `page.totalOfferCount`/`page.moreOffersAvailable` fields tell you the real total and whether more exist beyond what was captured, so you can always tell the difference from a genuinely-exhausted result.\r\n\r\n**What does `isPrime` mean?** It comes from Amazon's own machine-readable delivery-benefit flag on the offer row: `true` for Prime delivery, `false` when Amazon explicitly labels the row as paid shipping. If Amazon does not expose the flag for a row, the field is omitted rather than guessed. It is independent of `shippingPrice`: an offer can be Prime-eligible and still show a shipping charge in some destinations/marketplaces.\r\n\r\n**Is this affiliated with Amazon?** No. This is an independent, third-party actor that reads Amazon's publicly viewable product pages.\r\n\r\n**How fresh is the data?** Every run fetches the live page at request time -- offers, prices, and the buy-box winner can change within minutes on Amazon, so treat each run as a point-in-time snapshot.\r\n\r\n**Why does `sourceUrl` / `soldBy.profileUrl` return an error if I open it with a bare script?** Amazon's edge blocks plain, cookie-less, non-browser requests outright -- a raw request from a clean script with no session/cookies will get a \"Service Unavailable\" response even though the same URL loads fine for a real shopper. This actor itself reaches these pages successfully; the URLs in the output are the correct, canonical Amazon URLs and will render normally when opened in a browser.\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "amazon-all-offers-and-buy-box-tracker",
      "title": "Amazon All Offers & Buy Box Tracker",
      "description": "Collect every seller offer for Amazon ASINs you supply — condition, price, seller name and rating, shipping terms, delivery estimate, and which offer currently holds the buy box.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Amazon All Offers & Buy Box Tracker\r\n\r\nScrape **every seller offer** for one or more Amazon ASINs from the All-Offers-Display panel (the \"Other Sellers on Amazon\" / \"See All Buying Options\" list). Get condition, price, seller name and rating, ships-from, delivery estimate, and which offer currently wins the buy box -- for as many products as you need, across multiple marketplaces and destinations.\r\n\r\n## What this actor does\r\n\r\n- **Input by ASIN or by product URL** -- mix and match freely\r\n- **Every offer, not just the buy box** -- new, used, and third-party seller offers on the same listing, paged through Amazon's own 10-at-a-time offer list up to your cap\r\n- **Condition filter** -- restrict to New, Used, Collectible, or Renewed only, or All (each matched exactly -- a \"Used only\" filter never silently includes Collectible/Renewed offers)\r\n- **Fulfillment type filter** -- restrict to Fulfilled by Amazon (FBA), Fulfilled by Merchant (FBM), or sold-and-shipped-by-Amazon\r\n- **Destination-aware** -- set a delivery country / postal code, since offer sets and delivery estimates change by destination\r\n- **Buy-box detection** -- the current buy-box winner is explicitly flagged, never guessed from list position\r\n- **Empty fields are omitted**\r\n\r\n## Output per offer\r\n\r\n- `productAsin` -- the product ASIN this offer belongs to\r\n- `offerPosition` -- 1-based order the offer appeared in on the page (buy box is always position 1)\r\n- `condition`, `subCondition` -- e.g. `\"Used\"` / `\"Like New\"`\r\n- `conditionBucket` -- normalized `\"NEW\"` / `\"USED\"` / `\"COLLECTIBLE\"` / `\"RENEWED\"` bucket, derived from the localized condition heading only when this actor has live-verified that word (never guessed)\r\n- `conditionNote` -- extra condition detail text, when Amazon shows one\r\n- `price` -- `{ value, currency, display }`\r\n- `unitPrice` -- `{ value, currency, display }`, when Amazon shows a per-unit price\r\n- `listPrice` -- `{ value, currency, display }`, the strikethrough \"List Price\" Amazon shows for this specific offer, only present when Amazon's own DOM carries it (typically the pinned/buy-box offer on a discounted item) -- never derived/computed\r\n- `savingsPercent` -- integer percent-off (e.g. `30` for \"-30%\"), only present alongside a real `listPrice`\r\n- `deliveryEstimate` -- the delivery promise text shown for this offer\r\n- `isFreeDelivery` -- `true`/`false`, only when Amazon gives explicit evidence either way (a stated shipping charge, a zero delivery price, or \"FREE delivery\"); omitted when ambiguous\r\n- `shippingPrice` -- `{ value, currency, display }`, only present when Amazon shows an explicit paid-shipping amount (read from Amazon's own structured delivery-price field when the visible text omits the amount)\r\n- `isPrime` -- `true` when Amazon's own delivery-benefit flag says Prime, `false` when it explicitly says paid shipping; omitted when the flag is absent/unknown\r\n- `shipsFrom` -- who ships the item\r\n- `soldBy` -- `{ name, sellerId, profileUrl }`\r\n- `sellerRating`, `sellerRatingsCount` -- third-party seller reputation, when Amazon shows a rating line for that seller\r\n- `sellerPositivePercent12m` **or** `sellerPositivePercentLifetime` -- the positive-feedback percentage, exactly one of the two depending on which real period Amazon measured it over (sellers with a full 12-month history get \"% positive over last 12 months\"; newer sellers get \"% positive over lifetime\" instead) -- never conflated into one field, since they cover different windows\r\n- `fulfillmentType` -- `\"FBA\"` / `\"FBM\"` / `\"AMAZON\"`, derived from Amazon's own \"Ships from\"/\"Sold by\" labels; omitted when the combination is ambiguous (e.g. a named third-party fulfillment center)\r\n- `isBuyBoxWinner` -- `true` only for the pinned/buy-box offer, never inferred from position\r\n- `maxQuantity` -- highest quantity selectable for this offer, when a quantity control is shown\r\n- `couponText` -- any coupon/promotion text shown on the offer row\r\n- `marketplace` -- `{ countryCode, domain, marketplaceId, currency, language }`\r\n- `requestContext` -- `{ productAsin, sourceUrl, canonicalUrl, deliveryCountry, postalCode }`\r\n- `page` -- `{ classification: \"SUCCESS\", totalOfferCount, moreOffersAvailable }`. `totalOfferCount` is Amazon's own reported total offer count for the ASIN (when available). The actor repeatedly expands Amazon's \"See N more options\" panel toggle, which pages through the same server-side offer list 10 offers at a time, until Amazon's own total, the requested `maxOffersPerProduct` headroom, or a bounded 10-page ceiling is reached. `moreOffersAvailable: true` therefore means the listing genuinely has more offers than the actor captured (typically a very large used-book listing beyond 100 candidates); check this field rather than assuming the cap was always fully honored.\r\n- `recordType: \"offer\"`, `scrapedAt`\r\n\r\n## Output: status records\r\n\r\nWhen an ASIN's page can't be classified as a normal offers page (not found, invalid ASIN, sign-in wall, CAPTCHA, rate-limited, or a genuinely empty offers panel), the actor emits one explicit status record instead of silently returning zero rows. Likewise, when offers were found but every single one was removed by the `conditions`/`fulfillmentTypes` filters, one `FILTERED_OUT` status record is emitted (carrying Amazon's real `totalOfferCount`) so an empty result set is never ambiguous:\r\n\r\n- `productAsin`, `marketplace`, `requestContext`\r\n- `page.classification` -- one of `NOT_FOUND`, `INVALID_ASIN`, `AUTH_REQUIRED`, `CAPTCHA`, `ROBOT_CHECK`, `DOG_PAGE_503`, `RATE_LIMITED`, `NO_OFFERS`, `FILTERED_OUT`, etc.\r\n- `recordType: \"status\"`, `scrapedAt`\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `asins` | array | – | ASINs to fetch, e.g. `B0DCH8VDXF` |\r\n| `productUrls` | array | – | Full `/dp/{ASIN}` product URLs (marketplace domain auto-detected) |\r\n| `conditions` | string | `ALL` | `ALL` / `NEW` / `USED` / `COLLECTIBLE` / `RENEWED` |\r\n| `fulfillmentTypes` | array | `[]` (no filter) | Any of `FBA` / `FBM` / `AMAZON`; leave empty for no filter |\r\n| `maxOffersPerProduct` | int | `20` | Hard cap on offers emitted per ASIN (1-50) |\r\n| `deliveryCountry` | string | – | 2-letter destination country; also picks the default marketplace domain |\r\n| `postalCode` | string | – | Destination ZIP/postal code |\r\n| `proxyConfiguration` | object | AUTO | Apify proxy config |\r\n\r\nAt least one of `asins` or `productUrls` must be provided.\r\n\r\n## Limitations\r\n\r\n- The All-Offers-Display list is followed for up to 10 pages / 100 candidates per ASIN; `page.moreOffersAvailable` reports when more exist.\r\n- Stock quantity is not published on offer rows; only `maxQuantity` from the quantity selector is available.\r\n- Identical offers (same seller, price, condition and note) are collapsed as duplicates.\r\n- Condition words outside the live-verified translation set can under-match `USED`/`COLLECTIBLE`/`RENEWED` filters on non-English marketplaces; use `ALL` to inspect the real condition text.\r\n- Amazon page URLs are canonical but may return 503 to bare scripted requests; they render normally in a browser.\r\n\r\n### Example: single ASIN, all conditions\r\n\r\n```json\r\n{\r\n  \"asins\": [\"B0DCH8VDXF\"],\r\n  \"conditions\": \"ALL\",\r\n  \"maxOffersPerProduct\": 10\r\n}\r\n```\r\n\r\n### Example: multiple ASINs, new only, destination-aware\r\n\r\n```json\r\n{\r\n  \"asins\": [\"B0DXXYS4BJ\", \"B0DCH8VDXF\"],\r\n  \"conditions\": \"NEW\",\r\n  \"deliveryCountry\": \"US\",\r\n  \"postalCode\": \"10001\",\r\n  \"maxOffersPerProduct\": 20\r\n}\r\n```\r\n\r\n### Example: by product URL, UK marketplace\r\n\r\n```json\r\n{\r\n  \"productUrls\": [\"https://www.amazon.co.uk/dp/B0DCH8VDXF\"],\r\n  \"conditions\": \"ALL\"\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Price monitoring** -- track how many sellers compete on a listing and at what price\r\n- **Buy-box tracking** -- monitor which seller currently owns the buy box over time\r\n- **Repricing intelligence** -- see competitor pricing, condition, and shipping terms side by side\r\n- **Seller research** -- discover which third-party sellers list a given ASIN and their ratings\r\n- **Arbitrage / reselling** -- compare New vs Used pricing spreads on the same product\r\n\r\n## FAQ\r\n\r\n**What is the All-Offers-Display panel?** It's the list Amazon shows when you click \"See All Buying Options\" or \"X used & new\" on a product page -- every seller currently offering that ASIN, not just the buy-box winner.\r\n\r\n**Why do offer sets change by destination?** Amazon only shows offers a seller can actually ship to your delivery address. Setting `deliveryCountry`/`postalCode` makes the results match what a real shopper in that location would see.\r\n\r\n**Why is `sellerRating` sometimes missing?** Amazon only shows an independent seller-rating line for third-party sellers. Offers fulfilled and sold directly by Amazon (or \"Amazon Resale\") don't carry a separate rating line, so the field is correctly omitted rather than fabricated.\r\n\r\n**How is `fulfillmentType` determined?** From Amazon's own \"Ships from\" and \"Sold by\" labels on each offer row -- `FBA` (Fulfilled by Amazon) when Amazon ships it but a third party sold it, `AMAZON` when Amazon both sold and shipped it, `FBM` (Fulfilled by Merchant) when the ships-from and sold-by names match (the seller ships it themselves). If the combination is ambiguous (e.g. a named third-party fulfillment center), the field is omitted rather than guessed.\r\n\r\n**Why is `isFreeDelivery`/`shippingPrice` sometimes missing?** Only set when Amazon's delivery text gives explicit evidence either way (\"FREE delivery...\" or a stated shipping charge). An ambiguous delivery estimate with no free/paid wording leaves both fields omitted rather than assuming free.\r\n\r\n**What's the difference between `USED` and `COLLECTIBLE`/`RENEWED` in the condition filter?** Amazon's own AOD panel surfaces up to 4 distinct top-level condition buckets on the same listing -- `New`, `Used`, `Collectible` (rare/specialty copies, common on books/media), and `Renewed` (Amazon's official refurbishment program). Each `conditions` filter value matches its own bucket exactly -- selecting `USED` will never silently include a `Collectible` or `Renewed` offer. Use `ALL` if you want every condition together.\r\n\r\n**Does the `conditions` filter work on non-English marketplaces?** The output `condition` field always shows Amazon's own real, localized text (e.g. Polish \"Nowe\", Dutch \"Nieuw\", Italian \"Nuovo\" for New-condition offers) -- it's never translated or altered. The `conditions` input filter itself recognizes the English bucket names plus a small, evidence-based set of live-verified translations: New-condition words for Polish/Dutch/Italian/German/Japanese/Spanish/French, plus Used/Collectible words for Japanese (\"中古商品\"/\"コレクター商品\"), German (\"Gebraucht\"), Italian (\"Usato\"/\"Da collezione\"), Spanish (\"De 2ª mano\"), and French (\"D'occasion\"). Filtering by `USED`/`COLLECTIBLE`/`RENEWED` on a marketplace whose offers render those buckets in a language this actor hasn't yet verified a translation for may under-match (real offers in that bucket excluded rather than risking a wrong match) -- use `ALL` and inspect the real `condition` text yourself if you need every bucket on an untranslated marketplace.\r\n\r\n**Why did I get a status record instead of offers?** The ASIN's page didn't classify as a normal offers listing -- it may be invalid, geo-restricted, temporarily rate-limited, or genuinely have no additional offers beyond the buy box. The `page.classification` field tells you exactly why.\r\n\r\n**I set `maxOffersPerProduct` to 50 but got fewer offers back -- is that a bug?** No -- `maxOffersPerProduct` is a cap, not a guarantee. The actor pages through Amazon's own offer list (10 offers per page) until it reaches your cap, Amazon's reported total, or the 10-page (100-candidate) safety ceiling, so ordinary listings are fully covered. Popular used-book listings can genuinely have more offers than that ceiling, and a filter can remove some captured rows. Every returned offer record's `page.totalOfferCount`/`page.moreOffersAvailable` fields tell you the real total and whether more exist beyond what was captured, so you can always tell the difference from a genuinely-exhausted result.\r\n\r\n**What does `isPrime` mean?** It comes from Amazon's own machine-readable delivery-benefit flag on the offer row: `true` for Prime delivery, `false` when Amazon explicitly labels the row as paid shipping. If Amazon does not expose the flag for a row, the field is omitted rather than guessed. It is independent of `shippingPrice`: an offer can be Prime-eligible and still show a shipping charge in some destinations/marketplaces.\r\n\r\n**Is this affiliated with Amazon?** No. This is an independent, third-party actor that reads Amazon's publicly viewable product pages.\r\n\r\n**How fresh is the data?** Every run fetches the live page at request time -- offers, prices, and the buy-box winner can change within minutes on Amazon, so treat each run as a point-in-time snapshot.\r\n\r\n**Why does `sourceUrl` / `soldBy.profileUrl` return an error if I open it with a bare script?** Amazon's edge blocks plain, cookie-less, non-browser requests outright -- a raw request from a clean script with no session/cookies will get a \"Service Unavailable\" response even though the same URL loads fine for a real shopper. This actor itself reaches these pages successfully; the URLs in the output are the correct, canonical Amazon URLs and will render normally when opened in a browser.\r\n",
      "input": {
        "title": "Amazon Offers Scraper Input",
        "description": "Scrape every seller offer for one or more Amazon ASINs from the All-Offers-Display (\"Other Sellers on Amazon\") panel. Provide ASINs and/or full product URLs.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "asins": {
            "title": "ASINs",
            "type": "array",
            "description": "Amazon ASINs to fetch offers for, e.g. `B0DCH8VDXF`. Provide at least one ASIN or product URL.",
            "editor": "stringList",
            "default": [],
            "prefill": [
              "B0DXXYS4BJ"
            ]
          },
          "productUrls": {
            "title": "Product URLs",
            "type": "array",
            "description": "Full Amazon product URLs (any `/dp/{ASIN}` link). The marketplace domain and ASIN are both extracted from each URL. Provide at least one ASIN or product URL.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "conditions": {
            "title": "Condition filter",
            "type": "string",
            "description": "Only emit offers of this condition. Amazon's offer panel surfaces 4 distinct condition buckets -- New, Used, Collectible, and Renewed (Amazon Renewed program) -- each matched exactly (\"Used only\" never silently includes Collectible/Renewed offers).",
            "editor": "select",
            "enum": [
              "ALL",
              "NEW",
              "USED",
              "COLLECTIBLE",
              "RENEWED"
            ],
            "enumTitles": [
              "All conditions",
              "New only",
              "Used only",
              "Collectible only",
              "Renewed only"
            ],
            "default": "ALL",
            "prefill": "ALL"
          },
          "fulfillmentTypes": {
            "title": "Fulfillment type filter",
            "type": "array",
            "description": "Only emit offers with this fulfillment type. Derived from Amazon's own explicit \"Ships from\"/\"Sold by\" labels: FBA (Fulfilled by Amazon -- ships from Amazon, sold by a third-party seller), AMAZON (sold and shipped by Amazon itself), FBM (Fulfilled by Merchant -- the seller ships it themselves). Leave empty for no filter. Offers where the fulfillment type couldn't be confidently derived are excluded whenever a filter is set (but still included when this filter is empty).",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "FBA",
                "FBM",
                "AMAZON"
              ],
              "enumTitles": [
                "Fulfilled by Amazon (FBA)",
                "Fulfilled by Merchant (FBM)",
                "Sold and shipped by Amazon"
              ]
            },
            "default": [],
            "prefill": []
          },
          "maxOffersPerProduct": {
            "title": "Max offers per ASIN",
            "type": "integer",
            "description": "Hard cap on the number of offer records emitted per ASIN (the buy-box/pinned offer counts as one). The actor pages through Amazon's offer list 10 offers at a time until this cap, Amazon's reported total, or a bounded 10-page safety ceiling is reached.",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "prefill": 5
          },
          "deliveryCountry": {
            "title": "Delivery country",
            "type": "string",
            "description": "2-letter destination country. Offer sets are destination-dependent; also selects the default marketplace domain for bare ASINs (ignored when `productUrls` supplies its own domain).",
            "editor": "select",
            "enum": [
              "",
              "US",
              "CA",
              "MX",
              "BR",
              "GB",
              "DE",
              "FR",
              "IT",
              "ES",
              "NL",
              "SE",
              "PL",
              "TR",
              "AE",
              "SA",
              "IN",
              "SG",
              "AU",
              "JP",
              "EG",
              "IE",
              "BE",
              "ZA"
            ],
            "enumTitles": [
              "(default - United States)",
              "United States",
              "Canada",
              "Mexico",
              "Brazil",
              "United Kingdom",
              "Germany",
              "France",
              "Italy",
              "Spain",
              "Netherlands",
              "Sweden",
              "Poland",
              "Turkey",
              "United Arab Emirates",
              "Saudi Arabia",
              "India",
              "Singapore",
              "Australia",
              "Japan",
              "Egypt",
              "Ireland",
              "Belgium",
              "South Africa"
            ],
            "default": "",
            "prefill": "US"
          },
          "postalCode": {
            "title": "Postal / ZIP code",
            "type": "string",
            "description": "Destination postal code to refine delivery estimates. Optional.",
            "editor": "textfield",
            "prefill": "10001"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Uses the free AUTO (datacenter) proxy group by default. Some marketplaces (e.g. amazon.co.uk, amazon.de) drop datacenter connections outright, so the actor fast-fails a network-level timeout on a target and automatically retries it once under a RESIDENTIAL session -- a bounded fallback, never the default.",
            "editor": "proxy",
            "prefill": {
              "useApifyProxy": true
            },
            "default": {
              "useApifyProxy": true
            }
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Amazon All Offers & Buy Box Tracker Output",
        "description": "Per-seller offers for scraped Amazon ASINs -- condition (+ normalized condition bucket, + seller-provided condition note on used offers), price, seller name/rating, ships-from, delivery estimate, Prime flag, fulfillment type (FBA/FBM/AMAZON, when derivable), free-delivery flag/shipping price (when Amazon gives explicit evidence either way), and buy-box winner flag. The actor pages through Amazon's own offer list (10 offers per page) up to the requested cap.",
        "properties": {
          "offers": {
            "type": "string",
            "title": "Amazon offers",
            "description": "Dataset containing all scraped Amazon offer and status records.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "defaultMemoryMbytes": 2048,
      "minMemoryMbytes": 2048,
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Offers",
              "transformation": {
                "fields": [
                  "productAsin",
                  "offerPosition",
                  "condition",
                  "conditionBucket",
                  "price",
                  "soldBy",
                  "shipsFrom",
                  "isPrime",
                  "fulfillmentType",
                  "isBuyBoxWinner"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "0bab4847a6ac524c9f603dde88068f8ba1aec79a17431c50171cb8be47847c5f",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.010842222222222222
    }
  }
}