Tony Wang6 min readHow to Scrape Instacart in 2026 (API & Python)
Scrape Instacart in 2026 — nearby stores, live product pricing, and search suggestions as structured JSON — DIY, no-code, or a structured API.
The fastest way to scrape Instacart in 2026 is to call a structured API that returns normalized JSON — nearby stores, live product pricing, search suggestions, department categories, and trending terms — instead of parsing Instacart's rendered pages yourself. Instacart's own APIs don't fill this gap: they're built for app integrations and retailer partners, not third-party data access. This guide covers all three approaches, what each returns, where DIY breaks, and the legal reality up front.
Why scrape Instacart?
Instacart aggregates thousands of grocery, retail, and pharmacy storefronts into one delivery platform, which makes its data useful for:
- Grocery price and availability monitoring — track how a product's price, sale status, and stock level move at a specific store over time.
- Store coverage and delivery-ETA tracking — see which retailers serve a postal code, whether they accept EBT, and how fast they deliver.
- Product search and category research — see what shoppers search for near a location and how a store organizes its department taxonomy.
- Market-basket and CPG research — compare the same product's price and promotion across nearby stores and chains.
Is it legal to scrape Instacart?
Option 1: DIY in Python (and why it breaks)
Instacart's storefront pages render from an internal API behind the site's own JavaScript app, so a DIY scraper ends up reverse-engineering that internal API rather than parsing clean HTML:
import requests
# Instacart's storefront pages call an internal API scoped to a
# specific postal code and store — there's no stable public endpoint
resp = requests.get("https://www.instacart.com/store/safeway/storefront")
It demos and then breaks:
- No public API for third-party data access. The Instacart Developer Platform (IDP) is for embedding a shoppable Instacart checkout link in another app — it hands back a landing-page URL, not product data. Instacart Connect is for retailer partners pushing their own store's inventory into Instacart. Neither grants an outside researcher read access to Instacart's data.
- Everything is location- and store-scoped. Pricing, availability, and even search suggestions are tied to a postal code and a specific store's
shop_id— there's no single "Instacart catalog" response to fetch once. robots.txtand Terms explicitly restrict scraping. Instacart's Terms bar automated scraping/data mining, androbots.txtdisallows the API path and most storefront browse/item paths for crawlers.- Drifting internal schema and anti-bot defenses. The private storefront API's response shape changes without notice, and repeated automated requests draw rate limits.
Option 2: No-code tools
Marketplace "Instacart scraper" actors exist for one-off pulls of a store's listing or a single search, but they inherit the same internal-API fragility as DIY and carry the same Terms exposure.
Option 3: A structured Instacart API
For a repeatable workflow, an Instacart scraping API returns normalized JSON for store discovery, product detail, search, and categories — no login, cookie, or Instacart account required. Find stores near a postal code:
curl "https://api.crawlora.net/api/v1/instacart/stores?postal_code=94105" \
-H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"postal_code": "94105",
"stores": [
{
"shop_id": "9501",
"retailer_location_id": "53",
"retailer_id": "1",
"name": "Safeway",
"slug": "safeway",
"retailer_type": "Grocery - Traditional",
"service_type": "delivery",
"accepts_ebt": true,
"delivery_eta": "By 4:45am"
}
]
}
}
Once you have a store's shop_id and slug, search suggestions are also postal-code scoped — either within that one store or across every nearby retailer at once:
curl "https://api.crawlora.net/api/v1/instacart/search-nearby?postal_code=94105&q=milk" \
-H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"postal_code": "94105",
"query": "milk",
"suggestions": [
{ "term": "milk", "thumbnail_url": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/thumb_b4aaab37-66cf-46e3-9638-f37987fca803.jpg" },
{ "term": "almond milk", "thumbnail_url": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/thumb_example.jpg" }
]
}
}
Then pull a specific product's live price, stock, and nutrition at that store in Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/instacart"
loc = {"shop_id": "9501", "store_slug": "safeway", "postal_code": "94105"}
stores = requests.get(f"{base}/stores", headers=h, params={"postal_code": "94105"}).json()["data"]["stores"]
item = requests.get(f"{base}/item", headers=h, params={
**loc,
"retailer_location_id": "53",
"product_id": "17830663",
}).json()["data"]
An item response is normalized JSON you can store directly (real fields):
{
"id": "items_53-17830663",
"product_id": "17830663",
"name": "Lucerne Blended Plain Yogurt",
"size": "32 oz",
"brand_name": "lucerne",
"price": {
"current_price": 2.99,
"regular_price": 3.99,
"on_sale": true,
"offer_label": "25% off",
"pricing_unit": "32 oz"
},
"available": true,
"stock_level": "inStock",
"dietary_labels": ["low_carb", "low_sugar"],
"nutrition": [
{ "label": "Protein", "value": "7", "unit": "g" },
{ "label": "Calories", "value": "150" }
]
}
Beyond these, the same key reaches /instacart/departments (a store's category/subcategory taxonomy, scoped by shop_id/store_slug/postal_code), /instacart/search (autocomplete suggestions scoped to one store via shop_id/store_slug/q), and /instacart/trending (popular search terms near a postal_code, no store required). Store one row per product per pull, keyed by product_id and shop_id, and re-run on a schedule to track current_price/on_sale changes.
What you can collect
Public storefront data: nearby stores (shop_id, retailer_location_id, name, retailer type, service type, EBT acceptance, delivery ETA); product detail at a specific store (name, brand, size, current/regular price, sale status and offer label, availability, stock level, dietary labels, nutrition facts); search and autocomplete suggestion terms (within one store or across every nearby retailer); a store's department and subcategory taxonomy; and trending search terms by postal code. Public product-page data only — not personal shopper, customer, or order information.
Limitations and common challenges
- No product-catalog enumeration endpoint. Search and search-nearby return typeahead suggestion terms, not a paginated list of matching products with ids — resolving a
product_idfor/instacart/itemtakes a known SKU or another discovery step, not a single search call. - Store-specific, not chain-wide. A
shop_idaddresses one retailer's storefront in one location — the same chain in a different postal code is a differentshop_idwith its own pricing and availability. - Pricing is a moving target.
current_priceandon_salechange frequently; treat any pull as a point-in-time snapshot and re-run on a schedule for trend data. - No official channel for this exact use case. Instacart's own developer offerings (IDP, Connect) solve app-embedding and retailer-inventory sync, not third-party read access — plan around a structured API rather than waiting on an official one.
Where this gets used
- Grocery price and availability monitoring — track
current_price,on_sale, andstock_levelfor a product at a specific store over time. See the ecommerce product intelligence use case. - Store coverage and delivery-ETA tracking — map which retailers serve a postal code and how fast they deliver.
- Product search and category research — pair
/instacart/trendingand department taxonomy to see what's searched versus how a store organizes its catalog.
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Test the stores and item endpoints in the Playground, check the schema in the API docs, and review pricing. See also how to scrape DoorDash and how to scrape Costco for adjacent grocery and delivery patterns, how to scrape Uber Eats for the restaurant-delivery side of the same on-demand market, plus is web scraping legal.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Does Instacart have a public API for scraping product or price data?
No. The Instacart Developer Platform is for app developers embedding a shoppable checkout link (it doesn't return product data), and Instacart Connect is for retailer partners syncing their own inventory into Instacart — neither grants third-party read access to Instacart's storefront data.
How do I find Instacart stores near a location with an API?
Send a postal code to /instacart/stores and get nearby retailer storefronts back as structured JSON — name, shop_id, EBT acceptance, and delivery ETA.
Can I get live pricing for an Instacart product?
Yes — /instacart/item returns a product's current price, any active sale, stock level, and nutrition facts at a specific store as structured JSON, given a shop_id and product_id.
Why does the same product have different prices in Instacart data?
Pricing and availability are scoped to a specific store's shop_id in a specific postal code, not a single national catalog — the same product at two different stores (or the same chain in two ZIP codes) can return different price and stock_level values.
Does Instacart's search endpoint return a list of matching products?
No — /instacart/search and /instacart/search-nearby return autocomplete suggestion terms (with thumbnails), not a paginated list of product ids. Resolving a product_id for full detail takes a known SKU or another discovery step.
Is it legal to scrape Instacart?
Product facts aren't copyrightable and accessing public data isn't a CFAA violation per hiQ v. LinkedIn, but Instacart's Terms of Service explicitly prohibit automated scraping/data mining, and robots.txt disallows the API path and most storefront browse/item paths — treat this as a real restriction, not a formality.
Does the Instacart API require an account or login?
No Instacart account or login is required from the caller — only an API key.