{
  "openapi": "3.0.1",
  "info": {
    "title": "Best Buy Scraper — Prices, Stock, Reviews & Search Rank",
    "description": "Scrape Best Buy by SKU, URL, keyword or category page: price, savings, rating, stock, UPC, full specs, dimensions and description. Keywords return the ranked grid with sponsored tiles flagged. Optional ZIP-level availability, customer reviews and brand / open-box filters.",
    "version": "0.0",
    "x-build-id": "MCdQhpvDBz5Sc9Hxw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~bestbuy-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-bestbuy-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/memo23~bestbuy-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-bestbuy-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/memo23~bestbuy-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-bestbuy-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "startUrls": {
            "title": "Product, search or category URLs",
            "type": "array",
            "description": "Any Best Buy URL. <b>Product pages</b> — <code>bestbuy.com/site/…/6505729.p</code>, <code>bestbuy.com/site/-/6505729.p</code>, <code>bestbuy.com/product/…/sku/6505729</code> — give one row per product. <b>Search pages</b> (<code>searchpage.jsp?st=…</code>) and <b>category pages</b> (<code>…/abcat0101001.c?id=abcat0101001</code>) are walked page by page for their ranked result grid; a <code>cp=</code> page number in a pasted URL is ignored, the walk starts at page 1. Bare SKUs go in the <b>SKUs</b> field below.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "skus": {
            "title": "SKUs",
            "type": "array",
            "description": "Best Buy SKU numbers, one per line (<code>6505729</code>). Same row as a product URL. Handy for price monitoring on a fixed list.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Each keyword becomes a Best Buy search, walked page by page in rank order. With <b>Best Buy API key</b> set below, the keyword goes through the official Products API instead, which returns the full official result list.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max products",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on product rows across all inputs. Controls billing. Reviews are counted separately — see the Reviews section.",
            "default": 100
          },
          "includeDetails": {
            "title": "Return every product on each results page",
            "type": "boolean",
            "description": "Best Buy sends only the first few tiles of a results page filled in. On: the rest are looked up too, four per request, so you get the whole ranked grid. Off: only the pre-filled tiles, one request per page (a cheap preview).",
            "default": true
          },
          "minPrice": {
            "title": "Min price",
            "minimum": 0,
            "type": "integer",
            "description": "Lower price bound in USD. With both bounds set, searches send Best Buy's own price facet so the site narrows results server-side; otherwise the bound is applied to rows after the fetch."
          },
          "maxPrice": {
            "title": "Max price",
            "minimum": 0,
            "type": "integer",
            "description": "Upper price bound in USD."
          },
          "brands": {
            "title": "Brands",
            "type": "array",
            "description": "Brand names exactly as Best Buy labels them — <code>HP</code>, <code>Samsung</code>, <code>Insignia™</code>. Several brands are combined (products from any of them). Sent as Best Buy's <code>brand_facet</code>; a label Best Buy does not use simply matches nothing, and the run log says so.",
            "items": {
              "type": "string"
            }
          },
          "minRating": {
            "title": "Min rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only products whose average customer rating is at least this. Applied to the rows: Best Buy's own rating facet has no numeric threshold, only the <b>Top-Rated only</b> switch below."
          },
          "topRatedOnly": {
            "title": "Top-Rated only",
            "type": "boolean",
            "description": "Best Buy's own \"Top-Rated\" filter on searches and category pages. It is the site's quality cut, which Best Buy does not define as a number — on one test it took a 7,230-result search down to 395. Narrows server-side, so it is the cheap way to skim the good stuff. Website filter only: it has no effect on a run that sets a Best Buy API key.",
            "default": false
          },
          "openBoxOnly": {
            "title": "Open-Box only",
            "type": "boolean",
            "description": "Best Buy's <code>Condition~Open-Box</code> facet: open-box listings only. Applies to searches and category pages, not to pasted SKUs or product URLs. Best Buy drops the sort order while this is on, and its own open-box counts move around during the day. Website filter only: it has no effect on a run that sets a Best Buy API key.",
            "default": false
          },
          "soldByBestBuyOnly": {
            "title": "Sold by Best Buy only",
            "type": "boolean",
            "description": "Drop marketplace sellers and keep only what Best Buy sells and ships itself — its own \"Sold &amp; shipped by Best Buy\" filter, which took a 7,230-result laptop search down to 1,112. Every row also carries <code>sellerType</code> (<code>1P</code> Best Buy, <code>3P</code> marketplace) and <code>soldByBestBuy</code>, so you can see the split without filtering. Website filter only: it has no effect on a run that sets a Best Buy API key, which does not expose the seller split.",
            "default": false
          },
          "onSaleOnly": {
            "title": "On sale only",
            "type": "boolean",
            "description": "Keep only products whose current price is below the regular price.",
            "default": false
          },
          "skipOutOfStock": {
            "title": "Skip out-of-stock",
            "type": "boolean",
            "description": "Drop products Best Buy marks sold out or not available online.",
            "default": false
          },
          "sortBy": {
            "title": "Sort results by",
            "enum": [
              "Best-Match",
              "Best-Selling",
              "Best-Discount",
              "Price-Low-To-High",
              "Price-High-To-Low",
              "Customer-Rating",
              "New-Arrivals"
            ],
            "type": "string",
            "description": "Order of the result pages, using Best Buy's own sort options. Changes which products land in your item budget — \"Best discount\" first is the usual choice for deal hunting. A pasted URL that already carries a sort keeps its own. Best Buy ignores the sort when <b>Open-Box only</b> is on; the run log reports the order it actually used.",
            "default": "Best-Match"
          },
          "zipCode": {
            "title": "ZIP code",
            "type": "string",
            "description": "A US ZIP code, e.g. <code>10001</code>. Every product then also carries Best Buy's add-to-cart state <i>for that ZIP</i> in <code>zipButtonState</code> / <code>inStockAtZip</code> — which genuinely differs by region: one laptop came back <code>ADD_TO_CART</code> for 10001 and Miami and <code>SOLD_OUT</code> for Anchorage in the same minute. Costs one small JSON request per 20 products, no extra dataset rows."
          },
          "includeReviews": {
            "title": "Also scrape customer reviews",
            "type": "boolean",
            "description": "Write each product's customer reviews, one row each, to the run's separate <b>Reviews</b> dataset (<code>type: \"review\"</code>): rating, title, full text, author, verified-purchase badge, helpful votes, submission date, pros and cons. <b>Each review is billed</b> at the same price as a product row — so 50 products at the default 3 reviews each is 150 extra rows on top of the 50 products. Raise <b>Max reviews per product</b> deliberately.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Reviews per product. Best Buy serves 20 per page, so a value above 20 means more requests per product. Each review is billed, so this is the dial that decides what turning reviews on costs.",
            "default": 3
          },
          "reviewSort": {
            "title": "Review order",
            "enum": [
              "MOST_RECENT",
              "MOST_HELPFUL"
            ],
            "type": "string",
            "description": "Best Buy honours these two orders only; the rating-based orders it advertises elsewhere silently return its default order.",
            "default": "MOST_RECENT"
          },
          "bestbuyApiKey": {
            "title": "Best Buy API key (optional)",
            "type": "string",
            "description": "Your own key from <a href='https://developer.bestbuy.com/' target='_blank' rel='noopener'>developer.bestbuy.com</a>. When set, every lookup and keyword search goes through the official Best Buy Products API, official JSON, no proxy, no bot wall. Specifications, UPC and description come back without a key too. The key and the API's terms of use are yours; this actor only makes the calls you are entitled to make. Leave empty to scrape the website."
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Lookups run in parallel through the residential proxy. 4 is a good default; more does not help much, bandwidth is the cost, not CPU.",
            "default": 4
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Best Buy rejects datacenter IPs at the TLS layer, so a <b>residential US</b> exit is required and is used automatically. Set this only to point at your own residential pool (proxy URLs). The API path ignores it, except for ZIP availability and reviews.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}