The Marketplace dropdown accepts null as well, so an all-fields-null template runs.
- An input that fills every optional field with
null now starts. That is the shape n8n, Make and most agent frameworks actually send, and one field was still refusing it: the Marketplace dropdown. {"sellers": ["A124O05NL4Z2HN"], "marketplace": null, "includeListings": null, "maxItems": null} used to be rejected before the run began, with an error about allowed values. It now runs on the defaults, exactly as if those fields had been left out.
- A store we do not cover is answered by name, and nothing is looked up. Amazon runs a separate seller directory per country, so
"marketplace": "amazon.ca" quietly looked up on amazon.com would answer a different question — and "no such seller" would be wrong twice over. It now returns one uncharged row naming the three stores that do work. Nothing is charged, and the run still succeeds.
- Every value the dropdown lists behaves exactly as before, and the console picker is unchanged.
- The run's own status line now says "1 input error" instead of "1 input skipped". The old line named nothing you could act on; the dataset row spells out the fix.
- Nothing about what is delivered or charged changed. One flat fee per delivered record, misses never charged.
Optional settings now accept null, and null means "use the default".
- An explicit
null on an optional setting starts the run instead of refusing it. Agents and integrations routinely fill in the fields they are not using with null; until now {"sellers": ["A124O05NL4Z2HN"], "maxItems": null} was rejected before the run began, with an error saying the field had to be an integer. It now runs exactly as if the field had been left out.
null never changes what a run does. Include the seller's live listings, Max listings per seller, Max records (whole run), Max run seconds and Include listing specifications each fall back to the same default they would have used anyway. This is a second way to say "leave it alone", not new behaviour.
Sellers still cannot be null, and neither can the Marketplace dropdown — a dropdown only accepts one of the values it lists. Send a real value or leave the field out entirely. Sellers staying strict is deliberate: it is what catches a mistyped field name before the run starts rather than after.
- Nothing about what is delivered or charged changed. One flat fee per delivered record, misses never charged.
The linked example dataset is re-shot from the code this release ships, and it now has a permanent address.
- The example-dataset link points at a fresh run of exactly this code — a live seller profile, one of its listings with the Sold-by cluster populated, and the
cap_reached summary row last; two records delivered, two charged.
- That sample now lives at a permanent address. It used to be one run's own output, which is cleared when that run ages out — the link would eventually have gone dead on its own. It cannot now.
- The page says "one real run of the current code", not "of the current build", because a release that changes only this page must not make that sentence false. Nothing about what this actor delivers or charges changed in this release.
The linked example dataset is re-shot from a verified run of the current build.
- The example-dataset link now points at a run of this build — a live seller profile, one of its listings with the Sold-by cluster populated, and the
cap_reached summary row last; two records delivered, two charged. Nothing about what this actor delivers or charges changed in this release.
Listing rows carry their Sold-by cluster again, and pasting a product link resolves its seller reliably again.
buyBoxSeller, buyBoxSellerId, fulfilledByAmazon and soldByAmazon are filled in again on listing rows. Amazon serves the Sold-by block in several layouts and the cluster had been shipping as null; the parser now reads all of them, verified against freshly captured pages.
- Product-link input works reliably again. Pasting a product URL resolves the seller through the buy box — the same repaired parser — so ASIN-to-seller resolution no longer degrades on Amazon's newer page layouts.
- New column:
buyBoxNote. When a served page genuinely names no seller, the Sold-by fields stay null and this column says so on that exact row.
- Invisible direction marks are stripped from every text field, and the fetch ladder gained a final mobile-fingerprint step on the same residential exits after amazon.co.uk began refusing every desktop fingerprint. Blocked or missing sellers are still never charged.
Clearer release notes — this page's notes now read more plainly. Nothing about what this actor delivers or charges changed.
A full live example dataset is now linked from the Output section.
- See the exact rows before spending anything. The Output section now links a real run's dataset, unedited — a seller profile record, one of its live listings and the run's own summary row — so the row shape and the charging behaviour can be inspected up front.
- Every actor named in the README is now a live link. The Amazon Bestsellers entry and every other name in the suite tables now link to their live store pages. Nothing about what this actor delivers or charges changed.
Restarts, resurrections and billing bookkeeping hardened end to end.
- A restarted run no longer trusts a stale answer about what it already delivered. Right after a restart, the platform's view of the run's own output can lag a few seconds behind. A run that believed that lagging answer could have delivered — and charged — records a second time, or lost count of rows past the lagging total. It now double-checks an "empty" answer and reads its own output through to the true end before doing anything, so nothing already delivered is ever fetched, delivered or billed again.
- Finishing an interrupted charge can never bill twice — and can never sink the run. When a restart finds a charge from the previous attempt half-finished, the amount still owed is reckoned against the highest count of what already landed, so a lagging counter cannot cause a repeat charge. And if that settlement cannot be completed at that moment, the run carries on and settles it on a later resume instead of failing — nothing extra is charged either way.
- A run being moved to another server hands over cleanly, and never writes a half-finished invoice. The departing side no longer declares the run finished on its way out, and it no longer adds a summary row of its own — the run continues where it left off, and the finished run writes exactly one summary that reconciles against the invoice.
- A resurrected run gets a real working window. "Max run seconds" counts the run's life, not each restart's — but a run resurrected after that window had already passed used to stop on its first step, blaming your own limits, with nothing new delivered. It now gets a fresh, bounded window to finish the remaining work.
- If this actor's own price configuration is ever broken, a run stops before spending anything. Both broken shapes — one that would bill for rows we promise carry no result fee, and one that could not bill at all — halt immediately, fetch nothing, charge nothing, and say plainly that the fault is ours.
- A charge is counted only when it actually landed. The
charged flag and the run's own charge totals now reflect the platform's answer, never an assumption.
Numbers printed in the "wrong" language now always read as the numbers they are.
- Counts survive a product page served in another language's number format. Amazon renders a page in the formatting of the route that fetched it, not the store's own, so amazon.de sometimes arrives with English-style numbers — a review count of "4,305". Read with German number rules that used to collapse into a decimal: a charged
reviewCount of 4, a thousand times under. Grouped whole numbers now read as grouped whole numbers in every language — on review counts, ranks and prices alike.
- "Bought in past month" badges phrased without a "+" right after the digits parse correctly, and the localized German thousand/million marks ("Tsd.", "Mio.") are understood — "Mehr als 1.000 Mal … gekauft" is 1,000, never 1,000,000.
- A Nordic "kr" price mark never takes another marketplace's currency label. When the currency of a price cannot be resolved from the page, the
currency column ships honestly empty instead of guessed.
- The Amazon suite links in the README now point at the published actors.
Guidance rows say "Nothing was charged" exactly once.
- Two guidance rows no longer repeat themselves. The row for a link that points at an Amazon marketplace this actor does not cover, and the row for a product page whose Buy Box is Amazon itself rather than a third-party seller, both used to end by saying "Nothing was charged" twice in a row. Each now says it once. What is delivered and what is charged are unchanged.
A typo in an input field name now gets a helpful pointer instead of sample rows.
- A run that sets a field this actor does not have is answered, not demoed. Sending something like
sellerIds instead of sellers used to look exactly like an empty run, so it came back with the uncharged sample rows — and nothing said the field had been ignored. Such a run now returns one uncharged row that names the field it did not recognise, names Sellers (input key sellers) and shows the shape to send. A run that really is empty still returns the sample rows, and a run with real sellers is unchanged.
The empty-storefront verdict is now held to the same proof standard as every other verdict in this actor.
- A seller with live listings can no longer be reported as
no_listings. Amazon sometimes answers a storefront request with a full-size "no results" page even when the storefront is not empty. The empty-storefront verdict now has to be confirmed by the most reliable check we have before it ships; an empty answer that cannot be confirmed is reported as source_unavailable — temporary, uncharged, worth re-running — never as a permanent verdict about the seller.
- A storefront page whose listings cannot be read now ships as
parse_failed — on us, uncharged and flagged — instead of no_listings.
- The
amazon_retail row now tells the whole story. Amazon answers a seller ID with its help pages both for its own retail accounts and for a real seller that is not registered on that marketplace; the row now says both, and suggests re-running with the marketplace the seller actually trades on.
Price parsing is hardened, ported from the family's shared parser.
- Promotional wording printed next to a price ("avec 18 % d'économies", "con il 18 % di risparmio") can no longer bleed its digits into the parsed amount — a percentage is never read as part of a price, in any language.
- The Nordic "kr" and Polish "zł" currency marks are now recognised wherever Amazon prints them, instead of being dropped.
- Review counts on European listings are read correctly. Some storefront layouts print the total with a space between the digit groups ("4 298"); earlier builds could not read that formatting and shipped an honest empty
reviewCount. The count now arrives as a number, in the store's own formatting.
- "Max run seconds" really is measured from your run now. The previous build anchored our own internal ceiling to the moment the run started, but your setting still got a fresh full window every time Apify moved the run to another server. Both are now measured from the start of the run, so a run you capped at 300 seconds takes 300 seconds however many times it is moved.
- "Bought in past month" is correct on decimal counts. Amazon writes some of these as
1.5K+, and as 1,5K+ on amazon.de. Both were read as 15,000 instead of 1,500 — ten times the real figure. Whole-number forms such as 2K+ and the German 1.000+ were always right and are unchanged.
- Restarts no longer cost you twice. Apify can move a run to another server mid-way, and you can resurrect a finished run with one click. Either way this actor now rebuilds what it already delivered from your own dataset before it does anything else: records already collected are not fetched again, not added to your dataset again, and not charged again.
- A charge interrupted between delivering a record and billing it is completed once, at the start of the next attempt — so a row that says
charged: true is always true, and can never be billed twice.
Max records (whole run) now holds across a restart. Previously a restarted run started its own fresh count and could deliver up to twice the limit you set.
Max run seconds is now measured from when your run started rather than from when a server move restarted it.
- The summary row gained
resumedRecords: how many records the run had already delivered before it restarted.
- If the actor cannot read your dataset back at startup on a run that has already been billed, it now delivers your records but charges nothing at all rather than risk billing against a record it cannot see.
- Duplicates you could not see are now merged. Two storefront cards that are variants of the same product land on one Amazon page: they used to ship as two records at two charges. So did two seller IDs that resolve to the same seller profile. Both now deliver once, charged once.
- A seller page or storefront that Amazon answers by redirecting to its sign-in or captcha address is now reported as
blocked — temporary and uncharged — instead of being read as a seller with an empty storefront.
- New
not_a_product status: some storefront items are Amazon's own subscription plans rather than product listings. They have no price, seller or reviews of their own, and they now say so instead of being reported as a layout we could not read.
- Budget accuracy: the storefront walk is now sized by what the spend cap can still pay for, so a run close to
maxTotalChargeUsd no longer fetches listing pages it could never deliver or charge for.
- When the spend cap is what ended a run, the summary row names the cap as the reason — including when the cap runs out on the very last seller.
Initial release.
- Look up any Amazon seller by ID, storefront link, profile link, or a product link whose seller you want.
- Profile records: name, storefront link, star rating and rating counts for 30 days, 90 days, 12 months and lifetime, positive-feedback percentage, and the seller's published business block — registered name, business type, address, country, and VAT or trade-register number where the seller publishes one.
- Listing records: the seller's live storefront, one full product row per item, paged in the seller's own order.
listingCount reports the seller's true total so you can see when your own limit truncated the answer.
- One priced event. A profile and a listing cost the same flat fee, and there is no second event.
- Honest uncharged rows for every way a lookup can fail: an ID that does not exist, one of Amazon's own retail accounts (which have no storefront), a seller with no live listings, and anything Amazon blocked.
- Marketplaces: amazon.com, amazon.co.uk, amazon.de.
- Running with an empty seller list returns uncharged sample rows.