September 23, 2026 · 13 min read
Walgreens Scraper: 100% Success Rate for Retail Data (2026)
This scraper provides access to the Walgreens product catalog, returning detailed records for $0.005 per result. It extracts product pricing, member discounts, UPC, GTIN, and stock availability across 12 controls. It functions by querying public endpoints anonymously, meaning it does not return private pharmacy data, user-specific coupons, or prescription history. You can target specific physical locations by adjusting the storeId to see localized inventory. This tool is built for retail analysts and price monitoring professionals; it is not for users seeking to automate pharmacy checkouts or scrape restricted medical records.
What does a Walgreens Scraper run cost?
Each result costs $0.005 on the free tier, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.
| Apify plan | Per result | Per 1,000 results |
|---|---|---|
| FREE | $0.005 | $5.00 |
| BRONZE | $0.00433 | $4.33 |
| SILVER | $0.00367 | $3.67 |
| GOLD | $0.003 | $3.00 |
| PLATINUM | $0.003 | $3.00 |
| DIAMOND | $0.003 | $3.00 |
Pricing is set at $5.00 per 1,000 results on the free tier. The maxItems parameter is your primary cost driver, so always set a hard cap to prevent unexpected spending on broad search queries. To minimize costs while verifying data quality, run a single-product lookup using byProductIds before launching large category crawls.
How do you run Walgreens Scraper from the API?
The schema marks 1 of its 12 controls as required: mode. Every value in the payload below comes from the published schema's own prefills, which means you can paste it, swap the token, and get a real result.
Call the synchronous endpoint to start a run and receive dataset items in one request:
curl -X POST "https://api.apify.com/v2/acts/crawlerbros~walgreens-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"search","searchQuery":"vitamin c","productIds":[],"storeId":15196,"inStockOnly":false,"onSaleOnly":false,"maxItems":30}'
The same run from Python, using the official client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"mode": "search",
"searchQuery": "vitamin c",
"productIds": [],
"storeId": 15196,
"inStockOnly": False,
"onSaleOnly": False,
"maxItems": 30
}
run = client.actor("crawlerbros~walgreens-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
And from Node.js:
import { ApifyClient } from 'apify-client'
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
const input = {
"mode": "search",
"searchQuery": "vitamin c",
"productIds": [],
"storeId": 15196,
"inStockOnly": false,
"onSaleOnly": false,
"maxItems": 30
}
const run = await client.actor('crawlerbros~walgreens-scraper').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)
That endpoint blocks until the run completes. Fine while you are testing a handful of records, risky once a run takes minutes: a dropped connection loses the response even though the run itself finished. Switch to an asynchronous start with polling or a webhook before you schedule anything.
Which Walgreens Scraper inputs matter, and which can you skip?
The mode control is the only required input and dictates whether you fetch by keyword, category, or ID. For your first execution, keep the storeId at its default and avoid setting minRating or brand filters until you have confirmed the general result set meets your needs.
mode(string): What to fetch. Default:"search".searchQuery(string): Free-text keyword search, e.g.vitamin c,ibuprofen,sunscreen. Default:"vitamin c".categoryUrl(string): Full or relative Walgreens product-listing category URL (ends-tier2.../-tier3), e.g.https://www.walgreens.com/store/c/vitamin-c/ID=361635-tier3. Copy this from a specific category page on walgreens.com - not a top-level department page (-tier1), which lists subcategories rather than products.productIds(array): Walgreens product IDs (e.g.300405068,prod3511) or full product page URLs. Default:[].storeId(integer): Walgreens store ID used for local price/availability lookups. Leave as default for a representative US store; change if you need a specific store's pricing. Default:15196.minPrice(integer): Drop products priced below this.maxPrice(integer): Drop products priced above this.inStockOnly(boolean): Only emit products currently in stock (online). Default:false.brand(string): Exact brand name to keep, e.g.Nature Made,Walgreens. Case-insensitive.minRating(number): Only emit products with at least this average customer rating (0-5). Products without any reviews yet are kept.onSaleOnly(boolean): Only emit products Walgreens is currently marking as on clearance or at a new lower price. Default:false.maxItems(integer): Hard cap on emitted records. Default:30.
Fixed-choice controls: mode accepts search, byCategoryUrl, byProductIds.
Change a single control per run and diff the result against the last sample, sorting records into accepted, uncertain, and excluded. A control that increases volume without improving decision quality still bills at $0.005 per result.
What does Walgreens Scraper return?
Output records feature authoritative fields like regularPrice, upc, and inStock, making them ideal for inventory syncs. They conspicuously do not contain member-only coupon codes or per-store aisle locations. This ensures you are viewing public catalog data rather than restricted internal store maps.
The Actor does not publish a per-field output list, so treat the first run as the specification: collect a small sample and record which fields are present before anything downstream depends on them.
How do you build the workflow end to end?
Open Walgreens Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.
- Select byProductIds in the mode dropdown to run a fast, low-cost baseline test.
- Paste a single Walgreens item code like 300405068 into the productIds array and run the Actor.
- Review the resulting dataset to confirm the regularPrice and inStock boolean match the public product page.
- Switch the mode to search and enter a specific keyword like vitamin c in the searchQuery field.
- Set the maxItems limit to 30 to prevent the crawler from deep-paginating on your first exploratory run.
- Input a specific numeric storeId if you need to verify local pickupAvailable status for a specific zip code.
- Apply the onSaleOnly toggle to see if the recordType correctly identifies clearance items in the result set.
How do you apply it? Three worked playbooks
These are Walgreens Scraper's own documented use cases, each worked through as an operating pattern rather than a description.
Use case 1: Price monitoring
Outcome: track regular price, member price, and clearance status for pharmacy/health/beauty SKUs over time
Configure: Set mode to 'search', searchQuery to your target product category, and storeId to your local store's ID.
Working method: Execute a daily scheduled run and compare the regularPrice and memberPrice against the previous day's results.
Deliverable: A historical CSV of price fluctuations including clearance status markers.
Stop condition: The record count drops to zero for a known high-volume keyword.
Use case 2: Assortment & catalog research
Outcome: browse category pages to see everything Walgreens stocks in a department
Configure: Set mode to 'byCategoryUrl' and paste a leaf category URL ending in '-tier3'.
Working method: Fetch all products in a specific health department and export the tier1Category and tier2Category breadcrumbs to map the hierarchy.
Deliverable: A structured JSON list of every SKU currently listed within a specific Walgreens department.
Stop condition: The crawler returns only subcategory names instead of individual product records.
Use case 3: Competitive retail analysis
Outcome: compare pricing and promotions against other drugstore/grocery chains
Configure: Set mode to 'search', searchQuery to a broad category like 'shampoo', and enable the onSaleOnly flag.
Working method: Run the scraper and filter the output for products where isWalgreensBrand is true to compare private label pricing against national brands.
Deliverable: A competitive analysis report showing the price gap between brand-name items and Walgreens equivalents.
Stop condition: The returned records contain only national brands despite the private-label filter.
What breaks, and how do you design around it?
searchclicks through Walgreens' own results pagination (beyond the first page) to gather more product IDs whenmaxItemscalls for it, but for broad/popular keywords the site's own deeper result pages increasingly re-surface products already seen on earlier pages - so the actor may return fewer unique records thanmaxItemsonce it has exhausted what Walgreens' search UI actually offers as distinct results, rather than an error. Use a narrowersearchQuery(orbrand/minPrice/maxPrice) to reach a larger unique count.- For very broad single-word keywords with
maxItemsset near the 200 maximum, Walgreens' own ad/lazy-image-heavy results grid can also hit a headless-browser rendering limit a few pages in (typically after 80-90 unique products); the actor detects this cleanly and returns the records already gathered rather than erroring, timing out, or fabricating filler - re-run with a narrowersearchQueryif you need the full requested count. byCategoryUrlreads whatever product tiles Walgreens renders on the category page (including recommendation carousels); very large categories may not be fully covered in a single run - use a narrower subcategory URL, orbyProductIdsfor exact coverage of a known product list.- Coupon content (the
couponsearchendpoint with actual coupon codes/terms) requires a signed-in session and is out of scope;couponAvailable(whether a coupon exists at all) andrebateTextreflect publicly shown savings signals only. - Per-store aisle location and pharmacy-specific (prescription) data are not exposed by the public product API and are out of scope.
- The
urlfield on each product record is the correct, live walgreens.com product page - it opens normally in a browser. Walgreens' Akamai bot protection stalls or blocks direct HEAD/GET requests to product and category pages from non-browser clients (e.g.curl), independent of this actor; the actor itself reaches the same data through Walgreens' public product API rather than by rendering those pages.
If you hit the pagination limit on broad searches, split your requests into narrower search queries to reach unique items. When a category page is too large for a single crawl, provide the specific tier-3 leaf URLs directly to the categoryUrl field to ensure total coverage.
When should you not use Walgreens Scraper?
Do not use this Actor if your project requires pharmacy-specific data such as prescription drug costs, insurance co-pay estimators, or pharmacist availability. This information is considered out of scope as it is not exposed by the public product API. Furthermore, if you need to retrieve actual digital coupon codes for automated application at checkout, this scraper will fail as those require an authenticated user session. If you require hyper-local aisle coordinates for every product in a specific store, this tool will not suffice because such data is not provided. For projects needing deep inventory depth on a single keyword beyond 200 items, you should consider using a targeted brand-by-brand search rather than a generic broad category query.
What should you check before trusting the output?
- Check that upc is a 12-digit string and not null for retail inventory mapping.
- Verify that inStock is a boolean; do not rely on the shipAvailableMessage string which can be misleading.
- Stop the run if more than 20% of records are missing the regularPrice field.
- Ensure brand is not empty; Walgreens typically provides a specific brand name for every valid product record.
- Monitor that memberPrice is only present when it represents a discount from the regularPrice.
None of this proves a record is correct. It gives a scheduled Walgreens Scraper run defined points where it should stop instead of quietly passing bad data downstream.
Frequently asked questions
What is the cost of scraping 5,000 products from Walgreens?
At a rate of $5.00 per 1,000 results on the free tier, scraping 5,000 products would cost $25.00 in result charges, before run-start fees and platform usage. This is calculated based on the $0.005 per result price. You can lower the unit cost by moving to higher tier plans like Bronze or Silver.
Does this scraper provide the myWalgreens member price?
Yes. The scraper returns a memberPrice field whenever it differs from the regularPrice. This allows you to track loyalty program discounts alongside standard retail prices for competitive analysis and member-only deal monitoring.
Can I check if a product is available for pickup at a specific store?
Yes. By providing a numeric storeId, the scraper returns the pickupAvailable and inStock booleans for that specific location. This is useful for building local availability trackers or store-specific inventory alerts.
Why do some products lack an ingredients or nutrition list?
The scraper only returns ingredients and nutritionFacts for products that Walgreens explicitly publishes this data for, typically supplements and over-the-counter drugs. If the data is not on the public page, the field is omitted from the output.
How do I avoid getting blocked by Walgreens when scraping?
The Actor automatically manages its connection to the Walgreens API. It attempts a fast JSON fetch first and only falls back to a headless browser if it detects a challenge. This built-in logic ensures high success rates without manual proxy management.
Where to go next
Start with the Walgreens Scraper Actor page for the current input schema, pricing tier, and run history.
If you are comparing approaches rather than committing to one Actor, these category pages list every option we publish:
- Search results scrapers covers 11 Actors in this family.
- Product and price scrapers covers 378 Actors in this family.
Readers running Walgreens Scraper commonly pair it with:
- Wiggle Scraper Scrape Wiggle (wiggle.com) - cycling, running, swimming, and outdoor gear e-commerce.
- Decathlon Scraper Scrape Decathlon US (decathlon.com) sporting-goods catalog.
- Wholesale Marine Scraper Scrape Wholesale Marine (wholesalemarine.com) - boat parts, propellers, covers, electronics, trailer parts, and outdoor gear.
- KaTom Restaurant Supply Scraper Scrape KaTom Restaurant Supply (katom.com) - a national wholesale commercial kitchen equipment retailer.
- World Market Product Scraper Scrape Cost Plus World Market (worldmarket.com) - a major US home decor, furniture, and specialty food retailer.
- Nike Scraper Scrape Nike.com's public product catalog - search by keyword or style code, browse 39 curated categories (shoes, clothing, accessories, sale), or fetch full product-page details (description, sizes, images) by URL.
- Sam Ash Music Scraper Scrape Sam Ash Music (samash.com) - search or browse musical instruments and gear by category, brand, price, and stock status, or look up exact products by SKU.
- REI Product Scraper Scrape live outdoor gear, apparel, and footwear listings from REI.com - search by keyword, browse by category or brand, or look up full product detail (price, member price, rating, images) by URL.
Related guides:
- Blick Art Materials Scraper: Pull Data from 237 Categories (2026)
- Gymshark Scraper: 3 Practical Use Cases & Operational Playbooks
- Boohoo Fashion Scraper: 3 Practical Use Cases
- Redbubble Scraper: 3 Practical Use Cases and Workflow Guide
Resources
Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-23.
Actor last updated by its maintainers on 2026-08-03.
Run outcome figures cover the 30 day public window ending 2026-09-23.
● Featured actors
Walgreens Scraper
Scrape Walgreens.com's product catalog. Search by keyword, browse any category/department page, or fetch specific products by product ID/URL. Get price, member price, brand, UPC/GTIN, stock & shipping status, images, description and category breadcrumb.
Run on Apify ↗