The run pays for itself now. The platform bills this Actor for what it downloads through the proxy, and that line was 85–90 % of every run's cost (measured on the usage breakdown: $0.0041–0.0048 of proxy traffic against $0.0004–0.0012 of compute). Amazon serves HTML in gzip only — it answers a request for br or zstd with an uncompressed body — so there is nothing to win on compression, and every saving had to come from downloading less. This release stops paying for four things that were never used:
- The page tail is no longer downloaded. Past the last block the parser reads, an Amazon page continues with the footer and ~50 JS bundles. The body is now read as a stream and the connection is dropped at the end of the useful markup: a
/s? listing goes from 278 KB to 231 KB over the wire (−17 %), a product page from 482 KB to 453 KB (−6 %), measured with a byte counter on the socket. Listings get cut earlier still — at the filter panel, which the Actor never parses (rh= tokens come from its own table) — but only once result cards have already arrived, because one of the two layouts Amazon rotates emits that panel before the results.
- The session check no longer costs a page. Verifying the logged-in session used to fetch
/gp/css/homepage.html on every run — a full Amazon page for zero rows of data, and up to nine of them when the account pool handed out a signed-out session. The verdict now comes off the first page the run downloads anyway; the header that carries it is the same on every Amazon page. Dead accounts are still flagged back to the pool, and still only after two different egress IPs refuse the session.
deliveryZipCode no longer re-downloads every page. Changing the address is a POST plus a reload, and the reload is a second full copy of the page. It was repeated on every single request, because each request opened a fresh session with an empty cookie jar. The address cookies are now kept for the run, so the change happens once. And when Amazon ignores the change — it answers the POST with 200 and keeps its own location, which is what it does on .com today — the run says so in the log instead of paying for that reload on every page.
offers no longer treats "no offers" as a block. Amazon's All-Offers endpoint answers an ASIN with no sellers with a legitimate 4.8 KB fragment. The Actor read the size, called it a soft block, retried six times, then downloaded the whole ~1.9 MB product page to scrape a buy-box line that had no seller on it. A valid AOD answer is now recognised by its own container, an empty one is reported as empty, and the product-page fallback reuses the page the run already has instead of fetching it again. One ASIN in that state went from 6 requests / 1.8 MB to a single 5 KB fragment.
Fixed: the two "also fetch…" toggles were free. includeOffers and includeSellerDetails are documented — in the input form itself — as charging one offer event per offer and one seller event per product, and they never did. Each of them is a separate Amazon page, so a product record with both cost three pages of traffic and billed for one cheap event. They now charge what the form says they charge. Reviews embedded in a product record stay free: those arrive inside the same HTML and cost nothing extra, which was always the reason they were free.
Cheaper waiting. The retry back-off no longer grows to 9.8 s (1.5 → 2.4 → 3.8 → 4 → 4 instead), because compute units are billed for every second the container is up, and past the fourth attempt the pause is not what decides the outcome. The product parser also stopped reading the same two values three times each — the rating and the review count were parsed once for the log, once for the record and once for hasReviews.
Paid plans now go out through our own network. Requests for paying Apify users leave through the developer's premium gateway instead of Apify Residential; free users are unchanged. There is nothing to configure and nothing to bring — the Actor has never had a proxy input and still doesn't. The gateway is used in session-sticky mode, one stable address per proxy session: Amazon issues its bm-verify token and its "continue shopping" form to a specific address, so a network that rotated per request would arrive at the gate as a stranger on every step. The address rotates only when a request actually fails, exactly as before. A gateway that cannot reach Amazon answers with a short text body rather than an error, and that body is now recognised and retried from another address instead of being parsed as a page — on a pay-per-event Actor, parsing it would have meant charging for garbage. All twelve modes were re-verified end to end over the new path (12/12, 17 requests, no captcha and no retries).
New in the log: what the run cost. Every run now ends with the number of pages, the HTML volume, the wire volume behind it and the dollar figure, plus how many pages were cut short. Traffic is the thing that decides whether a mode earns or loses, and it used to be invisible.
Six new scrape modes. charts (Best Sellers / New Releases / Movers & Shakers / Most Wished For / Gift Ideas by category slug), storefront (every product a seller lists), deals (Today's Deals, no input needed), stores (Amazon /stores/ brand pages), asinLookup (EAN / UPC / ISBN → ASIN) and reviewById. All six bill the existing searchResult / review events — no new prices.
Product records grew from ~40 to 55+ fields, including the ones competitors sell as extras:
monthlyPurchaseVolume / monthlyPurchaseCount — Amazon's "10K+ bought in past month", verbatim and as a number. The demand signal that does not lag the way review counts do.
variantDetails — every sibling variant with its name, attributes and thumbnail, instead of a bare ASIN list.
frequentlyBoughtTogether, productComparison, aPlusContent, brandStory, brandStoreUrl, galleryThumbnails, productOverview, importantInformation, sustainabilityFeatures + climatePledgeFriendly, isAmazonChoice, priceRange, condition, offersCount, ratingDistribution, authors / bookDescription, hasReviews / reviewsLink, originalAsin / unNormalizedProductUrl.
includeOffers and includeSellerDetails attach the full offer list and the buy-box seller's profile to the product record — one run instead of three.
Reviews embedded in another record are now free. A product record carries the reviews Amazon prints on the page and a seller record carries its feedback rows; neither is billed on top any more. A product used to cost its own event plus one review event per embedded review — up to 6× the headline price for data that arrived in the same HTML.
Delivery address. New deliveryZipCode takes a ZIP, postcode or two-letter country code and fetches every page against it, so prices, stock and delivery dates stop drifting with the proxy's city.
Search filters. searchMinPrice, searchMaxPrice, searchBrand, searchSellerId, searchPrimeOnly, searchFourStarsAndUp, searchCondition and searchDeals. Price and brand work on every marketplace; the rest use Amazon's per-marketplace node IDs and are skipped with a log line where the ID is not known, rather than silently returning an empty result.
Review filters and fields. reviewsDateFrom / reviewsDateTo / reviewsFilterByKeyword, plus dateIso (the raw "Reviewed in … on …" string stays in date), userId, variantAsin, variantAttributes, position, totalCategoryRatings and totalCategoryReviews.
Seller records gained email, storefrontUrl, productAsins and the published shippingPolicy / returnPolicy / privacyPolicy / helpContent / otherPolicies.
Known limit, now stated instead of silently empty: of the five charts, Amazon serves four as ready-made HTML; Movers & Shakers is drawn in the browser and its pages contain no product markup at all. That chart returns nothing and now says why in the log, in the input schema and in the README.
Fixed: the run threw away every IP that had just been let through. Apify's proxy pins an IP to a session id, and the Actor asked for a new one on every single request. Amazon's gates are per-IP — the bm-verify token and the "continue shopping" form clear the address they were issued to — so each request arrived at the gate as a stranger and no run ever got past it on a flagged pool. The proxy session is now held for the whole run and rotated only after a request actually fails, and the cookies Amazon hands out on the way through are reused by every later request instead of being dropped with the session.
Fixed: runs returned empty rows instead of saying they were blocked. Amazon answers a flagged IP with a 3 KB "Click the button below to continue shopping" page or a 150-byte stub, both HTTP 200. These parsed into zero cards and the log said "0 reviews" for a product with 57,000 of them. Stub pages are now detected, the "continue shopping" gate is followed automatically like the bm-verify interstitial already was, and a genuinely blocked page is reported as blocked. JSON responses from Amazon's ajax endpoints are exempt from the size check.
Fixed: seller mode could return an almost-empty record. A bare /sp?seller=… request gets served Amazon's internal products JSON instead of the profile page often enough to matter; the request now carries the full parameter set Amazon's own "Sold by" link uses.
Fixed: listPriceText came back as the string "null" on listings without a struck-through price, and deliveryLocation came back as the button label "Update location" when no address was set. Both are omitted now.
Cheaper runs. Default memory is 512 MB instead of 1 GB (the Actor is async HTTP plus BeautifulSoup — compute units scale with memory). Retries went from 10 fixed 2-second attempts to 6 with growing pauses: every failed attempt downloads the full page before the block is recognised, so ten of them cost several times what the record sells for. The reviews fallback no longer stacks three rounds of retries on top of the six that already ran underneath.
- Fixed: review counts on search, category and Best-Sellers rows were up to 1000× too small. Amazon now abbreviates the count it prints next to a card ("34.7K"), and the Actor read the digits only: a listing with 34,720 ratings came back as
reviewsCount: 347, and a Best-Sellers row with 279,601 ratings as 44. The exact number is taken from the rating link Amazon keeps beside it ("34,720 ratings"); where only the abbreviation exists it is expanded properly (K/M/B and their localised twins, so amazon.de's "34,7 Tsd." works too).
- Fixed:
isPrime was false on every search row. The a-icon-prime badge no longer exists in Amazon's current delivery block, so Prime eligibility is now read from the delivery line itself — Prime rows are flagged again, and rows that are not eligible ("FREE delivery Sat, Sep 5 on $35 of items shipped by Amazon") stay false.
- Search rows no longer disappear when Amazon changes the card layout. A second card layout is in rotation (signed-in runs get it) and a row whose
<h2> was missing used to be dropped from the dataset without a trace. The title is now read from every slot a layout can put it in, so the row is emitted either way — and where a layout offers both a shortened and a full title, the full one wins.
- Product-page counts (reviews, answered questions, helpful votes) and a seller's rating count in the offers list go through the same abbreviation-proof parser instead of silently returning a wrong number or none at all.
- Amazon put a password on its review pages.
/product-reviews/{ASIN} and the individual review pages now answer with a sign-in form even for a session that is demonstrably logged in everywhere else, and Amazon's lazy-widgets review stream returns an empty body. Reviews mode therefore returns the 8–13 reviews printed on the product page — the same set signed in or not. The ~32 signed-in reviews of 0.2 are no longer reachable by anyone; product mode's customersSay / reviewAspects remain the way to read the full corpus in aggregate.
- Reviews mode no longer wastes requests on the wall. The wall is now recognised (its
/ap/signin link sits 54 KB deep, past the window the old check looked at), so a run stops after it instead of retrying review pages, individual review pages, and the lazy-widgets stream in turn: 2 requests per ASIN instead of up to 9, without re-downloading the ~1.8 MB product page twice.
- Fixed: a signed-in run could return 3 reviews where an anonymous one returned 13. The product-page reviews parsed during warm-up were kept only when
/product-reviews/ had also returned cards, so once the wall went up they were dropped and the run fell back to whatever the deep review pages happened to give. They are now always emitted, deduplicated by review ID.
- Signing in still works and is still on by default — it affects delivery dates today, and review pages are picked up automatically if Amazon reopens them.
- Offers mode now returns every seller, not just the buy-box. Amazon moved its All-Offers endpoint, so the Actor had been silently falling back to the single buy-box offer for every ASIN; a typical listing now returns 3–6 offers with condition, seller ID, FBA flag and delivery. No login needed.
- ~2.5× more reviews on signed-in runs (~32 vs ~13 on a typical ASIN): the Actor now also collects the reviews Amazon references from its own review analysis but never lists.
- New in product mode:
customersSay + reviewAspects. Amazon's own AI summary of the whole review corpus, plus per-aspect sentiment (Sound quality — positive, 1.7K mentions) with a paragraph per aspect. This is the signal from the tens of thousands of reviews Amazon no longer serves individually.
- Signed-in runs. New
useOurAccounts toggle (on by default) borrows a logged-in Amazon session from our own account pool for the run and returns it afterwards; amazonCookies accepts your own EditThisCookie export and takes priority over the pool. Both are optional — without them the run works exactly as before, anonymously.
- Reviews: sources are now merged instead of first-wins. The signed-in
/product-reviews/ page and the reviews embedded on the product page are combined and deduplicated by review ID, so a signed-in run never returns fewer reviews than an anonymous one.
- Fixed: review pages parsed as empty. Review cards are
<li data-hook="review"> on /product-reviews/ but <div> on the product page; the tag-specific selector silently found zero cards on every review page.
- Fixed:
reviewTitle contained "5.0 out of 5 stars" instead of the review headline on signed-in review pages.
- Fixed:
variant contained "Verified Purchase" — the badge sits inside the same block as the size/colour strip and is now subtracted.
- Fixed:
isVine was true for every verified-purchase review (the selector matched the generic success-colour class, not the Vine badge).
- Fixed: star / media / verified review filters returned unfiltered results. Amazon now ignores
filterByStar & co. in the URL and serves the same review set regardless, so the Actor applies the filters itself — asking for 1-star reviews no longer returns 5-star ones.
- Fixed: buy-box
sellerName was "Learn more about the seller" on signed-in runs; the seller name is now read from the merchant block and the link is only used for the seller ID and URL.
- Review pagination stops as soon as a page repeats the previous one — Amazon now serves page 1's reviews for every page number.
- Fixed: a working account could be dropped from the pool after a single signed-out page. Amazon serves an anonymous page to live sessions too — from an unlucky proxy IP, or on a marketplace the cookies were not exported from — and the Actor retired the account on the first one. The verdict now needs two different IPs to agree, and a session that another marketplace refuses is returned to the pool instead of being flagged. Your own
amazonCookies now say so explicitly when they belong to a different marketplace than the run.
- Product detail scraping: title, ASIN, price, list price, currency, stars + rating breakdown, reviews count, breadcrumbs, features, A+ description, hi-res images, videos, variants, BSR, seller, delivery, return policy, tech-spec table.
- Search / category / Best-Sellers listing rows: ASIN, title, price, stars, reviews count, Sponsored / Prime / Best-Seller / Amazon's Choice flags, badge, coupon, delivery, position, page.
- Customer reviews: rating, title, body, date, country, verified-purchase flag, helpful votes, variant, photos, videos, linked to parent ASIN.
- Seller profiles: business name, address, VAT, trade register, phone, registration country, overall stars, total feedback, Lifetime / 12-month / 90-day / 30-day positive % with 5-star histograms.
- Buy-box / AOD offers: price, list price, currency, condition, seller name+ID+URL+rating, Prime, Fulfilled-by-Amazon, delivery, shipping price.
- 19 Amazon marketplaces (US, UK, DE, FR, IT, ES, JP, IN, AU and more). No Amazon API, no captcha. Pay-per-event pricing.