# Changelog of Price Tracker Canada - Best Buy, Walmart, Canada Computers (`akhil_rajesh/bot-wall-price-scraper`) Actor

- **URL**: https://apify.com/akhil_rajesh/bot-wall-price-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/akhil_rajesh/bot-wall-price-scraper.md

## Changelog

All notable changes to this Actor are documented here.

### 2026-10-05

#### The proxy setting is followed

- **The proxy you set is the proxy that's used.** Only "Use Apify Proxy" was read: the groups
  and country picked with it were replaced by Apify's default pool, and your own proxy URLs
  were dropped without a word. Searches, product pages and category pages now all use the
  proxy as set.
- **Residential proxies aren't available** (nor Google SERP and Unblocker): they're billed per
  GB or per request on top of the result price. A run that asks for one stops at once and says
  so.
- **Your own proxies are checked first**: if one can't be used, the run stops and says to
  write it as http://user:password@host:port instead of searching without it.
- **A proxy that fails is named as the cause.** When Apify Proxy refuses every request (it
  answers HTTP 407 for a country or group your account doesn't have) or your own proxy doesn't
  answer, the run says so instead of reporting that the stores blocked it.
- **Proxy passwords never reach the log or the results.** Error messages that repeat a proxy
  address show it as `http://***@host:port`.
- The browser engine now logs in to a proxy that needs a user and password.

#### Closer models and cases told apart; Best Buy found with "Always render JavaScript"

- **A search for a base model no longer returns its siblings.** "iPhone 17" returned the
  iPhone 17e, "Pixel 10" the Pixel 10a, "Pixel 10 Pro" the Pixel 10 Pro XL and 10 Pro Fold,
  "Galaxy S26" the Galaxy S26 FE, and "Core Ultra 7 265K" the 265KF. A letter glued to the
  model number now makes another model, and so do a phone line's own variant words (XL and Fold
  for a Pixel, FE and Edge for a Galaxy). An NVIDIA Founders Edition still counts as the card.
- **Phone cases that don't say "case" are left out**: Apple's own case listed as "Apple iPhone
  17 Pro TechWoven Black", and cases naming the phone after their own brand ("OTTERBOX iPhone 18
  Pro/17 Pro Otterbox Defender Pro MagSafe + Camera"). In a search for a phone, tablet or
  earbuds, only the device's maker may come before its name.
- **Best Buy's results are read when "Always render JavaScript" is on.** The browser received
  Best Buy's search results as text in a page of its own, which wasn't read, so Best Buy
  returned nothing in that mode.
- Amazon sometimes answers a search with its robot check ("Click the button below to continue
  shopping") instead of results. The status message now calls that a bot check.

#### A store that turns the search away is named, not taken for one without a match

- **Missing Amazon prices are now explained.** Amazon answered most searches from Apify's
  servers with HTTP 503 (8 of the 11 daily test runs from September 25 to October 5), and the
  browser the Actor tried next got a page without listings. That counted as "Amazon has no
  match", so those runs finished without Amazon's prices and said nothing about it. A store
  that turns the search away now counts as not loaded, and the run's status message names it
  with the reason: "Couldn't search Amazon (HTTP 503), so its prices are missing; try again
  later."
- **Every search run ends with a status message** saying how many products it found at how
  many stores.
- When none of the searched stores loads, the run still fails, and its message now names each
  store with its reason.

#### Graphics cards sold with a stand are no longer taken for accessories

- **Vuugo's cards are back.** Vuugo names each card's spec list in the listing, and many end
  with what comes in the box: "... Graphics Card - 16GB 256-bit GDDR7 - ... - Bundled Support
  Stand", "... - GPU Support Stand Included", "... - TUF GPU Card Holder". The word "stand" or
  "holder" anywhere in a name made it an accessory, so 19 cards across the RTX 5070 Ti, 5080,
  5090 and RX 9070 XT searches were left out, among them every MSI card Vuugo sells. An ASUS
  TUF RTX 5080 "(..., Detachable GC-HPWR Adapter)" was lost the same way on Amazon and Newegg.
- **Best Buy's AirPods Pro 3 are found** ("... True Wireless Earbuds with MagSafe Charging
  Case"), and so are PS5 Pro consoles sold "with ... Wireless Controller and Case".
- A listing is now an accessory when it names the accessory before naming any device: "AirPods
  Pro 3 Case", "Nintendo Switch 2 AC Adapter" and "Galaxy S26 Ultra Phone Case" still are. Words
  count only as whole words, so "Standard" holds no "stand".
- A graphics card sold with a PC case ("... Graphics Card + Prime AP201 ... PC case") counts as
  a bundle with a second piece of hardware, and stays out.

### 2026-10-02

#### Searches return the product, not what's built around it or sold for it

- **Computers built around a part are left out.** An `RTX 5070` search returned gaming PCs
  "with" one at $2,299–3,099, and the RTX 5090 and Ryzen 7 9800X3D searches returned gaming
  PCs and laptops. A listing that names a computer before the part, or (as Canada Computers
  lists its PCs) a processor, memory, storage and Windows besides the part, is a computer.
  A search for a computer (`MacBook Air 13`, `Gaming PC RTX 5070`) still returns computers.
- **Games and accessories named after a console are left out**: "Star Fox Nintendo Switch 2"
  ($69.99), "Mario Kart World (Switch 2)", "Pokémon Legends: Z-A - Nintendo Switch 2 Edition",
  Joy-Con and DualSense controllers, the Switch 2 camera, a PS5 Pro housing part, and drives
  "PS5 Compatible", "PS5 Ready" or that "work with" a PlayStation 5.
- **A console's official bundles are the console.** "Nintendo Switch 2 + Mario Kart World
  Bundle" and the PS5's game bundles now count; bundles with a second piece of hardware (an
  extra controller, a disc drive, a motherboard, a power supply) still don't.
- **"Xbox Series X" no longer returns the Series S**, and `RTX 5090` no longer returns the
  China-only RTX 5090 D.
- **A product listed further down a store's page is found.** Only the first three listings of
  each store were checked, so a store whose first listings were accessories returned nothing:
  Best Buy lists two PS5 Pro consoles after six other PS5s. Every listing on the page is now
  checked before the three are taken.
- **A product page that turns out to be another product is left out**, whatever its search
  listing said.

#### Store prices, not resellers'

- When Walmart or Best Buy sells the product itself, their marketplace sellers' listings are
  left out: resellers listed the Nintendo Switch 2 at 1.5–1.8x Walmart's own price. When only
  marketplace sellers list it (Walmart and the PS5 Pro), their rows stay, with the seller's
  name in the new field `marketplaceSeller`.
- New field `priceOutlier`: true when a price is under a quarter or over twice the search's
  typical price (the median of each store's cheapest), for example a PS5 Pro at $2,629.99 when
  Best Buy and Canada Computers charge $1,099.99. Flagged rows are listed after the others. It
  needs prices from three stores, and stays wide enough for the 1.6x between an RTX 5060 Ti 8GB
  and 16GB and for Best Buy's RTX 5090 Founders Edition at its $2,899.99 list price among cards
  marked up to $8,499 and more.

### 2026-09-23

#### Search returns the product you asked for

- **Look-alikes are no longer returned.** A listing used to count as a match when any
  one word of the search appeared in it, so `PlayStation 5 Pro` returned a Samsung
  980 PRO SSD, a SanDisk Extreme PRO drive, PS5 controllers and older PS5 models,
  and `RTX 5070` returned RTX 5070 Ti cards. Now every model number must match, at
  least three quarters of the search words must appear, a variant right after the
  model makes it a different product (Pro vs Pro Max, 5070 vs 5070 Ti, S26 vs S26
  Ultra), and a listing *for* the product (a controller "for PS5 Pro") is an
  accessory. `PS5` and `PlayStation 5` are treated as the same name. A listing that
  names its own product first and the console after ("Pro Gaming Controller PS5 &
  PC") is a companion product too.
- **An out-of-stock product no longer shows another product's price.** Amazon lists
  recommended products, with their prices, on every product page. When the product
  itself was unavailable and had no price, the Actor took the first recommended one:
  a PlayStation 5 Pro came back at $99.96. Prices inside recommendation carousels and
  "similar products" sections are now ignored, so such a row has no price.

#### Maintenance update

- **Walmart products no longer end as error rows when Walmart challenges a product
  page.** Walmart started answering some product pages with a Cloudflare challenge
  while still serving its search results (2 of 3 pages in a test on 2026-09-23). The
  row now carries the price and stock status from Walmart's search listing, marked
  `priceSource: "search_results"`, as Best Buy rows already did.
- **Faster runs when a store turns requests away.** Once a store refuses a product
  page, its other products in the same run use their search listing straight away
  instead of retrying the same wall for up to 90 seconds each.
- Fixed: a price taken from an Amazon.ca search listing was labelled USD; it is CAD.

### 2026-09-16

#### Maintenance update

- If none of the searched stores can be loaded (they blocked the requests or were
  unavailable), the run now fails with an explanation instead of finishing as successful
  with an empty dataset.
- When only some stores can't be loaded, the run log and the "no products found" status
  message name them.

### 2026-09-12

#### Maintenance update

- Fixed: `inStock` now follows the stock status the store declares in its product data.
  Some in-stock products (for example at Canada Computers) were reported as out of stock
  because "sold out" text elsewhere on the page was mistaken for the product's status.
- Search results no longer include bundles with a second paid product (for example a
  graphics card sold with a power supply), whose price isn't comparable with the item alone.
- A search that finds no matching products now ends with a clear status message and an
  empty dataset, instead of adding a placeholder `no_results` row.
- Dependencies are pinned to their tested major versions for more predictable builds.
- Default run memory is now 1 GB (was 2 GB), which halves the per-GB start charge.
  Memory can be set between 1 GB and 4 GB.

### 2026-09-10

#### 0.3.17 — Session continuity + reliability

- Requests now reuse one session per store for the whole run, so cookies set
  on a search page carry through to the product pages it links to. Fixes
  product pages that previously returned no price (e.g. Walmart).
- Added detection for additional store bot-interstitial pages so the Actor
  escalates to its browser engine instead of reading a block page as a product.
- Version/tag housekeeping.

#### 0.3.15 — More stores + price accuracy

- **Added Vuugo** as a searchable store (now 6: Amazon, Best Buy, Walmart,
  Newegg, Canada Computers, Vuugo).
- Fixed an upsell-confusion bug where protection-plan / warranty add-on prices
  could be reported instead of the product price (affected Amazon listings).
- Improved relevance filtering so accessories (cases, chargers, screen
  protectors) are not returned when searching for the device itself.

#### 0.3.13 — Store coverage fixes

- Fixed a request-fingerprint issue that caused some stores (Amazon, Walmart)
  to serve block pages; product and search pages now load reliably.
- Tightened model matching so "iPhone 17 Pro Max" no longer matches
  "iPhone 16 Pro Max".

#### 0.3.11 — Search coverage

- Generalised store product-URL matching so results are found across all
  categories (previously only some categories were recognised).
- **Added Walmart** as a searchable store.
- Fixed run-log diagnostics so search progress per store is visible.

#### 0.3.9 — Input handling & price accuracy

- Typing a **product name into the URL field** now runs a product search
  instead of failing.
- Prices are now read from the page's structured product data first, which
  fixes cases where a promotional or membership amount was picked up instead.
- Pages with no genuine price now return `price: null` rather than a guessed
  number.

#### 0.3.0 — Search by product name

- **New: search by product name.** Enter a product name (e.g. "RTX 5070 Ti")
  and the Actor searches the selected stores, then scrapes each match's live
  price. Results are sorted cheapest-first — a ready-made price comparison.
- Direct product/category URLs moved to the Advanced section.
- New output fields: `retailer`, `searchQuery`, `priceSource`.
- Never returns an empty dataset — emits a `no_results` row when nothing matches.

#### 0.2.x — Reliability & scale

- Automatic politeness delays between requests to the same store, a per-URL
  time budget, and retry on transient errors.
- Category/search listing crawling: one category URL expands into every
  product listed across its result pages.
- Access-level labels in the output (standard / js / +proxy) instead of
  internal engine names.
- Input schema reorganised: primary fields front, overrides in Advanced.
- Output, dataset and input schemas added and validated.
- Improved price extraction: reads prices from embedded page data when not
  visible in HTML, and ignores subscription/membership price decoys.
- Currency auto-resolution for Canadian retailers.

#### 0.1.0 — Initial release

- Scrape product pages for name, price, currency and stock status.
- Automatic fallback when a store actively blocks a request.
- One bad URL never fails the whole run — failed URLs return a clean error row.
