Instacart Scraper - Grocery Prices, Unit Prices & Sizes
Pricing
from $1.00 / 1,000 run start fees
Instacart Scraper - Grocery Prices, Unit Prices & Sizes
Instacart scraper for grocery price data: pick a retailer such as Wegmans, Costco, Publix or Kroger and get every storefront product with name, USD price, unit price per lb or oz, pack size, image and an estimated-price flag. For price comparison, retail analysts and catalogue datasets.
Pricing
from $1.00 / 1,000 run start fees
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
a month ago
Last modified
Categories
Features
Share
Instacart Scraper - Grocery Prices by Retailer
Instacart Scraper collects grocery products and prices from Instacart retailer storefronts. Get product names, numeric USD prices, unit prices, pack sizes, images and a separate flag for estimated weight prices. Choose a retailer such as Wegmans, Costco, Publix or Kroger, or supply several Instacart store URLs, and download the result as JSON, CSV or Excel.
The output is suitable for comparing products across retailers, following the prices shown on storefronts and building a grocery price database. Product identifiers remain strings, so they can be stored and joined across runs without losing their original format. Every product includes its retailer and product URL. A product that appears at two retailers remains a separate row for each retailer.
What the Instacart scraper returns
One row per product card on the storefront, with these values:
- Product name and Instacart product ID, plus the product page URL.
- Current price in USD as a number, never as text with a dollar sign.
- Unit price and measure (for example 0.59 per lb) where the storefront shows one.
- Pack size or approximate weight as printed, such as
18 oz,20 ctorAbout 0.38 lb each. - Estimated-price flag for goods sold by weight, so loose produce is never read as a fixed price.
- Product image, the retailer slug and the position of the row in the run.
How to scrape Instacart
- Open the Actor and enter a retailer slug, for example
wegmans,costco,publixorkroger. The slug is the part after/store/in an Instacart storefront address. - Or paste one or more Instacart storefront URLs into Store URLs to collect several retailers in one run.
- Set Limit to the maximum number of products you want back, and start the run.
- Download the dataset as JSON, CSV, Excel or another format, or read it through the Apify API and integrations.
Instacart Scraper input
| Field | Type | Default | Meaning |
|---|---|---|---|
retailer | String | none (form prefills wegmans) | Retailer slug of one storefront |
store_urls | List of strings | none | Instacart store URLs; wins over retailer when not empty |
limit | Integer, 1–2000 | 100 | Maximum products returned across all storefronts |
retries | Integer, 1–8 | 4 | Fetch attempts per storefront |
Use a retailer slug for a single storefront. This measured input returned 39 products in the recorded run on 4 October 2026:
{"retailer":"wegmans","limit":100,"retries":4}
retailer is trimmed and converted to lowercase. The input form prefills Wegmans, but there is no default retailer for API requests. Provide retailer or store_urls; a completely empty input produces a successful empty run with an input error in the key-value store.
store_urls accepts Instacart store URLs and takes precedence over a retailer slug when the list is non-empty. It can contain multiple storefronts. The Actor also recognises a text list separated by whitespace, commas or semicolons where that input form is accepted. Each URL must belong to Instacart. Empty entries are ignored. Prefer storefront pages: an aisle or collection page may contain no product cards and therefore return nothing. This recorded input collected Publix and Kroger together and returned 74 products:
{"store_urls":["https://www.instacart.com/store/publix/storefront","https://www.instacart.com/store/kroger/storefront"],"limit":2000,"retries":6}
limit defaults to 100 and supports 1 to 2000 products across the supplied storefronts. It is a ceiling on returned rows, not a guarantee that the retailer exposes that many products. One storefront normally provides a selection of products. Raising the limit does not create additional products or promise complete catalogue coverage.
retries defaults to 4 and supports up to 8 fetch attempts per storefront. A missing storefront is reported without repeatedly requesting the same missing page. Other temporary failures can be retried. If one store cannot be collected, other supplied stores can still contribute products.
Output fields
Results are written to the default dataset, one row per product. Download them as JSON, CSV or other formats offered by the dataset. The original fields remain available:
| Field | Type and meaning |
|---|---|
product_id | String: Instacart product identifier |
name | String or null: product name |
price | Number or null: current USD price |
currency | String: USD |
is_estimated | Boolean: price is an estimate for goods sold by weight |
price_unit | String or null: what the price is per |
unit_price | Number or null: price per stated measure |
unit_measure | String or null: measure such as lb or oz |
size | String or null: printed size or approximate weight |
image | String or null: product image URL |
retailer | String or null: source retailer slug |
url | String: Instacart product URL |
position | Integer: position in the run, starting at 1 |
Additional fields provide source, fetched_at, country, title and image_url. title and image_url mirror the original name and image fields. Existing integrations can continue reading the original names. fetched_at is the UTC time at which the product was collected.
Instacart scraper output example
The following row was retrieved in the recorded Wegmans run; it is not a generated example:
{"product_id": "98106295","name": "Thomas’ Plain Bagels, 6 count, 18 oz","price": 5.19,"currency": "USD","is_estimated": false,"price_unit": null,"unit_price": null,"unit_measure": null,"size": "18 oz","image": "https://www.instacart.com/image-server/197x197/filters:fill(FFFFFF,true):format(jpg)/d2lnr5mha7bycj.cloudfront.net/product-image/file/large_8ff4ba9f-0c42-4707-a51c-fbe981cd66a2.jpeg","retailer": "wegmans","url": "https://www.instacart.com/products/98106295-thomas-plain-bagels-18-oz","position": 1,"source": "instacart-scraper","country": "US","title": "Thomas’ Plain Bagels, 6 count, 18 oz","image_url": "https://www.instacart.com/image-server/197x197/filters:fill(FFFFFF,true):format(jpg)/d2lnr5mha7bycj.cloudfront.net/product-image/file/large_8ff4ba9f-0c42-4707-a51c-fbe981cd66a2.jpeg","fetched_at": "2026-10-04T13:55:24.263Z"}
The same run also returned this produce item, sold by weight (selected fields). Its price is an estimate against an assumed weight, and the unit price per pound is the figure to compare:
{"product_id": "2748189","name": "Bananas, Sold by the Each","price": 0.22,"currency": "USD","is_estimated": true,"price_unit": "each (estimated)","unit_price": 0.59,"unit_measure": "lb","size": "About 0.38 lb each","retailer": "wegmans","url": "https://www.instacart.com/products/2748189-banana-each","position": 31}
Missing source values remain null. A missing price is never replaced by zero or a guessed amount. Prices are read from the storefront's accessibility text, which states both the amount and any qualification. is_estimated: true identifies prices calculated against an assumed weight, such as loose produce. Use unit_price, unit_measure and size alongside that flag when comparing those products.
Summary and errors
The default key-value store contains summary, including products returned, storefronts fetched, price coverage, estimated-price counts, elapsed collection time and error count. The keys are productsReturned, storefrontsFetched, withPrice, withUnitPrice, estimatedPrices, estimatedNote, fetchedInSeconds and errorCount. The keys accessNote, exitCountry, proxyConfigured and proxyPinnable are technical run notes kept so existing integrations keep working. If a supplied store fails while another succeeds, the returned products remain in the dataset and the errors record describes the failures as a list of code and message.
A missing retailer, invalid input or page without usable products results in a successful empty Actor run. The error record explains what happened, with codes such as bad_input, fetch_failed and no_products. Empty runs return no product rows. A fully unsuccessful collection keeps the first source error, matching the existing Actor behaviour. The additional OUTPUT record reports delivery counts and charged events.
Use cases
- Grocery price comparison. Collect the same storefront selection from Wegmans, Publix and Kroger and compare prices per product, or per pound and ounce with the unit price fields.
- Instacart prices vs in store. Pair the storefront price with your own shelf observations to see where Instacart prices are higher, for example at Costco.
- Price monitoring. Schedule a daily or weekly run and keep the history, so you can see when a product's price changes on a retailer's storefront.
- Grocery price data for analysis. Build a grocery price database for retail analytics, inflation tracking, assortment studies or a consumer price project.
- Catalogue enrichment. Use names, sizes, images and product URLs to match your own product list to Instacart listings.
Instacart scraper vs other ways to get Instacart data
| Option | What you get | Good for |
|---|---|---|
| This Actor | Storefront products with price, unit price, size, image and estimate flag, as a dataset | Price and catalogue data per retailer, without code |
| Instacart Connect and Developer Platform APIs | Ordering, fulfilment and shopping-list integrations for approved partners | Retailers and apps that build on Instacart checkout |
| Public Instacart datasets | Historical order or basket datasets published for research | Machine-learning studies, not current prices |
| Writing your own scraper | Whatever you build and maintain | Teams that want full control and can maintain it |
| Other Store Actors | Varies by Actor; some offer ZIP-based prices or retailer lists | Compare fields and prices before choosing |
The official Instacart API is meant for partners who place orders or connect a store; it does not offer a public price feed. This Actor reads the public storefront pages and turns them into structured rows, so you can start from a retailer name and get grocery prices in minutes.
Pricing
The existing price is $0.001 per run plus $0.0015 per returned product. The run-start event is charged once, including runs with invalid input or no products. The product event counts only rows actually delivered to the dataset. Empty results incur no product events. Collecting several storefronts does not create an additional start fee for each storefront.
Two recorded examples: the Wegmans run with 39 products costs $0.001 + 39 × $0.0015 = $0.0595. The Publix and Kroger run with 74 products costs $0.001 + 74 × $0.0015 = $0.112. A run for a retailer that does not exist returns nothing and costs only the $0.001 start fee.
Users without a paid Apify plan receive at most ten product rows per run. Product events are charged only for those delivered rows. Users with a paid plan retain the requested limit. Apify's own platform usage is shown separately in the run details.
FAQ
Does limit 100 guarantee 100 products?
No. The limit is a ceiling across storefronts. The source's current product selection determines the available count. A recorded Costco run with limit 25 returned 23 products; the Actor kept those real products rather than filling the gap. Counts can change across runs as the storefront selection changes.
Are these checkout prices for a particular postcode?
The Actor reads prices displayed by the supplied storefront pages. It does not promise checkout totals, personalised delivery-location prices, delivery fees or inventory for a particular address. It also does not claim UPC or GTIN identifiers that the product cards do not expose.
Why are some prices estimated?
Goods sold by weight can display an amount based on an assumed weight. The estimate flag and price-unit text preserve that qualification. Treat an estimated amount as an estimate, and compare price per measure where the source provides it.
Can I use aisle and collection URLs?
You can provide Instacart URLs, but those pages may contain no usable product cards. The recorded Wegmans produce collection returned no products. Storefront URLs are the proven input for product collection; complete aisle or catalogue coverage is not promised.
What happens if a storefront fails?
A failure is recorded with a code and an English message. Other supplied stores can still return products. When nothing can be returned, the run succeeds with an empty dataset and an error record. The existing start fee still applies, while the product count remains zero.
Does Instacart have an API for prices?
Instacart offers APIs for partners who integrate ordering and fulfilment, not a public price feed. This Instacart scraper gives you the prices shown on public storefronts as structured data instead.
Which retailers can I scrape?
Any retailer with an Instacart storefront whose slug you can see in the address, such as wegmans, costco, publix or kroger. A slug that does not exist returns a successful empty run with a fetch_failed error.
Is it legal to scrape Instacart?
The Actor collects publicly visible product information and no personal data. You are responsible for how you use the data; check the terms that apply to you and consult a lawyer for your specific case.