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, bestseller 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.
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
keyword instead of keywords 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 Keywords (input field keywords) and shows the shape to send. Changing a setting such as the marketplace without entering a keyword is answered the same way. A run that really is empty still returns the sample rows, and a run with real keywords is unchanged.
"No matches" now means Amazon really said so.
- A keyword is never reported as having no matches on the word of an exit Amazon distrusts. Amazon sometimes serves a full "no results" page to a request it does not trust, for a search that in fact has plenty of matches. Such a page is now re-asked on the trusted route before any verdict is given, and if the trusted route is never reached the row says the search could not be completed this run and asks you to re-run — uncharged — instead of telling you your keyword has no matches.
- A results page we cannot read is reported as our problem, not yours. If Amazon serves a real results page in a layout this actor cannot parse, the row now says so and is flagged for us to look at, rather than claiming the search returned nothing.
- A search emptied by your own sponsored filter says exactly that. If Amazon answers with products but every one of them is a sponsored placement and the run was set to skip those, the row now names the filter and tells you to re-run with sponsored results included — instead of reporting no matches.
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.
Your product limit is exact again, and one figure was ten times too large.
- "Max products (whole run)" holds when two products finish at the same moment. The actor works on two products at once, and the limit used to be counted after a row had already been written. Two products landing together could both pass a limit that had one slot left, so a run capped at 50 could hand you 51 rows and charge for 51. The slot is now claimed before the row is built, and a product that cannot claim one is never fetched, delivered or billed.
- A restarted run no longer stops short of your limit. A run that picks up where it left off counts what it has already delivered against your limit. Rows that are not products — misses, invalid keywords, the summary row — were counted as well, so a resumed run could finish with noticeably fewer products than you asked for. Only delivered products count now.
- "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.
Restart safety: a run that moves servers, or that you resurrect, never delivers or charges the same product twice.
- No double charges after a restart. Apify can move a long run to another server mid-flight, and resurrecting a finished run is one click. Either way the run used to start over from an empty memory: products you had already received were fetched again, written to your dataset a second time, and charged a second time. Every delivered row now carries an invisible record of what it was and what it cost, so a restarted run reads its own dataset first, skips everything already delivered, and finishes only the charge that was interrupted. Same run, same dataset, one row and one charge per product.
- Your product limit holds across a restart. "Max products (whole run)" counted only what the current server had delivered, so a run that moved could deliver up to twice the number you asked for. The count now starts from what the run has already delivered.
- "Max run seconds" is measured from the run, not from the server. A run that moved used to get a fresh full allowance on the new machine.
- A blocked search is no longer reported as "no results". When Amazon answers a search by redirecting to its sign-in or robot-check address, the page it serves has no results on it — that used to be read as "your keyword matched nothing", which is permanent and wrong. It is now the retryable
blocked row it always was, and it is never retried through the paid route.
- When a run is being moved, work already in flight is dropped rather than half-delivered, and the summary row says so instead of blaming one of your settings.
- A new honest status,
not_a_product. Amazon sells some of its own subscription plans through ordinary product addresses. Those pages are fine — they simply are not product listings, and they have no price, seller or reviews. They used to come back as parse_failed ("a layout we could not read, that one is on us"), which was a false confession. Never charged, either way.
Review-fix build: charge-once dedupe, permanent "page not found" honesty, and a tighter spend clamp.
- Billing accuracy. Two search results that turn out to be the same product — different result cards that redirect to one canonical page — are now delivered once and charged once, even when they are fetched at the same moment. Before, both could slip past the duplicate check while the first row was still being written, and you could pay twice for one product.
- A row that fails to save no longer counts as delivered: its charge slot is handed back, so the run's invoice always matches the rows you actually received.
- Honest verdicts. A search address Amazon answers with "page not found" now comes back as a permanent
not_found row that says so and tells you to check the keyword and any department filter — instead of a "this is temporary, please re-run" message for a page that will never exist. It is also no longer retried through the paid proxy route, so a dead address costs nothing to discover. Still never charged.
- Spend clamp. The actor no longer fetches extra search pages it has no budget left to deliver products from, and a run that spends its last charge on the final keyword now correctly names your spend cap as the reason it stopped.
Initial release.
- Type Amazon search keywords and get one complete product row for every result: the keyword, its search rank, whether it was sponsored, plus price, currency, list price, stock, buy-box seller, rating, review count, bought-in-past-month, variants, bestseller ranks, category path, images, bullet points and the specifications table.
- Full product detail on every result — there is no cheaper "listing only" mode, because that would need a second event and this family charges one.
- Marketplaces: amazon.com, amazon.co.uk and amazon.de. Search is verified end to end on amazon.com.
- One priced event per product and nothing else — no start fee, no per-keyword fee, no per-field fee.
- Sponsored results are flagged and can be skipped; a skipped sponsored result is never fetched, so it costs nothing.
- Keywords that return nothing or are blocked, and individual results that cannot be fetched, are returned with an honest status and are never charged, and every run ends with a summary row that reconciles against the invoice.
- Your limits are exact: the run stops cleanly, names the setting that stopped it, and hands back the keywords still to do.