# Home Depot Search Results & Price Tracker (`dataspryva/home-depot-search-results-and-price-tracker`) Actor

Turn a Home Depot keyword search or search URL into structured product data: price, original price, brand, rating, reviews, and image, with sponsored-result and keyword filtering.

- **URL**: https://apify.com/dataspryva/home-depot-search-results-and-price-tracker.md
- **Developed by:** [Dataspryva](https://apify.com/dataspryva) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Home Depot Products, Prices & Store Stock

Scrape Home Depot products from a keyword search, a category page or a list of item IDs. Every row can include the store-local price, pickup and delivery availability, aisle and bay, full specifications, media, variants, and optional reviews and Q\&A.

### What this actor does

- **Three ways to start** — search by keyword, browse a whole category, or look up specific item IDs and product URLs.
- **Store-local pricing and stock** — pick a Home Depot store (or a ZIP to find the nearest one) and read that store's price and shelf pickup quantity.
- **Pickup and delivery kept separate** — shelf pickup quantity, ship-to-store availability, and online/delivery quantity are separate fields and are never mixed.
- **Full product detail** — description, highlights, specification groups, key features, dimensions, UPC/GTIN, all images, videos, 360/AR links, bundle contents and variant swatches.
- **Optional reviews and Q\&A** — add a capped set of customer reviews with rating breakdown, and customer questions with their answers.
- **Filters and pagination** — price, brand, rating, sale, clearance, stock, sponsored and title filters, plus multi-page collection with duplicate removal.
- **Empty fields are omitted** from each record instead of being returned as null or blank.

### Output per product

**Identity** — `recordType`, `itemId`, `parentId`, `url`, `title`, `brand`, `modelNumber`, `storeSku`, `productType`, `upc`, `gtin13`, `brandUrl`, `collection`, `scrapedAt`

**Pricing** — `price`, `originalPrice`, `currency`, `discountAmount`, `discountPercent`, `unitOfMeasure`, `unitPrice`, `bulkPrice`, `clearancePrice`, `isSpecialBuy`, `isClearance`, `onPromotion`, `promotionTag`, `savingsCenter`, `promotionStartsAt`, `promotionEndsAt`, `conditionalPromotions`

**Ratings and reviews** — `rating`, `reviewCount`, `ratingDistribution`, `recommendedCount`, `notRecommendedCount`, `reviews[]` with text, author, date, verified purchase, photos, responses, and source

**Media and content** — `imageUrl`, `images[]`, `videos[]`, `threeSixty`, `augmentedReality`, `description`, `highlights[]`, `specifications[]`, `keyFeatures[]`, `dimensions[]`, `isBundle`, `bundleItems[]`, `subscription`, `installation`, `prop65`, `protectionPlanSkus[]`

**Variants and taxonomy** — `hasVariants`, `variantCount`, `variants[]`, `categories[]`, `breadcrumbs[]`, `department`, `badges[]`, `isSponsored`

**Store and fulfillment** — `storeId`, `storeName`, `storeCity`, `storeState`, `storePostalCode`, `storePhone`, `pickupAvailable`, `storeQuantity`, `pickupInStock`, `pickupLimited`, `curbsidePickup`, `pickupMaxQuantity`, `shipToStoreAvailable`, `deliveryAvailable`, `deliveryQuantity`, `deliveryEta`, `deliveryCharge`, `freeShipping`, `backordered`, `backorderDate`, `pickupOptions[]`, `deliveryOptions[]`, `aisle`, `bay`, `aisleBay`, `quantityLimit`, `returnPolicy`, `isBuyable`, `discontinued`

**Questions** — `questions[]` with the question, author, date, answers and photos

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search`, `category`, or `products` |
| `searchQueries` | list | – | Keywords for search mode, one per line |
| `categoryUrls` | list | – | Category `/b/...` URLs or browse codes (`N-...`) |
| `itemIds` | list | – | Item IDs or `/p/...` product URLs |
| `storeId` | string | `121` | Store number for price and shelf stock |
| `zipCode` | string | – | Finds the nearest store when `storeId` is empty; also used for delivery estimates |
| `sortBy` | select | `relevance` | `relevance`, `top_sellers`, `price_low_to_high`, `price_high_to_low`, `top_rated`, `newest` |
| `priceMin` / `priceMax` | number | – | USD price bounds |
| `brand` | string | – | Case-insensitive brand filter |
| `minRating` | number | – | Drop products rated below this value (0–5) |
| `onlyOnSale` | boolean | `false` | Keep real discounts, promotions, special buys and clearance |
| `onlyClearance` | boolean | `false` | Keep clearance products only |
| `onlyInStock` | boolean | `false` | Keep products available for pickup or delivery |
| `includeSponsored` | boolean | `false` | Include paid placements |
| `filterKeywords` | string | – | Comma-separated title words to keep |
| `maxItems` | integer | `100` | Overall product cap (1–5000) |
| `maxItemsPerQuery` | integer | `100` | Cap per query or category |
| `maxPages` | integer | `30` | Pages per source (1–30; 24 products per page) |
| `includeDetails` | boolean | `true` | Add specs, description, UPC/GTIN, media and variants |
| `includeReviews` | boolean | `false` | Add reviews and rating breakdown |
| `maxReviewsPerProduct` | integer | `20` | Review cap per product |
| `reviewsSort` | select | `most_recent` | `most_recent`, `most_helpful`, `oldest`, `highest_rating`, `lowest_rating`, `photos_first` |
| `includeQuestions` | boolean | `false` | Add customer questions and answers |
| `maxQuestionsPerProduct` | integer | `10` | Question cap per product |
| `includeStoreAvailability` | boolean | `true` | Add pickup/delivery stock fields |
| `includeAisleBay` | boolean | `false` | Add aisle and bay for in-store SKUs |

Legacy inputs from earlier versions (`searchQuery`, `startUrls`) continue to work and are mapped automatically. No proxy setup or API key is needed.

### Examples

#### Search for drills under $300

```json
{
  "mode": "search",
  "searchQueries": ["cordless drill"],
  "storeId": "121",
  "priceMax": 300,
  "sortBy": "top_sellers",
  "maxItems": 50,
  "includeDetails": true,
  "includeStoreAvailability": true
}
```

#### Browse a category and keep only clearance

```json
{
  "mode": "category",
  "categoryUrls": ["https://www.homedepot.com/b/Tools-Power-Tools-Drills/N-5yc1vZc27f"],
  "storeId": "121",
  "onlyClearance": true,
  "maxItems": 200,
  "maxPages": 10
}
```

#### Look up specific item IDs with reviews and aisle locations

```json
{
  "mode": "products",
  "itemIds": ["320326787", "https://www.homedepot.com/p/Milwaukee-M18-FUEL-18V-Lithium-Ion-Brushless-Cordless-Hammer-Drill-and-Impact-Driver-Combo-Kit-2-Tool-with-2-Batteries-3697-22/320326787"],
  "storeId": "121",
  "includeDetails": true,
  "includeReviews": true,
  "maxReviewsPerProduct": 20,
  "includeStoreAvailability": true,
  "includeAisleBay": true
}
```

#### Find the nearest store from a ZIP

```json
{
  "mode": "search",
  "searchQueries": ["pressure washer"],
  "storeId": "",
  "zipCode": "30339",
  "includeStoreAvailability": true,
  "maxItems": 25
}
```

### Use cases

- **Price monitoring** — compare store-local prices and promotions over time.
- **Restock and pickup tracking** — watch shelf pickup quantities at one store.
- **Assortment and catalog research** — pull a whole category with specs, brands and variants.
- **Comparison shopping** — collect models, UPCs, ratings and media for a shortlist.
- **Voice-of-customer research** — sample reviews and Q\&A across competing products.

### FAQ

**Is this affiliated with Home Depot?**
No. This is an independent, third-party actor that reads publicly visible Home Depot product data. It is not operated by or affiliated with The Home Depot.

**Which store are the prices and stock from?**
They come from the `storeId` you enter (default 121, Cumberland, GA). If you leave `storeId` empty and supply `zipCode`, the nearest store is used. Change the store to see that store's price and shelf quantity.

**What is the difference between pickup and delivery stock?**
`storeQuantity` and `pickupInStock` are the shelf quantity available for pickup at the selected store. `deliveryQuantity`, `deliveryAvailable` and the delivery options describe the online/delivery pool. They are separate pools and are never added together.

**Why are some fields missing on a product?**
Home Depot does not expose every field for every product. Fields with no real value are omitted rather than filled with null, zero or a placeholder. Variants, specs, videos and aisle locations appear only when the product has them. Aisle and bay are added only for products with pickup stock at the selected store.

**How many products can one run return?**
`maxItems` is the overall cap and `maxItemsPerQuery` caps each query or category. Each page holds up to 24 products, and a category can be paged up to 30 times (720 products). For a larger category, narrow it by price or brand, or split it into smaller categories.

**Can I get every review for a product with thousands of reviews?**
No. Reviews are optional and capped by `maxReviewsPerProduct` (default 20). The actor reads review pages until it reaches that cap or the end of the review list. The total review count and rating breakdown still show the full picture, but only the requested number of review texts is saved.

**Do I need a proxy or an API key?**
No. Enter a store and the products you want; the actor handles access automatically.

**What happens if Home Depot refuses a request?**
The actor retries with a few fresh browser sessions. If every attempt is refused, the run ends with a status message naming the source and saves no placeholder rows; re-run later.

**Does this work for Home Depot Canada or Mexico?**
No. This actor covers the US storefront only. Canadian and Mexican stores are separate sites with different product IDs and stock.

**Why does the price differ from the first page I see on the website?**
The site personalises price and availability by store. Make sure the `storeId` in your input is the store you are comparing against.

# Actor input Schema

## `mode` (type: `string`):

Choose what to scrape: a keyword search, a category browse page, or specific Home Depot item IDs.

## `searchQueries` (type: `array`):

One keyword per line, for example 'cordless drill'. Used in search mode.

## `categoryUrls` (type: `array`):

Home Depot category URLs (/b/...) or browse codes (N-...). Used in category mode.

## `itemIds` (type: `array`):

Home Depot item IDs or product URLs (/p/...). Used in products mode.

## `storeId` (type: `string`):

Home Depot store number for store-local prices and pickup stock. 121 is Cumberland, GA.

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

Used to find the nearest store when Store ID is empty, and for delivery estimates.

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

How to order the products in each search or category.

## `priceMin` (type: `number`):

Only keep products at or above this price.

## `priceMax` (type: `number`):

Only keep products at or below this price.

## `brand` (type: `string`):

Keep only products whose brand contains this text, for example Milwaukee.

## `minRating` (type: `number`):

Drop products rated below this average, from 0 to 5.

## `onlyOnSale` (type: `boolean`):

Keep only products with a real discount, promotion, special buy or clearance.

## `onlyClearance` (type: `boolean`):

Keep only products with a clearance price.

## `onlyInStock` (type: `boolean`):

Keep only products available for pickup at the selected store or for delivery.

## `includeSponsored` (type: `boolean`):

Include paid product placements alongside organic results.

## `filterKeywords` (type: `string`):

Comma-separated words; keep only products whose title contains at least one, for example chainsaw,chain saw.

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

Overall maximum number of products to save.

## `maxItemsPerQuery` (type: `integer`):

Maximum products to save from each search query or category.

## `maxPages` (type: `integer`):

Maximum result pages to read for each search or category. Home Depot returns up to 24 products per page and 30 pages per browse.

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

Add description, specs, key features, UPC/GTIN, all images, videos and variants for every product.

## `includeReviews` (type: `boolean`):

Add customer reviews and the rating breakdown for every product.

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

Review cap for each product when reviews are enabled.

## `reviewsSort` (type: `string`):

How to order reviews when reviews are enabled.

## `includeQuestions` (type: `boolean`):

Add customer questions and their answers for every product.

## `maxQuestionsPerProduct` (type: `integer`):

Question cap for each product when questions are enabled.

## `includeStoreAvailability` (type: `boolean`):

Add store-local pickup quantity, pickup/delivery split and delivery details.

## `includeAisleBay` (type: `boolean`):

Add the aisle and bay where the product sits at the selected store.

## Actor input object example

```json
{
  "mode": "search",
  "searchQueries": [
    "drill"
  ],
  "storeId": "121",
  "sortBy": "relevance",
  "onlyOnSale": false,
  "onlyClearance": false,
  "onlyInStock": false,
  "includeSponsored": false,
  "maxItems": 3,
  "maxItemsPerQuery": 3,
  "maxPages": 30,
  "includeDetails": true,
  "includeReviews": false,
  "maxReviewsPerProduct": 20,
  "reviewsSort": "most_recent",
  "includeQuestions": false,
  "maxQuestionsPerProduct": 10,
  "includeStoreAvailability": true,
  "includeAisleBay": false
}
```

# Actor output Schema

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

Dataset containing all scraped Home Depot product records.

# 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 = {
    "mode": "search",
    "searchQueries": [
        "drill"
    ],
    "onlyOnSale": false,
    "onlyClearance": false,
    "onlyInStock": false,
    "includeSponsored": false,
    "maxItems": 3,
    "maxItemsPerQuery": 3,
    "includeDetails": false,
    "includeReviews": false,
    "includeQuestions": false,
    "includeStoreAvailability": false,
    "includeAisleBay": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspryva/home-depot-search-results-and-price-tracker").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 = {
    "mode": "search",
    "searchQueries": ["drill"],
    "onlyOnSale": False,
    "onlyClearance": False,
    "onlyInStock": False,
    "includeSponsored": False,
    "maxItems": 3,
    "maxItemsPerQuery": 3,
    "includeDetails": False,
    "includeReviews": False,
    "includeQuestions": False,
    "includeStoreAvailability": False,
    "includeAisleBay": False,
}

# Run the Actor and wait for it to finish
run = client.actor("dataspryva/home-depot-search-results-and-price-tracker").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 '{
  "mode": "search",
  "searchQueries": [
    "drill"
  ],
  "onlyOnSale": false,
  "onlyClearance": false,
  "onlyInStock": false,
  "includeSponsored": false,
  "maxItems": 3,
  "maxItemsPerQuery": 3,
  "includeDetails": false,
  "includeReviews": false,
  "includeQuestions": false,
  "includeStoreAvailability": false,
  "includeAisleBay": false
}' |
apify call dataspryva/home-depot-search-results-and-price-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataspryva/home-depot-search-results-and-price-tracker"
        }
    }
}
```

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/QFcedaopb4W0h72DA/builds/wuFfPsyQX2r5dL5kR/openapi.json
