How to get Best Buy product prices, deals and open-box data
3 Nov 2026 · benthepythondev
The Best Buy Scraper exports Best Buy products as rows of data. You can start from a keyword search, a category URL or a list of product URLs. It reads Best Buy's public product API, so you don't need a Best Buy login, a developer key or a browser. It downloads product data only. It skips photos, fonts, ads and browser bundles.
What you get
Each saved row describes one product (one SKU). The fields are:
- skuId: Best Buy's SKU number for the product.
- title, brand and modelNumber: the product name as Best Buy lists it, the maker, and the manufacturer model number.
- price: the current customer price in USD.
- originalPrice, savings, savingsPercent and onSale: the regular price, how much is taken off in dollars and percent, and whether a saving is reported.
- rating and reviewCount: the average customer rating and how many reviews it's based on.
- url and imageUrl: the canonical SKU link and the primary product image.
- condition and openBoxCondition: whether the offer is new or open-box, plus the open-box grade when there is one.
- availability and isSponsored: compatibility fields. They are always null (see the limits section).
- source and scrapedAt: a fixed
bestbuylabel and a UTC timestamp for when the row was collected.
Set includeSpecifications and search or category rows also get specifications (a name/value object), features (a list of text), a description and image URLs. Direct product URL exports always include these detail fields.
Example output
These rows came from a real laptop search. Two of them are shown here, trimmed slightly:
[
{
"skuId": "6667483",
"title": "HP - 14\" Laptop - Intel N150 Processor - 4GB Memory - 128GB UFS Storage - Pale Rose Gold",
"brand": "HP",
"modelNumber": "14-dq6105dx",
"price": 209.99,
"originalPrice": 349.99,
"savings": 140,
"savingsPercent": 40,
"onSale": true,
"rating": 4.4,
"reviewCount": 112,
"url": "https://www.bestbuy.com/product/hp-14-laptop-intel-n150-processor-4gb-memory-128gb-ufs-storage-pale-rose-gold/JJGW3FGF9T/sku/6667483",
"availability": null,
"isSponsored": null,
"condition": "new",
"openBoxCondition": null,
"source": "bestbuy",
"scrapedAt": "2026-10-07T07:48:01.875719+00:00"
},
{
"skuId": "6613865",
"title": "HP - OmniBook X Flip 2-in-1 - 16\" 2K Touchscreen Laptop - Intel Core Ultra 7 (2024) - 16GB Memory - 1TB SSD - Copilot+ PC - Eclipse Gray",
"brand": "HP",
"modelNumber": "16-as0023dx",
"price": 749.99,
"originalPrice": 1199.99,
"savings": 450,
"savingsPercent": 37.5,
"onSale": true,
"rating": 4.7,
"reviewCount": 2295,
"condition": "new",
"openBoxCondition": null,
"source": "bestbuy"
}
]
Prices and review counts in these rows will have changed by the time you read this. Treat a row as a snapshot taken at the scrapedAt time.
Use cases
Price tracking. Schedule the same input to run daily, then compare the price column between runs to spot price drops on the products you care about.
Deal hunting. Set onSaleOnly to keep only products where Best Buy reports a saving. Add minPrice and maxPrice to stay inside a budget, and minRating to skip poorly rated items.
Open-box shopping. Set openBoxOnly and each SKU's row shows the lowest-priced matching open-box offer, with its grade in openBoxCondition.
Catalog enrichment. Feed in product URLs with mode set to direct_urls to get the SKU, model number, specifications, features and description for products already on your list.
How to run it on Apify
Open the Actor at apify.com/benthepythondev/bestbuy-scraper. A small first run is a good idea. This input saves up to 25 laptops and follows to another search page if it has to:
{
"mode": "search",
"searchQuery": "laptop",
"maxProducts": 25,
"includeSpecifications": false
}
You can narrow it down. This one returns Lenovo laptops between $500 and $1,000, cheapest first:
{
"mode": "search",
"searchQuery": "laptop",
"brands": ["Lenovo"],
"minPrice": 500,
"maxPrice": 1000,
"sortBy": "priceLow",
"maxProducts": 25
}
For category mode, pass a public category URL ending in .c, such as https://www.bestbuy.com/site/laptop-computers/all-laptops/pcmcat138500050001.c. Any filters already in the URL are kept. sortBy accepts bestMatch, priceLow, priceHigh, rating, bestSelling or newest. maxProducts can be anywhere from 1 to 1,000, and the default is 5.
When the run finishes, open the default dataset's Overview table. You can export it as JSON, CSV or Excel, or read it through the Apify API. Direct access is the default. You can add an Apify proxy or your own proxy if you want one.
Use it as an API on RapidAPI
If you'd rather call it from your own code with a standard API key, the same scraper is listed on RapidAPI: Best Buy Products Scraper on RapidAPI.
Honest limits
- It doesn't cover local store inventory or delivery promises. The
availabilityandisSponsoredfields are always null because this API path can't verify them. The oldzipCodeinput never controlled local inventory, and it's been removed. maxProductscaps the number of saved rows, including when filters drop some products. A lower run charge limit can cut the count further, and the log tells you how many rows you can afford before collection starts.- A minimum-only price filter is checked against the products that come back, so it may need to fetch more search pages.
- Sorting follows Best Buy's own order. One product group can hold several offers, so the offer that gets picked won't always line up perfectly with the price sort.
- Products without a rating never pass a
minRatingfilter. - Each SKU is saved at most once per run. Search rankings, prices and offer conditions can change between requests. A row isn't a price quote and doesn't reserve stock.
Affiliate if you still need an Apify account: apify.com/?fpr=qolupv. I may earn a commission; the price you pay does not change.