Home Depot
Home Depot keyword search, product detail with per-store shelf counts, customer reviews, markdown labels, and a store locator that turns a ZIP code into a store id
Home Depot products, reviews and stores behind the same canonical commerce schema as Amazon, Walmart, Target and eBay. Two things make this platform unusual: product reports how many units are physically on the shelf at a given store, and stores turns a postcode into the store id that localises that stock.
Base URL: /v1/home_depot/...
Products are keyed on the internet number, the numeric id at the end of a product URL. In homedepot.com/p/<name>/100333077 the item id is 100333077.
Prices are Home Depot's online price and do not change with store_id: in
our comparison on 28/09/2026 across four stores in three states, every shared
item had the same current and original price. store_id localises stock and
pickup. In-store-only shelf markdowns are not in this data. Get a store id from
/v1/home_depot/stores.
Quickstart
Find products by keyword
search is the keyword-to-item-id resolver for the rest of the platform. It returns 24 products a page.
curl "https://www.socialcrawl.dev/v1/home_depot/search?query=paver" \
-H "x-api-key: YOUR_API_KEY"Read the product and its reviews
Full detail including per-store shelf counts, then the review text.
curl "https://www.socialcrawl.dev/v1/home_depot/product?item_id=100333077" \
-H "x-api-key: YOUR_API_KEY"
curl "https://www.socialcrawl.dev/v1/home_depot/reviews?item_id=100333077" \
-H "x-api-key: YOUR_API_KEY"Localise stock to a store
Turn a ZIP into a store id, then pass that id back into search or product.
curl "https://www.socialcrawl.dev/v1/home_depot/stores?query=95032" \
-H "x-api-key: YOUR_API_KEY"
curl "https://www.socialcrawl.dev/v1/home_depot/search?query=paver&store_id=1009" \
-H "x-api-key: YOUR_API_KEY"All endpoints
4 endpoints available.
| Endpoint | Path | Credit Tier |
|---|---|---|
| Find Home Depot stores near a ZIP code | /v1/home_depot/stores | standard (1cr) |
| Get a Home Depot product by item id or URL | /v1/home_depot/product | advanced (5cr) |
| Get Home Depot product reviews | /v1/home_depot/reviews | advanced (5-9cr)metered |
| Search Home Depot products by keyword | /v1/home_depot/search | advanced (5cr) |
Search
GET /v1/home_depot/search takes query plus two optional parameters: page (1 to 30) and store_id. It returns 24 products a page with item id, title, brand, model number, current and original price, rating, review count, images, department and stock status, and a total that holds steady across pages.
It takes no sort or filter parameters. If you send sort_by, items_per_page, brand, min_price, max_price, in_stock or zipcode you get a 400 naming the parameter rather than a silently unfiltered page, because a filter that is quietly ignored is worse than an error: you cannot tell it happened. Filter and sort on the returned rows instead, which carry product.price.current, product.brand, product.rating, product.availability and product.ext.promotion.
To turn a ZIP code into a store, call /v1/home_depot/stores first and pass the store's id as store_id. Each row's store_inventory then marks that store with is_selected_store, and availability says whether any fulfilment path has the item in stock.
Markdowns and clearance
When Home Depot publishes a markdown online, the row carries it under product.ext.promotion, on both search and product:
| Field | Type | Meaning |
|---|---|---|
label | string or null | Home Depot's Savings Center label, for example Clearance or Special Buys |
amount_off | number or null | Dollars off price.original; null when nothing is off |
percent_off | number or null | Percentage off price.original; null when nothing is off |
price.original is the price before that markdown, and equals price.current when there is none. promotion is null on a row without one. A Special Buy can carry the label with no amount off. When Home Depot withholds a price until checkout, price.current is null and product.ext.price_note says why, for example see final price in cart.
These are online markdowns, so they are the same at every store. There is no clearance filter: a keyword such as clearance power tools surfaces labelled rows, and you keep the ones whose promotion.label is Clearance.
Product detail
GET /v1/home_depot/product takes item_id or the full product url, plus an optional store_id. Give it the URL and the item id is extracted for you.
The field nothing else in this API sells is product.ext.store_inventory: the actual unit count at each location that can fulfil the item. store_id changes that stock figure and pickup availability, not the price.
Home Depot lists one location per fulfilment path, so a row is not always a store. A typical response has three rows: the pickup store, an express-delivery location and a ship-to-home location. Each row carries:
| Field | Type | Meaning |
|---|---|---|
store_id | string | Location id. product echoes the format you sent (0159 stays 0159); search drops the leading zero (0723 comes back as 723) |
store_name | string or null | Store name; null on delivery locations |
state | string or null | US state of the location |
in_stock | boolean or null | Whether the location has stock |
quantity | number or null | Units available at the location |
fulfillment | string or null | pickup or delivery |
service | string or null | For example bopis, express delivery or sth |
location_type | string or null | store or online |
is_selected_store | boolean or null | true on the store the request was localised to |
search rows carry the same store_inventory. Only a bopis row with location_type store is stock on that store's shelf. A boss row is online stock that can be shipped to the store for pickup, and sth is ship to home from an online warehouse.
To find the store you asked for, read is_selected_store. Do not match ids numerically: a delivery location can share digits with a store number, and 0121 is not store 121. If every row reports null for the flag, the selected store is the pickup row whose store_id equals the store_id you sent, compared as an exact string. An unknown store_id returns a free 400 naming it.
Reviews
GET /v1/home_depot/reviews takes item_id and returns the ten most relevant reviews, each with the text, star rating, reviewer name, location, submission date, verified-purchaser flag, helpful-vote count and photos. total reports the full number of reviews on the product, so you can always see how many exist beyond the ten returned.
This is a single page. The upstream exposes no paging parameter, so there is no cursor to follow.
Find a store
GET /v1/home_depot/stores takes a five-digit US ZIP as query and returns the 20 nearest stores with store id, name, full address, phone, distance in miles and seven days of opening hours. Store data changes rarely, so it is 1 credit and heavily cached.
Platform notes
Shelf counts go stale fast. The shelf figure is exactly as volatile as it sounds. Treat it as a point-in-time reading rather than something to cache.
Prices are online prices. They did not vary by store in any comparison we have run, so a store's own shelf markdown is not visible here. Compare against a competitor's online price, not a store receipt.
Search pages can repeat a row. Home Depot's own result ordering shifts slightly between pages, so consecutive pages occasionally re-serve a product. We de-duplicate across a paging session for you, and a page that de-duplicates to nothing is not charged.
US only. Prices are US dollars and there is no marketplace selector.
Category browsing is temporarily withdrawn. GET /v1/home_depot/category returns a free 503 while its data source is re-established. Use search with a descriptive keyword in the meantime, and see the changelog for its status.
Labels
/v1/home_depot/reviews labels each review by default, at no extra credit: sentiment (read from the words, never the stars, with rating_mismatch when the two clearly disagree) and issue (the main problem the review reports) on computed.labels. Send judgments=off for the page without them. See Labels for the field shapes and the labels you can add with label=, such as label=reports&reports=the battery drains quickly.
