# Changelog of Amazon to 1688 Sourcing Bridge: FBA Suppliers & Margins (`crawleast/amazon-fba-sourcing-bridge`) Actor

- **URL**: https://apify.com/crawleast/amazon-fba-sourcing-bridge/changelog.md
- **Full Actor documentation**: https://apify.com/crawleast/amazon-fba-sourcing-bridge.md

## Changelog

### Unreleased — 2026-10-21

- Fix the amazon.com 100%-blocked regression caused by the 2026-10 .com markup change. `.com` now serves the classic challenge page to the desktop profile from every residential exit (52 items / 3 time windows, 100% blocked), so delivery rides on the mobile rotation profile — whose `/gp/aw/d/` page no longer carries `#productTitle` or `og:title`; the product name is the text of `<span id="title">` inside `<h1 data-feature-name="title">`. The 0.1.6 soft-wall rule (site-name prefix title AND no `#productTitle`/`og:title`) therefore classified every normal mobile page as a soft wall and `evaluateAmazonDetail` blocked it as `soft_page_title` — permanently, since the markup will not revert.
- `parseAmazonDetailHtml` reads the new title shape (`#title`, `h1[data-feature-name="title"]`, `h1[data-template-name="title"]`), plus mobile rating (`#averageCustomerReviews_feature_div .a-icon-alt`), review count (the container's `aria-label="142,507 Reviews"`) and seller (`[offer-display-attribute-name="mobile-merchant-info"]`).
- `detectAmazonChallenge` now treats any real commerce block (`#productTitle`, `titleExpander`, `add-to-cart`, `addtocart`, `averageCustomerReviews`) as a product page; `og:title` no longer counts as product evidence. The scan covers the whole document — real mobile pages put `<title>` at ~80KB and the add-to-cart block at ~420KB, past the former 60KB prefix. A missed soft page is still blocked free by `evaluateAmazonDetail`'s site-name-prefix title check.
- Verified against a real 806KB `/gp/aw/d/` capture (clean title, $29.99 USD, 4.6 rating, 142,507 reviews, sold by Amazon, graded `ok`) and 84/84 unit tests.

### Unreleased — 2026-10-20

- CAPTCHA detection now flags the markerless amazon.com soft wall: a HTTP-200 page whose `<title>` is a site-name PREFIX ("Amazon.com : Product : Category") with a real buy-box price and main image but no product blocks (2026-10-20 V1 probe, e.g. B00E4GACB8). Since that prefix shape is also the standard title of a NORMAL .com product page (0.1.5 regression run 3lPMxZbDShbU6My0W flagged 4/4 normal items on the title alone), the soft wall is identified only when the prefix title carries no product-block signal either (no #productTitle, no og:title). `evaluateAmazonDetail` additionally rejects any parsed title that still starts with the site-name prefix (`blocked` / `soft_page_title`) — a soft page that survives rotation is delivered free instead of billed with a polluted title.

- CAPTCHA detection now flags the localized HTTP-200 "continue shopping" soft interstitial (`/errors_page/validateCaptcha` form / `field-keywords` token) that amazon.de and amazon.co.uk serve to non-browser clients; previously such pages were misclassified as `unavailable_in_region` instead of `blocked`.

- CAPTCHA rotation switches to a mobile profile: the retry uses a mobile Safari UA and the `/gp/aw/d/<asin>` path, which amazon.de / amazon.co.uk still serve in full (verified on 6/6 de+uk probe items). The first attempt keeps the desktop profile, so marketplaces that don't wall desktop requests (`.com`, `.co.jp`) pay no extra requests.

- `parseAmazonDetailHtml` reads the mobile page's main image (`#main-image` + `data-a-hires`); mobile pages otherwise match the existing widget/price selectors.

- `evaluateAmazonDetail` grades a page with a title but no main image as `blocked` (`no_product_data`) instead of `unavailable_in_region` — a challenge shell whose only signal is the site-name `<title>` can no longer masquerade as an unpriced product.

- Mobile detail fetches get a 45s timeout (≈2.5MB pages through residential exits).

### 0.1.0 — 2026-10-20

Initial private build.

- Input: up to 100 Amazon product URLs and/or 100 bare ASINs (merged into one deduplicated ASIN set) and/or 100 direct image URLs; `marketplace` across 8 Amazon storefronts, `maxSuppliersPerItem` 1–20, `marginBasis` fba/plain, optional `fbaFeeUsd` override, per-run charge cap and request quota.
- Output: flat `source`, `match` and `summary` rows; `RUN_SUMMARY` key-value record with the completeness identity checked before exit.
- Amazon leg: pure HTTP (no browser) with one sticky residential session per item, homepage warm-up for cookies, CAPTCHA detection with up to two session rotations (never solved), 404 → `notFound`.
- Parsing: title/main image/buy-box price from stable widget ids with JSON-LD and og: fallbacks; multilingual dimensions/weight/BSR from the product-details fold; European decimal-comma and CDN$ currency handling.
- FBA estimator: published 2026 US fee schedule (small/large standard, oversize tiers), price bands <$10/$10–50/>$50, 3.5% fuel surcharge, volumetric weight for oversize, weight-only fallback; missing weight degrades the row to a plain margin.
- FX: one CNY → USD/CAD/GBP/EUR/JPY snapshot per run (frankfurter + er-api + env overrides); margins in the marketplace currency with USD fees converted.
- Image pipeline: magic-byte detection, WebP/AVIF → JPEG conversion with sharp (max 800×800, quality 85), 1 MB upload cap.
- 1688 leg: existing mtop reverse-image-search engine with identity pool, token cache and risk-control rotation.
- Billing: `run-base-fee` $0.00005 (only with a billable row), `amazon-item-lookup` $0.005 (only `fetchStatus: ok`), `supplier-match` $0.008 (only delivered rows); six plan tiers; failures and empty lookups free.
