To check Home Depot stock by store from code, use Scavio's Home Depot API. POST /api/v1/homedepot/stores with a ZIP returns the 20 nearest store numbers, and POST /api/v1/homedepot/availability with an item id and a store_id returns that store's price, the units on hand, whether the item is on the shelf or only orderable to the store, and the pickup date. Each call costs 2 credits, about $0.004 on the Growth plan billed yearly.
Home Depot's website and app show stock for the one store you have selected, so checking a city means switching stores again and again. These five steps get the same answer for every store near a ZIP, from code.
Step 1: Find the stores near a ZIP
curl -s https://api.scavio.dev/api/v1/homedepot/stores \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "30318", "limit": 20}'For Atlanta ZIP 30318 this returned 20 stores in 2.2 s on November 3, 2026, nearest first, from Midtown (3.95 miles) to Sandy Plains in Marietta (17.72 miles). One row, as captured, with the opening hours and services trimmed:
{
"store_id": "0121",
"name": "Cumberland",
"store_type": "retail",
"address": {
"street": "2450 Cumberland Pkwy",
"city": "Atlanta",
"state": "GA",
"postal_code": "30339",
"country": "US"
},
"latitude": 33.862126,
"longitude": -84.476161,
"distance_miles": 5.94,
"phone": "(770)432-9930",
"pro_desk_phone": "(770)801-6415",
"tool_rental_phone": "(770)801-6400",
"url": "https://www.homedepot.com/l/Cumberland/GA/Atlanta/30339/121"
}store_id is what the next calls take, with or without the leading zero. The query can also be a city or a street address, and distance_miles is measured from the place you searched. Store lists change rarely, so cache them.
Step 2: Find the item id
The item id is the number at the end of a homedepot.com product URL, and the availability call also accepts the full URL. To find items by keyword, use search:
curl -s https://api.scavio.dev/api/v1/homedepot/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "cordless drill", "sort_by": "top_sellers"}'This returned 12 of 1,918 results. The third row, trimmed to the fields that matter here:
{
"pos": 3,
"item_id": "309752194",
"store_sku": "1004501352",
"model_number": "2746-20",
"brand": "Milwaukee",
"title": "M18 FUEL 18-Volt Lithium-Ion Brushless Cordless Gen II 18-Gauge Brad Nailer (Tool-Only)",
"price": 279,
"original_price": 329,
"discount_percent": 15,
"rating": 4.6774,
"review_count": 2929,
"stock_quantity": 13,
"pickup": {
"available": true,
"type": "bopis",
"store_id": "121",
"store_name": "Cumberland",
"store_state": "GA",
"distance_miles": 0,
"quantity": 13
}
}Search answers for one store that Home Depot assigns to the request, Cumberland here, and does not take a store number. Use it to find item ids, and use step 3 for the stores you choose.
Step 3: Check stock and price at one store
curl -s https://api.scavio.dev/api/v1/homedepot/availability \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"item_id": "309752194", "store_id": "0121"}'The response, as captured, trimmed of the URL, the store SKU and the empty price fields:
{
"data": {
"item_id": "309752194",
"store_id": "0121",
"zip": null,
"title": "M18 FUEL 18-Volt Lithium-Ion Brushless Cordless Gen II 18-Gauge Brad Nailer (Tool-Only)",
"brand": "Milwaukee",
"model_number": "2746-20",
"price": 279,
"original_price": 329,
"currency": "USD",
"discount_amount": 50,
"discount_percent": 15,
"promotion_type": "DISCOUNT",
"promotion_start": "10/26/2026",
"promotion_end": "01/31/2027",
"clearance_price": null,
"availability": "Shared",
"buyable": true,
"discontinued": false,
"pickup": {
"available": true,
"type": "bopis",
"store_id": "0121",
"store_name": "Cumberland",
"store_state": "GA",
"store_phone": "(770)432-9930",
"quantity": 13,
"in_stock": true,
"limited_quantity": false,
"ready_date": "2026-11-03",
"ready_date_latest": "2026-11-03"
},
"delivery": null,
"retrieved_at": "2026-11-03T16:11:56.516Z"
},
"response_time": 3536,
"credits_used": 2
}price is the price at that store, with the promotion and its dates. pickup.quantity is the store's count, 13 here, and ready_date is the day you could collect it. At Morrow, 16.45 miles away and checked less than a minute later, the same item came back with quantity 0, in_stock false and limited_quantity true. Note that pickup.available stayed true at Morrow, so decide on quantity and in_stock, not on available. Add "zip" to the body and the same call also quotes delivery to that ZIP.
Step 4: Tell shelf stock from ship-to-store
pickup.type says what kind of pickup the store offers. bopis (buy online, pick up in store) means the store has the item on its own shelf, and quantity is that shelf count. boss (buy online, ship to store) means the store has none to hand over, and Home Depot will send one there. A Milwaukee M12 FUEL combo kit (item 342964677) at the same Cumberland store, with ZIP 30318 added, trimmed to the stock fields:
{
"price": 365,
"availability": "Online",
"pickup": {
"available": true,
"type": "boss",
"store_id": "0121",
"store_name": "Cumberland",
"quantity": 962,
"in_stock": true,
"limited_quantity": false,
"ready_date": "2026-11-04",
"ready_date_latest": "2026-11-06"
},
"delivery": {
"zip": "30318",
"available": true,
"backordered": false,
"options": [
{
"type": "sth",
"charge": 0,
"free_shipping": true,
"earliest_date": "2026-11-05",
"latest_date": "2026-11-05",
"quantity_available": 962,
"in_stock": true
}
]
}
}The 962 is the stock Home Depot can ship, the same number as the delivery option, not 962 kits in Cumberland. A ship-to-store row is not a reason to drive to the store today, so a "near me" tool should show only bopis rows with a quantity above 0 as available now and show boss rows with their ready date.
Step 5: Check every nearby store and keep watching
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}"}
API = "https://api.scavio.dev/api/v1/homedepot"
stores = requests.post(f"{API}/stores", headers=H,
json={"query": "30318", "limit": 20}, timeout=60).json()["data"]["stores"]
for s in stores:
d = requests.post(f"{API}/availability", headers=H,
json={"item_id": "309752194", "store_id": s["store_id"]}, timeout=60).json()["data"]
p = d["pickup"] or {}
on_shelf = p.get("type") == "bopis" and (p.get("quantity") or 0) > 0
print(s["name"], s["distance_miles"], d["price"], p.get("type"), p.get("quantity"), on_shelf)On November 3 this loop took 21 calls and 42 credits. The nailer was $279 at all 20 stores; 13 stores had it on the shelf and 7 had none, and of the 45 units across the metro, 13 were at Cumberland. The nearest store, Midtown, had 1, and the next two, Buckhead and Cascade, had none. The chart of every store and a comparison of the other options are in the best Home Depot store inventory APIs.
To watch for a restock, run the loop on a schedule, store quantity and type per store with retrieved_at, and alert when a store goes from 0 to a bopis quantity above 0. Prices can differ by store too: a 2x4x96 in. stud (item 312528776) was $4.25 at Midtown and at Manhattan West 23rd St and $4.15 at West Seattle, all three checked within five seconds, so store the price next to the count.
All store-level endpoints
| Endpoint | What it returns | Credits |
|---|---|---|
/api/v1/homedepot/stores | Up to 20 stores near a ZIP, city or address: store_id, address, coordinates, distance, phones, hours, services | 2 |
/api/v1/homedepot/availability | One item at the store you pass: the store's price and promotion, pickup type, units on hand, ready date; delivery options to a ZIP if you add one | 2 |
/api/v1/homedepot/shipping | Every delivery option for an item to a ZIP and quantity, with charge and dates | 4 |
/api/v1/homedepot/search | 12 products a page with price, rating and pickup stock at the one store Home Depot assigns | 2 |
/api/v1/homedepot/product | The full item page: specs, UPC, documents, rating and a 10-review preview, no store stock | 2 |
The delivery quote for the nailer to ZIP 30318 listed free express delivery the same day, free standard shipping the next day and a 2-hour on-demand option for $7. An invalid body returns a 400 and is not charged; an unknown item id returns a 404 and is charged.
Getting started
- Sign up at dashboard.scavio.dev/sign-up: 50 free credits, no card required, which is 25 Home Depot calls.
- Copy your API key from the dashboard.
- Send a POST to
/api/v1/homedepot/storeswith a ZIP, then to/api/v1/homedepot/availabilitywith an item id and a store id.
Try the Home Depot API free in the playground first, or call it from Claude and other agents through the MCP server.
Reference: Home Depot API overview · stores · availability · delivery quote · search · best Home Depot store inventory APIs
Frequently asked questions
How do I check Home Depot stock at a store online?
On homedepot.com, set your store and open the product page, which shows pickup stock for that store; switch stores to check another. To check many stores from code, call Scavio's /api/v1/homedepot/stores with a ZIP for the nearby store numbers, then /api/v1/homedepot/availability with the item id and each store number. Each call returns the units on hand and the pickup date.
What is the difference between pick up in store and ship to store at Home Depot?
Pick up in store means the store has the item on its own shelf and you can collect it, usually the same day. Ship to store means that store has none, so Home Depot sends one there and you collect it later, in our test one to three days out. In API responses the first is type bopis with the store's count, the second is type boss with a later ready date.
How do I find items in Home Depot?
In the store, the Home Depot app shows an item's aisle and bay once you set that store. Before you go, check that the store has it at all: a store count of 0 means a trip for nothing. Scavio returns the count and pickup date but not the aisle and bay; Unwrangle's product API lists an aisle_bay field for a store number.
Is there a free Home Depot inventory API?
There is no free official one. Scavio gives 50 credits on signup with no card, which covers 25 store checks at 2 credits each, and paid plans start at $30 a month for 7,000 credits. SerpApi has 250 free searches a month and OpenWeb Ninja a free plan of 50 requests, after which every option compared in our roundup charges per check.