Home Depot Product Scraper
Pricing
from $0.75 / 1,000 results
Home Depot Product Scraper
Reads Home Depot product data by item ID or product URL: numeric price, was-price, brand, model number, unrounded star rating, review count and a derived availability status. Pass a store number and both the price and the stock come back for that store instead of the national default.
Pricing
from $0.75 / 1,000 results
Rating
0.0
(0)
Developer
String
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
4
Monthly active users
20 days ago
Last modified
Categories
Share
What does Home Depot Product Scraper do?
It collects Home Depot product data by item ID or product URL and returns one row per item: a
numeric price, a wasPrice when the item is genuinely below its list price, brand,
modelNumber, an unrounded rating, reviewCount, a derived availability status and the primary
image. Set the optional storeId and the price and stock come back for that store instead of
the national default.
Home Depot's storefront is a client-rendered shell: the product page HTML carries no price and no
inventory to parse, only the JavaScript that fetches them. So this Actor calls the same
federation-gateway GraphQL endpoint the site itself calls, asking for exactly the fields in the
table below. One item costs a response of a few kilobytes rather than a full page render, and the
numbers arrive as numbers.
- One row per item, up to 300 items per run.
storeIdresolves both price and stock against a single store, which is the difference between "this item exists" and "this item is on the shelf at store 0121 today".- Bare item IDs and full
homedepot.com/p/…URLs both work and collapse to one fetch per item. - Ratings are not rounded:
4.8235stays4.8235. - No account, API key or cookies, at a median of about 3.5 seconds per item in our own measurements.
What data does it extract?
| Field | Type | Description |
|---|---|---|
itemId | string | Home Depot's item ID as the gateway returns it. Stable, and the right key to join on |
title | string | The product label, with HTML entities decoded |
brand | string | Manufacturer name |
modelNumber | string | The manufacturer's model number, which is how the same product is matched across retailers |
price | number | 249, not "$249.00". Resolved for storeId when you set one |
priceText | string | The same amount formatted as US currency, e.g. $249.00 |
wasPrice | number | The list price, reported only while it genuinely exceeds price |
currency | string | USD |
rating | number | Average stars out of 5, unrounded — 4.8235, not 5 |
reviewCount | number | Total number of reviews |
availability | string | One of IN_STOCK, LIMITED_STOCK, OUT_OF_STOCK, BACKORDERED, AVAILABLE, UNAVAILABLE, DISCONTINUED |
imageUrl | string | The primary image at the largest size Home Depot offers for it |
sourceUrl | string | Home Depot's canonical product URL |
collectedAt | string | ISO timestamp stamped once per run |
Reading availability correctly
The status is derived from the gateway's answer in a fixed order, and one value needs explaining:
| Value | What it means |
|---|---|
DISCONTINUED | Home Depot marks the item discontinued |
UNAVAILABLE | The item is not buyable |
BACKORDERED | Buyable, but the fulfilment record says backordered |
IN_STOCK | A location actually reported stock |
LIMITED_STOCK | A location reported limited quantity |
OUT_OF_STOCK | Locations were reported and none of them had it |
AVAILABLE | Buyable, but no location inventory was reported at all |
AVAILABLE is not a stock check. It is what an online-only item returns, and what any item
returns on a run with no storeId, because without a store there are no locations to resolve. It
says the item is buyable and nothing more. IN_STOCK and LIMITED_STOCK are only ever reported
when a location said so, which is why the two are kept apart instead of collapsed into a boolean.
Geography: what storeId changes
storeId is the geographic control, and it is a Home Depot store number rather than a ZIP code —
the same number printed on your receipt and shown in the site's store picker. It is passed to the
gateway on both the pricing and the fulfilment fields, so setting it changes two things:
pricebecomes that store's local price. Home Depot prices regionally, and lumber, appliances and seasonal goods are where the gap shows up most.availabilitybecomes a real answer:IN_STOCK,LIMITED_STOCKorOUT_OF_STOCKresolved against that store's inventory, rather than theAVAILABLEplaceholder.
Leave it unset and you get the national online price with no inventory resolution. Currency is
USD on every row either way; homedepot.com is the US storefront and there is no country input.
To compare stores, run the same item list once per store number. Every row carries the price and
availability for the store the run used, so the datasets line up on itemId.
Why scrape Home Depot?
- Regional price mapping. The same SKU across a set of store numbers shows how much Home Depot's pricing actually varies by market, which national-price data hides completely.
- Pre-purchase stock checks. Contractors and resellers care whether an item is on a specific
shelf today, and that is exactly what
storeIdplusavailabilityanswers. - Competitive pricing.
modelNumberis the join key that matches a Home Depot SKU to the same manufacturer part on other retailers, which makes a like-for-like comparison possible. - Markdown detection.
wasPriceonly appears when the item is genuinely below list, so it is a signal rather than a field you have to second-guess. - Catalogue enrichment. Brand, model number, unrounded rating and review count for a list of SKUs you already track.
How to use it
- Open the Actor and click Try for free.
- Put Home Depot item IDs or full product URLs into SKUs or URLs.
- If you want local pricing and real stock, set Store ID to the store number, which you can read off your local store's page in Home Depot's own store finder.
- Adjust Maximum results and Concurrency if the batch is large.
- Run it, then export the dataset as JSON, CSV or Excel, or read it over the API. The
SUMMARYrecord lists any item that failed, with Home Depot's own message where there was one.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
products | array of strings | required | Home Depot item IDs or full homedepot.com product URLs, 1 to 300 per run |
storeId | string | unset | A numeric store number, up to 6 digits. Applies to every item in the run |
maxItems | integer | 1000 | Ceiling on dataset rows, 1 to 50,000 |
concurrency | integer | 2 | Items fetched in parallel, 1 to 5 |
{"products": ["313588232","https://www.homedepot.com/p/Husky-46-in-9-Drawer-Tool-Chest/314030291"],"storeId": "0121","maxItems": 1000,"concurrency": 2}
An item is addressed by the number at the end of its product URL. In
homedepot.com/p/Husky-46-in-9-Drawer-Tool-Chest/314030291 the item is 314030291; the words in
between are a slug. Bare IDs and full URLs collapse to one request per item, so listing a product
both ways is not billed twice. A URL on any other host is rejected before it costs a fetch and is
reported under failures.
storeId applies to the whole run rather than per item. Two stores means two runs.
Output
One row per item. This is the shape rather than a captured run:
[{"itemId": "313588232","title": "1/2 in. x 10 ft. Copper Type L Pipe","brand": "Cerro","modelNumber": "LH04010","price": 38.97,"priceText": "$38.97","wasPrice": 44.52,"currency": "USD","rating": 4.8235,"reviewCount": 187,"availability": "IN_STOCK","imageUrl": "https://images.thdstatic.com/productImages/2c4e/svn/copper-pipe_1000.jpg","sourceUrl": "https://www.homedepot.com/p/Copper-Type-L-Pipe/313588232","collectedAt": "2026-08-20T09:14:02.881Z"},{"itemId": "314030291","title": "Husky 46 in. 9-Drawer Mobile Workbench with Solid Wood Top","brand": "Husky","modelNumber": "H46MWC9BLK","price": 698,"priceText": "$698.00","wasPrice": null,"currency": "USD","rating": 4.6,"reviewCount": 2431,"availability": "LIMITED_STOCK","imageUrl": "https://images.thdstatic.com/productImages/91ab/svn/husky-workbench_1000.jpg","sourceUrl": "https://www.homedepot.com/p/Husky-46-in-9-Drawer-Tool-Chest/314030291","collectedAt": "2026-08-20T09:14:02.881Z"}]
How much does it cost?
Pay-per-event: you are charged per result row written to the dataset. Rows are written only when they can be charged, so reaching your spend limit stops the writing rather than delivering unbilled data. The current per-row figure is on the Actor's Store page.
Runs started from an Apify free plan stop at 250 requests and 250 results, with a status
message saying so. Any paid plan runs the full input and the maxItems you set.
The limit exists because this Actor fetches through our own scraping infrastructure, which Apify does not cover for free-plan runs. It binds on requests as well as rows so that a long SKU list cannot spend fetches on rows the run will not return.
Using it with the Apify API
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('usestring/homedepot-products').call({products: ['313588232', '314030291'],storeId: '0121',maxItems: 100});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) {console.log(item.itemId, item.price, item.availability);}
To price the same basket across several stores, call the Actor once per store number and key the
results on itemId. The Python client and the REST API work identically, and a schedule keeps a
daily price and stock history without further work.
Is it legal to scrape Home Depot?
The product data this Actor reads is what homedepot.com serves an anonymous visitor's own browser: no login, no cookies, no API key. The output is product and inventory data — price, stock, brand, model number, ratings — with no reviewer names, no review text and no personal data.
Collecting public data is broadly lawful in the US and the EU, but what applies to you depends on your jurisdiction and on what you do with the data next, and Home Depot's terms of service are a separate matter from the law. None of this is legal advice.
Limitations
Product data on homedepot.com (US) only, and only for items you name. No review text, no
specification tables, no variants or collections, no shipping quotes and no store locator. There is
no search or category crawling, so the Actor never spends a fetch on a page you did not ask for. One
storeId per run. Values reflect what the gateway returned at collectedAt.
Related actors
- Walmart Product Scraper — the same price, stock and rating fields on Walmart, including marketplace sellers.
- Amazon Product Scraper — product lookup by ASIN across seven Amazon marketplaces, for the third leg of a price comparison.
- Amazon Search Scraper — find the competing products by keyword before you price them.
- Amazon Bestsellers Scraper — category rankings, a quick read on what is selling in a hardware or tools category.
- Zillow Property Listings Scraper — housing market data, if your building-materials demand model starts from what is being bought and renovated.
FAQ
What is a Home Depot item ID?
The number at the end of a homedepot.com/p/… product URL, for example 313588232. Pass it bare or
pass the whole URL.
How do I find a store number? Home Depot's store finder shows it on each store's page, and it is printed on receipts. Pass it as a string; leading zeros are fine.
Does storeId change the price as well as the stock?
Yes, both. It is sent on the pricing field and the fulfilment field of the same request, so price
and availability are answered together for that store.
Why does availability say AVAILABLE instead of IN_STOCK?
Because no location inventory was reported — either the item is online-only, or the run had no
storeId and so resolved no stores. It means buyable, not on the shelf.
Is the rating rounded?
No. rating is Home Depot's own unrounded average, such as 4.8235, and reviewCount is the exact
total. Rounding here would flatten a 4.82 into a 5 and lose the only signal that separates two
well-reviewed products.
Can it search or crawl a category? No. You supply the item IDs, which keeps the fetch count equal to your input.
What happens to an item ID that does not exist?
It is recorded under failures in the run's SUMMARY record with Home Depot's own error message
where there is one, and the rest of the batch still returns. If every item fails, the run fails
rather than reporting an empty success.
Feedback
Something parsing wrong, or a gateway field you need that is not in the table? Open an issue from the Actor's Store page with the item ID and the store number you used.