# Best Buy Stock Checker: In-Store Stock by ZIP & Restock Alerts (`getascraper/best-buy-stock-checker`) Actor

Check Best Buy stock at the stores around up to 10 ZIP codes: in stock, units when 3 or fewer, pickup and shipping dates, open-box offers and price history. Scheduled runs alert on restocks, sell-outs and price drops for GPUs, consoles and trading cards. Export JSON or CSV, or send to Slack.

- **URL**: https://apify.com/getascraper/best-buy-stock-checker.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 product rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🛒 Best Buy Stock Checker: In-Store Stock by ZIP & Restock Alerts

<table width="100%" style="margin-bottom:0">
<tr>
<td style="padding:24px 28px;background:#EEF3FC;border:1px solid #C9D7F2;border-top:4px solid #0046BE;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Know which Best Buy stores have it before you drive there</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Check stock at the stores around one ZIP code or ten, see pickup and shipping dates, and get an alert the moment a sold-out item is back or a price drops. No Best Buy login needed.</span>
</td>
</tr>
</table>
<table width="100%" style="margin-top:0">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C9D7F2;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#003A9B">📍 Many ZIP codes, one run</span><br>
<span style="font-size:12px;color:#57534E">Sweep about 25 stores per ZIP code. A store reached from two ZIP codes shows up once.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C9D7F2;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#003A9B">🔔 Restock and price alerts</span><br>
<span style="font-size:12px;color:#57534E">Back in stock, sold out, low stock, price drop or your target price. Quiet runs return nothing.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C9D7F2;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#003A9B">🚚 Pickup and shipping dates</span><br>
<span style="font-size:12px;color:#57534E">Earliest pickup, shipping cost, free shipping flag and arrival date for each ZIP code.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C9D7F2;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#003A9B">📦 Open-box and price history</span><br>
<span style="font-size:12px;color:#57534E">Open-box offers by condition, plus the lowest and highest price your monitor has seen.</span>
</td>
</tr>
</table>

Point this Actor at any Best Buy product, search or category and see where it is on the shelf near you. Add your ZIP codes, run it once or put it on a schedule, and keep only the products that changed.

### 🔍 What does Best Buy Stock Checker do?

Best Buy shows stock for one store at a time. This Actor checks the whole area around each ZIP code you give it and returns one clear answer per product: which stores have it, how many are left when the number is low, and when you can pick it up.

You can start from keywords, product numbers (SKUs), or links copied straight from bestbuy.com: product pages, search results and category pages. Filters for brand, price range, rating, on sale and sold by Best Buy keep the list to what matters.

Each result also carries the current and regular price, discount, rating, release date, and flags for pre-order and coming-soon items. Turn on open-box offers to see cheaper conditions of the same product.

Best Buy shows an exact unit count only when 3 or fewer are left at a store. Above that, a store is reported as in stock.

Items sold by marketplace sellers ship from the seller, not from store shelves, so they come back without a store stock verdict.

### 💡 Who uses this?

- **I buy and resell hard-to-find hardware.** I need to see which stores near me have a graphics card or console on the shelf today, so I stop driving to empty shelves.
- **I collect trading cards and drops.** I want to know the day a sealed box shows up in a store, and which weekday restocks usually land.
- **I am a deal hunter.** I want a message the second an item falls under my target price or gets a real discount, not a daily check by hand.
- **I need it today.** I am comparing pickup dates and shipping across my home, my office and my parents' ZIP code before I order.

### 🚀 How to use

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#EEF3FC;border:1px solid #C9D7F2;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0046BE;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Add products and ZIP codes</span><br>
<span style="font-size:12px;color:#57534E">Type keywords or SKUs, or paste Best Buy links. Add the ZIP codes you care about.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EEF3FC;border:1px solid #C9D7F2;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0046BE;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Pick a layout</span><br>
<span style="font-size:12px;color:#57534E">One row per product with its stores inside, or one row per product and store.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EEF3FC;border:1px solid #C9D7F2;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0046BE;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Schedule and get alerts</span><br>
<span style="font-size:12px;color:#57534E">Turn on changes-only, set a schedule, and add an optional Slack or Discord link.</span>
</td>
</tr>
</table>

### 📥 Input

| Field | Type | Required | Description |
|---|---|---|---|
| `searchQueries` | array of text | No | Keywords to look up on bestbuy.com, such as `RTX 5070` or `pokemon elite trainer box`. Best Buy search links also work. |
| `skus` | array of text | No | Exact Best Buy product numbers or product page links. The cheapest way to follow one item. |
| `startUrls` | array of URLs | No | Search, category or product links copied from bestbuy.com. Filters in a search link are kept. |
| `zipCodes` | array of text | No | US ZIP codes to check, up to 10. About 25 of the nearest stores are covered for each. |
| `maxStoreDistanceMiles` | integer | No | Ignore stores farther than this. Empty includes every nearby store Best Buy reports. |
| `brands` | array of text | No | Keep only these brands. |
| `minPrice` / `maxPrice` | number | No | Price range in USD. |
| `minRating` | number | No | Minimum average customer rating, 0 to 5. |
| `soldBy` | enum | No | Anyone, Best Buy only, or marketplace sellers only. Best Buy only follows real store inventory. |
| `onSaleOnly` | boolean | No | Keep only products priced below their regular price. |
| `inStockOnly` | boolean | No | Keep only products you can buy now, in a store or online. |
| `sortBy` | enum | No | Order for keyword and category results, for example Newest arrivals to catch new drops. |
| `maxProductsPerSearch` | integer | No | Products taken from each keyword or link. Default: 10. |
| `outputShape` | enum | No | One row per product, or one row per product and store. |
| `storesToInclude` | enum | No | Only stores that have it, or every store checked. |
| `includeOpenBox` | boolean | No | Add open-box offers for each product. Off by default. |
| `maxResults` | integer | No | Maximum rows to return. Default: 20. Free-plan runs return at most 25. |
| `onlyChanges` | boolean | No | Return only products with an alert since the last run. The first run saves the starting state. |
| `monitorName` | text | No | Name of the saved history. Use one per watch list. |
| `alertOn` | array of enum | No | Which changes count as alerts: new listing, back in stock, sold out, low stock, price drop, price increase, target price reached. |
| `targetPrice` | number | No | Alert when a product reaches this price or lower. |
| `minDiscountPercent` | number | No | Only alert on price drops of at least this percent below the regular price. |
| `webhookUrl` | text | No | Optional https link that receives a Slack, Discord or generic JSON message when alerts are found. |
| `maxConcurrency` | integer | No | Products checked at the same time. Default: 3. |
| `proxyConfiguration` | proxy | No | Optional. The Actor switches to a proxy by itself if it is needed. |

### 📊 Data table

| Field | Type | Description |
|---|---|---|
| `sku` | string | Best Buy product number. |
| `name`, `brand`, `url`, `imageUrl` | string | Product name, brand, product page link and main image. |
| `price`, `regularPrice`, `savings`, `discountPercent` | number | Current price, regular price, amount saved and percent off. |
| `onSale` | boolean | True when the price is below the regular price. |
| `soldBy` | string | `bestbuy` or `marketplace`. |
| `rating`, `reviewCount` | number | Average customer rating and number of reviews. |
| `releaseDate`, `isPreorder`, `isComingSoon` | mixed | Release date and pre-order or coming-soon flags. |
| `buttonState`, `availableOnline` | mixed | Buy button status and whether it can be ordered online now. |
| `stockLevel` | string | `in_stock`, `low_stock` or `out_of_stock` across the nearby stores. |
| `inStockAtStores`, `storesInStock`, `storesChecked` | mixed | Whether any store has it, how many do, and how many were checked. |
| `nearestStoreInStock` | object | The closest store that has it. |
| `stores` | array of objects | Stores with stock (or all stores checked), nearest first, with distance, units left, pickup date and the ZIP code each was found from. |
| `byZip` | array of objects | Per ZIP code summary with stores in stock, shipping options, free shipping flag, earliest arrival and home delivery. |
| `openBoxOffers` | array of objects | Open-box condition, price and savings. |
| `storeId`, `storeName`, `storeCity`, `storeZip`, `distanceMiles` | mixed | Store details, on the one row per product and store layout. |
| `storeStockLevel`, `storeQuantity`, `pickupAvailable`, `pickupDate`, `shipToStoreDate` | mixed | Stock at that store, units left when 3 or fewer, and pickup or ship-to-store dates. |
| `changeType`, `changes`, `previousPrice` | mixed | What changed since the last monitored run. |
| `lowestPriceSeen`, `highestPriceSeen`, `lastPriceChangeAt` | mixed | Price history kept by your monitor. |
| `restocksSeen`, `lastRestockAt`, `usualRestockDay` | mixed | Restock count, last restock and the weekday restocks usually land. |
| `firstSeenAt`, `checkedAt` | string | When your monitor first saw the product and when it was checked. |

Fields with no data for a product are left out instead of being filled with placeholders.

### 💰 Pricing

You pay per result row, with no start fee and no per-request fee. One row is one product (or one product and store, if you pick that layout). Paid Apify plans get volume discounts automatically. With changes-only turned on, quiet scheduled runs return nothing and cost nothing, so watching a long list is cheap. Free-plan accounts can try the Actor with up to 25 rows per run and 3 runs per day.

### ⭐ Enjoying Best Buy Stock Checker?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#EEF3FC;border:1px solid #C9D7F2;border-left:5px solid #0046BE;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Saved you a wasted trip to an empty shelf? Tell other shoppers.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other resellers and deal hunters find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#0046BE;border:1px solid #C9D7F2;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/best-buy-stock-checker/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

**How do I check Best Buy stock by ZIP code?**
Add one or more ZIP codes and a keyword, SKU or Best Buy link, then run the Actor. Each product comes back with the nearby stores that have it and their pickup dates.

**Does it show exact quantities in stores?**
Best Buy shows an exact unit count only when 3 or fewer are left. Those stores are marked low stock with the number. Stores with more are marked in stock.

**Can I get an alert when a sold-out item is back in stock?**
Yes. Turn on changes-only, keep a monitor name, and run on a schedule. Only products that went back in stock, sold out, dropped in price or hit your target price come back. Add a Slack or Discord link to get a message.

**Do I need a Best Buy account?**
No. The Actor needs no login, account or key. It only reads public product and store availability.

### 🔗 Other actors

- [Mercari US Scraper: Active & Sold Listings, Price & Seller Data](https://apify.com/getascraper/mercari-us-scraper) ↗ - resale listings and seller data.
- [Mercari Sold Comps Scraper: Sold Listings & Sell-Through Rate](https://apify.com/getascraper/mercari-sold-comps-scraper) ↗ - what items actually sold for.
- [LigaPokemon Scraper: Pokémon Card Prices in BRL, Decks & Drops](https://apify.com/getascraper/ligapokemon-scraper) ↗ - Pokémon card prices and drops.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/best-buy-stock-checker/changelog.md

# Actor input Schema

## `searchQueries` (type: `array`):

Products to look for on bestbuy.com, one per row, for example RTX 5070, PS5 console or pokemon elite trainer box. Best Buy search links also work here. Each keyword is checked at every ZIP code below.

## `skus` (type: `array`):

Exact products to check: a Best Buy SKU such as 6606082, or the link of a product page. This is the most precise and cheapest way to follow one item.

## `startUrls` (type: `array`):

Paste links copied from bestbuy.com: a search results page (filters in the link are kept), a category page such as graphics cards, or a product page.

## `zipCodes` (type: `array`):

US ZIP codes to check, one per row (up to 10). Each ZIP code covers about 25 of the nearest stores, so add several to watch more than one area in a single run. A store reached from two ZIP codes is listed once.

## `maxStoreDistanceMiles` (type: `integer`):

Ignore stores farther than this from the ZIP code. Leave empty to include every nearby store Best Buy reports, usually within 20 to 70 miles.

## `brands` (type: `array`):

Only keep products from these brands, for example ASUS or Sony. Applied to keyword, search and category results. Leave empty for all brands.

## `minPrice` (type: `number`):

Skip products priced below this amount.

## `maxPrice` (type: `number`):

Skip products priced above this amount, useful to ignore scalper-priced marketplace listings.

## `minRating` (type: `number`):

Skip products with an average customer rating below this value (0 to 5). Products without reviews are skipped when this is set.

## `soldBy` (type: `string`):

Best Buy sells and ships its own stock, while marketplace sellers are third parties whose items are rarely held in stores. Pick Best Buy only to follow real store inventory.

## `onSaleOnly` (type: `boolean`):

Keep only products currently priced below their regular price.

## `inStockOnly` (type: `boolean`):

Keep only products that are in stock at a nearby store or can be ordered online right now.

## `sortBy` (type: `string`):

Order of the products taken from keyword and category searches. Newest arrivals is the best choice to catch new set drops.

## `maxProductsPerSearch` (type: `integer`):

How many products to take from each keyword, search link or category link, after the filters above. Every product is then checked at every ZIP code.

## `outputShape` (type: `string`):

One row per product answers where is it in stock in a single line: the stores holding it are listed inside the row. One row per product and store gives a flat table with a row for each store.

## `storesToInclude` (type: `string`):

Only stores that have it keeps results short. A product that is in stock nowhere nearby still gets a row, with zero stores in stock.

## `includeOpenBox` (type: `boolean`):

Add the open-box offers of each product (condition, price and savings, for example Excellent, Good, Fair). Makes the search step slower.

## `maxResults` (type: `integer`):

Stop after this many rows. Free-plan runs are limited to 25 rows.

## `onlyChanges` (type: `boolean`):

Turn this on for scheduled runs. The Actor remembers each product between runs and returns only products with an alert below, so a quiet run returns no rows. The first run saves the starting state and returns every product.

## `monitorName` (type: `string`):

Name of the saved history. Use a different name for each separate watch list. When changes-only is on and this is empty, the name default is used.

## `alertOn` (type: `array`):

Which changes count as an alert when only changes are returned. Without changes-only every product is returned and the changes are shown on the row.

## `targetPrice` (type: `number`):

Raise a price-reached-my-target alert when a product falls to this price or lower. Leave empty to turn it off.

## `minDiscountPercent` (type: `number`):

Only raise price-drop alerts when the product is at least this many percent below its regular price. Leave empty to alert on any drop.

## `webhookUrl` (type: `string`):

A Slack, Discord or other web address that receives a message when alerts are found. It must start with https:// and is never required.

## `maxConcurrency` (type: `integer`):

How many products are checked at the same time. Higher is faster but more likely to be slowed down by Best Buy.

## `proxyConfiguration` (type: `object`):

Optional. Requests go out directly first, and the Actor switches to a proxy by itself only if Best Buy refuses them. Choose a proxy here to use it from the start.

## Actor input object example

```json
{
  "searchQueries": [
    "pokemon elite trainer box"
  ],
  "skus": [],
  "startUrls": [],
  "zipCodes": [
    "10001"
  ],
  "brands": [],
  "soldBy": "any",
  "onSaleOnly": false,
  "inStockOnly": false,
  "sortBy": "Best-Match",
  "maxProductsPerSearch": 10,
  "outputShape": "perProduct",
  "storesToInclude": "inStock",
  "includeOpenBox": false,
  "maxResults": 20,
  "onlyChanges": false,
  "alertOn": [
    "new_listing",
    "back_in_stock",
    "sold_out",
    "low_stock",
    "price_drop",
    "target_price_hit"
  ],
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "pokemon elite trainer box"
    ],
    "skus": [],
    "startUrls": [],
    "zipCodes": [
        "10001"
    ],
    "brands": [],
    "soldBy": "any",
    "onSaleOnly": false,
    "inStockOnly": false,
    "sortBy": "Best-Match",
    "maxProductsPerSearch": 10,
    "outputShape": "perProduct",
    "storesToInclude": "inStock",
    "includeOpenBox": false,
    "maxResults": 20,
    "onlyChanges": false,
    "alertOn": [
        "new_listing",
        "back_in_stock",
        "sold_out",
        "low_stock",
        "price_drop",
        "target_price_hit"
    ],
    "maxConcurrency": 3,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/best-buy-stock-checker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["pokemon elite trainer box"],
    "skus": [],
    "startUrls": [],
    "zipCodes": ["10001"],
    "brands": [],
    "soldBy": "any",
    "onSaleOnly": False,
    "inStockOnly": False,
    "sortBy": "Best-Match",
    "maxProductsPerSearch": 10,
    "outputShape": "perProduct",
    "storesToInclude": "inStock",
    "includeOpenBox": False,
    "maxResults": 20,
    "onlyChanges": False,
    "alertOn": [
        "new_listing",
        "back_in_stock",
        "sold_out",
        "low_stock",
        "price_drop",
        "target_price_hit",
    ],
    "maxConcurrency": 3,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/best-buy-stock-checker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "pokemon elite trainer box"
  ],
  "skus": [],
  "startUrls": [],
  "zipCodes": [
    "10001"
  ],
  "brands": [],
  "soldBy": "any",
  "onSaleOnly": false,
  "inStockOnly": false,
  "sortBy": "Best-Match",
  "maxProductsPerSearch": 10,
  "outputShape": "perProduct",
  "storesToInclude": "inStock",
  "includeOpenBox": false,
  "maxResults": 20,
  "onlyChanges": false,
  "alertOn": [
    "new_listing",
    "back_in_stock",
    "sold_out",
    "low_stock",
    "price_drop",
    "target_price_hit"
  ],
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call getascraper/best-buy-stock-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/best-buy-stock-checker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fQciVx1FBTSPAL1Bi/builds/jrkPeXmX5crgpCxQn/openapi.json
