# Home Depot Product Scraper — Prices, Ratings & Stock (`haketa/home-depot-product-scraper`) Actor

Home Depot product scraper and data API for keyword, category URL and item-ID collection. Export localized prices, promotions, ratings, images, model and UPC identifiers, specifications, pickup, delivery and store inventory. Built for retail monitoring and catalog enrichment—no login required.

- **URL**: https://apify.com/haketa/home-depot-product-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<h1 align="center">🏠 Home Depot Product Scraper</h1>

<p align="center">
  <strong>Prices, products, ratings, promotions and local stock — ready for analysis.</strong>
</p>

<p align="center">
  <img src="https://img.shields.io/badge/Home%20Depot-Product%20Data-F96302?style=for-the-badge" alt="Home Depot product data">
  <img src="https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-00A67E?style=for-the-badge" alt="JSON CSV Excel output">
  <img src="https://img.shields.io/badge/No%20Code-Ready-6C5CE7?style=for-the-badge" alt="No code required">
  <img src="https://img.shields.io/badge/US%20Stores-Localized-1976D2?style=for-the-badge" alt="US store localized">
</p>

Turn Home Depot searches, category pages, product URLs or item IDs into clean, structured product records. Use the results for price monitoring, retail intelligence, catalog enrichment, assortment research and local availability tracking.

> 💡 Choose a keyword, set the result limit and click **Start**. No Home Depot account or manual proxy setup is required.

### ⚡ At a glance

| | Capability | What you receive |
|---|---|---|
| 🔎 | Product discovery | Keyword, search URL and category URL collection |
| 💵 | Price intelligence | Current price, original price, savings and promotions |
| ⭐ | Market signals | Rating, review count and search position |
| 🏷️ | Product identity | Item ID, brand, model, SKU and UPC when available |
| 📍 | Local context | Store and ZIP-aware pickup, delivery and availability |
| 🧰 | Detail enrichment | Descriptions, highlights, images and specifications |
| 📦 | Ready-to-use exports | JSON, CSV, Excel, XML and RSS |

### 🚀 Quick start

1. Enter one or more product keywords.
2. Choose how many products you need.
3. Keep **Full product details** off for the fastest search export.
4. Click **Start** and download the dataset.

```json
{
  "keywords": ["cordless drill"],
  "maxResults": 24,
  "storeId": "0121",
  "zipCode": "30033",
  "sortBy": "TOP_SELLERS"
}
```

### 📊 What data can you extract?

The latest 120-product validation produced 120 unique records. Fields are omitted when Home Depot does not publish them for a specific product.

| Group | Fields | Latest test coverage |
|---|---|---:|
| 🆔 Identity | `itemId`, `productUrl`, `title` | 🟢 120/120 |
| 🏭 Brand | `brand`, `modelNumber`, `storeSkuNumber`, `upc` | 🟢 Brand 118/120 |
| 💰 Pricing | `price`, `originalPrice`, `savings`, `percentageOff` | 🟢 Price 117/120 |
| ⭐ Reputation | `rating`, `reviewCount` | 🟢 Rating 115/120 |
| 🖼️ Media | `imageUrl`, `imageUrls` | 🟢 120/120 |
| 🛒 Availability | `buyable`, `availabilityType`, `discontinued` | 🟡 Product-dependent |
| 🚚 Fulfillment | Pickup, shipping, delivery and inventory rows | 🟡 Store-dependent |
| 📝 Details | Description, highlights, categories and specifications | 🟡 Detail mode |
| 🔍 Search context | Query, position, store, ZIP and timestamp | 🟢 Search records |

### 🎯 Popular use cases

| | Use case | How the data helps |
|---|---|---|
| 📉 | Price monitoring | Track price drops, promotions and original-price changes by item ID |
| 🧭 | Competitor research | Compare brands, price bands, ratings and search visibility |
| 🏪 | Local stock checks | Monitor store-aware pickup and delivery availability |
| 📚 | Catalog enrichment | Add identifiers, images, descriptions and specifications to a product database |
| 🛍️ | Assortment analysis | Discover which products and brands appear across targeted searches |
| 📈 | Retail dashboards | Feed structured snapshots into Sheets, BI tools or a database |
| 🤖 | Automation and AI | Connect current product records to agents, workflows and monitoring systems |

### 🧩 Choose the right collection mode

| Mode | Best for | Speed and cost |
|---|---|---|
| ⚡ Search overview | Price, title, brand, rating, image and rank at scale | Fastest and most economical |
| 🔬 Full details | Specifications, descriptions, identifiers and fulfillment | Richer but slower |
| 🎯 Exact product | Monitoring known Home Depot item IDs or product URLs | Focused detail extraction |

> 💡 For large exports, begin with overview mode. Enable full details only when the additional product-page fields are essential.

### 📝 Input options

| Input | What it does | Default |
|---|---|---:|
| `keywords` | Searches one or more product phrases | `cordless drill` |
| `startUrls` | Accepts Home Depot search, category or product URLs | Empty |
| `productIds` | Looks up exact 9-digit Internet item IDs | Empty |
| `maxResults` | Caps unique products across the run | `24` |
| `maxResultsPerQuery` | Caps products collected per search | `24` |
| `storeId` | Selects the local store context | `0121` |
| `zipCode` | Selects the delivery ZIP context | `30033` |
| `sortBy` | Best match, top sellers, price or rating | `BEST_MATCH` |
| `priceMin` / `priceMax` | Keeps products within a USD range | Empty |
| `includeDetails` | Adds full product-page fields | `false` |
| `includeRawRecord` | Includes the original source object | `false` |

<details>
<summary><strong>🎯 Example: monitor exact products</strong></summary>

```json
{
  "keywords": [],
  "productIds": ["306283873", "301711642"],
  "maxResults": 2,
  "storeId": "6175",
  "zipCode": "10001",
  "includeDetails": true
}
```

</details>

<details>
<summary><strong>💲 Example: search a price range</strong></summary>

```json
{
  "keywords": ["patio furniture"],
  "priceMin": 100,
  "priceMax": 1000,
  "maxResults": 100
}
```

</details>

### 📤 Example result

```json
{
  "itemId": "306283873",
  "productUrl": "https://www.homedepot.com/p/.../306283873",
  "title": "20V MAX Cordless Drill/Driver Kit",
  "brand": "DEWALT",
  "modelNumber": "DCD771C2",
  "price": 99,
  "originalPrice": 179,
  "currency": "USD",
  "rating": 4.7,
  "reviewCount": 3521,
  "imageUrl": "https://images.thdstatic.com/productImages/..._1000.jpg",
  "query": "cordless drill",
  "searchPosition": 1,
  "storeId": "0121",
  "zipCode": "30033",
  "scrapedAt": "2026-08-02T16:00:00.000Z"
}
```

### 🔌 Built for your workflow

Use the Actor directly in Apify Console or connect it to:

- 📊 Google Sheets and Excel reporting
- 🔔 Scheduled price and availability alerts
- ⚙️ Make, Zapier and webhook automations
- 🗄️ PostgreSQL, BigQuery, Snowflake and cloud storage
- 🤖 AI agents and the Apify MCP server
- 💻 JavaScript, Python or HTTP API clients

<details>
<summary><strong>💻 JavaScript API example</strong></summary>

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('haketa/home-depot-product-scraper').call({
    keywords: ['cordless drill', 'impact driver'],
    maxResults: 100,
    storeId: '0121',
    zipCode: '30033',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

</details>

### ✅ Tips for better results

- Use focused keywords such as `cordless drill`, `ceiling fan` or `bathroom vanity`.
- Keep the same store ID and ZIP across scheduled runs for comparable snapshots.
- Use exact item IDs when monitoring a known product list.
- Combine several focused searches for broader catalog coverage.
- Leave raw records disabled unless you specifically need the full source payload.
- Start small, verify the desired fields, then increase the result limit.

<details>
<summary><strong>❓ FAQ and limitations</strong></summary>

#### Do I need a Home Depot account?

No. The Actor collects publicly visible product information without a Home Depot login.

#### Why is a price or stock field sometimes missing?

Availability and pricing can depend on the selected store, ZIP, delivery method and product status. Missing values are omitted rather than invented.

#### Can I collect specifications and descriptions?

Yes. Enable `includeDetails`, or provide exact product IDs or product URLs.

#### Can I scrape multiple keywords?

Yes. Results from all inputs are combined and deduplicated by Home Depot item ID.

#### Why can detail mode take longer?

Each product requires additional collection work. Overview mode is recommended when price, rating, image and search position are sufficient.

#### Which market is supported?

The built-in collection mode targets Home Depot US and accepts US store and ZIP context.

</details>

### 🆕 Changelog

#### 1.0.6 — August 2026

- Reduced high-bandwidth resource transfer while preserving product image URLs.
- Lowered the default memory allocation for more economical runs.
- Improved selection of complete search responses.
- Cloud validated 120 unique products in under five minutes.

#### 1.0 — Initial release

- Added keyword, URL and item-ID inputs.
- Added localized prices, promotions, ratings, images and availability.
- Added optional product-detail enrichment and export-ready schemas.

# Actor input Schema

## `keywords` (type: `array`):

One or more Home Depot product searches. Each keyword paginates independently and results are deduplicated by item ID.

## `startUrls` (type: `array`):

Optional Home Depot search (/s/), category (/b/), or product (/p/) URLs. Product URLs are automatically routed to detail extraction.

## `productIds` (type: `array`):

Optional 9-digit Home Depot Internet item IDs. Best for SKU monitoring and full product-detail extraction.

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

Hard cap across every keyword, URL and item ID in this run.

## `maxResultsPerQuery` (type: `integer`):

Built-in browser mode reliably returns Home Depot's first 24 rich results per search. SerpApi mode can paginate up to approximately 576. Combine focused inputs for larger exports.

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

Store used for localized pricing and pickup context. Default 0121 is Atlanta-Cumberland.

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

Five-digit US ZIP used for localized delivery context.

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

Order Home Depot search results before extraction.

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

Optional minimum current price. Products without a visible price are not removed.

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

Optional maximum current price. Products without a visible price are not removed.

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

Visit each result's product page to add descriptions, full images, specifications and richer fulfillment. Slower and more proxy-intensive; direct product IDs are always extracted in detail mode.

## `includeRawRecord` (type: `boolean`):

Attach the complete GraphQL or SerpApi source object. Keep disabled for smaller CSV/JSON exports.

## `dataSource` (type: `string`):

AUTO uses the built-in US residential browser and falls back to SerpApi only when a key is supplied. SERPAPI skips browser collection and requires serpApiKey.

## `serpApiKey` (type: `string`):

Optional private SerpApi key for deterministic API fallback or SERPAPI mode. Stored securely and never logged.

## `maxRetries` (type: `integer`):

Maximum US residential IP/profile rotations after Akamai block pages. The proven default is eight.

## `maxRuntimeSeconds` (type: `integer`):

Graceful time budget. Raise this for many keywords or full-detail enrichment.

## Actor input object example

```json
{
  "keywords": [
    "cordless drill"
  ],
  "productIds": [],
  "maxResults": 24,
  "maxResultsPerQuery": 24,
  "storeId": "0121",
  "zipCode": "30033",
  "sortBy": "BEST_MATCH",
  "includeDetails": false,
  "includeRawRecord": false,
  "dataSource": "AUTO",
  "maxRetries": 4,
  "maxRuntimeSeconds": 240
}
```

# Actor output Schema

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

No description

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

No description

# 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 = {
    "keywords": [
        "cordless drill"
    ],
    "maxResults": 24,
    "includeDetails": false,
    "includeRawRecord": false,
    "dataSource": "AUTO",
    "maxRetries": 4,
    "maxRuntimeSeconds": 240
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/home-depot-product-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 = {
    "keywords": ["cordless drill"],
    "maxResults": 24,
    "includeDetails": False,
    "includeRawRecord": False,
    "dataSource": "AUTO",
    "maxRetries": 4,
    "maxRuntimeSeconds": 240,
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/home-depot-product-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "cordless drill"
  ],
  "maxResults": 24,
  "includeDetails": false,
  "includeRawRecord": false,
  "dataSource": "AUTO",
  "maxRetries": 4,
  "maxRuntimeSeconds": 240
}' |
apify call haketa/home-depot-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=haketa/home-depot-product-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/yRjEQaqp4bafpfCDN/builds/OBbQhl9CSQ5eubeXq/openapi.json
