To get Walgreens product data programmatically, use Scavio's Walgreens API. Find stores with POST /api/v1/walgreens/stores and a ZIP code, search the catalog with /search for regular and sale prices, coupons and promotions, read one item in full with /product, then pass its id and up to 20 store numbers to /stock for the units in stock at each store in one call. Search, product and stores cost 2 credits, stock costs 4, about $0.008 on the Growth plan billed yearly.
Walgreens' own developer program has a Store Inventory API for registered developers, keyed by article id one store at a time, but no catalog search or price API. The steps below return product names, prices and stock together with one key. Every response shown was captured on November 2, 2026.
Step 1: Find stores near a ZIP
curl -s https://api.scavio.dev/api/v1/walgreens/stores \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"zip": "60614", "limit": 20}'This returned the 20 nearest of 441 locations within 25 miles of the Chicago ZIP, nearest first, in 1.6 s. The first one, as captured:
{
"store_number": "15350",
"name": "Walgreen Drug Store",
"brand": "Walgreens",
"address": {
"street": "834 W ARMITAGE AVE",
"city": "CHICAGO",
"state": "IL",
"zip": "60614",
"intersection": "Northwest corner of DAYTON & ARMITAGE"
},
"phone": "773-687-0709",
"latitude": 41.91829082,
"longitude": -87.6498915,
"distance_miles": 0.36,
"open_time": "7AM",
"close_time": "11PM",
"time_zone": "CE",
"temporarily_closed": false,
"url": "https://www.walgreens.com/locator/walgreens-834+w+armitage+ave-chicago-il-60614/id=15350"
}limit goes up to 25 a page and radius from 1 to 100 miles; pass latitude and longitude instead of zip to search around a point. Duane Reade stores come back in the same list: 9 of the 10 nearest New York ZIP 10001 were Duane Reade. Five of the 20 Chicago rows were pharmacy-only locations, such as "Walgreens Specialty Pharmacy" and "Walgreens Pharmacy at Northwestern Memorial Hospital-Galter", with a brand other than Walgreens or no opening hours. Drop those before you check front-store items.
Step 2: Search the catalog
curl -s https://api.scavio.dev/api/v1/walgreens/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "nyquil", "sort": "top_sellers", "store_id": "15350"}'"nyquil" sorted by top sellers returned 54 products in 3.9 s. The first row, with the image trimmed:
{
"position": 1,
"product_id": "300460474",
"sku_id": "sku6319016",
"upc": "32390003955",
"name": "Vicks Dayquil Nyquil Severe Cold & Flu LiquiCap Medicine",
"brand": "Vicks Dayquil Nyquil",
"size": "24 ea",
"product_type": "Cold & Flu Medications",
"price": 16.99,
"sale_price": 13.99,
"sale_text": "2/$26.00 or 1/$13.99",
"on_sale": true,
"promotion": null,
"coupon": "$1.50 off 2 Coupon",
"loyalty_message": null,
"rebate": "Extra 15% off $35+ eligible items sitewide* with code NOV15 or 20% off $50+ eligible items sitewide* with code NOV20",
"rating": 4.5,
"review_count": 174,
"url": "https://www.walgreens.com/store/c/vicks-dayquil-nyquil-severe-cold-%26-flu-liquicap-medicine/ID=300460474-product",
"availability": {
"ship": false,
"pickup": false,
"delivery": false,
"text": "In stock but not available for pickup"
},
"clearance": false,
"article_id": "000000000011354536"
}price is the regular price, sale_price the single-unit sale price and sale_text the multi-buy wording. coupon, promotion, loyalty_message and rebate are Walgreens' own text: in this search 38 of 54 rows carried a coupon and 14 a promotion such as "Buy 1, Get 1 50% OFF". Prices do not change with store_id; it only fills availability.text for that store. Use page (up to 70 rows a page) and sort, with 11 orders including price_low_to_high, unit_price_low_to_high and highest_rated.
Step 3: Get one product in full
curl -s https://api.scavio.dev/api/v1/walgreens/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": "300460474"}'Product adds the GTIN, savings, unit price, dated offers, ingredients, warnings and the category path, in 2.1 s here. Captured, with the long fields trimmed:
{
"product_id": "300460474",
"upc": "32390003955",
"gtin": "00323900039551",
"name": "Vicks Dayquil Nyquil Severe Cold & Flu LiquiCap Medicine",
"size": "24.0 ea",
"price": 16.99,
"sale_text": "2/$26.00 or 1/$13.99",
"savings_amount": 3,
"savings_percent": 18,
"unit_price": 0.58,
"unit_price_size": "ea",
"store_pricing": false,
"ingredients": [
{
"group": "Vicks NyQuil Severe Cold & Flu",
"type": "active",
"ingredients": [
"Acetaminophen - 325 mg (Pain Reliever/Fever Reducer)",
"Dextromethorphan HBr - 10 mg (Cough Suppressant)",
"Doxylamine Succinate - 6.25 mg (Antihistamine)",
"Phenylephrine HCl - 5 mg (Nasal Decongestant)"
]
}
],
"rating": 4.5,
"review_count": 174,
"categories": [
{ "id": "359438", "name": "Medicines & Treatments" },
{ "id": "360549", "name": "Cough, Cold & Flu" },
{ "id": "361457", "name": "Adult Cold Remedies" }
],
"ship_available": false,
"pickup_available": false,
"ship_message": "Not sold online",
"fsa_eligible": true,
"article_id": "000000000011354536"
}ship_message says this item is "Not sold online", so the only way to buy it is in a store, and step 4 says which ones. store_pricing: false confirms the price is the same whichever store you pick. The full response also returns the description, the DayQuil ingredient groups, warnings, seven images and an offers list with each offer's type, text and start and end dates.
Step 4: Check stock at 20 stores in one call
curl -s https://api.scavio.dev/api/v1/walgreens/stock \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": "300460474", "store_ids": ["15350", "15992", "249", "178", "1173", "3949", "1375", "3698", "15305", "7630", "15493", "1298", "21447", "4494", "211", "3072", "1096", "15525", "258", "15971"]}'store_ids takes 1 to 20 store_number values from step 1. The response, as captured, with 4 of the 20 store rows shown:
{
"product_id": "300460474",
"article_id": "000000000011354536",
"planogram": "40000102735",
"count": 20,
"in_stock_count": 15,
"stores": [
{ "store_number": "15350", "status": "In Stock", "quantity": 22, "in_stock": true },
{ "store_number": "1375", "status": "In Stock", "quantity": 10, "in_stock": true },
{ "store_number": "15305", "status": "Not Available", "quantity": 0, "in_stock": false },
{ "store_number": "15525", "status": "Out of Stock", "quantity": 0, "in_stock": false }
],
"unknown_store_ids": []
}The item was in stock at all 15 regular stores, 285 units in total and 10 to 32 at each, in 3.2 s. Read status as well as quantity: "Out of Stock" is a store that carries the item and has none, "Not Available" a store that does not carry it, and store numbers Walgreens does not recognise land in unknown_store_ids. The comparison of four products across these 20 locations is charted in the best Walgreens product data APIs.
Step 5: Join stock to store addresses
The stock response returns store numbers only, so keep the stores call from step 1 and join on store_number:
import requests
BASE = "https://api.scavio.dev/api/v1/walgreens"
H = {"Authorization": "Bearer sk_live_your_key"}
stores = requests.post(f"{BASE}/stores", headers=H, json={"zip": "60614", "limit": 20}).json()["data"]["stores"]
shops = {s["store_number"]: s for s in stores if s["brand"] == "Walgreens" and s["open_time"]}
stock = requests.post(f"{BASE}/stock", headers=H,
json={"product_id": "300460474", "store_ids": list(shops)}).json()["data"]
for row in stock["stores"]:
if row["in_stock"]:
s = shops[row["store_number"]]
print(s["distance_miles"], s["address"]["street"], row["quantity"])The filter keeps the 15 regular Walgreens stores, so the same stock call covers them with 5 slots to spare for stores further out. Around New York, keep brand == "Duane Reade" as well.
All four endpoints
| Endpoint | What it returns | Credits |
|---|---|---|
/api/v1/walgreens/stores | Walgreens and Duane Reade locations near a ZIP or point, nearest first, up to 25 a page | 2 |
/api/v1/walgreens/search | Up to 70 products a page: regular, sale and unit price, coupon, promotion, rewards, rating, UPC | 2 |
/api/v1/walgreens/product | One product: GTIN, savings, dated offers, ingredients, warnings, categories, images, FSA flag | 2 |
/api/v1/walgreens/stock | One product at up to 20 stores: status, quantity and in_stock per store | 4 |
There is no review text endpoint; search and product carry each item's rating and review count. Pharmacy and prescription data are not covered. For a side-by-side of every Walgreens data option, including Walgreens' own Store Inventory API, see the best Walgreens product data APIs.
Getting started
- Sign up at dashboard.scavio.dev/sign-up: 50 free credits, no card required.
- Copy your API key from the dashboard.
- Send a POST to
/api/v1/walgreens/storeswith a ZIP and your key in theAuthorizationheader.
Try the Walgreens API free in the playground first, or call it from Claude and other agents through the MCP server.
Reference: Walgreens API overview · stores · search · product · stock
Frequently asked questions
Is there a Walgreens API for product data?
Walgreens' developer program offers a Store Inventory API and a Store Locator API to registered developers, but no catalog search or price API. Scavio's Walgreens API returns walgreens.com product, price, promotion and per-store stock data as JSON with one API key, through 4 POST endpoints: search, product, stores and stock.
How do I find a Walgreens store number?
POST a ZIP code, or a latitude and longitude, to /api/v1/walgreens/stores. It returns Walgreens and Duane Reade locations nearest first, within 25 miles by default and up to 100, up to 25 a page, each with store_number, address, phone, distance and opening hours. ZIP 60614 returned store 15350, 834 W Armitage Ave in Chicago, at 0.36 miles.
Can I see how many units a Walgreens store has?
Yes. /api/v1/walgreens/stock takes a product id and up to 20 store numbers and returns each store's status, quantity and in_stock. On November 2, 2026, DayQuil and NyQuil LiquiCaps had 22 units at store 15350 and 285 across the 15 regular stores near ZIP 60614.
Does the Walgreens API return coupons and sale prices?
Yes. Search and product return price, sale_price and sale_text for multi-buy deals such as "2/$26.00 or 1/$13.99", plus coupon, promotion, loyalty_message and rebate as Walgreens writes them. Product adds savings_amount, savings_percent and an offers list with each offer's dates.
How much does Walgreens data cost with Scavio?
Search, product and stores cost 2 credits a call and stock costs 4 for up to 20 stores: about $0.004 and $0.008 on the Growth plan billed yearly. New accounts get 50 free credits with no card.