---
title: "Best Buy scraper"
description: "Scrape Best Buy product pages as JSON: price, SKU, model number, specs, rating, review summary and Q&A. One API request from Python, Node.js, the CLI or MCP."
canonical: https://www.zenrows.com/scrape/best-buy
updated: 2026-10-20
---

# Best Buy scraper

The Zenrows Best Buy scraper turns Best Buy product pages into structured JSON: name, brand, SKU, BSIN, model number, price, installment plan, specifications, rating, review count, the AI review summary, questions and answers, and breadcrumbs. Fetch in Adaptive Stealth Mode opens the page and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: bestbuy.com
- Returns: Prices, SKUs, model numbers, specs, ratings and Q&A

## Run it: one Best Buy product in, JSON out

```json Input
{
  "url": "https://www.bestbuy.com/site/apple-airpods-pro-2/6447382.p?skuId=6447382",
  "mode": "auto",
  "extract": "auto",
  "proxy_country": "us"
}
```

```json Output
{
  "product": {
    "name": "Apple - AirPods Pro 2, Wireless Active Noise Cancelling Earbuds with Hearing Aid Feature - White",
    "brand": "Apple",
    "sku_id": "12558974",
    "bsin": "JJGCQ88C8X",
    "model_number": "MTJV3LL/A/MTJV3AM/A",
    "canonical_url": "https://www.bestbuy.com/product/apple-airpods-pro-2-wireless-active-noise-cancelling-earbuds-with-hearing-aid-feature-white/JJGCQ88C8X"
  },
  "pricing": {
    "current_price": 274.99,
    "installment_count": 8,
    "installment_payment_amount": 30.62
  },
  "ratings_summary": { "average_rating": 4.8, "review_count": 32487 },
  "specifications": [
    { "name": "Noise Cancelling (Active)", "value": "Yes" },
    { "name": "Wireless Connectivity", "value": "Bluetooth" }
  ],
  "questions_and_answers": [
    { "question": "What is the battery life of these earbuds?", "answer": "These earbuds have a battery life of 6 hours." }
  ]
}
```

Request and output of a live call to a Best Buy product page from the US on Oct 20, 2026, trimmed for length. A field is returned when the page shows it.

## What data can you scrape from Best Buy?

A Best Buy product page carries the price, the identifiers that tie it to the manufacturer's catalog, the spec sheet and what customers say. Extract returns them in named groups. These are the fields electronics and pricing teams read most.

| Field | What it holds | Example |
|---|---|---|
| `product.name` | Full product title, brand first | `Apple - AirPods Pro 2, Wireless Active Noise Cancelling Earbuds…` |
| `product.brand` | Brand | `Apple` |
| `product.sku_id` | Best Buy's SKU for the item | `12558974` |
| `product.bsin` | Best Buy's product ID used in the newer `/product/` URLs | `JJGCQ88C8X` |
| `product.model_number` | Manufacturer model numbers, the key to match other retailers | `MTJV3LL/A/MTJV3AM/A` |
| `product.canonical_url` | The product's canonical URL | `https://www.bestbuy.com/product/…/JJGCQ88C8X` |
| `product.primary_image_url` | Main product image | `https://pisces.bbystatic.com/image2/BestBuy_US/images/products/6447/6447382_sd.jpg…` |
| `pricing.current_price` | The price on the page today | `274.99` |
| `pricing.installment_count` | Number of monthly payments in the plan shown | `8` |
| `pricing.installment_payment_amount` | Amount of each payment | `30.62` |
| `ratings_summary.average_rating` | Star rating out of 5 | `4.8` |
| `ratings_summary.review_count` | Number of reviews | `32487` |
| `ai_review_summary.summary_text` | Best Buy's summary of what reviewers say | `Customers highly value the exceptional sound quality…` |
| `questions_and_answers[]` | Customer questions with their answers | `{ "question": "Do these earbuds have a warranty?", … }` |
| `specifications[]` | Spec sheet as name and value pairs | `{ "name": "True Wireless", "value": "Yes" }` |
| `breadcrumbs[]` | Category path with names and URLs | `Headphones > Earbud & In-Ear Headphones` |
| `color_variants[]` | Other colors of the same model, when sold | `[]` |

## How to scrape Best Buy with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Copy the product URL.** The sample uses an older `/site/…/SKU.p?skuId=SKU` link. Best Buy now gives each product a canonical `/product/…/BSIN` URL, and the response returns it.
3. **Send it from the US** with the default configuration: Adaptive Stealth Mode to open the page and Extract to return the fields. Best Buy's US store shows prices to US shoppers.
4. **Read `parsed`** and keep the IDs it returns. The SKU and BSIN in the response are the stable keys for your records.
5. **Run your product list in Batch** once one URL returns what you need.

```python Python
# pip install requests
import json
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://www.bestbuy.com/site/apple-airpods-pro-2/6447382.p?skuId=6447382",
    "mode": "auto",          # Adaptive Stealth Mode
    "extract": "auto",       # structured JSON
    "proxy_country": "us",   # Best Buy US prices
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

data = response.json()["parsed"]
specs = {s["name"]: s["value"] for s in data.get("specifications", [])}
print(data["product"]["model_number"], data["pricing"]["current_price"], specs.get("Water Resistant"))
print(json.dumps(data, indent=2))
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://www.bestbuy.com/site/apple-airpods-pro-2/6447382.p?skuId=6447382",
  mode: "auto",
  extract: "auto",
  proxy_country: "us",
});

const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
  signal: AbortSignal.timeout(180_000),
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);

const { parsed } = await response.json();
console.log(parsed.product.sku_id, parsed.product.bsin, parsed.pricing.current_price);
console.log(parsed.questions_and_answers.map((qa) => qa.question));
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.bestbuy.com%2Fsite%2Fapple-airpods-pro-2%2F6447382.p%3FskuId%3D6447382&mode=auto&extract=auto&proxy_country=us"

# Only the fields you need
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.bestbuy.com%2Fsite%2Fapple-airpods-pro-2%2F6447382.p%3FskuId%3D6447382&mode=auto&extract=auto&proxy_country=us&extract_fields=product.sku_id%2Cproduct.model_number%2Cpricing.current_price%2Cratings_summary"
```

```python Python SDK
# pip install zenrows
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
response = client.get(
    "https://www.bestbuy.com/site/apple-airpods-pro-2/6447382.p?skuId=6447382",
    params={"mode": "auto", "extract": "auto", "proxy_country": "us"},
)
parsed = response.json()["parsed"]
for qa in parsed.get("questions_and_answers", []):
    print("Q:", qa["question"], "\nA:", qa["answer"])
```

## Input

The scraper takes one Best Buy URL per request with the options below. A Batch job applies the same settings to every task, so a product list is a set of URLs and one configuration.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | A Best Buy product page, such as `/site/…/SKU.p?skuId=SKU` or its canonical `/product/…/BSIN` URL |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when the page needs them |
| `extract` | string | `auto` | Returns the page's fields as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Comma-separated paths to keep, such as `product.sku_id,pricing.current_price` |
| `proxy_country` | string | any | Two-letter country code. Use `us` for bestbuy.com prices and offers |
| `wait_for` | string | none | A CSS selector to wait for before the page is read. |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto",
    "proxy_country": "us"
  },
  "tasks": [
    { "url": "https://www.bestbuy.com/site/apple-airpods-pro-2/6447382.p?skuId=6447382", "external_id": "airpods-pro-2" },
    { "url": "https://www.bestbuy.com/site/headphones/earbud-in-ear-headphones/pcmcat143000050007.c?id=pcmcat143000050007", "external_id": "earbuds-category" }
  ]
}
```

## Output

Every response is JSON with two keys: `html`, the page as Best Buy served it, and `parsed`, the structured record. The sample below is the trimmed output of a live request to a product page.

```json Product page
{
  "product": {
    "brand": "Apple",
    "bsin": "JJGCQ88C8X",
    "canonical_url": "https://www.bestbuy.com/product/apple-airpods-pro-2-wireless-active-noise-cancelling-earbuds-with-hearing-aid-feature-white/JJGCQ88C8X",
    "color": null,
    "model_number": "MTJV3LL/A/MTJV3AM/A",
    "name": "Apple - AirPods Pro 2, Wireless Active Noise Cancelling Earbuds with Hearing Aid Feature - White",
    "primary_image_url": "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/6447/6447382_sd.jpg;maxHeight=1920;maxWidth=900?format=webp",
    "seller": null,
    "sku_id": "12558974"
  },
  "pricing": { "current_price": 274.99, "installment_count": 8, "installment_payment_amount": 30.62 },
  "ratings_summary": { "average_rating": 4.8, "review_count": 32487 },
  "ai_review_summary": {
    "summary_text": "Customers highly value the exceptional sound quality and overall comfort of these headphones, which are frequently praised for their secure fit and impressive battery life… some users have expressed minor concerns regarding the pricing and the functionality of the volume controls."
  },
  "questions_and_answers": [
    { "question": "Do these earbuds have a warranty?", "answer": "Yes, these earbuds have a 1-year limited warranty for both parts and labor." },
    { "question": "How long does it take to charge these earbuds?", "answer": "A 5-minute charge provides 1 hour of playtime." }
  ],
  "specifications": [
    { "name": "Noise Cancelling (Active)", "value": "Yes" },
    { "name": "Sound Mode", "value": "Stereo" },
    { "name": "Connection Type", "value": "Wireless" },
    { "name": "True Wireless", "value": "Yes" },
    { "name": "Water Resistant", "value": "Yes" }
  ],
  "breadcrumbs": [
    { "name": "Best Buy", "position": 1, "url": "https://www.bestbuy.com/" },
    { "name": "Headphones", "position": 2, "url": "https://www.bestbuy.com/site/electronics/headphones/abcat0204000.c?id=abcat0204000" },
    { "name": "Earbud & In-Ear Headphones", "position": 3, "url": "https://www.bestbuy.com/site/headphones/earbud-in-ear-headphones/pcmcat143000050007.c?id=pcmcat143000050007" }
  ],
  "color_variants": [],
  "media_videos": [
    { "name": null, "thumbnail_url": "https://pisces.bbystatic.com/prescaled/180/320/image2/BestBuy_US/images/videos/1944698453.jpg;maxHeight=128;maxWidth=56?format=webp", "content_url": null }
  ]
}
```

| Group | What it gives you |
|---|---|
| `product` | Identity: name, brand, SKU, BSIN, model number, image and canonical URL |
| `pricing` | The price and the installment plan shown with it |
| `ratings_summary`, `ai_review_summary` | The rating, the review count and Best Buy's written summary of the reviews |
| `questions_and_answers` | Customer questions with the answers shown on the page |
| `specifications` | The spec sheet as name and value pairs |
| `breadcrumbs` | The category path, with URLs you can crawl |

Load `parsed` into pandas with `pd.json_normalize(...)` for a spreadsheet, or ask for Markdown when an LLM will read the page.

## Scrape Best Buy from your coding agent

Claude Code, Cursor, Codex and any MCP client can scrape Best Buy from a prompt.

The agent runs the same Fetch and Extract request as the code above and reads the JSON it returns. Connect the Zenrows MCP server once, or install the CLI and let the agent run it in the terminal.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://www.bestbuy.com/site/apple-airpods-pro-2/6447382.p?skuId=6447382" --proxy-country us
```

```text Then ask your agent
Use Zenrows to open this Best Buy product from the US and give me the price,
the installment plan, the model number, the rating and review count, and
every question and answer on the page:
https://www.bestbuy.com/site/apple-airpods-pro-2/6447382.p?skuId=6447382
```

## Scrape Best Buy at scale with Batch and Crawl

**Batch** runs a list of Best Buy product URLs as one job, with your own ID on each result. Use the SKU or your internal product code as the `external_id` and run it daily to follow prices and ratings across an electronics catalog.

**Crawl** collects the product URLs in a category. Start it on a category page, such as one from the `breadcrumbs` of a product you already scraped, keep links in either product URL format, and it returns every product page it reaches. Send that list to Batch.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto", "proxy_country": "us" },
    "tasks": [
      { "url": "https://www.bestbuy.com/site/apple-airpods-pro-2/6447382.p?skuId=6447382", "external_id": "airpods-pro-2" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# products.jsonl: one {"url": "...", "external_id": "...", "extract": "auto"} per line
zenrows batch create products.jsonl --proxy-country us --wait
zenrows batch results <job-id> --out bestbuy-products.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.bestbuy.com/site/headphones/earbud-in-ear-headphones/pcmcat143000050007.c?id=pcmcat143000050007",
    "depth": 2,
    "max_pages": 200,
    "include_patterns": ["/product/", ".p?skuId="]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto",
        "proxy_country": "us"
      },
      "tasks": [
        {
          "url": "https://www.bestbuy.com/site/apple-airpods-pro-2/6447382.p?skuId=6447382",
          "external_id": "best-buy"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with Best Buy data

| Use case | Data they pull | Who runs it |
|---|---|---|
| Electronics price monitoring | Current price and installment plan per SKU, daily | Retail pricing teams and consumer electronics brands |
| Cross-retailer matching | Model number, brand and name to join Best Buy with Amazon and Walmart | Price comparison sites and analysts |
| Spec and content audits | Spec sheet, images and title against the brand's own product data | Brand, channel and ecommerce content teams |
| Customer question mining | Questions and answers per product | Product marketing and support teams |
| Rating and review tracking | Average rating, review count and the AI review summary over time | Product and market research teams |
| Assortment research | Category paths and the products listed in each | Category managers and investors |

## Tips for scraping Best Buy

- **Store the IDs from the response, not from the URL.** The sample URL used SKU 6447382, and the response returned `sku_id` 12558974, BSIN `JJGCQ88C8X` and a canonical URL in the newer `/product/` format. Keep all three.
- **Match other retailers on model number.** `product.model_number` can hold several codes joined by a slash, such as `MTJV3LL/A/MTJV3AM/A`. Split it before you join on it.
- **Turn the spec sheet into columns.** `specifications[]` is a list of name and value pairs, so one dictionary per product gives you a clean table for filtering by feature.
- **Request from the US.** bestbuy.com shows US prices and offers. bestbuy.ca is a separate store with its own prices and IDs.
- **Use the breadcrumbs to find the category.** `breadcrumbs[]` holds the category URLs above each product, which are the right starting points for a Crawl.
- **Read the price with its plan.** `pricing.installment_count` and `pricing.installment_payment_amount` describe the monthly plan shown next to the price, so do not mistake the monthly amount for the price.

## Frequently asked questions

### Is it legal to scrape Best Buy?

Collecting publicly available data from Best Buy, such as prices, specs, ratings and product details shown to every visitor, is common practice for price monitoring and market research. Questions, answers and reviews can include personal data, which is protected by laws such as the GDPR and the CCPA, so collect only what you have a legitimate reason to use. Check Best Buy's terms for your use case and ask your lawyer if you are unsure.

### Is there an official Best Buy API?

Yes. Best Buy runs a developer API at developer.bestbuy.com with product, store and category endpoints, which needs an API key that Best Buy issues. It returns catalog data in Best Buy's own format. Teams use a scraper when they need the product page as shoppers see it, including the review summary and the questions and answers, or when they do not have an approved key.

### What Best Buy pages can I scrape?

Product pages, the richest page type on the site. The sample above uses a /site/…SKU.p?skuId=SKU link, and the response gives the canonical /product/…/BSIN URL. Category and search pages list products with links to their pages, which you can collect with Crawl and then scrape with Batch.

### Can I scrape Best Buy prices?

Yes. Each product page returns the current price and the installment plan shown with it. Run your SKUs in Batch every day to build a price history.

### Can I scrape Best Buy specs and Q&A?

Yes. specifications[] returns the spec sheet as name and value pairs, and questions_and_answers[] returns the customer questions with their answers.

### How do I scrape Best Buy with Python?

Send a GET request to https://api.zenrows.com/v1/ with your API key, the product URL, Adaptive Stealth Mode and Extract turned on, and the US as the country, as in the Python example. response.json()["parsed"] holds the product as a Python dictionary.

### How many Best Buy products can I scrape?

Send one URL per request, or a whole list as a Batch job that runs the URLs in parallel and keeps your own ID on each result. One Batch job accepts more than 10,000 URLs, sent inline or as a CSV file.

### Can AI agents scrape Best Buy with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the products you want in plain language and the agent calls Fetch and Extract for you.

### Can I scrape Best Buy on a schedule?

Yes. Create a scheduled Batch job with your Best Buy URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the Best Buy scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. Send results to Google Sheets, a database or a data warehouse from the workflow tool you already use. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with the structured record in parsed and the original page in html . You can also ask for the page as Markdown or plain text for LLM pipelines.

### Can I compare Best Buy with Amazon and Walmart?

Yes. Scrape each retailer with the same request format and join on brand and model number. The Amazon price scraper and the Walmart scraper return the matching prices.

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
