# Changelog of Amazon Sellers Scraper — Profile + Live Listings, Flat Fee (`steadyfetch/amazon-seller-scraper`) Actor

- **URL**: https://apify.com/steadyfetch/amazon-seller-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/steadyfetch/amazon-seller-scraper.md

## Changelog

### 1.0.59 — 2026-09-21

- **The first line of the store page now names the thing and the price.** It opened on "Paste an Amazon seller ID..." and the per-record price sat about 840 characters down in a bullet. The opening line now reads "An Amazon seller scraper: paste a seller ID or a storefront link and get that seller's profile plus their live listings — from $1.50 per 1,000 seller records. One flat fee per record.", and the detail that used to be in that sentence — feedback history, registered business details, up to 300 live listings — follows it. Nothing else moved: same $1.50 per 1,000 on Gold and above, same one priced event, same input fields, same output columns, and sellers we could not deliver are still never charged.

### 1.0.58 — 2026-09-20

- **Three sentences on the run page are shorter, so a crowded run has room for the rest.** The status line is cut at 500 characters by the platform and the busiest run it can compose sat exactly on that cut, with nothing left to give. "N sellers returned no record" now reads "N sellers with no record", "N listings could not be fetched" reads "N listings not fetched", and "carried over N records already delivered before the restart (not re-charged)" reads "carried over N records already delivered (not re-charged)" — "carried over" is what says the restart happened, so the sentence was saying it twice. Same facts, same counts, and the "not re-charged" statement is untouched. No price, input field, output column or charged event changes.

### 1.0.57 — 2026-09-19

- **The whole "Maximum cost per run" you set is now spent on seller records.** Before this build the run held back about a tenth of your cost cap before it started — a cushion for platform running costs which, on this actor's pricing, your cap does not pay for at all: your cap buys seller records, and the running costs are ours. So the cushion was simply cap you had asked to spend and could not get. On a run capped at $0.10 with seller records at $0.0015 the plan asked for 60 seller records where the cap paid for 66 — 6 seller records of your own cap, unspendable by construction. From this build the plan uses your cap in full, so a run asks for as many seller records as your cap can really pay for. Nothing you are charged changes, and nothing can be charged above the cap you typed: every charge is still checked against what is left of your cap at the moment it is posted, and a run that reaches your cap still stops cleanly, ships what it had already fetched, and tells you what is left. No price, input field or output column changes.

### 1.0.56 — 2026-09-16

- **The per-record price and a line on how often the data moves now sit in the opening list, three screens earlier than before.** A buyer landing here had to read about 6,916 characters before the price appeared at all. It is now a bullet under the input line: both ends of the tier ladder, the one priced event, and the reminder that a row we could not deliver is never charged — with the full ladder, the event name and the honesty contract unchanged below. Beside it is the cadence line that was not on the first screen at all: what actually moves between one run and the next, so a buyer can tell whether this is a one-off or a schedule. No input field, output column, charged event or price changed; only where the page says them.

### 1.0.55 — 2026-09-13

- **The store description now says what a record is, so the price on the card means what it says.** The line read "a full product row for every live listing. From $1.50 per 1,000 seller records", which reads as $1.50 per 1,000 sellers. It never was: the profile is one charged record and each live listing is another, so a seller with 100 live listings is 101 records — about 100 times the card's apparent price. The pricing section of this page has always said so; the card now says it too.
- **"Every live listing" is now the real limit: up to 300, 100 by default.** The ceiling has always been 300 listings per seller with a default of 100, and the console form opens on 15 — so "every listing" was a promise no run kept. The description carries the real numbers.
- The description also mentions that each listing row carries its product specifications, which it always has. Nothing else moved: no input field, output field, event or price changed.

### 1.0.54 — 2026-09-13

- **The input form now opens on a first run of about 16 records instead of 101.** The form arrives with one example seller, and `Max listings per seller` used to sit empty and fall back to 100 — so pressing Start on the example delivered the profile plus 100 listings, 101 charged records and about $0.61 on the Apify free plan, after roughly seven storefront pages and a product lookup for every listing. The form now opens with that limit set to 15, so the example run returns the profile plus 15 listings for about $0.10 and finishes quickly. This is a starting value in the form only: the limit still falls back to 100 whenever it is left out by an API call, a scheduled task or an integration, so nothing you have already wired up changes. Nothing else moved: no input field, output column, event or price changed.

### 1.0.53 — 2026-09-13

- **The input form now opens with the call that works, what one record costs and what is never charged — the screen an AI agent reads.** An AI agent shopping the store never reads this page: it reads the input form's own description, and that description used to open by telling a human to click Start. It now opens with a ready-to-send input, says which field is required and that every other one can be left out, spells out that a record is the profile plus one per live listing — so a seller with 100 listings is 101 records — and prices that job on the Apify free plan and on paid plans, lists what is never charged, repeats that reading a product link to find its seller costs nothing on its own, names the run option that caps the bill and the limits that bound the work, and points an ASIN, a keyword or a Best Sellers link at the right sibling actor. **Sellers** leads with the value shape and its example instead of the console instruction, which now comes last. Nothing else moved: no input field, output column, event or price changed, and the console form behaves exactly as before.

### 1.0.52 — 2026-09-12

- **An aborted or migrated run now leaves its receipt from the first moment of the run, instead of only after start-up finishes.** The record that says how a run ended was only put in place once the run had finished starting up — reading your input, opening its stores, working out what a previous attempt had already delivered and charged. A run stopped inside that window ended with nothing written about it at all, which mattered most on a re-started run, where the thing not written about was the earlier attempt's work. It is now in place from the run's first moment. Nothing else moved: no input field, output column, event or price changed, and a run that reaches its work behaves exactly as before.

### 1.0.51 — 2026-09-12

- **This actor has a new title on the store: Amazon Sellers Scraper — Profile + Live Listings, Flat Fee.** Same actor, same id, same URL, same input, same output, same price — only the words on the listing changed, so nothing you have saved, scheduled or wired into an integration needs touching. The title now carries the phrase buyers actually search for, which is the only reason it moved.
- **Asking for a bigger limit than this actor can do no longer stops the run before it starts.** `Max listings per seller`, `Max records (whole run)` and `Max run seconds` used to be range-checked by the platform itself, so a run asking for 3,000 listings a seller, 200,000 records or 30 seconds was refused outright: no run, no rows, no message, nothing on the run page to explain it. The ceilings are unchanged (300 listings a seller, 20,000 records, 60 to 21,600 seconds) but they are now ours to apply: the run starts, continues at the nearest value it can do, and adds one uncharged `input_note` row naming what you asked for and what bound. Anything you already send inside those ranges behaves exactly as before.
- Nothing else moved: no input field, output column, event or price changed.

### 1.0.50 — 2026-09-11

- **An AI agent can now pin this actor straight from the top of the store page.** The one-click MCP link, the actor's id, the single input field it needs with a real example, and the run setting that caps what a run may spend now sit in the opening lines of the page instead of far down it. An agent that reads only the start of a listing could not see any of that before, so it could not work out how to call this actor without being told. Nothing about the actor itself changed — same id, same input, same rows.
- **The page also names our other scrapers correctly again.** A few links and mentions still used titles those actors no longer have. The links always pointed at the right actors; only the words were out of date.
- **One maintenance detail you will not see:** the private run-report this actor writes for our own support — numbers only, never anything you typed — now also records the price each charged item carried on that run, so a question about a bill can be answered from the run itself.
- Nothing else moved: no price, event, output column or charge changed, and only delivered records are charged.

### 1.0.49 — 2026-09-10

- **A maintenance build: nothing about your runs changes.** The private run-report this actor writes for our own support — counts only, never anything you typed — gained room for four figures it does not fill in yet: how many targets a run was given, how long it waited on a blocked source, how many of those waits recovered, and a reason code for an item our own size limit refused. The build carries the shared contract so a later one can report them; on this actor every one of them is left blank, and nothing a run does or costs is different.
- Nothing else moved: no price, event, output column or charge changed, and only delivered records are charged.

### 1.0.48 — 2026-09-09

- **A run on a short time limit now gets a real second attempt on a blocked seller record.** Patience is sized to the clock a run actually has instead of being refused whenever the full pause would not fit, so a short run — including the eight-minute sample and Apify's own five-minute health check — gets a retry where before it got none. The first pause is a third as long, so a block that lifts quickly is caught far sooner, and a block that answers the same way twice ends the waiting instead of paying for pauses that were never going to help.
- Nothing else moved: no price, event, output column or charge changed, and only delivered records are charged.

### 1.0.47 — 2026-09-09

- **A run that answered every seller honestly no longer asks you whether something went wrong.** A seller ID with no page behind it, and a storefront listing we could confirm is not there, are real answers and nothing is charged for them — but the run page still ended with "Something off? Open an issue", which reads as a fault on your own correct input. It now asks for an issue only when something a re-run could fix went wrong: a page Amazon blocked or we could not read, a setting we could not accept, a run cut short by your cost cap or the clock, an unreadable delivery record, or a run that delivered nothing and could not say why. Every count still appears on the line exactly as before.
- Nothing else moved: no price, event, output column or charge changed, and only delivered records are charged.

### 1.0.46 — 2026-09-06

- **A block of links pasted into one row is now read as the list you meant, whatever separates them.** "Sellers" takes one seller ID or link per row. A whole block pasted into a single row was read as one very long address, so a list of sellers looked up one at best and lost the rest in silence. A pasted block is now split back into its individual links whether they are separated by spaces, line breaks, tabs, commas, semicolons, pipes or nothing at all, so a column copied straight out of a spreadsheet works. Each one is then read, deduplicated and charged on its own, exactly as if you had pasted them one per row.
- **A link that carries another link inside it is still one link.** An address holding a second address in its query or its path is left whole, not broken in two, and a single link pasted on its own is never rewritten.
- **Text pasted around a link no longer breaks it.** A number, a bullet or a note sitting beside a link is ignored and the link itself is used. A row holding no link at all is still answered as one row, not one row per word.
- Nothing else moved: no price, event, output column or charge changed, and only delivered results are charged.

### 1.0.45 — 2026-09-06

- **The run's own record now counts the rows your limits left uncollected.** When your **Max records** cap filled, your maximum cost per run was reached, or the run's clock ended the walk, the sellers still ahead of it — and the listings inside a storefront it had already read — were simply absent from the report this run writes back to us: a run that asked for five records and delivered two closed its books with three named by nothing at all. Each is now counted under the limit that stopped it, so a run that stops short of what you asked for is visible to us without you having to report it.
- **A run that stopped at your record cap now also records whether that cap really filled.** It is one true-or-false fact about the run, never the number you typed, and it lets us see a run that claimed your cap stopped it while it had in fact delivered fewer records than you allowed.
- **Nothing you can see changed.** Your rows, your columns, your receipt row and your bill are exactly as they were — only delivered records are charged, and a record that was not delivered is not charged.

### 1.0.44 — 2026-09-05

- **A seller with fewer live listings than your per-seller limit is no longer recorded as if the storefront had been full.** Ask for up to 100 listings from a seller who has 16, and this run's own record of the job said you had asked for 101 rows and been given 17 — 84 rows that were never there, and nothing in the record to say so. The record now follows what each storefront really listed. Your rows, your status line and your bill are unchanged: the same profile and the same 16 listings are delivered and charged.
- **A seller that was never looked up is now counted one by one, not as a single problem.** When a setting such as "Marketplace" cannot be read, every seller id you sent still gets its own uncharged row saying so — that part is unchanged — but our own record of the run counted that as one problem rather than as the eight sellers it cost, so a run of yours that delivered nothing could look far smaller to us than it was. The same is now true of a seller or a storefront Amazon walled: the run records the rows that wall cost, not just the wall.
- **A seller id this actor could not read now stays in the count of what you asked for.** If your list held five ids and one of them was neither a seller ID nor a storefront link, the run's own record quietly dropped it from what you had asked for. It is still answered with its own uncharged row, and nothing is charged for it.
- **Your "Max records" limit is now recorded as what stopped the run, never as what you asked for.** A run that filled your limit reads as a run that filled your limit, with the sellers it never reached still on the record as asked for and unfinished.
- **Two ids that turn out to be the same seller are counted once**, the way they have always been delivered once and charged once.

### 1.0.43 — 2026-09-05

- **A run now pauses only when it can finish a whole second round of attempts afterwards and still have time to write its rows.** When Amazon refuses every route, this actor waits a minute and a half to three minutes and asks again. The check that decided whether that pause was affordable set aside half a minute for the round of attempts that follows it, while a real round here takes between two and a half and just over four minutes, depending on how many routes the run is allowed to use. So on a short run — the automatic five-minute check, or a low **Max run seconds** — the run could take the full pause and then run out of clock part-way through the round it had just waited for. The pause is now measured against a real round on this actor's own connection ladder, so a first run that waits now always keeps room to finish and report: a short run either waits and finishes cleanly or answers straight away, and a run with the time to wait behaves exactly as it did.
- Nothing about your dataset or your bill changed: a pause is never charged, and only delivered rows are charged.

### 1.0.42 — 2026-09-05

- **A sentence in the entry below called this actor's sample connection routes "free".** A run always spends platform time you pay for, so nothing on this page is described that way: the sentence now says the no-input sample uses only the unpaid connection routes. Nothing about what this actor does, delivers or charges changed.

### 1.0.41 — 2026-09-05

- **A run started with no input at all now waits out a block like any other run.** Press Start on the untouched form and this actor reads one real seller, charged like any run. Until now the no-input sample was the one run that never paused: its time limit was three minutes, and one pause of a minute and a half to three would have used most of it. So the most common first run of all — a first-time buyer pressing Start, an agent sending nothing, the daily automatic check — reported "blocked, please re-run" while the block was still lifting. The sample's time limit is now eight minutes, sized to hold one full round of attempts, one pause, another full round, and enough time left over to stop cleanly and report, and the sample is patient like everything else. A sample Amazon answers still finishes in seconds; only a blocked one uses the extra time; the no-input sample still uses only the unpaid connection routes, so a wait never buys a paid one; and nothing is charged unless rows are delivered.
- **How much of its remaining time a blocked run may spend waiting now follows the size of what you asked for.** A run with more sellers still to read keeps exactly the limit it had — no more than half the time left — so a wide block still leaves the later sellers their share of the run. A run with a single seller may spend what is left on its one pause, because nothing else is waiting for that time.

### 1.0.40 — 2026-09-05

- **When Amazon walls a page, the run now waits the wall out instead of handing you the wait.** A seller profile, a storefront or a listing that Amazon refused on every route used to end in an uncharged "please re-run" row inside a minute, with almost all of your run's time still unspent — the row asked you to wait exactly the minutes the run could have waited itself. That miss is now held back: the run pauses a minute and a half to three minutes, takes fresh network routes and asks again, and keeps doing so while your run still holds the time and the work still outstanding is worth the pause. Short wall storms clear inside that window, so the rows arrive on this run instead of the next one.
- **Each surface waits on its own.** A delivered seller profile whose storefront was walled re-walks the storefront alone — the profile is fetched once and charged once, whatever happens after it. One walled listing is asked again on its own, and the listings that already came back are never fetched or charged twice.
- **A definitive answer still stops at once, with no pause at all.** A seller ID Amazon answers with its help pages, a seller with no live listings confirmed on a trusted route, no seller page at all, a layout we cannot read, an ASIN from a different marketplace, one of Amazon's own subscription pages, or a product whose Buy Box is Amazon itself — waiting cannot change any of them, so the run does not.
- **A row that did wait says so**, naming how long the run waited in total and across how many attempts, before "please re-run". Nothing changed about the bill: a seller or listing we could not deliver is uncharged whether the run waited on it or not.
- **The summary row carries the run's waiting record** — passes made, seconds waited, surfaces walled, surfaces the wait recovered — so a run that took longer explains itself on the same row that carries the invoice.
- **The default sample run never waits**, so a Start with nothing set still answers inside its three-minute window.

### 1.0.39 — 2026-09-05

- **A run near its time limit now stops cleanly instead of being cut off mid-fetch.** The page-fetch ladder now checks the run's own clock before every attempt and every pause between attempts, so it never starts a fetch it cannot finish in time. A run that reaches its limit ends with its summary row intact rather than being stopped part-way through a request.

### 1.0.38 — 2026-09-04

- **Every run now reports what you asked for in the same unit it reports what it delivered.** The run's own record counted your ask in *sellers* while it counted the result in *records* — the seller profile row plus one row per listing, each charged the same flat fee — so a run that pasted two seller IDs and came back with two profiles and forty listings recorded an ask of two, an ask smaller than its own delivery. Your ask is now the record cap you set in "Max records (whole run)", or, when you set no cap, one profile plus "Max listings per seller" for every seller you sent (just the profiles when "Include listings" is off). The summary row is unchanged: its `requested` column still counts the sellers you asked for, and its sentence says so. Nothing about what is collected, delivered or charged changed.

### 1.0.37 — 2026-09-04

- **Settings with no sellers now run the sample under your settings, instead of returning one guidance row.** Picking a different **Marketplace**, turning listings off, or setting a limit and clicking **Start** with **Sellers** empty used to end the run with a single uncharged "no sellers were provided" row — so changing one dropdown was answered worse than changing nothing at all. That run now looks up a real seller with your settings applied, charged like any run.
- **The sample now uses a real seller on each store.** A seller ID belongs to one Amazon marketplace, so the sample on `amazon.co.uk` and `amazon.de` now uses a seller that actually trades there instead of a US ID those stores answer with their help pages.
- **"Include listings" is now honoured on that run too.** Turning listings off used to be ignored on a sample run, which billed for rows you had asked not to receive.
- **A limit is a ceiling, never a request.** On one of these runs "Max listings per seller", "Max records (whole run)" and "Max run seconds" are honoured as *at most* — the sample's own size and three-minute window are used when they are smaller, so narrowing a setting can never widen the bill.
- **One uncharged row explains it**, naming every setting you did set, that everything else used the sample's own values, and the field to fill in for your own run. It is never counted as a miss.
- **A field this actor does not recognise, or a seller list you actually filled in, still gets the guidance row** — answering a typo with sample rows would read as if it had worked. A store this actor does not cover is still refused by name.

### 1.0.36 — 2026-09-04

- **A mistyped "Marketplace" no longer swallows your seller list.** One unreadable value there used to end the run with a single guidance row, whatever you had typed in "Sellers" — twenty seller ids came back as one row. Every seller you sent now gets its own uncharged row saying it was not looked up and which field stopped it, and the run still succeeds. Nothing is looked up and nothing is charged, exactly as before.
- **"Marketplace" now says which of three things went wrong.** A real Amazon store this actor does not cover (amazon.ca, amazon.fr, amazon.co.jp and the rest, plus the country names people type for them) names the nearest store that does work, instead of sending you back to re-check a spelling that was already right. A value naming more than one store — "worldwide", "Europe", or just "amazon" — says this actor reads one store at a time. Only a value nothing can read is now reported as unreadable.
- **Every uncharged input row now carries the field it is about**, so a run with several settings set says which one to fix without reading the sentence.
- **The run's own report to us now counts seller profile rows as delivered.** A profile row is charged exactly like a listing row, but only the listings were being reported, so a run that delivered profiles looked like it had delivered less than it did — and a run with "Include listings" turned off looked like it had delivered nothing at all.
- **That report also carries the size of your ask** — the sellers you typed, counted before any limit applies. It used to report whichever list in your input happened to be longest, so a run that turned every seller away could look like it had nothing to do.

### 1.0.35 — 2026-09-04

- **A store written the ordinary way now works in "Marketplace".** The field used to take the exact domain and nothing else, so `US`, `USA`, `United States`, `Amazon.com`, `www.amazon.com` and a pasted store link each stopped the run before a single seller was looked up — one guidance row, and nothing for anything you sent. The domain, the host, a pasted link, the country code and the country name all resolve now. A store this actor does not cover is still refused rather than answered with a different one.

### 1.0.34 — 2026-09-04

- **A run stopped by an input mistake now tells us which field was wrong** — the field's name only, never the value you typed. A check that is too strict now reaches us as one thing to fix instead of looking like many unrelated typos.

### 1.0.33 — 2026-09-04

- **A storefront page that comes back unreadable is now retried before it is reported as a miss.** A page that arrives complete but with none of the listings on it used to end the attempt right there. The run now takes another look — a different page layout, a different network route — and reports a miss only if those come back empty too. Same price either way.

### 1.0.32 — 2026-09-04

- **A run that stops before it starts now reports its outcome too** — a run refused for its memory setting now reaches us the same way every other run does: counts and reason codes only, never your input or your rows.

### 1.0.31 — 2026-09-04

- **Every run now reports its own outcome to us** — counts and reason codes only, never your input or your rows — so a run that goes wrong reaches us even when nobody shares it.

### 1.0.30 — 2026-09-04

- **Run status lines fit the run page again; sample-run wording shortened.**
- **A run that could not read its own delivery record now says so on the run page** — the rows still ship, and nothing was charged for them.

### 1.0.29 — 2026-09-04

- **A run stopped by a pricing fault on our side now asks you to open an issue once, not twice**, and names the reply time.

### 1.0.28 — 2026-09-04

- **A run that filled the row cap you set is no longer treated as a run that went wrong.** The Issues-tab line now appears only when something actually did.

### 1.0.27 — 2026-09-04

- **The run page points at the Issues tab on every ending that went wrong**, including a run refused before it started.
- **One support promise on this page** — the older three-hours line is gone.

### 1.0.26 — 2026-09-04

- **A run that ends with a problem now says where to reach us.** A miss, an input error, an early stop or a failed run closes by pointing at the Issues tab and naming the reply time; a fully delivered run is left alone.
- **One support promise across this page** — issues are answered in a couple of hours, always within a day.

### 1.0.25 — 2026-09-03

Documentation build: nothing about what runs, what is delivered or what is charged changed.

- **The screenshots on this page now load from Apify storage.** The same two images of a real run, served from the platform itself instead of an outside host.
- **Every link on this page now stays inside Apify.**

### 1.0.24 — 2026-09-02

Documentation build: nothing about what runs, what is delivered or what is charged changed.

- **Real console screenshots on this page** — the input form exactly as it arrives, and the dataset table a real run delivers.
- **One-click MCP link** — pin this actor in Claude, Cursor or any MCP client straight from this page.
- **Suite links refreshed** to the current names of the other steadyfetch actors.
- **Input-form copy corrected.** The Sellers field still said a bare Start returns uncharged sample rows. It looks up a real seller, charged like any run — the field now says so, as this page already did.

### 1.0.23 — 2026-09-02

Start with the default form and get a real seller instead of placeholder rows.

- **A bare Start now runs a one-seller sample.** Click Start with nothing set (or send an empty input from the API) and the run looks up one real seller — `A124O05NL4Z2HN` on `amazon.com` — and returns the profile plus up to five listings, charged like any other records. The placeholder "sample rows" are gone; what you see is what a real run returns.
- **The sample stays small and quick by design:** one seller, five listings, the no-cost connection lanes only, and a three-minute window. On a bad Amazon minute you get one uncharged row saying the page was not served (re-run in a minute), never an empty dataset.
- **The status line says when a run was the sample** and how to run your own sellers.
- **Nothing else changed:** any input with sellers in it behaves exactly as before, and a mistyped field still gets a row naming the field instead of a sample.

### 1.0.22 — 2026-08-31

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.

### 1.0.20 — 2026-08-31

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.

### 1.0.19 — 2026-08-31

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.

### 1.0.17 — 2026-08-30

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.

### 1.0.16 — 2026-08-30

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.

### 1.0.15 — 2026-08-30

Clearer release notes — this page's notes now read more plainly. Nothing about what this actor delivers or charges changed.

### 1.0.14 — 2026-08-30

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.

### 1.0.13 — 2026-08-30

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.

### 1.0.12 — 2026-08-29

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.**

### 1.0.11 — 2026-08-29

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.

### 1.0.10 — 2026-08-29

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.

### 1.0.9 — 2026-08-29

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.

### 1.0.8 — 2026-08-28

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.

### 1.0.7 — 2026-08-27

- **"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.

### 1.0.6 — 2026-08-27

- **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.

### 1.0.4 — 2026-08-27

- 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.

### 1.0.3 — 2026-08-27

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.
