Best Buy Price Drop & Stock Tracker
Pricing
from $0.49 / 1,000 results
Best Buy Price Drop & Stock Tracker
Search Best Buy by keyword or product URL to get current and regular price, savings, rating, review count, brand, model and stock status for each item in one structured record.
Pricing
from $0.49 / 1,000 results
Rating
0.0
(0)
Developer
Dataspryva
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Features
Share
Watch Best Buy prices and availability without opening a browser tab for every product. Give this actor a few keywords, a category link, product links or SKU numbers, and it returns one structured row per product: what the item is, what it costs now, what it used to cost, whether it is in stock, how shoppers rated it, and where it sits in the result grid.
The actor runs without a Best Buy account, API key, cookie or proxy setup. It reads the public Best Buy storefront and its public price endpoint, then writes clean product records to the Apify dataset.
Four ways to build a product list
| Mode | Field | Best for |
|---|---|---|
| Keyword search | searchQueries | Exploring a category, brand or product idea |
| Category or search URL | categoryUrls | Reusing a Best Buy browse/search link you already trust |
| Product URL | productUrls | Watching exact items you found on the site |
| SKU | skuIds | Feeding a restock or price watchlist from another system |
All four modes can be combined in a single run. Results are de-duplicated by SKU, filtered, sorted and capped by maxResults.
What you can do with it
- Price-drop watchlist — run the same
skuIdsorproductUrlson a schedule and comparecurrentPricebetween datasets. A lower value is a drop;regularPricetells you the reference price. - Restock monitor — keep
inStockOnlyoff and watchavailabilityflip fromOutOfStocktoInStock. - Category deal scan — pass a category URL with
sortBy: "Best-Discount"orcondition: "open-box"to surface markdowns and open-box units. - Competitive snapshot — collect brand, model, rating and review count for every product in a search grid.
- Rank tracking —
position,searchPageandisSponsoredpreserve the grid order Best Buy returned, so you can compare placement across runs.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
searchQueries | array | – | One or more keyword searches (the input form prefills ["sony headphones"]). Each is paginated until the global result cap is reached. |
categoryUrls | array | [] | Best Buy category, browse or search-result links. cp pagination, sort and condition filters are added automatically. |
productUrls | array | [] | Exact product links in new /product/.../sku/... or legacy /site/.../<sku>.p?skuId=... form. |
skuIds | array | [] | Best Buy SKUs (6–9 digits). Product links are accepted here too. |
maxResults | integer | 24 | Total records across all modes, 1–1000. |
maxPages | integer | 50 | Page guard per keyword or category link, 1–100. |
sortBy | select | Best-Match | One of Best-Match, Best-Selling, Best-Discount, Price-Low-To-High, Price-High-To-Low, Customer-Rating, New-Arrivals. |
condition | select | all | all, new, open-box or refurbished. |
minPrice | integer | 0 | Minimum current price in dollars; 0 disables the bound. |
maxPrice | integer | 0 | Maximum current price in dollars; 0 disables the bound. |
inStockOnly | boolean | false | Drop products Best Buy marks sold out, out of stock or unavailable. |
includeDetails | boolean | false | Open each product page to add description, model, GTIN/UPC and seller where Best Buy publishes them. Slower. |
Every field in the input form is used by the actor. Older saved tasks that still send keyword, searchQuery, categoryUrl, skus, maxItems, sort, skipOutOfStock or openBoxOnly keep working: those legacy keys are mapped onto the current fields in code.
Example: exact-product watchlist
{"skuIds": ["6505727", "6620467", "6689192"],"inStockOnly": false,"maxResults": 10}
Example: open-box deals in a category
{"categoryUrls": ["https://www.bestbuy.com/site/headphones/wireless-headphones/pcmcat331200050015.c?id=pcmcat331200050015"],"condition": "open-box","sortBy": "Price-Low-To-High","maxResults": 60}
Example: keyword search with a price window
{"searchQueries": ["sony headphones", "noise cancelling earbuds"],"minPrice": 100,"maxPrice": 400,"inStockOnly": true,"sortBy": "Customer-Rating","maxResults": 50}
Example: one exact link
{"productUrls": ["https://www.bestbuy.com/product/sony-wh1000xm5-wireless-noise-canceling-over-the-ear-headphones-black/J7XSRH5CXG/sku/6505727"],"includeDetails": true}
Output fields
| Field | Type | Meaning |
|---|---|---|
sku | string | Best Buy SKU. |
url | string | Canonical product page URL. |
bsin | string | Best Buy canonical product-family identifier, when the URL exposes it. |
name | string | Product title. |
description | string | Product description, from the optional detail pass. |
brand | string | Manufacturer brand. |
model | string | Model number or MPN, from the optional detail pass. |
gtin13 | string | GTIN/UPC, from the optional detail pass. |
image, imageUrl | string | Primary product image (same value under both keys). |
currentPrice | number | Price shown to a shopper now. |
regularPrice | number | Non-sale reference price. |
salePrice | number | Current price when it is below the regular price. |
savings | number | Regular price minus current price. |
savingsPercent | number | Savings as a percentage of the regular price. |
onSale | boolean | True when the current price is below the regular price. |
currency, currencySymbol | string | ISO currency code and display symbol. |
availability | string | Normalized stock state, e.g. InStock, OutOfStock, PreOrder, BackOrder, LimitedAvailability. |
availabilityText | string | Best Buy's own button text, e.g. Add to Cart or Sold Out. |
buttonState | string | Raw Best Buy button state. |
priceType | string | Best Buy price event type, e.g. onSale or clearance. |
condition | string | new, open-box or refurbished when known. |
productType | string | Best Buy product type, e.g. hardgood. |
department, productClass, subclass | string | Best Buy taxonomy labels. |
categoryPath | array | Department → class → subclass path. |
rating | number | Average customer rating. |
reviewCount | integer | Number of customer reviews. |
seller | string | Seller name, from the optional detail pass. |
isSponsored | boolean | True when the result card is labelled Sponsored. |
dealBadge | string | Best Buy promotional badge, e.g. Trending Deal or Holiday Deal. |
position | integer | 1-based position in this run's output after sorting. |
searchPage | integer | Result page where a search/category product was found. |
searchTotalResults | integer | Best Buy's reported result count for that query or category. |
searchQuery | string | Keyword or category URL that produced the record. |
source | string | search, category, productUrl or sku. |
scrapedAt | string | ISO-8601 UTC collection timestamp. |
Fields Best Buy does not publish for a product are omitted rather than sent as null or an empty string. Missing price, rating or detail fields therefore mean “not available on this page”, not zero.
How it works
- Keyword and category modes load Best Buy's result grid in a real headless browser, scroll it to hydrate lazy cards, and read the rendered product cards. A direct-HTML fallback reads the server-rendered product data if the browser grid is empty.
- Product URL and SKU modes skip search and go straight to Best Buy's public price endpoint, batching up to 20 SKUs per request.
- Every mode merges the card data with the price/stock response, so price, savings and availability come from Best Buy's current price source rather than a cached grid tile. If that endpoint omits a SKU, the price shown on the hydrated result card fills the row.
- Optional detail enrichment opens each product page and reads its structured product data for description, model, GTIN and seller.
- Filters and sorting are applied once the merged records exist; duplicates are removed by SKU.
The actor adds intl=nosplash to every request. That tells Best Buy to serve the US storefront instead of its international country selector.
Limitations and honest notes
- Online availability only. Best Buy's per-store, per-ZIP inventory needs a location-bound fulfillment session. This actor reports the national online stock state and does not claim store-level counts.
- No stored price history. The actor is stateless. Schedule it and keep each dataset, or write the rows to a spreadsheet, to build a price timeline.
- Detail fields are best-effort and often unavailable. Best Buy resets product-page requests from many datacenter IPs. In cloud runs
description,model,gtin13andsellerare therefore usually omitted; the price and stock row still ships, andincludeDetailsnever blocks it. - SKUs with no usable data are skipped. If Best Buy returns neither a name nor a price for a product (retired, region-locked, or a price-endpoint miss), that row is not emitted.
maxResultsis a cap, not a guarantee, so a run can return fewer rows. A run that finds no product at all returns onebestbuy_errorrow withreason: "no_results". - Full specification sheets are not included. The detail pass reads structured product data, not the interactive spec table.
- Individual reviews are not included. Use
ratingandreviewCountfor reception; review text belongs to a dedicated reviews actor. - Marketplace offers are summarized, not enumerated. The record follows the primary offer Best Buy displays.
FAQ
Do I need a Best Buy API key? No. The actor reads public storefront and price data. It does not use the gated developer API.
Do I need a proxy? No. There is no proxy field and no proxy setup step. The actor uses a normal browser session and the public price endpoint.
Why does a SKU sometimes have no rating or image? Those values come from the search card. Direct SKU and product-URL lookups skip the grid, so the actor can fill price, stock, name, brand and taxonomy but may not see the card-only fields. Add a keyword search for the richest row.
Why is availability different from what I see in a store? The field tracks Best Buy's online button state. Store pickup and nearby inventory depend on a ZIP code and a different fulfillment call, which this actor does not make.
Can I get more than 24 results? Yes. Raise maxResults and, if needed, maxPages. Best Buy caps a search at roughly 200 results for many queries; category pages can expose more.
What happens when a keyword finds nothing? The dataset receives a single bestbuy_error row with reason: "no_results" and the inputs that produced it, so a failed run is visible instead of silently empty.
How do I track a price drop? Run the same skuIds or productUrls daily, keep the datasets, and compare currentPrice or savingsPercent between consecutive runs.
Is this affiliated with Best Buy? No. It reads publicly visible product information and is not endorsed by Best Buy.