# Home Depot Scraper: Prices, Products, Stock & Special Buys (`moggedhq/home-depot-scraper`) Actor

Get Home Depot products with the price at your store, was price, Special Buy and savings, stock count at that store, aisle and bay, delivery options, model, internet number, brand, rating and reviews. By search, category or product link and ZIP. About $0.005 per product. No login.

- **URL**: https://apify.com/moggedhq/home-depot-scraper.md
- **Developed by:** [mogged](https://apify.com/moggedhq) (community)
- **Categories:** E-commerce, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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.
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 Scraper: Prices, Products, Stock & Special Buys

For retail price analysts, contractors, brands and comparison services monitoring Home Depot products at specific US stores. Get current store prices, was prices, Special Buys, promotion dates, shelf stock, aisle and bay, model numbers, store SKUs and UPCs in one dataset.

About **$0.005 per product at one store**: 20 products cost about **$0.10**, or 1,000 cost about **$5**, plus Apify's small start charge. No Home Depot login, account cookies or retailer API key is needed.

### What you get

| Data | What it means |
| --- | --- |
| Current price and regular price | The advertised price requested for the selected store, plus the source's original or was price when supplied |
| Special Buys and savings | Promotion wording, sale and clearance flags, dollar savings and percentage savings |
| Promotion dates | Start and end dates supplied by the product offer; the daily Special Buy list also carries its own dates |
| Stock at your store | Pickup inventory matched to the exact store number, including a shelf count when the source supplies one |
| Aisle and bay | Store SKU shelf location, such as aisle 14 and bay 014 |
| Identifiers | Internet item number, store SKU, manufacturer model, UPC and GTIN |
| Product information | Title, brand, rating, review count, category and product/image links |
| Fulfillment | Pickup and delivery options, with their original service and location data |
| Run summary | Products, resolved stores, deals, duplicate exclusions and free failures in the `SUMMARY` record |

### Start with a search or a known product list

1. Enter `searchTerms`, product or category links in `startUrls`, or internet numbers in `productIds`.
2. Enter US ZIP codes in `locations`, or exact store numbers in `storeIds`.
3. Choose the maximum number of products, start the run and export the dataset as JSON, CSV or Excel.

The prefilled input searches for hammers near ZIP 30339 and delivers up to 20 products. The measured cloud prefill delivered 20 unique products with 20 Product charges. You can also monitor an existing item list without repeating discovery.

#### Search near a ZIP code

```json
{
  "searchTerms": ["hammer", "cordless drill"],
  "locations": ["30339"],
  "maxItemsPerSearch": 20,
  "maxItems": 40
}
```

#### Monitor known internet item numbers

```json
{
  "productIds": ["317987598", "320326787"],
  "storeIds": ["0121"],
  "maxItems": 2
}
```

#### Compare the same item across stores

```json
{
  "productIds": ["317987598"],
  "locations": ["30339", "10001", "90012", "60607", "77002"],
  "maxItems": 5
}
```

One product at two stores is two rows; duplicates at the same store are free. Each ZIP selects the nearest store returned by Home Depot. ZIPs resolving to the same store are combined, with the requested ZIPs retained in `requestedLocations`. Explicit store IDs take precedence when both input fields are supplied. Store numbers are normalized to four digits: `121` becomes `0121`.

#### Read a category or Special Buy list

```json
{
  "startUrls": [
    "https://www.homedepot.com/b/Tools-Power-Tools/N-5yc1vZc298"
  ],
  "locations": ["30339"],
  "maxItemsPerSearch": 100,
  "maxItems": 100,
  "dealsOnly": true
}
```

Use `https://www.homedepot.com/SpecialBuy/SpecialBuyOfTheDay` to select the public daily Special Buy list. Normal category links contain `/N-` followed by the category and refinement code. Search links and full product links are also accepted.

Validation on 3 November 2026: 32 varied cloud inputs passed across five ZIPs. Large runs delivered 1,100 and 1,099 distinct products. Reboots and the one-product spending limit passed. Ten rows matched independent product-page identities and live selected-store price and stock data.

### Input reference

| Input | Purpose |
| --- | --- |
| `searchTerms` | Array of searches such as `hammer`, `kitchen faucet` or `garden hose` |
| `startUrls` | Optional public HTTPS Home Depot category, search, Special Buy or product links |
| `productIds` | Optional Home Depot internet item numbers; these are different from store SKUs and UPCs |
| `locations` | Array of five-digit US ZIP codes; a ZIP+4 is accepted and normalized |
| `storeIds` | Optional exact store numbers; these override ZIP selection |
| `maxItemsPerSearch` | Maximum new rows from each search, category or deals source at each store; default 20, maximum 1,000 |
| `maxItems` | Global product/store row limit across the whole run; default 20, maximum 10,000 |
| `dealsOnly` | Keep rows with a lower price, clearance, Special Buy or another advertised promotion |
| `includeDetails` | Add descriptions and specification groups when supplied; no extra product fee |
| `proxyConfiguration` | Optional proxy selection; the default uses datacenter first and US residential after refusal |

An empty location selection uses the public site's Cumberland reference store, `0121`. Supply ZIPs or store IDs whenever location matters to your analysis. Invalid source values become free note rows. Invalid or retired store numbers are rejected instead of silently accepting a fallback store's price.

### Output fields shared with the retail family

The core field names match the Safeway & Albertsons retail Actor. This makes daily price pipelines reusable across retailers. Filter `recordType` to `PRODUCT` for billable product observations; `NOTE` rows describe free exclusions or unavailable data.

| Field | Meaning |
| --- | --- |
| `verdict` | Readable product price and selected-store stock summary |
| `retailer`, `country`, `currency` | The Home Depot, US and USD |
| `storeId`, `storeName` | Verified selected store, with a name when supplied |
| `location` | Requested ZIP; null for an exact store ID or the default store |
| `productId`, `sku`, `gtin` | Internet number, store SKU and public GTIN or UPC |
| `title`, `brand`, `size` | Product identity; size remains null when a standard size is not supplied |
| `price`, `regularPrice` | Current advertised price and the original or was price |
| `onSale` | A lower price, clearance or advertised promotional offer |
| `promoText`, `promoType` | Retailer wording and promotion type |
| `promoStart`, `promoEnd` | Supplied promotion dates, normalized to ISO dates when possible |
| `memberPrice`, `memberProgram` | Null when no public anonymous member price is supplied |
| `unitPrice`, `unitOfMeasure` | Alternate unit price and unit, when supplied |
| `inStock`, `stockLevel` | Selected-store pickup availability and quantity; unknown remains null |
| `rating`, `reviewCount` | Public product rating and review total |
| `category` | Breadcrumb category path when supplied |
| `url`, `imageUrl` | Product page and primary image |
| `scrapedAt` | Timestamp of this live product observation |

Home Depot extras include `itemId`, `storeSku`, `modelNumber`, `upc`, `aisle`, `bay`, `aisleBayDescription`, `stockQuantity`, `pickupAvailable`, `deliveryAvailable`, `fulfillmentOptions`, `bulkPrice`, `isDeal`, `isClearance`, `isSpecialBuy`, `savingsAmount`, `savingsPercent` and the original `promotion` object. Daily Special Buy rows can also carry `specialBuyStart`, `specialBuyEnd` and `specialBuyText`.

`storeAddress`, `requestedLocations`, source fields and store-metadata observation fields support auditing. Only store metadata is cached for up to six hours. Product prices, promotions and inventory are requested again on every run.

#### Real product observation

A cloud observation on 3 November 2026 at Cumberland store `0121` returned the following RYOBI drill data. Prices, offers and stock can change after collection.

```json
{
  "recordType": "PRODUCT",
  "retailer": "The Home Depot",
  "country": "US",
  "currency": "USD",
  "storeId": "0121",
  "storeName": "Cumberland",
  "productId": "317987598",
  "sku": "1006703281",
  "gtin": "0033287200177",
  "title": "ONE+ 18V Cordless 1/2 in. Drill/Driver Kit with (1) Compact Battery and Charger",
  "brand": "RYOBI",
  "modelNumber": "PCL206K1",
  "upc": "033287200177",
  "price": 59,
  "regularPrice": 89,
  "promoType": "DISCOUNT",
  "promoStart": "2026-10-26",
  "promoEnd": "2027-01-31",
  "inStock": true,
  "stockQuantity": 84,
  "aisle": "11",
  "bay": "EC1"
}
```

### Monitor prices every day

Save a successful input as an Apify task, then create a schedule for that task. Use the same product IDs and store selection on subsequent runs to compare like with like. For broad catalog research, discover products through searches first, then save their `productId` values for a repeatable monitoring panel.

### Pricing and spending limits

| Delivered product/store rows | Approximate list-price charge |
| --- | --- |
| 1 | $0.005 |
| 20 | $0.10 |
| 100 | $0.50 |
| 1,000 | $5.00 |

The Product price is $0.005 on the free tier, $0.00475 on Bronze, $0.0045 on Silver and $0.004 on Gold and higher configured tiers. The platform start charge is $0.00005 per GB, minimum one start event. Product details do not add another product fee.

Failed requests, unavailable products, unavailable store prices, duplicates and note rows have no Product charge. The Actor checks the buyer's spending limit before fetching another deliverable batch and before saving a paid row. It stops cleanly when there is no room for the next product. Set `maxItems` and an Apify maximum charge together when you need a predictable ceiling.

### API and automation

Start a run with an Apify token stored in your environment:

```bash
curl --request POST \
  'https://api.apify.com/v2/acts/moggedhq~home-depot-scraper/runs' \
  --header "Authorization: Bearer $APIFY_TOKEN" \
  --header 'Content-Type: application/json' \
  --data '{"productIds":["317987598"],"storeIds":["0121"],"maxItems":1}'
```

Read the returned run's default dataset and the `SUMMARY` record in its default key-value store. The output links provide an overview, promotion columns, full product data and a `DEALS` JSON export containing only deal rows. Large deal exports are split into linked parts.

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("moggedhq/home-depot-scraper").call(run_input={
    "productIds": ["317987598", "320326787"],
    "storeIds": ["0121"],
    "maxItems": 2,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row.get("recordType") == "PRODUCT":
        print(row["storeId"], row["productId"], row["price"])
```

Use schedules, webhooks, Make, n8n, Zapier or a spreadsheet integration to process completed runs. Always inspect `SUMMARY.status`, `freeFailures`, `notes` and the resolved store list before treating a missing row as a stockout. A free failure indicates unavailable evidence, not a confirmed zero inventory count.

### Use with AI agents (MCP)

Connect an assistant to the [Apify MCP server](https://mcp.apify.com) and request `moggedhq/home-depot-scraper`. Provide searches or item numbers, ZIPs or store IDs, and a product limit. Ask the assistant to retain store IDs, original promotion wording and dates in its answer.

### Limits and interpretation

- US homedepot.com only. Canadian and Mexican sites have different catalogs and are not substituted.
- Home Depot limits normal listing pagination to about 744 products per search or category. Use narrower categories, several searches or known item lists for larger panels.
- A Special Buy or Buy One Get One badge does not necessarily reduce the single-item price. Keep the original offer wording and purchase conditions.
- Missing prices are excluded with a free note. Missing stock, member prices, dates or shelf locations remain null.
- Shelf counts use the selected store's pickup inventory. Delivery and warehouse inventory remain separate in fulfillment data.
- Optional descriptions and specifications may be unavailable even when a store price is readable.
- Promotions, availability and checkout prices can change. An observation is not a reservation or a guarantee of a checkout offer.
- Signed-out public access can be refused. The Actor retries with fresh sessions and reports exhausted requests without charging a Product fee.
- Reboots resume from saved rows and page progress. Duplicate product delivery and duplicate Product charging are prevented by durable recovery.

### FAQ

**Does it verify my store?**
Yes. ZIP lookup resolves a current store, and explicit store IDs are verified. Retired or invalid IDs are reported free. This matters because a product request with an invalid store can otherwise fall back to a different store's price.

**Why does a promotion have no end date?**
The retailer did not supply a date for that offer. Null means unknown. The Actor does not invent one from a badge or from another product's offer.

**Why is stock null when delivery is available?**
Delivery inventory and the selected store's shelf inventory are different. A delivery option does not establish how many units are on the selected shelf.

**Can the same input work with Safeway & Albertsons?**
The shared inputs and core product fields use the same names. Retailer-specific URLs, product IDs, stores and optional extras differ. Filter `recordType` to `PRODUCT` and use the common price and location fields in shared pipeline code.

This is an independent Home Depot price and inventory tool. It is not affiliated with or endorsed by the retailer.

# Actor input Schema

## `searchTerms` (type: `array`):

Home Depot searches, such as hammer, cordless drill or kitchen faucet. Retailer category redirects are followed.

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

Public HTTPS homedepot.com category, search, Special Buy or product links.

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

Home Depot internet item numbers, such as 317987598. These are not store SKU numbers or UPCs.

## `locations` (type: `array`):

US ZIP codes, such as 30339 or 10001. Uses the nearest store for each ZIP. Empty selects the site default Cumberland store 0121.

## `storeIds` (type: `array`):

Exact numeric Home Depot store numbers, such as 0121 or 6175. Store IDs take precedence over ZIP codes. Retired or invalid stores are rejected.

## `maxItemsPerSearch` (type: `integer`):

Maximum new product rows from each term, category or deals source at one store. Duplicates are free.

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

Maximum delivered product/store rows in the whole run. About $0.005 per product: 20 products cost about $0.10 plus the small start charge.

## `dealsOnly` (type: `boolean`):

Return products with a lower price, clearance, Special Buy or another public promotion. Promotion conditions remain in the output.

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

Include optional descriptions and specification groups. Store prices, stock, model, SKU, UPC, aisle and bay are always requested. No extra product fee.

## `proxyConfiguration` (type: `object`):

Default datacenter proxy with a kept anonymous HTTP session. US residential is used only after refused datacenter attempts. Custom proxy settings are respected.

## Actor input object example

```json
{
  "searchTerms": [
    "hammer"
  ],
  "locations": [
    "30339"
  ],
  "maxItemsPerSearch": 20,
  "maxItems": 20,
  "dealsOnly": false,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `dealsView` (type: `string`):

No description

## `dealsOnly` (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 = {
    "searchTerms": [
        "hammer"
    ],
    "locations": [
        "30339"
    ],
    "maxItemsPerSearch": 20,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("moggedhq/home-depot-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 = {
    "searchTerms": ["hammer"],
    "locations": ["30339"],
    "maxItemsPerSearch": 20,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("moggedhq/home-depot-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 '{
  "searchTerms": [
    "hammer"
  ],
  "locations": [
    "30339"
  ],
  "maxItemsPerSearch": 20,
  "maxItems": 20
}' |
apify call moggedhq/home-depot-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moggedhq/home-depot-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/tgeVA4n07QLWNefYL/builds/Sj6GXojBg4Nk32fcX/openapi.json
