# Best Buy Scraper (`harpoon/bestbuy-scraper`) Actor

Scrape Best Buy products by keyword, product URL, or SKU - price, savings, rating, images, specifications and reviews.

- **URL**: https://apify.com/harpoon/bestbuy-scraper.md
- **Developed by:** [Harpoon](https://apify.com/harpoon) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 search-result products

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 — prices, specs and reviews for any Best Buy product

Turn a list of keywords, product links, or SKUs into a clean dataset of Best Buy products. One run can mix both kinds of input: keywords return that search's results, while a product link or SKU returns that exact product with its full detail. Every row carries the price, savings, open-box offers, rating, review count, image gallery and category.

Search-result rows are fast and cheap. Turn on full details — or use a product link or SKU — and each row also gets the description, feature bullets, full specification list, what's in the box, the review summary with pros and cons, the star breakdown, and the top customer reviews.

#### What can Best Buy Scraper do?

- Search by keyword and return up to 1,000 products per keyword
- Paste product links or SKUs to get exact products, with full details always included
- Mix keywords, links and SKUs in one list — each line is detected automatically
- Capture the current price, regular price, savings and every open-box buying option with its condition and price
- Collect full specifications, feature bullets, box contents, manuals, review summary, pros and cons, star distribution and customer reviews
- Export results to JSON, CSV, Excel, or XML
- Run via the API, schedule runs, and integrate through webhooks or MCP

### What data can I extract?

<table>
<tr><th>What you get</th><th>Features</th></tr>
<tr><td>

- **Product** — SKU, name, title, brand, model number, URL, condition, listing status, categories, seller
- **Pricing** — current price, regular price, savings and savings percent, plus open-box offers per condition
- **Media** — primary image plus the full-size image gallery
- **Ratings** — average rating, review count, star distribution, recommended percent
- **Full detail** — description, feature bullets, specifications, box contents, manuals
- **Reviews** — review summary, pros and cons, and up to 50 customer reviews with rating, author, date and verified-purchase flag

</td><td>

- **Two row types:** search-result rows (listing fields) and full-detail rows
- **Mixed input:** keywords, product links and SKUs in one run
- Up to 1,000 results per keyword
- Export to JSON, CSV, Excel, XML
- API access, webhooks, SDKs
- LLM-ready output for MCP, ChatGPT, Claude

</td></tr>
</table>

### How to use Best Buy Scraper

1. [Create](https://console.apify.com/sign-up) a free Apify account.
2. Open **Best Buy Scraper** in Apify Console.
3. Enter one or more **Search queries, product links, or SKUs** — one per line. The form is prefilled with `airpods`.
4. Set **Max results per search**. Leave **Fetch full details for search results** off for a fast, cheaper listing run, or turn it on for complete product rows.
5. Click **Save & Start**.
6. Download results in JSON, CSV, Excel, or XML.

### Input

There is one target list. Each line is detected automatically:

- a **keyword** (`airpods`, `usb c charger`) returns that search's products, capped by **Max results per search**
- a **product link** (`https://www.bestbuy.com/product/.../JJGCQP634G`, or any link containing `/sku/6376564`) returns that product with full details
- a **bare SKU** (`6376564`) returns that product with full details

Keywords, links and SKUs can be mixed freely in the same list, and duplicates are removed.

- `queries` — keywords, product links and SKUs, one per line.
- `max_results_per_query` — cap per keyword (default 50, maximum 1,000). Links and SKUs always return their single product.
- `fetch_full_details` — add description, specifications and reviews to keyword results (off by default; billed at the full-detail rate).
- `max_reviews` — reviews per full-detail row (default 10, maximum 50). Set `0` to keep the summary and rating breakdown but skip the review texts.

**Example input**

```json
{
  "queries": [
    "airpods",
    "https://www.bestbuy.com/product/apple-airpods-5-true-wireless-active-noise-cancelling-earbuds-with-wireless-charging-case-white/JJGCQP634G",
    "6376564"
  ],
  "max_results_per_query": 50,
  "fetch_full_details": true,
  "max_reviews": 10
}
```

See the **Input** tab above for every parameter.

### Output

Results land in a dataset under the **Storage** tab. Open the **Overview** table for one row per product, **Details** for descriptions and specifications, or **Reviews** for rating breakdowns and customer reviews. Download in JSON, CSV, Excel, or XML, or pull them via the API.

A full-detail row (trimmed: image gallery, offers, features, specifications and reviews are shortened here):

```json
{
  "sku": "6376564",
  "name": "Apple - AirPods 5 True Wireless Active Noise Cancelling Earbuds with Wireless Charging Case - White",
  "title": "AirPods 5 True Wireless Active Noise Cancelling Earbuds with Wireless Charging Case",
  "brand": "Apple",
  "model_number": "MKFT4LL/A",
  "url": "https://www.bestbuy.com/product/apple-airpods-5-true-wireless-active-noise-cancelling-earbuds-with-wireless-charging-case-white/JJGCQP634G",
  "image": "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/c67c787c-ce22-4a50-b1c8-f90ebc90dddb.jpg",
  "images": [
    "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/c67c787c-ce22-4a50-b1c8-f90ebc90dddb.jpg",
    "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/7fbc921a-31a4-4b90-bdb1-f5540f603eda.jpg"
  ],
  "price": 149,
  "regular_price": 149,
  "savings": 0,
  "savings_percent": 0,
  "currency": "USD",
  "status": "active",
  "condition": "new",
  "is_new": false,
  "categories": ["Headphones", "Wireless Headphones"],
  "rating": 4.7,
  "review_count": 100,
  "sold_by": "Best Buy",
  "buying_options": [
    {
      "condition": "new",
      "price": 149,
      "url": "https://www.bestbuy.com/product/apple-airpods-5-true-wireless-active-noise-cancelling-earbuds-with-wireless-charging-case-white/JJGCQP634G/sku/6376564"
    },
    {
      "condition": "excellent",
      "price": 136.99,
      "url": "https://www.bestbuy.com/product/apple-airpods-5-true-wireless-active-noise-cancelling-earbuds-with-wireless-charging-case-white/JJGCQP634G/sku/6376564/openbox?condition=excellent"
    }
  ],
  "source": "product",
  "query": "",
  "row_type": "full",
  "scraped_at": "2026-10-20T13:48:48Z",
  "description": "AirPods 5 with Wireless Charging Case. Featuring Active Noise Cancellation for an immersive listening experience, a redesigned acoustic architecture for richer sound, and hands-free access to Siri AI.¹",
  "features": [
    {
      "title": "",
      "description": "ACTIVE NOISE CANCELLATION—AirPods 5 offer improved Active Noise Cancellation to help reduce outside noise."
    }
  ],
  "specifications": [
    { "name": "Noise Cancelling (Active)", "value": "true" },
    { "name": "Sound Mode", "value": "Stereo" },
    { "name": "Connection Type", "value": "Wireless" }
  ],
  "included_items": ["AirPods 5", "Wireless Charging Case (USB‐C)"],
  "manuals": [],
  "review_summary": "Customers have good things to say about this product, particularly highlighting its amazing sound quality and impressive battery life.",
  "pros": ["Sound Quality", "Battery Life", "Connection Stability", "Ergonomics"],
  "cons": [],
  "recommended_percent": 95,
  "rating_distribution": [
    { "stars": 5, "count": 88, "percent": 88 },
    { "stars": 4, "count": 5, "percent": 5 }
  ],
  "reviews": [
    {
      "id": "51a73c34-96b8-3f83-88ff-1ac4747f1eb8",
      "rating": 5,
      "title": "★★★★★ Love These AirPods!",
      "text": "I love these AirPods! The sound is clear, they connect quickly, and they're comfortable to wear.",
      "author": "Lalis",
      "date": "2026-10-02T15:08:04.000-05:00",
      "verified": true,
      "photos": []
    }
  ]
}
```

Field names are lowercase snake_case. `row_type` is `basic` for a search-result row and `full` when the detail fields are included; `source` is `search` for a keyword row and `product` for a link or SKU.

### What can you do with the data?

#### 1. Track prices and open-box deals

1. Run the Actor on the products you care about (links or SKUs).
2. Read `price`, `savings` and every entry in `buying_options` (new, excellent, good, fair).
3. Schedule the run hourly or daily and diff the results to spot price drops and open-box bargains.

#### 2. Build a category catalogue

1. Run a set of keywords, for example `4k tv`, `oled tv`, `soundbar`.
2. Keep `max_results_per_query` high enough to cover the shelf, and turn on full details.
3. Load `specifications` into a spreadsheet or a comparison table, or feed `description` and `features` to an LLM for summarisation.

### How much does Best Buy Scraper cost?

The Actor uses pay-per-event pricing, and every returned row is charged exactly once:

- **`basic_details`** — a search-result row with the listing fields (name, price, savings, rating, images, categories). **$3 per 1,000 rows** ($0.003 each).
- **`full_details`** — a row that also carries the description, specifications, box contents, review summary and reviews. **$4 per 1,000 rows** ($0.004 each).

Product links and SKUs always produce `full_details` rows. Keyword results produce `basic_details` rows unless **Fetch full details for search results** is on.

| Run | Rows | Cost |
| --- | --- | --- |
| 1 product link | 1 full | $0.004 |
| 50 keyword results, details off | 50 basic | $0.15 |
| 50 keyword results, details on | 50 full | $0.20 |
| 500 keyword results, details on | 500 full | $2.00 |
| 1,000 full rows | 1,000 full | $4.00 |

Prices exclude the small Apify platform usage for the run. See the **Pricing** tab for current rates and plan discounts.

### FAQ

**Do I need a Best Buy account, cookies, or an API key?**
No. Only publicly visible product data is collected, and no credentials are needed.

**What is the difference between a basic and a full row?**
A basic row is what a keyword search returns: name, brand, price, savings, rating, review count, images and categories. A full row adds the description, feature bullets, specifications, box contents, manuals, review summary, pros and cons, star breakdown and customer reviews. Set `row_type` to filter them in your dataset.

**How many results can I get?**
Up to 1,000 products per keyword. A keyword can return fewer than you ask for — that is the full set the search exposes for it, not an error. Add more keywords to widen the coverage.

**Can I scrape private or restricted content?**
No. The Actor only returns public product listings.

**Are prices and stock live?**
Prices and buying options are captured at the moment of the run. `status` is the product's listing status, not per-store inventory, so the Actor does not report store-level pickup availability.

**Can I use it with the API, SDKs, or MCP?**
Yes — see the **API** tab above, or connect through the Apify MCP server.

**A product link was skipped.**
A link is matched to its product by its own identity. If the product no longer exists or the link cannot be matched, that line is skipped with a message in the run log and the rest of the run continues. Links that contain `/sku/<id>` resolve directly and are the most reliable.

**Something isn't working.**
Open an issue in the **Issues** tab with the input you used and the run log. Billing problems and missing rows are easiest to diagnose with the run ID.

### Notes and limitations

- This is a snapshot: prices, savings and open-box offers change after the run finishes.
- `savings` and `savings_percent` are `0` when the product is not discounted.
- `buying_options` lists only the conditions currently sold for the product; many products have just `new`.
- Specifications, manuals and box contents are missing for some products, and their lists are empty rather than wrong.
- Reviews are the site's most relevant reviews, up to 50 per product.
- The same product can appear once per keyword that matches it, so two overlapping keywords can produce the same SKU twice. Within one keyword, duplicates are removed.
- All prices are in USD, and results reflect the US storefront.

### Support

Found a bug or have feedback? Open an issue in the **Issues** tab, or reach out through the Actor's contact details in Apify Console.

# Actor input Schema

## `queries` (type: `array`):

One entry per line, and each line is detected automatically.<br><ul><li>A <b>keyword</b> (<code>airpods</code>) returns up to <b>Max results per search</b> products with the search-result fields.</li><li>A <b>product link</b> (<code>https://www.bestbuy.com/product/.../JJGCQP634G</code>, or any link containing <code>/sku/6376564</code>) or a <b>bare SKU</b> (<code>6376564</code>) returns that one product with full details.</li></ul>Mix both in the same list; duplicates are removed. Add one per line, or paste a list with <b>Bulk edit</b>.

## `max_results_per_query` (type: `integer`):

How many products to return for each keyword. Product links and SKUs always return their single product. Higher values take longer and increase cost. Maximum 1,000 per keyword.

## `fetch_full_details` (type: `boolean`):

Off by default. When on, every product found by a keyword also returns its description, feature bullets, full specification list, review summary, pros and cons, rating breakdown and top reviews. Full-detail rows are charged at <b>$4 per 1,000</b> instead of <b>$3 per 1,000</b> for search-result rows. Product links and SKUs always return full details.

## `max_reviews` (type: `integer`):

How many of the most relevant customer reviews to include in a full-detail row. Set <code>0</code> to keep the review summary, pros and cons, and rating breakdown but skip the individual review texts.

## `resume_from_run_id` (type: `string`):

Optional. Continue a run that was aborted or failed: paste its run id and the targets it already finished are skipped, so the new run only scrapes what is left. Leave empty for a normal run. A run's id is shown in the Apify Console run detail, or run scripts/resurrect.mjs --run <run-id>.

## Actor input object example

```json
{
  "queries": [
    "airpods",
    "https://www.bestbuy.com/product/apple-airpods-5-true-wireless-active-noise-cancelling-earbuds-with-wireless-charging-case-white/JJGCQP634G",
    "6376564"
  ],
  "max_results_per_query": 50,
  "fetch_full_details": false,
  "max_reviews": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per product with price, savings, rating, images and - for full-detail rows - specifications and reviews. Export as JSON, CSV, Excel, or XML.

# 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 = {
    "queries": [
        "airpods"
    ],
    "max_results_per_query": 50,
    "fetch_full_details": false,
    "max_reviews": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("harpoon/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 = {
    "queries": ["airpods"],
    "max_results_per_query": 50,
    "fetch_full_details": False,
    "max_reviews": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("harpoon/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 '{
  "queries": [
    "airpods"
  ],
  "max_results_per_query": 50,
  "fetch_full_details": false,
  "max_reviews": 10
}' |
apify call harpoon/bestbuy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,harpoon/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/B7LNE1QqsxATPzG03/builds/pFL5A9b7acNPCyTOD/openapi.json
