Instacart Product Intelligence — Price & Stock Tracker
Pricing
from $5.00 / 1,000 results
Instacart Product Intelligence — Price & Stock Tracker
Scrape real-time product prices, stock levels, promotions, and ratings from Instacart across any US ZIP code. Reveals geographic price discrimination. Normalized output for analytics pipelines and price monitoring.
Pricing
from $5.00 / 1,000 results
Rating
5.0
(1)
Developer
Shubham Nayak
Actor stats
2
Bookmarked
2
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Instacart Scraper — Real-Time Price, Stock & Promotions by ZIP Code
Extract real-time product prices, stock levels, promotions, nutrition facts, and ratings from Instacart across any US ZIP code. The only Instacart scraper that sets the delivery address inside the browser session — so prices reflect what a real customer at that location would see, not a default warehouse price.
What This Instacart Scraper Does
Three collection modes, one actor:
| Mode | Use Case |
|---|---|
search | Keyword search results across one or more ZIP codes |
category | Bulk-harvest an entire store aisle (produce, dairy, beverages…) |
product-details | Monitor a fixed list of product URLs for price/stock changes |
Every run sets the Instacart delivery address inside the browser session before collecting data — so prices reflect what a real customer at that ZIP code would see, not a default warehouse price.
Key Features
- ZIP-accurate pricing — Sets the delivery address UI per session; reveals geographic price discrimination across markets.
- Multi-ZIP in one run — Pass multiple ZIP codes; each runs as an independent browser session with its own location context.
- Retailer slug URL support —
product-detailsmode accepts both plain product URLs and?retailerSlug=URLs, automatically rendering the retailer-specific product page. - Full detail extraction — Nutrition facts (structured), ingredients, directions, price variants (all sizes), and up to 10 product images per product.
- Session-pool deduplication — Up to 50 browser sessions; each session's ZIP setting is cached in Key-Value Store to avoid redundant location UI interactions.
- Infinite-scroll support — Follows Instacart's lazy-load pagination with configurable
maxItemscap and stale-page detection. - Production stealth — Randomised viewport, suppressed
navigator.webdriver, human-like delays (800–2 300 ms), and smart resource blocking (fonts, analytics, third-party pixels blocked; CDN images allowed). - Pay-per-result billing — Charged only for products actually pushed to the dataset.
Use Cases
| Who | How They Use It |
|---|---|
| CPG & FMCG brands | Monitor competitor pricing across Safeway, Kroger, Publix by ZIP — detect regional promotions before they reach national reports |
| Price intelligence platforms | Feed daily Instacart snapshots into dashboards alongside Amazon Fresh and Walmart data |
| Retail analysts | Track stock availability and promotion frequency across store chains in different metro areas |
| E-commerce researchers | Extract full nutrition and ingredient data for product database enrichment |
| Algorithmic pricing teams | Set up hourly product-details runs on SKU watchlists; trigger repricing workflows via Apify webhooks |
Input
{"zipCodes": ["10001", "94105"],"mode": "search","queries": ["organic milk", "sourdough bread"],"store": "safeway","maxItems": 100,"maxConcurrency": 2,"headless": true}
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
zipCodes | string[] | Yes | — | One or more US ZIP codes. Each ZIP runs as an independent browser session. |
mode | string | No | "search" | "search", "category", or "product-details". |
queries | string[] | No | [] | Search keywords (mode=search) or category slugs (mode=category). |
startUrls | object[] | No | [] | [{"url":"https://..."}] — product URLs for mode=product-details. Supports ?retailerSlug= params. |
store | string | No | "fairway" | Instacart store slug, e.g. "safeway", "publix", "kroger". |
maxItems | integer | No | 0 | Max products per ZIP + query. 0 = unlimited. |
maxConcurrency | integer | No | 2 | Parallel browser sessions. Keep ≤ 4 without proxies. |
enrichmentConcurrency | integer | No | 3 | Detail-page tabs opened simultaneously per listing (not separate browsers). |
maxRequestRetries | integer | No | 3 | Retry attempts per URL before marking failed. |
headless | boolean | No | true | Set false to watch the browser during local testing. |
proxyConfiguration | object | No | — | Apify proxy config. Residential proxies recommended for multi-ZIP runs. |
Mode Examples
Search — price-track across markets
{"zipCodes": ["10001", "30301", "77001"],"mode": "search","queries": ["oat milk", "Greek yogurt"],"store": "publix","maxItems": 50}
Category — bulk aisle harvest
{"zipCodes": ["10001"],"mode": "category","queries": ["produce", "dairy-eggs", "beverages"],"store": "safeway"}
Product details — daily price monitor
{"zipCodes": ["94105"],"mode": "product-details","store": "safeway","startUrls": [{ "url": "https://www.instacart.com/products/42309-pepsi-cola-12-fl-oz" },{ "url": "https://www.instacart.com/products/2823570-red-bull-energy-drink-8-4-fl-oz?retailerSlug=safeway" }]}
Output
Each product is pushed as a flat JSON object to the Apify Dataset.
{"product_id": "16914182","source": "instacart","scrape_mode": "search","store": "safeway","landing_param": "16914182-s-pellegrino-sparkling-natural-mineral-water-33-8-oza","name": "san pellegrino sparkling natural mineral water","brand_name": "san pellegrino","current_price": 2.88,"original_price": 3.45,"price_per_unit": "$0.09/fl oz","stock_status": "inStock","promotion_flag": true,"promotion_label": "17% off","size": "1 L","image_url": "https://www.instacart.com/assets/domains/product-image/file/large_b5a770a4-bd8c-4e45-af58-7c0617822d9f.jpg","product_images": ["https://www.instacart.com/assets/domains/product-image/file/large_b5a770a4-bd8c-4e45-af58-7c0617822d9f.jpg","https://www.instacart.com/assets/domains/product-image/file/large_08273d14-d24a-404d-910b-61e0a0e99afc.jpg","https://www.instacart.com/assets/domains/product-image/file/large_d99e54a0-b595-4a6d-b0e3-81d65e54989e.jpg","https://www.instacart.com/assets/domains/product-image/file/large_89edcfb1-ec71-4361-bf69-f4608b68664b.jpg","https://www.instacart.com/assets/domains/product-image/file/large_4c4ffc37-8ce4-4b72-b34c-130fe6bbd90a.jpg","https://www.instacart.com/assets/domains/product-image/file/large_fec8bb65-0d28-4b61-ae6f-783a7f6439c7.jpg"],"product_url": "https://www.instacart.com/products/16914182-s-pellegrino-sparkling-natural-mineral-water-33-8-oza?retailerSlug=safeway","added_tags": "Low sodium, Zero calories","geo_zip": "94105","scrape_timestamp": "2026-03-17T10:23:21.108Z","description": null,"details": "Embrace the spirit of Italian living with S.Pellegrino Sparkling Natural Mineral Water. While moving through the San Pellegrino Terme area at the foothills of the Italian Alps, this water mineralizes through contact with underground rocks, naturally enriching S.Pellegrino with mineral salts, calcium and magnesium. The addition of carbon dioxide to the Italian mineral water enhances S.Pellegrino, providing its unmistakable taste and gentle bubbles. S.Pellegrino sparkling water is low in sodium and contains zero calories with no artificial colors, flavors or sweeteners. Elevate your next homemade meal with this Italian sparkling mineral water, enjoy while you’re out on the town, or indulge during any of life’s delicious moments. Unflavored sparkling water perfectly complements the flavors of your favorite foods, making it a favorite of chefs and foodies alike. Enhance your moments with S.Pellegrino Sparkling Natural Mineral Water.\n• One 33.8 fl oz (1 L) plastic bottle of S.Pellegrino Sparkling Natural Mineral Water\n• This bottled sparkling water offers unmistakable taste and gentle bubbles\n• S.Pellegrino sparkling mineral water is low in sodium and contains zero calories with no artificial colors, flavors or sweeteners\n• Perfect for any of life’s delicious moments, this unflavored sparkling water complements the flavors of your favorite foods and is perfect for a night out on the town\n• This 1 liter sparkling water plastic bottle is ideal for use on the go","ingredients": "CARBONATED MINERAL WATER.","directions": "Keep In A Clean, Cool ,Dry And Odorless Place, Away From Direct Sunlight.","warnings": null,"nutrition": {"calories": 0,"total_fat": null,"saturated_fat": 0,"trans_fat": 0,"monounsaturated_fat": 0,"polyunsaturated_fat": 0,"cholesterol": null,"sodium": null,"carbohydrate": null,"fiber": 0,"sugars": 0,"protein": null,"serving_size": "12.00","servings_per_container": "About 3"},"price_variants": [{"size": "1 L","price": 2.88,"original_price": 3.45,"unit_price": "$0.09/fl oz","url": "/products/16914182?retailerSlug=safeway"},{"size": "6 x 16.9 fl oz","price": 9.99,"original_price": 10.99,"unit_price": "$0.10/fl oz","url": "/products/17020436?retailerSlug=safeway"},{"size": "12 x 25.3 fl oz","price": 29.19,"original_price": 30.29,"unit_price": "$0.10/fl oz","url": "/products/16523315?retailerSlug=safeway"},{"size": "25.3 fl oz","price": 2.88,"original_price": 3.45,"unit_price": "$0.11/fl oz","url": "/products/17074096?retailerSlug=safeway"}]}
Field Reference
| Field | Type | Notes |
|---|---|---|
product_id | string | Instacart numeric product ID |
source | string | Always "instacart" |
scrape_mode | string | "search", "category", or "product-details" |
store | string | Store slug from your input |
input_url | string|null | Original URL from startUrls (product-details mode only) |
landing_param | string | Full URL slug |
name | string | Product name (lowercase) |
current_price | number|null | Current or sale price |
original_price | number|null | Pre-sale price (only present when on promotion) |
price_per_unit | string|null | Unit price label as shown on site |
stock_status | string | inStock, outOfStock, lowStock, highlyInStock |
promotion_flag | boolean | true when original_price > current_price |
promotion_label | string|null | Deal badge text, e.g. "25% off" |
category_tree | object|null | Nested breadcrumb hierarchy |
size | string|null | Package size |
image_url | string|null | Primary product image (CDN URL) |
product_images | string[] | All carousel images (up to 10) |
product_url | string | Full product URL |
added_tags | string|null | Attribute badges, comma-separated |
rating | number|null | Star rating 0–5 |
reviews_count | integer|null | Total review count |
geo_zip | string | ZIP code used for price lookup |
scrape_timestamp | ISO8601 | UTC time the product was collected |
details | string|null | Full "Details" section text |
ingredients | string|null | Ingredients list |
directions | string|null | Usage or preparation directions |
warnings | string|null | Allergen and warning text |
nutrition | object|null | Structured nutrition facts |
price_variants | array|null | All size/price options for this product |
Mode-Specific Field Omissions
| Field | search | category | product-details |
|---|---|---|---|
brand_name | present | present | omitted |
input_url | omitted | omitted | present |
rating, reviews_count | omitted | present | present |
category_tree | omitted | present | present |
details / ingredients / nutrition / price_variants | omitted | omitted | present |
Pricing
Pay-per-result: $0.005 per product pushed to the dataset.
| Run size | Approx. cost |
|---|---|
| 1 ZIP × 5 queries (~250 products) | ~$0.13 |
| 3 ZIPs × 10 queries (~2,500 products) | ~$1.25 |
| 10 ZIPs × 1 full category (~5,000 products) | ~$2.50 |
| 20 categories × 5 ZIPs (~50,000 products) | ~$25.00 |
Compute costs (memory, runtime) are billed separately by Apify at standard rates. Use maxItems to cap dataset size during testing.
Scaling Guide
Small runs (testing, spot-checks)
{ "maxConcurrency": 1, "headless": false, "maxItems": 20 }
No proxy needed. Good for verifying output schema or a new store slug.
Medium runs (daily price tracking, 1–5 ZIPs)
{ "maxConcurrency": 3, "headless": true }
Apify's shared proxy is usually sufficient. Add residential proxies if you see challenge pages.
Large runs (10+ ZIPs, full category sweeps)
{"maxConcurrency": 5,"headless": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
High-frequency monitoring (hourly / near-real-time)
Use multiple actor runs scoped to subsets of ZIP codes, combined with Apify Scheduler. Keep maxItems tight (20–50) to control cost and runtime.
Supported Stores
Any Instacart store can be targeted using its URL slug. Common examples:
| Slug | Store |
|---|---|
safeway | Safeway |
publix | Publix |
kroger | Kroger |
aldi | ALDI |
costco | Costco |
whole-foods | Whole Foods Market |
sprouts | Sprouts |
fairway | Fairway Market |
albertsons | Albertsons |
vons | Vons |
Find the slug in any Instacart store URL:
https://www.instacart.com/store/**{slug}**/collections/produce
Challenge Handling
When Instacart serves a bot-detection challenge, the actor:
- Detects the challenge via page title and body text patterns.
- Retires the current browser session from the pool.
- Retries the request automatically (up to
maxRequestRetries) with a fresh session.
If all retries fail, the URL is logged as a failed request and the run continues without losing other data.
Frequently Asked Questions
Does this work for all Instacart stores?
Yes — any store available on Instacart can be targeted using its URL slug (e.g. safeway, kroger, whole-foods). Availability varies by ZIP code.
How accurate is the pricing data? Very accurate. The actor sets the Instacart delivery address inside the browser session before scraping, so it captures the exact price a real customer at that ZIP code would see — including ZIP-specific promotions and store-level pricing.
Can I scrape multiple ZIP codes in one run?
Yes. Pass an array of ZIP codes in zipCodes. Each ZIP gets its own isolated browser session with its own location context.
Does it handle pagination and infinite scroll?
Yes. The actor follows Instacart's lazy-load pagination and stops when maxItems is reached or no new products appear.
What if a product is out of stock?
The actor still collects the product with stock_status: "outOfStock". Stock status is one of: inStock, outOfStock, lowStock, highlyInStock.
Can I use this for price monitoring on a schedule? Yes. Use Apify Scheduler to run the actor on a cron schedule. Combine with webhooks to push data to your pipeline on each run completion.
Do I need proxies?
Not required for small runs. For 10+ ZIPs or high-frequency runs, residential proxies (via proxyConfiguration) reduce challenge page frequency.
Limitations
- Instacart requires a valid US ZIP code for price accuracy. Non-US ZIPs are not supported.
- Category slugs must match Instacart's internal collection names. Find the correct slug in an Instacart category page URL.
- Products behind a login wall (Buy Again, personal lists) are not accessible.
- The actor does not support checkout, cart, or any write operations.
Support & Feedback
Open an issue on GitHub or contact the actor author through the Apify Store.