# Best Buy Scraper: Products, Prices, Stock & Reviews (`northloop-labs/bestbuy-scraper`) Actor

Scrape Best Buy products by search term, category or product URL: price, original price, discounts, ratings, review count, images, shipping and pickup stock for any ZIP code, optional full specs and customer reviews.

- **URL**: https://apify.com/northloop-labs/bestbuy-scraper.md
- **Developed by:** [Northloop Labs](https://apify.com/northloop-labs) (community)
- **Categories:** E-commerce, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 product saveds

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 Scraper: Products, Prices, Stock & Reviews

**Get Best Buy product data from any search, category or product page.** Type a search such as `oled tv`, paste a category URL or a list of SKUs, and get every product with its **price, original price, discount, rating, review count, brand, model, images and link**. Turn on **full details** for description, specifications, UPC, condition, seller and **shipping / pickup stock** for any US ZIP code. Set **reviews per product** to add customer reviews.

**Try it now:** click **Start** with the ready-made input (“airpods”, ZIP 10001) → about **100 seconds** → about **$0.24** → you get **8 products**.

Sample of what you get (from a real run, a few columns only):

| Product | Price | Rating | Reviews |
|---|---|---|---|
| Best Selling Apple - AirPods 5 True Wireless Active Noise… | $149.00 | 4.8 | 155 |
| Apple - AirPods Pro 3, Wireless Active Noise Cancelling E… | $249.99 | 4.8 | 11824 |
| Translation Earbuds | $149.00 |  | 0 |

It's built for **price monitoring, retail and e-commerce analytics, resellers and arbitrage, brands checking their listings, and market research**. You don't need a Best Buy account, an API key or any proxy setup.

### How much does it cost?

You pay only for what you get (pay per event, no monthly fee). Prices from the **Pricing** tab:

| Event | Price | When it is charged |
|---|---|---|
| Actor start | $0.005 per GB of memory | Once per run ($0.01 at the default 2 GB) |
| Best Buy session | $0.20 | Once per run, only after Best Buy accepts the browser session |
| Product saved | $0.003 | Per product (duplicates are free) — about **$3.00 / 1,000 products** |
| Full product details | $0.003 | Per product, only with **Include full product details** or product URLs/SKUs |
| Customer review | $0.0005 | Per review saved |

**Examples:**

- Ready-made input in Console (1 search, 8 products, no details): about **$0.23**. Through the API without `maxItemsPerSearch` (12 products): about **$0.25**.
- 1,000 products from several searches in one run: about **$3.21** ($3.00 for products + $0.21 per run).
- 1,000 products with full details: about **$6.21**. Adding 10 reviews per product adds $5.00.

If Best Buy blocks every session attempt, the session fee is not charged. Because the session fee is paid once per run, **put many searches in one run** instead of many small runs.

Set **Maximum cost per run** in the run options to cap your spend. The Actor stops cleanly when it is reached.

Store plan discounts (Bronze / Silver / Gold) lower the per-product price further; the session fee stays nearly flat.

### What you can use it for

- **Price tracking:** schedule a daily run on your searches and follow price drops and Top Deal discounts.
- **Stock checks:** see ship-to-home ETA and pickup availability at nearby stores for a ZIP code.
- **Competitor and brand monitoring:** list every product of a brand or category with ratings and review counts.
- **Catalog and product research:** export specs, UPCs, model numbers and descriptions.
- **Review analysis:** collect the newest customer reviews to find product problems and selling points.

### What data you get

One row per product:

| Field | Description |
|---|---|
| `sku`, `bsin`, `url`, `title`, `brand`, `modelNumber` | Best Buy SKU, BSIN, product link, name, brand and model |
| `price`, `originalPrice`, `discountPercent`, `currency` | Current price, was-price and % off |
| `rating`, `reviewCount` | Average star rating and number of reviews |
| `imageUrl`, `images` | Main image and gallery |
| `availability`, `condition`, `seller` | In Stock / Sold Out / etc., new or refurbished, marketplace seller |
| `searchTerm`, `sourceUrl`, `position`, `zipCode`, `scrapedAt` | Where the product came from and when |

With **Include full product details** (always on for product URLs and SKUs):

| Field | Description |
|---|---|
| `description`, `highlights`, `specifications`, `upc`, `categories` | Full product info |
| `shipToHomeAvailable`, `shipEta`, `shipEtaDate` | Ship-to-home for the ZIP |
| `pickupAvailable`, `inStoreQuantity`, `storeName`, `storeId`, `nearbyStores` | Pickup at nearby stores |

With **Reviews per product** above 0, each product gets a `reviews` list: `rating`, `title`, `text`, `author`, `date`, `recommended`, `helpfulVotes`, `verifiedPurchase` and `badges`.

The dataset has two ready-made views: **Products** and **Shipping & pickup**.

### How to scrape Best Buy

1. Enter **Search terms** (e.g. `oled tv`, `airpods pro`), paste **Best Buy URLs** (search, category or product pages), or add **Product SKUs**.
2. Set **Max products per search or category** (default 12).
3. Optional: enter a **ZIP code** for shipping and pickup.
4. Optional: turn on **Include full product details** and set **Reviews per product**.
5. Click **Start** and export the results as CSV, Excel, JSON or HTML, or connect them through the API.

#### Input example

```json
{
  "searchTerms": ["airpods"],
  "maxItemsPerSearch": 12,
  "sortBy": "best_selling",
  "zipCode": "10001",
  "includeDetails": false,
  "maxReviewsPerProduct": 0
}
```

#### Output example

```json
{
  "sku": "6673142",
  "url": "https://www.bestbuy.com/site/6673142.p?skuId=6673142",
  "title": "LG - 77\" Class C6H OLED evo AI 4K Smart webOS TV (2026)",
  "brand": "LG",
  "price": 1999.99,
  "originalPrice": 2499.99,
  "discountPercent": 20,
  "rating": 4.9,
  "reviewCount": 97,
  "availability": "In Stock",
  "searchTerm": "oled tv",
  "position": 1,
  "zipCode": "10001"
}
```

### Tips

- Large runs are cheap per product: the cost of opening a session is paid once per run, so put many searches in one run instead of many small runs.
- Stock and shipping are for one ZIP per run. To compare areas, run once per ZIP code.
- List-only mode (details off) is faster and cheaper when you only need SKU, title, price and rating from search results.

### Use with AI agents, MCP, Make, Zapier, n8n and the API

#### AI agents and the Apify MCP server

Your AI agent can run this Actor as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). In Claude, Cursor, VS Code or any other MCP client, add this server URL to load only this Actor:

```text
https://mcp.apify.com?tools=northloop-labs/bestbuy-scraper
```

Pass `maxTotalChargeUsd` in `callOptions` to cap what one run may cost. Example prompt: *"Find the 20 best-selling OLED TVs at Best Buy near ZIP 10001 with price and rating."*

#### Make, Zapier and n8n

Apify has official integrations for [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier) and [n8n](https://docs.apify.com/platform/integrations/n8n). Use "Run Actor", pick `northloop-labs/bestbuy-scraper`, paste your input as JSON, and send the products to Google Sheets, Airtable or your database.

#### API

```bash
curl -X POST "https://api.apify.com/v2/acts/northloop-labs~bestbuy-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["oled tv"], "maxItemsPerSearch": 48, "zipCode": "10001"}'
```

Or with the Python client (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("northloop-labs/bestbuy-scraper").call(run_input={"searchTerms": ["oled tv"], "zipCode": "10001"})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item.get("availability"))
```

### Data & privacy

- The Actor collects **public product information** that any visitor of bestbuy.com can see. Reviews can include a reviewer's display name; only keep what you need.
- Results are written **only to your own Apify account** (the run's dataset and a run summary). The Actor sends the data nowhere else and keeps no copy.

### Is it legal to scrape Best Buy?

The Actor reads public product pages without logging in and doesn't bypass any login or paywall. Best Buy's terms restrict automated access, and data protection laws apply to personal data in reviews, so check that your use fits your own legal and compliance requirements. This isn't legal advice.

### FAQ

**How many products can I get?** As many as Best Buy lists for a search or category. Set **Max products per search or category** to the number you need.

**Which ZIP's shipping and pickup do I get?** The **ZIP code** you enter. Without it, Best Buy's default location is used.

**Can I track price changes?** Yes. Save your input as a task, schedule it daily, and compare `price` between runs.

**Do you support Best Buy Canada?** This Actor covers bestbuy.com (US). Canada is a separate site.

**What if a run is blocked?** Best Buy uses Akamai bot protection. The Actor retries with a fresh browser and US residential IP; if every attempt fails, the run ends without charging the session fee. Just run it again.

### How this Actor was made

This Actor was made with AI. An AI agent wrote and tested the code, this README and the store listing, and a human owns and maintains the Actor. It opens a real browser session on bestbuy.com through US residential IPs and reads the same product data the website loads.

### More Actors from Northloop Labs

- [Home Depot Scraper: Products, Prices, Stock & Reviews](https://apify.com/northloop-labs/home-depot-scraper): Home Depot products, prices, store stock and reviews.
- [Luma, Eventbrite & Meetup Events Scraper](https://apify.com/northloop-labs/tech-events-finder): tech, AI and startup events from Luma, Eventbrite and Meetup.
- [Greenhouse, Lever, Ashby & Workable Jobs Scraper](https://apify.com/northloop-labs/company-jobs-finder): open jobs from company career pages.
- [Google Ads Transparency Center Scraper](https://apify.com/northloop-labs/google-ads-transparency-library): a company's ads from the Google Ads Transparency Center.
- [Meta Ads Library Scraper: Facebook & Instagram Ads](https://apify.com/northloop-labs/meta-ads-library-scraper): Facebook and Instagram ads from Meta's Ad Library.
- [X Ads Transparency Scraper: X (Twitter) Ads Repository](https://apify.com/northloop-labs/x-ads-transparency-scraper): X (Twitter) ads from the Ads Repository, guest access, no login.
- [Podcast Transcriber for RSS & Apple Podcasts](https://apify.com/northloop-labs/podcast-transcriber): podcast transcripts with timestamps and SRT subtitles.
- [EU TED & UK Find a Tender Scraper](https://apify.com/northloop-labs/public-tenders-monitor): UK and EU public tenders with daily alerts.
- [Google Trends Scraper: Keywords, Regions & Related Queries](https://apify.com/northloop-labs/google-trends-scraper): bulk Google Trends with comparisons and rising-query alerts.
- [YouTube Transcript Scraper: Captions, Subtitles & Text](https://apify.com/northloop-labs/youtube-transcript-scraper): YouTube transcripts with captions or Whisper, timestamps and SRT.
- [Google Maps Leads Scraper: Emails, Phones & Socials](https://apify.com/northloop-labs/google-maps-leads-scraper): local business leads with emails, phones, socials and a lead score.

### Feedback

Missing a field or a filter? Something doesn't work? Open an issue on the **Issues** tab with your run link and we'll fix it quickly.

# Actor input Schema

## `searchTerms` (type: `array`):

Words you would type into the Best Buy search box, e.g. "oled tv" or "airpods pro".

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

Paste search pages (/site/searchpage.jsp?st=…), category pages (/site/… or /c/…) or product pages (/site/….p or /product/…).

## `productIds` (type: `array`):

Best Buy SKU numbers (7–8 digits from the product URL), e.g. 6376563. Product pages and SKUs always include full details.

## `maxItemsPerSearch` (type: `integer`):

Stop after this many products for each search term or category URL.

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

Order of search results.

## `zipCode` (type: `string`):

US ZIP code used for ship-to-home ETA and nearby store pickup. Leave empty for Best Buy's default (Richfield, MN 55423).

## `includeDetails` (type: `boolean`):

Opens each product page for description, specifications, UPC, model, condition, seller and shipping/pickup stock. One extra request and charge per product. Always on for product URLs and SKUs.

## `maxReviewsPerProduct` (type: `integer`):

Number of customer reviews to add to each product (0 = none). Each review is charged separately. Requires a numeric SKU.

## Actor input object example

```json
{
  "searchTerms": [
    "airpods"
  ],
  "maxItemsPerSearch": 8,
  "sortBy": "best_match",
  "zipCode": "10001",
  "includeDetails": false,
  "maxReviewsPerProduct": 0
}
```

# Actor output Schema

## `products` (type: `string`):

Price, rating, reviews, availability and link for each product.

## `stock` (type: `string`):

Ship-to-home ETA and nearby store pickup for the selected ZIP.

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

Counts per search and errors.

## `all` (type: `string`):

Every field, including details and reviews when requested.

# 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 = {
    "searchTerms": [
        "airpods"
    ],
    "maxItemsPerSearch": 8,
    "zipCode": "10001"
};

// Run the Actor and wait for it to finish
const run = await client.actor("northloop-labs/bestbuy-scraper").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 = {
    "searchTerms": ["airpods"],
    "maxItemsPerSearch": 8,
    "zipCode": "10001",
}

# Run the Actor and wait for it to finish
run = client.actor("northloop-labs/bestbuy-scraper").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 '{
  "searchTerms": [
    "airpods"
  ],
  "maxItemsPerSearch": 8,
  "zipCode": "10001"
}' |
apify call northloop-labs/bestbuy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,northloop-labs/bestbuy-scraper"
        }
    }
}
```

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/sgQlgQyAh4YaBsgm3/builds/h0uaES2P28zcLKCPd/openapi.json
