Grocery Product Scraper for Instacart avatar

Grocery Product Scraper for Instacart

Pricing

from $5.00 / 1,000 products

Go to Apify Store
Grocery Product Scraper for Instacart

Grocery Product Scraper for Instacart

Scrapes product details, retailer storefronts and cross-retailer search results from instacart.com. Independent tool, not affiliated with or endorsed by Instacart.

Pricing

from $5.00 / 1,000 products

Rating

0.0

(0)

Developer

FalconScrape

FalconScrape

Maintained by Community

Actor stats

1

Bookmarked

62

Total users

13

Monthly active users

3 days ago

Last modified

Share

🛒 Instacart Scraper: Grocery Prices by Store and ZIP

Export Instacart prices and product data as clean JSON, CSV or Excel. The Grocery Product Scraper for Instacart returns each product's name, brand, size, image, price, regular price and stock status from product pages, retailer storefronts (Costco, Safeway, Walmart, Target, Sprouts, Kroger, Aldi, Publix, Wegmans and other Instacart retailers) and cross-retailer search. Its price grid mode prices the same products at the store that serves each US ZIP code. Use it for grocery price comparison, as a grocery price tracker, or as a practical alternative to an Instacart API.

🎯 Use Cases

  • Compare grocery prices across retailers: run one search or a list of product IDs against Costco, Walmart, Safeway, Target and Kroger, and line the prices up side by side.
  • Grocery price tracker: schedule a daily run on a fixed list of products and build your own price history.
  • Costco and Walmart grocery prices by city: use price grid mode to see what one product costs in New York, Chicago, Seattle or Phoenix.
  • Promotion and discount monitoring: fullPriceString holds the regular price whenever an item is on sale, so you can spot discounts at once.
  • Instacart dataset building: turn storefronts and searches into a product catalog with images, brands and sizes for analytics or a recommender.
  • Food price monitoring: follow staples like milk, eggs and bread across markets for research or reporting.

✨ Features

  • Product data: name, brand, size, image, product URL, price as a number, price string, regular price when on sale, currency, stock status and attribute badges (Organic, Gluten-free, Non-GMO and similar).
  • Three sources in one run: product pages, retailer storefronts (about 32 featured items per store) and cross-retailer search (about 14 items per query, mixed retailers).
  • Many retailers per run: sweep Costco, Safeway, Walmart, Target, Sprouts and any other Instacart retailer in a single run, or seed every storefront linked from the Instacart home page.
  • Price grid by ZIP: give product IDs, retailers and ZIP codes, and get each product's real price and stock at the store that serves each ZIP. Grid rows add the city (place), the store location ID, the delivery zone, the service type and the unit price.
  • Honest coverage: when a retailer doesn't deliver to a ZIP, the ZIP is outside Instacart, or the store doesn't carry the product, that cell is not charged. It is listed in the GRID_COVERAGE key-value record and never filled with another market's price.
  • No duplicates: a product that appears in several storefront carousels or in two searches at the same shop is saved and billed once.
  • Max items respected: the run stops at your maxItems limit, even with many pages loading at once.

🛠️ How It Works

  1. Add your inputs: any mix of Instacart URLs, retailer slugs, search queries and product IDs. Add ZIP codes for price grid mode.
  2. Run the Actor: it visits each page and saves one record per product.
  3. Download the dataset as JSON, CSV or Excel, or pull it through the Apify API.

⚙️ Input

All fields are optional. Combine them freely: for example, three retailer storefronts plus a few product IDs in one run.

FieldWhat it does
Start URLs (startUrls)Any Instacart URLs: product pages (/products/...), retailer storefronts (/store/{retailer}) or cross-retailer search (/store/s?k=...). Other Instacart URLs are skipped.
Retailer slugs (retailerSlugs)Retailers to scrape as storefronts, e.g. costco, safeway, target. In grid mode these are the retailers priced in each ZIP.
Search queries (searchQueries)Free-text queries run against the cross-retailer search. The first results page is saved (about 14 items per query).
Product IDs (productIds)Instacart product IDs, the number at the start of a product URL (/products/31895-... is 31895). In grid mode these are the products priced in each ZIP.
Default retailer slug (defaultRetailerSlug)Retailer used when fetching productIds. Leave empty for Instacart's default market.
Seed retailers from Instacart home (seedFromHome)If true, scrapes every retailer storefront linked from the Instacart home page. Default false.
Postal code (postalCode)Not applied to product page, storefront and search rows: Instacart prices those pages for its default location, 94105 (San Francisco), and each row's postalCode says which ZIP it was priced for. For real per-ZIP prices use Postal codes.
Postal codes (postalCodes)Price grid mode. Every product ID × ZIP × retailer (retailerSlugs, or defaultRetailerSlug) is priced at the store serving that ZIP. One row per priced cell (source: "grid"). Unpriced cells are free and listed in GRID_COVERAGE.
Max items (maxItems)Stop after this many products. Default 50; 0 = unlimited.

Storefront, search and product example:

{
"startUrls": [{ "url": "https://www.instacart.com/products/7079-lucerne-dairy-farms-milk-128-oz?retailerSlug=safeway" }],
"retailerSlugs": ["costco", "safeway"],
"searchQueries": ["milk", "eggs"],
"maxItems": 100
}

Price grid example

{
"productIds": ["31895", "18848274"],
"retailerSlugs": ["costco"],
"postalCodes": ["94105", "10001", "60601", "98101", "85004"]
}

This returns up to 10 rows, one per product and ZIP. Grid mode needs at least one product ID and one retailer.

💰 Pricing

Pay only for the products you get. No monthly rental.

EventPriceWhat you get
Product$0.005 per product ($5.00 per 1,000)One product row with all fields below, from any source (product page, storefront, search or grid)
Actor start$0.00005 per runCharged once when the run starts (one event per GB of memory; the default 1 GB = one event).

Examples:

  • The prefilled input (one product page, the Costco storefront and a "milk" search) returns about 47 products = $0.235.
  • A price grid of 20 products × 10 ZIPs × 1 retailer = up to 200 rows = up to $1.00. Unpriced cells cost nothing.
  • 1,000 products = $5.00.

📊 Sample Output Data

A price grid row (real output, Costco in Manhattan):

{
"id": "items_284-31895",
"productId": "31895",
"retailerSlug": "costco",
"retailerId": "5",
"shopId": "968",
"url": "https://www.instacart.com/products/31895-honey-nut-cheerios-cereal-with-oats-gluten-free-27-5-oz?retailerSlug=costco",
"name": "General Mills, Cheerios Cereal, Honey Nut, 27.5 oz, 2-count",
"brand": "General Mills",
"size": "each",
"image": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/large_4472557b-f5b8-44a0-90cc-5c7f68461551.jpg",
"category": "Cereal",
"description": null,
"price": 8.45,
"priceString": "$8.45",
"fullPriceString": "$10.65",
"priceCurrency": "USD",
"availability": "highly_in_stock",
"dietaryAttributes": ["Gluten-free"],
"source": "grid",
"postalCode": "10001",
"scrapedAt": "2026-10-20T17:46:38.863Z",
"place": "Manhattan, NY",
"zoneId": "18",
"retailerLocationId": "284",
"serviceType": "delivery",
"pricePerUnitString": "$2.66 each"
}

Every row has the same core fields; source tells you where it came from (pdp, storefront, search or grid). fullPriceString is the regular price and is filled only when the item is on sale (price is then the sale price). place, zoneId, retailerLocationId, serviceType and pricePerUnitString appear on grid rows only.

availability uses one vocabulary for every source: highly_in_stock (many in stock), in_stock, low_stock and out_of_stock. dietaryAttributes lists the attribute badges Instacart shows on the product (for example Organic, Gluten-free, Non-GMO, 2%) and is empty when the product has none. brand is the brand's display name on product page rows; on storefront, search and grid rows Instacart only gives a lowercase brand, so it is title-cased (Kirkland Signature), and a rare acronym brand may come out as Kfc instead of KFC.

🔁 Schedule and Integrate Your Grocery Price Tracker

For price tracking, run it once a day with the same product IDs, retailers and ZIP codes: every run is a dated snapshot, and together they form your price history. Weekly runs are enough for broad catalog or food price studies. Set it up in Apify Schedules, then send the results to Google Sheets, Zapier, Make, n8n or a webhook with Apify integrations, so new prices land where your team already works.

🤖 Use with AI Agents (MCP)

This Actor works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (https://mcp.apify.com). An agent can call it with:

{ "searchQueries": ["oat milk"], "maxItems": 20 }

❓ Instacart API and Price FAQ

Does Instacart have an official API? Instacart's Developer Platform lets approved partners build shoppable recipe and shopping-list pages that link to Instacart, and its Connect APIs are for retailers and partners building ordering and fulfillment experiences. Both need an application and approval, and neither is an open feed of product prices by store. This Actor needs no key or account and returns the public product data a shopper sees: prices, regular prices, sizes, brands and stock status, per retailer and per ZIP.

Do I need an Instacart account? No. The Actor works without logging in.

How do I compare grocery prices by ZIP code? Use price grid mode: list the product IDs, the retailers (for example costco and safeway) and the ZIP codes. You get one row per product, retailer and ZIP, priced at the store that serves that ZIP. Product page, storefront and search rows are priced for Instacart's default location (San Francisco, 94105), whatever you put in Postal code; their postalCode field shows that ZIP, and the run's status message says so.

Are Instacart prices the same as in-store prices? Not always. Retailers set their own Instacart prices, and some price items higher on Instacart than in their stores. This Actor returns the price Instacart shows, so you can compare it with your own in-store checks.

Why is a field empty? category is filled on product page and grid rows, and description on product page rows only. fullPriceString is empty when the item isn't on sale. dietaryAttributes is an empty list when Instacart shows no attribute badges for the product. retailerSlug, retailerId and shopId are filled on every row.

Are there limits? Storefronts return about 32 featured items per store and search returns the first results page (about 14 items per query). One run handles up to about 1,000 pages, or more when your input is larger; if the limit is hit, the run says so and you can split the input across runs. Price grid mode takes US ZIP codes; a ZIP that can't be priced comes back as an unpriced, free cell in GRID_COVERAGE.

⚖️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Instacart or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.