Home Depot Product Scraper avatar

Home Depot Product Scraper

Pricing

from $0.75 / 1,000 results

Go to Apify Store
Home Depot Product Scraper

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

String

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

4

Monthly active users

20 days ago

Last modified

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.
  • storeId resolves 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.8235 stays 4.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?

FieldTypeDescription
itemIdstringHome Depot's item ID as the gateway returns it. Stable, and the right key to join on
titlestringThe product label, with HTML entities decoded
brandstringManufacturer name
modelNumberstringThe manufacturer's model number, which is how the same product is matched across retailers
pricenumber249, not "$249.00". Resolved for storeId when you set one
priceTextstringThe same amount formatted as US currency, e.g. $249.00
wasPricenumberThe list price, reported only while it genuinely exceeds price
currencystringUSD
ratingnumberAverage stars out of 5, unrounded — 4.8235, not 5
reviewCountnumberTotal number of reviews
availabilitystringOne of IN_STOCK, LIMITED_STOCK, OUT_OF_STOCK, BACKORDERED, AVAILABLE, UNAVAILABLE, DISCONTINUED
imageUrlstringThe primary image at the largest size Home Depot offers for it
sourceUrlstringHome Depot's canonical product URL
collectedAtstringISO 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:

ValueWhat it means
DISCONTINUEDHome Depot marks the item discontinued
UNAVAILABLEThe item is not buyable
BACKORDEREDBuyable, but the fulfilment record says backordered
IN_STOCKA location actually reported stock
LIMITED_STOCKA location reported limited quantity
OUT_OF_STOCKLocations were reported and none of them had it
AVAILABLEBuyable, 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:

  • price becomes that store's local price. Home Depot prices regionally, and lumber, appliances and seasonal goods are where the gap shows up most.
  • availability becomes a real answer: IN_STOCK, LIMITED_STOCK or OUT_OF_STOCK resolved against that store's inventory, rather than the AVAILABLE placeholder.

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 storeId plus availability answers.
  • Competitive pricing. modelNumber is 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. wasPrice only 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

  1. Open the Actor and click Try for free.
  2. Put Home Depot item IDs or full product URLs into SKUs or URLs.
  3. 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.
  4. Adjust Maximum results and Concurrency if the batch is large.
  5. Run it, then export the dataset as JSON, CSV or Excel, or read it over the API. The SUMMARY record lists any item that failed, with Home Depot's own message where there was one.

Input

FieldTypeDefaultNotes
productsarray of stringsrequiredHome Depot item IDs or full homedepot.com product URLs, 1 to 300 per run
storeIdstringunsetA numeric store number, up to 6 digits. Applies to every item in the run
maxItemsinteger1000Ceiling on dataset rows, 1 to 50,000
concurrencyinteger2Items 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.

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.

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.