# Best Buy Scraper - Exact UPC Lookup, Prices & Product Search (`s-r/bestbuy-scraper`) Actor

Look up Best Buy US products by exact UPC/EAN, keyword or a copied search URL. Get SKU, UPC, USD price, regular price, sale flag, rating, reviews, images and colour variants as clean rows for price monitoring and catalogue matching.

- **URL**: https://apify.com/s-r/bestbuy-scraper.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Categories:** E-commerce, Business
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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: exact UPC lookup, prices and product search

Best Buy Scraper finds US products by exact UPC or EAN, by keyword, or from a Best Buy search URL. It returns product identifiers, USD prices, ratings, images and colour or size attributes in a dataset ready for export, for price monitoring, catalogue matching and product research.

### What the Best Buy scraper collects

Each row represents one Best Buy SKU, which identifies one product variant. A product family with several colours can have several SKUs and UPCs. Exact barcode lookup checks the UPC attached to the returned product, so a similar title or a nearby barcode does not qualify as a match. Keyword searches return the products Best Buy associates with the term, without an additional title filter.

Use the dataset for catalogue matching, retailer price monitoring, product research or joining records from several stores by GTIN. The `gtin` and `upc` fields preserve Best Buy's spelling, including leading zeros. `product_id` and `sku_id` both identify the Best Buy SKU. Save the timestamp with any price comparison because prices and availability can change between collections.

### Input

Choose one input mode:

- `upcs`: up to 1000 UPC/EAN/GTIN codes. The input form accepts a string list. The HTTP interface also accepts comma, space or newline separated text. Codes must contain 8–14 digits after removing spaces and hyphens.
- `query`: a search keyword, such as `laptop`. `searchQuery` and `keyword` are aliases, with `query` taking precedence.
- `url`: a Best Buy US search URL copied from the site. Search terms, page selection, sorting and supported URL facets are preserved. The `cp` parameter accepts site pages 1–111, with 18 source rows per page; `cp=3` starts at source row 37.

| Field | Type | Default | What it does |
|---|---|---|---|
| `upcs` | list of strings | – | Barcodes to look up exactly, one dataset row per unique SKU found |
| `query` | string | – (form prefill `laptop`) | Search keyword; aliases `searchQuery` and `keyword` |
| `url` | string | – | Best Buy US search URL |
| `sort` | select | – | Overrides sorting in the keyword or URL search |
| `maxItems` | integer | 100 | Total products for search or URL input, 1 to 2000; alias `maxResults` |
| `includeVariants` | boolean | true | Adds sibling colour and size variants inside `variant_siblings` |

For search or URL input, `maxItems` sets the total requested products, from 1 to 2000, with a default of 100. `maxResults` is an alias; an explicit `maxItems` takes precedence. Barcode mode processes the submitted list instead of applying this search limit. Repeated codes and equivalent UPC/EAN spellings produce one dataset row per unique SKU.

`includeVariants` defaults to true. Sibling variant identifiers and their attributes appear inside `variant_siblings`; they do not create additional product rows. Set the option to false if you only need the current product variant.

Optional `sort` values are `Best-Match`, `Best-Selling`, `Best-Discount`, `Price-Low-To-High`, `Price-High-To-Low`, `Customer-Rating` and `New-Arrivals`. An explicit sort overrides sorting in the URL. URL facets can narrow the search to a brand or price range when those facets are present in a copied Best Buy URL.

Search cards missing a SKU, title or product URL are skipped while collection continues. The `summary.products_skipped` count and a warning report these cards, and `partial` remains true. Skipped cards produce no dataset row or product charge.

An exact lookup input verified against the collected response is:

```json
{"upcs":["027242923232"]}
```

A copied search URL with a brand facet and price sorting, limited to three products:

```json
{"url":"https://www.bestbuy.com/site/searchpage.jsp?st=laptop&sp=%2Bcurrentprice%20skuidsaas&qp=brand_facet%3DBrand~Apple","maxItems":3}
```

### Output

The dataset contains found products only. The verified code above returned Best Buy SKU `6505727`, Sony WH-1000XM5 headphones in Black. The response collected on 5 October 2026 carried a current price of USD 198; this is a historical example rather than a promise about the next run's price.

The row as it was delivered on that run, with the `images` list shortened to its first entry:

```json
{
  "source": "bestbuy-scraper",
  "country": "US",
  "fetched_at": "2026-10-05T10:24:20.509789Z",
  "product_id": "6505727",
  "sku_id": "6505727",
  "gtin": "027242923232",
  "upc": "027242923232",
  "bsin": "J7XSRH5CXG",
  "title": "Sony - WH-1000XM5 Wireless Noise Cancelling Over-the-Ear Headphones - Black",
  "long_title": "WH-1000XM5 Wireless Noise Cancelling Over-the-Ear Headphones",
  "brand": "Sony",
  "manufacturer": "SONY ELECTRONICS INC. 001",
  "model_number": "WH1000XM5/B",
  "url": "https://www.bestbuy.com/product/sony-wh-1000xm5-wireless-noise-cancelling-over-the-ear-headphones-black/J7XSRH5CXG",
  "sku_url": "https://www.bestbuy.com/product/sony-wh-1000xm5-wireless-noise-cancelling-over-the-ear-headphones-black/J7XSRH5CXG/sku/6505727",
  "image_url": "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/6505/6505727_rd.jpg",
  "images": [
    "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/6505/6505727_rd.jpg"
  ],
  "currency": "USD",
  "price": 198.0,
  "offers_count": 1,
  "regular_price": 398.0,
  "current_price": 198.0,
  "price_event_type": "onSale",
  "on_sale": true,
  "rating": 4.6,
  "reviews_count": 6603,
  "availability": "active",
  "condition": "new",
  "open_box_condition": null,
  "is_new": false,
  "seller_type": "1P",
  "seller_id": "bby",
  "categories": ["Headphones", "Wireless Headphones"],
  "variant": {"colour": "Black", "size": null},
  "variant_siblings": [
    {"bsin": "J7XSRH5CXV", "variations": [{"name": "Portable_Audio:Color", "value": "Silver"}]},
    {"bsin": "J7XSRH528S", "variations": [{"name": "Portable_Audio:Color", "value": "Blue"}]},
    {"bsin": "J7XSRH5QPP", "variations": [{"name": "Portable_Audio:Color", "value": "Smoky Pink"}]},
    {"bsin": "J2VJR64GFJ", "variations": [{"name": "Portable_Audio:Color", "value": "Black"}]}
  ],
  "query": "027242923232",
  "code_form": "027242923232",
  "position": 2
}
```

Core fields include `source`, `fetched_at`, `country`, `product_id`, `gtin`, `title`, `brand`, `url`, `image_url`, `currency`, `price` and `offers_count`. Additional fields include the long title, manufacturer, model number, images, regular price, price event type, sale flag, rating, review count, condition, open-box condition, seller type and variant attributes. Fields the source does not provide remain null instead of receiving inferred values. A price is numeric and positive, or null when no positive price is supplied.

A run summary reports the input mode, source result count, pages fetched, products returned, requested codes and found codes. `not_found` lists unmatched codes. Missing codes do not generate dataset rows. Errors and warnings describe incomplete collection so that an interrupted search is visible. Searches continue through multiple pages automatically in the Actor. The summary of the five-code run that produced the row above:

```json
{"mode":"upcs","query_type":"SEARCH","num_found":null,"pages_fetched":5,"products_returned":5,"codes_requested":5,"codes_found":5,"not_found":[]}
```

### Use cases

#### Best Buy price tracker for your own product list

Schedule the Actor with a fixed list of UPCs and store each run's dataset. `price`, `regular_price`, `price_event_type` and `on_sale` show the current price and whether Best Buy marks it as a sale, so you can chart price drops per SKU over time or trigger an alert when a product falls below a threshold.

#### Best Buy UPC lookup for catalogue matching

Retailers, distributors and comparison sites often hold a barcode list but no Best Buy identifiers. A barcode run returns the Best Buy SKU, BSIN, model number and product URL for every code that Best Buy sells, and lists the rest in `not_found`, so the match is a fact rather than a fuzzy title guess.

#### Assortment and competitor research

Use a keyword or a copied search URL with a brand facet to see which products Best Buy lists, in which order, at which price, and with how many reviews. `position` keeps the rank in the search results.

#### Product data for listings and feeds

Titles, brand, manufacturer, model number, categories, images and colour variants give a structured starting point for marketplace listings or product feeds, keyed by GTIN.

### How the Best Buy scraper compares

| | Best Buy Scraper | Official Best Buy API | Writing your own scraper |
|---|---|---|---|
| Exact UPC/EAN list as input | yes, up to 1000 codes per run | via its own query syntax and a developer key | build and maintain it yourself |
| Keyword and copied search URL | yes, with sorting and URL facets | separate query syntax | yes, if you maintain it |
| Price, sale flag, rating and variants per SKU | yes | yes | depends |
| Access | Apify account | Best Buy developer key | your own infrastructure and upkeep |
| Price | $3 per 1,000 delivered products | free, within Best Buy's rate limits and terms | your own time and hosting |

Most Best Buy actors in the Apify Store start from a keyword, a SKU or a product URL. This one also accepts a barcode list and confirms each match against the product's own UPC, which makes it suited to joining Best Buy with other stores by GTIN.

### Pricing

The launch reference is $3 per 1000 delivered products, with no start fee. Check the price shown on the Actor's Store page for the active rate before running. Charging follows actual delivered dataset rows: a missing barcode costs no product event, an empty result costs no product event, and duplicate SKUs are counted once. Variant sibling attributes belong to the same delivered product row.

Examples at the launch rate: 100 found barcodes cost about $0.30, and a 1,000-product keyword search about $3.00. A list of 500 codes where 200 are not sold at Best Buy is charged for the 300 delivered rows.

Users without a paid Apify plan receive at most ten products per run. The summary reports `free_tier_remaining`; paid users can collect the requested search volume or process their full barcode list. The search depth limit still applies because it is a limit of the source's results.

### Limits and interpretation

This Actor covers Best Buy US and returns USD prices. Search result totals come from the product search response and may differ from the count displayed on the website. Best Buy can associate a keyword with related products or apply fuzzy matching. A nonsense term can therefore still return products; this does not make barcode lookup approximate.

Search depth is approximately 2000 results. Large collections should use narrower keywords or URL facets. A source limit or incomplete request is reported in warnings. Availability describes what the product response states; it does not establish local store inventory, delivery promises or checkout eligibility. Sibling BSINs are references, not independently verified offers.

### FAQ

#### Does a padded EAN find the same product as its UPC?

Yes, when the code is the equivalent leading-zero representation. The Actor tries the UPC-A spelling first and verifies the returned product's own UPC while ignoring leading zeros for comparison. The collected Sony fixture confirms this for `0027242923232` and `027242923232`.

#### Are missing barcodes charged?

No. The two verified control codes `104332181960` and `637940265420` returned no products. Such codes appear in the summary without a dataset row or product charge.

#### Why are there fewer products than the source total?

The requested limit, your plan's cap, non-product search documents, search depth or an incomplete request can reduce delivered rows. Use the summary and warnings to distinguish these cases. `num_found` is a source count and does not guarantee that every document is an accessible product row.

#### Do I need a Best Buy API key?

No. The Actor needs only an Apify account. You do not register for a Best Buy developer key or learn its query syntax, and the output fields are the same for barcode, keyword and URL runs.

#### Does it cover Best Buy Canada or other countries?

No. The Actor covers bestbuy.com in the United States and returns prices in USD.

#### Can I export the results to CSV or Excel?

Yes. Like every Apify dataset, the results download as JSON, CSV, Excel, XML or HTML, and can be read through the Apify API or sent onward with integrations.

# Actor input Schema

## `upcs` (type: `array`):

Exact UPC/EAN codes; use a list or comma, space or newline separated text. One product per unique found SKU.

## `query` (type: `string`):

Best Buy US keyword search. Choose exactly one of upcs, query or url.

## `url` (type: `string`):

Best Buy US search URL (/site/searchpage.jsp?st=...), preserving st, sp and qp. cp selects site pages 1-111 of 18 source rows each.

## `sort` (type: `string`):

Optional search sort; overrides the URL sort.

## `maxItems` (type: `integer`):

Total search products across cursor pages. Ignored for UPC lists.

## `includeVariants` (type: `boolean`):

Include sibling BSINs and their variant attributes; no extra product rows.

## `searchQuery` (type: `string`):

Alias of query; query takes precedence.

## `keyword` (type: `string`):

Alias of query; query and searchQuery take precedence.

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

Alias of maxItems; maxItems takes precedence when present.

## Actor input object example

```json
{
  "query": "laptop",
  "maxItems": 100,
  "includeVariants": true
}
```

# Actor output Schema

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

Found products only; missing codes are free.

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

Counts, unmatched codes and free-tier remaining.

# 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 = {
    "query": "laptop",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/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 = {
    "query": "laptop",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("s-r/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 '{
  "query": "laptop",
  "maxItems": 100
}' |
apify call s-r/bestbuy-scraper --silent --output-dataset

```

## MCP server setup

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