# Home Depot Product API: Search, Stock, Reviews, Stores (https://www.socialcrawl.dev/blog/home-depot-product-api)
> Home Depot product API with four GET endpoints: keyword search, product detail with UPC and store stock, reviews, and ZIP to store id. See fields and credits.
A Home Depot product API turns a keyword or an item id into structured product data: title, brand, UPC, price, rating, per-store stock and reviews. SocialCrawl offers four GET endpoints for it under `/v1/home_depot/`, on one API key and in the same response envelope as the rest of `/v1`.
| Endpoint | Required | Returns | Credits |
| --- | --- | --- | ---: |
| `GET /v1/home_depot/search` | `query` | Matching products and the real match total | 5 |
| `GET /v1/home_depot/product` | `item_id` or `url` | UPC, price, rating, per-location stock | 5 |
| `GET /v1/home_depot/reviews` | `item_id` | The ten most relevant written reviews, plus the total | 5 |
| `GET /v1/home_depot/stores` | `query` (a US ZIP) | Nearby stores with `store_id` | 1 |
Send your key in an `x-api-key` header. Full parameter lists are on the [Home Depot platform page](/platforms/home_depot).
## How do you search Home Depot products by keyword?
`GET /v1/home_depot/search` takes a `query` and returns 24 products per page. Each row has the item id, title, brand, price, rating, review count, images and availability, and `total` is the real match count. Add `page` (1 to 30) to walk further, and `store_id` to localise stock.
```bash
curl -s -H "x-api-key: $SOCIALCRAWL_API_KEY" \
"https://www.socialcrawl.dev/v1/home_depot/search?query=paver"
```
```json
{
"product": {
"id": "100333077",
"title": "12 in. x 12 in. x 1.5 in. Pewter Square Concrete Step Stone",
"url": "https://www.homedepot.com/p/.../100333077",
"price": { "current": 1.87, "original": 1.87, "currency": "USD" },
"rating": { "average": 4.6, "count": 12904 },
"reviews_count": 12904,
"availability": "InStock"
}
}
```
The item id is the number at the end of a Home Depot product URL. Pass it to the product and reviews endpoints. Paginate while `pagination.has_more` is true. For the general pattern, see [how API pagination works](/blog/twitter-api-pagination).
Search takes no sort or filter parameters. `sort_by`, `items_per_page`, `brand`, `min_price`, `max_price`, `in_stock` and `zipcode` are rejected with a 400 that names the parameter, and the call costs 0 credits. Filter and sort on the rows you got back: every row carries `price.current`, `brand`, `rating` and `availability`.
## How do you get Home Depot product data, UPC and in-store stock?
`GET /v1/home_depot/product` takes an `item_id` or a product `url` and returns full detail: title, brand, model number, UPC, description, feature bullets, current and original price, rating, images and stock. Stock sits in `product.ext.store_inventory`, with a unit count for each location that can fulfil the item.
```bash
curl -s -H "x-api-key: $SOCIALCRAWL_API_KEY" \
"https://www.socialcrawl.dev/v1/home_depot/product?item_id=326680222&store_id=0256"
```
```json
{
"product": {
"id": "326680222",
"brand": "RYOBI",
"price": { "current": 49.97, "original": 49.97, "currency": "USD" },
"rating": { "average": 4.6, "count": 1907 },
"availability": "InStock",
"ext": {
"store_inventory": [
{
"store_id": "0256",
"store_name": "Stadium",
"state": "FL",
"in_stock": true,
"quantity": 34,
"fulfillment": "pickup",
"service": "bopis",
"location_type": "store",
"is_selected_store": true
},
{
"store_id": "0121",
"in_stock": true,
"quantity": 79,
"fulfillment": "delivery",
"service": "express delivery",
"is_selected_store": false
}
]
}
}
}
```
A row in `store_inventory` can be a delivery path rather than a store. Read `fulfillment` (pickup or delivery) and `location_type` (store or online) before you treat a count as shelf stock. The row with `is_selected_store: true` is the store you passed as `store_id`. Compare store ids as exact strings, because a delivery node can share digits with a store number (`0121` is not store 121).
Prices are Home Depot's online prices and do not change with the store, so in-store-only markdowns are not in the data. A markdown that Home Depot publishes online appears in `ext.promotion` with its label, `amount_off` and `percent_off`. When Home Depot withholds a price, `price.current` is null and `ext.price_note` explains why.
The response uses the same unified Product shape as [other retailer product endpoints](/blog/best-amazon-product-data-apis-2026), so one parser covers several stores.
## Is there a Home Depot reviews API?
Yes. `GET /v1/home_depot/reviews` takes an `item_id` and returns the ten most relevant written reviews for 5 credits. It is a single page with no cursor, and `total` gives the full review count on the product.
```bash
curl -s -H "x-api-key: $SOCIALCRAWL_API_KEY" \
"https://www.socialcrawl.dev/v1/home_depot/reviews?item_id=100333077"
```
```json
{
"review": {
"id": "306350952",
"text": "The majority of the 70 pavers were good but two had concrete bumps on their surfaces.",
"rating": { "value": 4, "max": 5 },
"author": { "name": "KIP", "location": null },
"helpful_votes": 0,
"verified": true,
"language": "en_US",
"published_at": "2026-09-04T01:04:17.000Z"
}
}
```
Each review has its text, a star rating out of 5, the author, helpful votes, a verified-purchase flag and a publish time. Review rows also carry judged labels in `computed.labels` (sentiment and issue type) by default, at no extra credits. See [Labels](/docs/labels) for how they are scored.
The review total and the `reviews_count` on a product row can differ slightly, because they come from separate payloads. Treat each as the count for that response.
## How do you turn a ZIP code into a Home Depot store id?
`GET /v1/home_depot/stores?query=95032` takes a five-digit US ZIP and returns the nearest stores in distance order for 1 credit. Each store has an `id`, name, address, phone number, coordinates and a store page link. The `id` is the `store_id` that search and product accept.
```bash
curl -s -H "x-api-key: $SOCIALCRAWL_API_KEY" \
"https://www.socialcrawl.dev/v1/home_depot/stores?query=95032"
```
```json
{
"place": {
"id": "1009",
"name": "Hillsdale",
"address": "1855 Hillsdale Ave, San Jose, CA 95124",
"phone": "(408)978-6807",
"latitude": 37.263343,
"longitude": -121.921355,
"url": "https://www.homedepot.com/l/Hillsdale/CA/San-Jose/95124/1009"
}
}
```
The local-stock flow is three calls. Turn the ZIP into a `store_id` with stores, then call product with `item_id` and `store_id`, and read the row with `is_selected_store: true`. Pass the id as a string exactly as stores returns it, with leading zeros. An unknown store number is rejected.
## What does the Home Depot API not do?
`GET /v1/home_depot/category` is withdrawn while its data source is re-established. It answers 503 and costs 0 credits, so use keyword search to find item ids. Sorting and filtering happen on the rows you get back, and reviews come ten at a time.
Error responses include a `doc_url` that points to the [error reference](/docs/errors). Calls that fail on our side are refunded.
## How do you start?
Create an account and an API key. Signup includes free credits. Run the search call above, read `data` before you write a parser, and take an `item_id` from the result for product and reviews. To look at the response shapes before writing code, use the [explorer](/explorer).
## Frequently asked questions
### Is there an official Home Depot product API for developers?
Not a public, self-serve one that we could find. SocialCrawl is independent of Home Depot and is not part of any Home Depot partner program. The `/v1/home_depot/` endpoints are a separate, self-serve API with search, product, reviews and stores.
### How much does a Home Depot product API call cost?
Search, product and reviews cost 5 credits each. The stores lookup costs 1 credit. A request that is rejected before it is fetched, such as an unsupported filter, costs 0. See [per-endpoint credit costs](/docs/endpoint-pricing) for the full table.
### Can the API return in-store inventory and local availability?
Yes. Get a `store_id` from the stores endpoint, then pass it to product. Stock appears in `product.ext.store_inventory`, and the row marked `is_selected_store` is your store.
### Why do brand, price and sort filters return a 400?
The search source does not support them, so the API rejects them by name instead of silently ignoring them. Search accepts `query`, `page` and `store_id`. Filter the returned rows on `price.current`, `brand`, `rating` and `availability`.