# Changelog of Newegg Scraper 🛒 prices, stock, ratings, item numbers (`tagadanar/newegg-scraper`) Actor

- **URL**: https://apify.com/tagadanar/newegg-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/tagadanar/newegg-scraper.md

## Changelog

### 2026-10-01

- **Faster and steadier when a connection misbehaves.** Each page is now asked
  for directly first, and a request that gets no answer is cut after 20 seconds
  (it was 60) and retried straight away by another route. A page that would not
  load can hold a run for about 100 seconds at most, down from 240. Nothing changes
  in what is delivered or what it costs you.

- When a page cannot be read, the run status now names the routes that were
  actually tried instead of a general "after proxy escalation".

- The run log ends with a one-line route summary (how many requests each route
  carried), so a slow or partial run can be explained from its log.

- **Fixed: `isSponsored` was false on every ad.** Promoted products are now
  flagged (about 8 of 44 on a typical search page).

- **Fixed: marketplace products were being merged.** Item numbers that contain
  hyphens (for example `1FT-00EY-00036`) were cut at the first hyphen, so different
  products looked like duplicates and were dropped — a search page showing 44
  products delivered 26. Each product is now delivered, with its full item number.

- "No products" is now said only when Newegg itself says so: the run reads
  Newegg's own item count ("We have found 0 items that match …") and reports an
  empty search only when that count is 0. A listing page with no products and
  no count is reported as a possible layout change on Newegg's side, and a run
  where some searches came back that way is marked incomplete instead of clean.

- **New: products from a widened search are flagged.** A keyword Newegg does
  not recognise usually does not come back empty — Newegg answers it with a
  broad "closest match" list across unrelated categories. Those products are
  still delivered, but each one now carries `searchWidened: true`, and the run
  status names the search: "Newegg did not find an exact match for '…' and
  widened the search; the N products delivered from it may be unrelated".
  Filter on `searchWidened` if you only want exact matches, or use a more
  specific keyword or a category URL.

- **Fixed: a search with no matching product could be reported as blocked.**
  The check that tells a bot-wall page from an empty listing matched a script
  Cloudflare adds to every Newegg page, healthy ones included, so any page
  without product tiles — a genuine "0 items" search first of all — was
  reported as "bot-wall page (HTTP 200)" and the search was dropped. The page
  is now read payload first: a page carrying products or Newegg's own item
  count is a listing page and is never called a wall; only a page with neither
  is tested against the wall signatures.

- A real bot-wall page served with HTTP 200 is now treated like an HTTP 403:
  the same page is retried on the next proxy rung before the search is given
  up, and the run log names the rung, the signature that matched, the page
  size and its title. A wall that survives the last rung is still reported as
  a refusal — never as an empty search — and is no longer counted among the
  listing pages read.

- New diagnostic: the first page of a run that is classified as a wall, or
  that comes back with no product and no item count, is saved to the run's
  default key-value store as `BLOCKED_PAGE_SNAPSHOT` (HTML, at most one per
  run, capped at 2 MB), so a blocked or unexplained result can be inspected
  after the run.

- **Fixed: searches served in Newegg's redesigned listing page returned no
  products.** Newegg now serves two page layouts for the same search — the
  long-standing one and a redesign with different product cards — and a run
  that received the redesign read a healthy page as empty and reported the
  search as incomplete. Both layouts are now read, into the same output
  fields: a product has the same `itemNumber`, price, rating and the rest
  whichever layout Newegg served, so a result set that spans both is not
  duplicated. The run log names the layout of every page.

- Status wording: a page with no readable product is now described as
  "Newegg's own item count did not say 0" rather than "no item count from
  Newegg" — on the redesigned page Newegg did state a count (1,347 items), so
  the old sentence was untrue for exactly this case.

### 2026-09-19

- The run's closing status now says what was delivered and what was asked for,
  and when a run returns little or nothing it says why: Newegg refused or never
  answered the pages, a limit (time, charge, or "Max products") stopped the run
  early, or Newegg served a listing page that we read and that held no
  products. A blocked run is never reported as an empty search any more.

### 2026-09-08

- **A run can no longer spend more time than it has.** The retry ladder booked
  its worst case up front, under loops with no ceiling, so a slow or wobbling
  source could push the run past the platform timeout. A run killed that way
  loses its own closing message entirely.
- Every request now plans against the time actually left, and a backoff that
  would outlive the run is not slept.
- A run that hits its time limit now delivers everything it did read and says
  so plainly, naming the searches it never reached — rather than reporting an
  empty result, which is a claim it has not earned.

### 2026-09-02

- The run now ends with a status message in the Console (the "Done" line was log-only, so a run could not explain itself in the Store).

### 2026-08-29

- Pricing copy corrected for the 2026-08-26 we-pay flip: platform usage is
  included in the per-product price (it is no longer billed to your run), and
  the start fee in the pricing table is the live $0.001 per run.

### 2026-08-19

- A dropped source is never silent any more. Before, a source that stayed
  blocked after the proxy fallback was skipped with only a log line, so a
  multi-keyword run could deliver half a result set and still read as a clean
  success. Now: if some sources fail, the run finishes with a status message
  naming each dropped source (and how many products it kept from earlier
  pages); if every source fails and nothing was delivered, the run fails
  outright — nothing is charged for products either way.
- Bot-wall pages served with HTTP 200 (Cloudflare interstitial, "Are you a
  human?") are now recognized and counted as blocks instead of being
  indistinguishable from a search with no results.

### 2026-08-09 (later)

- Reliability: when Newegg refuses a page (HTTP 403 or 429) the actor now
  retries that exact page from a US residential exit instead of reporting an
  empty source. Runs still start on the free datacenter pool, so the fallback
  costs nothing unless it is actually needed, and the run log names the rung
  every page was fetched on. Nothing to configure.

### 2026-08-09

- Documentation: the README now explains which Newegg URL shape to paste. A
  `/SubCategory/ID-<n>` page returns 36 products (96 with `?PageSize=96`) and
  pages properly with `?Page=N`; a top-level `/Category/ID-<n>` page returns
  about a dozen and does not page. The input examples now use `SubCategory`
  URLs, which is the reliable way to run large jobs.
- Documentation: added a per-plan price comparison against the most-used Newegg
  actor on the Store, and made it explicit that `reviewCount` is the number of
  reviews, not the review text. The title no longer says "reviews".
- No code or behaviour change.

### 2026-07-12

- Invalid input no longer fails the run. The run now finishes cleanly with a clear explanation in its status message, so a typo or an empty list is easy to spot and fix.
- List inputs now accept datasets piped straight from another scraper: entries
  that are objects are read through their usual key names (url/link,
  query/keyword/title, name/company and similar) instead of being rejected.

### 2026-07-11

- Billing: on paid runs every row is billed before it is written, and a run
  now stops visibly if billing fails instead of continuing unbilled.

### 2026-07-07

- Initial public release on Apify Store.
- Scrape Newegg product listings by keyword or by pasted search/category URL.
- Clean records: title, product URL, item number, price (numeric USD) and price label, shipping, stock, rating, review count, brand, image, and a sponsored flag when detectable.
- Reads Newegg's listing tiles directly over HTTP and follows the search-to-category redirect. No browser, no login.
- Walks listing pages until a page returns no new products, deduping by item number, up to your max products and max pages per search.
- US residential proxy by default (Newegg is a US storefront). Pay per product returned, platform usage billed to your run, no subscription.
