Instacart Product Scraper avatar

Instacart Product Scraper

Pricing

from $2.99 / 1,000 products

Go to Apify Store
Instacart Product Scraper

Instacart Product Scraper

Extract bounded public Instacart product data with explicit source-access diagnostics.

Pricing

from $2.99 / 1,000 products

Rating

0.0

(0)

Developer

w3crawler

w3crawler

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Instacart Product Scraper

Target and scope

This Actor extracts bounded, source-backed product data from official public Instacart search pages or public store-specific product pages. It uses Product JSON-LD, server-rendered product state, and a bounded product-card fallback. It does not log in, use private APIs, solve CAPTCHAs, use stealth, or bypass access controls.

The public page may expose no products to an unauthenticated request, even when a browser shows a login modal or an interactive catalog. Those outcomes become minimal diagnostic rows and an OUTPUT summary. The Actor never fabricates a product, price, retailer, rating, or image.

Use cases

  • Take a small public catalog snapshot for a store and query.
  • Compare publicly exposed prices, units, availability, promotions, and product media.
  • Inspect a bounded list of official product URLs with retailerSlug context.
  • Run a scheduled public-data monitor that can distinguish usable data from access barriers.

Cost

Apify platform compute, storage, and any explicitly enabled proxy traffic are billed according to your Apify plan. This Actor has no separate service fee. Keep maxItems, maxBytes, retries, and proxy use bounded to control run time and spend.

How to use

  1. Enter a product query and official Instacart storeSlug, provide an official searchUrl, or supply bounded productUrls.
  2. Set maxItems and the request controls appropriate for a small public request.
  3. Run the Actor and inspect the default dataset plus the OUTPUT key-value record.

productUrls takes precedence over searchUrl. In detail mode the Actor makes one bounded request per accepted product URL until maxItems normal records are collected. In search mode it makes one bounded search-page request; it does not invent pagination for an infinite-scroll surface. Product IDs are deduplicated by public SKU/product ID/GTIN/MPN and then canonical product URL. Diagnostics do not consume maxItems.

Input

The input schema is the source of truth. All limits below are enforced by the schema and bounded again by the runtime.

FieldType and defaultBounds and behavior
querystring, organic milkProduct keyword; maximum 200 characters. Used when searchUrl and productUrls are absent.
storeSlugstring, sproutsPublic slug matching [A-Za-z0-9][A-Za-z0-9-]{0,80}.
searchUrlstring, emptyOptional official HTTPS Instacart search URL; maximum 2,000 characters. Takes precedence over query/storeSlug.
productUrlsarray, emptyObjects with required url; official HTTPS Instacart /products/ URLs; maximum 2,000 characters per URL. Takes precedence over searchUrl. Include retailerSlug when the public detail page supports store-specific context.
maxItemsinteger, 30Normal product rows, from 1 through 100.
timeoutMsinteger, 30000Per-request timeout, from 5,000 through 120,000 ms.
maxBytesinteger, 2000000Maximum retained response size, from 100,000 through 5,000,000 bytes.
requestDelayMsinteger, 0Delay before retries or redirects, from 0 through 10,000 ms.
maxRequestRetriesinteger, 1Retries only timeouts, transport failures, and HTTP 5xx responses; from 0 through 2. Access barriers are not bypassed.
userAgentstring, transparent defaultOptional user-agent without control characters; maximum 300 characters.
proxyConfigurationobject, directOptional { "useApifyProxy": true, "apifyProxyGroups": [], "apifyProxyCountry": "US" }. At most five non-empty groups; country is an optional two-letter code. Proxy use is explicit and does not bypass access controls.

Runnable search input

{
"query": "organic milk",
"storeSlug": "sprouts",
"maxItems": 10,
"maxRequestRetries": 0,
"proxyConfiguration": { "useApifyProxy": false }
}

Runnable search-URL input

{
"searchUrl": "https://www.instacart.com/store/sprouts/search?query=coffee",
"maxItems": 10,
"timeoutMs": 30000,
"maxRequestRetries": 1
}

Runnable multi-product input

{
"productUrls": [
{
"url": "https://www.instacart.com/products/18602684-green-seedless-grapes-per-lb?retailerSlug=kents-market"
},
{
"url": "https://www.instacart.com/products/220058-topcare-ibuprofen-200-mg-tablets-100-ct?retailerSlug=kents-market"
}
],
"maxItems": 2,
"timeoutMs": 30000,
"maxRequestRetries": 1,
"proxyConfiguration": { "useApifyProxy": true }
}

Output

The default dataset contains only source-backed instacart-product rows. Access diagnostics and run summaries are stored in the OUTPUT key-value-store entry and logs. If a run saves products before a later request or output problem, the Actor run succeeds and reports dataStatus: PARTIAL. A clean empty result succeeds with dataStatus: NO_RESULTS. If a real failure occurs before any product is saved, the Actor run reports status: FAILED and dataStatus: FAILED; diagnostics are never added to the dataset.

Normal product record

{
"recordType": "instacart-product",
"recordId": "product_0123456789abcdef0123",
"source": "Instacart",
"url": "https://www.instacart.com/store/sprouts/search?query=organic%20milk",
"sourceUrl": "https://www.instacart.com/store/sprouts/search?query=organic%20milk",
"extractionMethod": "json-ld",
"productId": "MILK-001",
"productName": "Organic Whole Milk",
"productUrl": "https://www.instacart.com/store/sprouts/products/organic-whole-milk",
"description": "Organic whole milk from Fresh Farms.",
"category": "Dairy & Eggs",
"price": 6.49,
"priceText": "$6.49",
"currency": "USD",
"originalPrice": 8.99,
"unit": "64 fl oz",
"imageUrl": "https://www.instacart.com/assets/milk.jpg",
"imageUrls": ["https://www.instacart.com/assets/milk.jpg"],
"brand": "Fresh Farms",
"availability": "in-stock",
"promotionText": "11% off",
"isOnSale": true,
"badges": ["Organic", "Non-GMO"],
"rating": 4.6,
"reviewCount": 22,
"sellerName": "Sprouts Farmers Market",
"searchQuery": "organic milk",
"storeSlug": "sprouts",
"scrapedAt": "2026-09-08T00:00:00.000Z"
}

Card fallback record

When Product JSON-LD is absent, a qualifying public product card can still produce a normal row. Fields not exposed by that card are omitted; they are never guessed.

{
"recordType": "instacart-product",
"recordId": "product_card_7e3b",
"source": "Instacart",
"url": "https://www.instacart.com/store/sprouts/search?query=coffee",
"sourceUrl": "https://www.instacart.com/store/sprouts/search?query=coffee",
"productName": "Organic Coffee",
"productUrl": "https://www.instacart.com/store/sprouts/products/organic-coffee",
"price": 7.99,
"priceText": "$7.99",
"originalPrice": 8.99,
"availability": "Many in stock",
"badges": ["Organic", "Fair Trade"],
"imageUrl": "https://cdn.example.test/coffee.jpg",
"cardPosition": 1,
"scrapedAt": "2026-09-08T00:00:00.000Z"
}

OUTPUT summary

{
"status": "SUCCEEDED",
"runStatus": "SUCCEEDED",
"dataStatus": "PARTIAL",
"source": "Instacart",
"actor": "instacart-product-scraper",
"sourceMode": "product-detail",
"targetCount": 2,
"itemCount": 1,
"productCount": 1,
"diagnosticCount": 1,
"blockedCount": 0,
"dataAvailable": true,
"productPagesRequested": 2,
"productPagesSucceeded": 1,
"productPagesFailed": 1,
"optionalFailureCount": 0,
"sourceTransport": "apify_proxy",
"fixture": false,
"requestCount": 2,
"generatedBy": "OpenAI Codex with GPT-6",
"completedAt": "2026-09-08T00:00:00.000Z"
}

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Advanced options and troubleshooting

Start with one store, a small maxItems, and no retries. Use productUrls when store-specific detail state is required. A larger maxBytes retains more server-rendered or structured content but uses more memory. Missing price, rating, review, image, or retailer fields are expected when the public response does not expose them.

  • LOGIN_REDIRECT or BLOCKED: the source required an unauthenticated client to stop; no bypass was attempted.
  • NO_PUBLIC_PRODUCTS: the bounded response was usable but contained no qualifying public Product JSON-LD, detail state, or product card.
  • HTTP_ERROR, TIMEOUT, or REQUEST_FAILED: inspect the URL, timeout, retry count, and run logs.
  • INVALID_INPUT or INVALID_PROXY: correct the input shape; unsupported fields are reported rather than silently used.

API, support, and Issues

Use the Apify API or Console dataset endpoint to read normal rows and the default key-value store OUTPUT record. When reporting an issue, include the Actor version, run ID, input mode, error code, and a short description. Do not include private customer information or credentials.

This Actor is not affiliated with, sponsored by, or endorsed by Instacart. It is intended for public, source-backed data only. Follow Instacart's terms, robots guidance, rate limits, privacy rules, and applicable law. Do not use it to log in, collect private customer information, evade security controls, or infer data that the public source did not expose.