Instacart API: Search store products
Searches a named Instacart store's guest-visible grocery products for a US ZIP code. Prices are in USD and can differ from in-store prices; stock estimates can change.
Unofficial. Not affiliated with or endorsed by Instacart.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Query, required
query The grocery product to search for, for example oat milk.
milk
- Store, required
store Store name, for example Safeway or Costco.
Safeway
- Zip Code, required
zip_code Five-digit US delivery ZIP code, for example 94103.
94103
Exactly 5 characters.
- Max Results optional
max_results Most products to return, for example 20.
60
Whole number from 1 to 60. Default
20.
Input as JSON
{ "query": "milk", "store": "Safeway", "zip_code": "94103", "max_results": 60}Output
{ "store": "Safeway", "products": [ { "size": "128 fl oz", "brand": "Lucerne", "price": 7.99, "currency": "USD", "in_stock": true, "image_link": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/large_1f0daedf-f4a0-4eb8-a54c-de3656820f43.png" , "unit_price": "$0.06/fl oz" , "product_link": "https://www.instacart.com/products/7079-lucerne-dairy-farms-milk-128-oz?retailerSlug=safeway" , "product_name": "Lucerne Whole Milk", "original_price": null }, { "size": "128 fl oz", "brand": "Lucerne", "price": 7.99, "currency": "USD", "in_stock": true, "image_link": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/large_f29919c4-6586-4af3-9136-71ca6b5a2a2f.png" , "unit_price": "$0.06/fl oz" , "product_link": "https://www.instacart.com/products/7069-lucerne-milk-reduced-fat-2-milkfat-128-oz?retailerSlug=safeway" , "product_name": "Lucerne Milk, Reduced Fat, 2% Milkfat", "original_price": null }, { "size": "64 fl oz", "brand": "Clover Sonoma", "price": 7.99, "currency": "USD", "in_stock": true, "image_link": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/large_8290e590-df0a-401e-aee3-f5bb422e4b1b.png" , "unit_price": "$0.12/fl oz" , "product_link": "https://www.instacart.com/products/3371015-clover-sonoma-organic-uht-whole-milk-half-gallon-64-oz?retailerSlug=safeway" , "product_name": "Clover Sonoma Pasture-Raised Organic Whole Milk Vitamin D Ultra-Pasteurized Half Gallon", "original_price": null } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"instacart.com/search_products","input":{"query":"milk","store":"Safeway","zip_code":"94103","max_results":60}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "instacart.com/search_products" , "input": { "query": "milk", "store": "Safeway", "zip_code": "94103", "max_results": 60 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "instacart.com/search_products" , "input": { "query": "milk", "store": "Safeway", "zip_code": "94103", "max_results": 60 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run instacart.com/search_products# with {"query":"milk","store":"Safeway","zip_code":"94103","max_results":60}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "query", "zip_code", "store" ], "properties": { "query": { "type": "string", "minLength": 1, "description": "The grocery product to search for, for example oat milk." }, "store": { "type": "string", "minLength": 1, "description": "Store name, for example Safeway or Costco." }, "zip_code": { "type": "string", "maxLength": 5, "minLength": 5, "description": "Five-digit US delivery ZIP code, for example 94103." }, "max_results": { "type": "integer", "default": 20, "maximum": 60, "minimum": 1, "description": "Most products to return, for example 20." } }}Output schema
{ "type": "object", "required": [ "store", "products" ], "properties": { "store": { "type": "string", "description": "Store used for the search." }, "products": { "type": "array", "items": { "type": "object", "required": [ "product_name", "brand", "size", "price", "currency", "original_price", "unit_price", "in_stock", "image_link", "product_link" ], "properties": { "size": { "type": [ "string", "null" ] }, "brand": { "type": [ "string", "null" ] }, "price": { "type": [ "number", "null" ] }, "currency": { "type": "string" }, "in_stock": { "type": "boolean" }, "image_link": { "type": [ "string", "null" ] }, "unit_price": { "type": [ "string", "null" ] }, "product_link": { "type": "string" }, "product_name": { "type": "string" }, "original_price": { "type": [ "number", "null" ] } } } } }}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
instacart.com/search_products- Returns
- store, product name, brand, size, price, original price, unit price, stock, image, link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method instacart.com/search_products with the inputs above.
Ask your agent
- How much is Greek yogurt at Safeway for delivery to 94103? Show me brands, sizes, and prices.
- Find oat milk at Costco near ZIP 98052 on Instacart, top 10 results with unit prices and whether they're in stock.
- I'm in 60614 — what does Whole Foods have for sourdough bread right now? Include any sale prices vs original.
- Check Instacart for ground coffee at Kroger delivering to 45202, up to 30 items, and list price per ounce.
- Compare frozen pizza options at Aldi for zip 30309 — brand, size, current price, and links to each product.
See more
Search ALDI US groceries in site order with prices for the selected store. Prices and availability vary by store; related search results may follow direct matches.
aldi.us/search_productsSearches Trader Joe's public product catalogue by name or keywords, optionally within a main category. Prices are website reference prices and may vary by store.
traderjoes.com/search_productsSearches Target products and returns prices, ratings, photos and product links. Prices can vary by store, so you can give a ZIP code for local pricing.
target.com/search_productsSearches a country's English Zara store for products, with current prices, colours, images and product links. The all section excludes non-Zara brands.
zara.com/search_productsSearches IKEA products in a chosen country and returns current prices, details, photos and reviews in IKEA's result order.
ikea.com/search_productsSearches Macy's products in the site's order with optional USD price bounds, sale-only results and sorting. Prices for products with a range use the lowest shown price.
macys.com/search_productsFinds a Lowe's product by name, item number or product link and returns its details, price, specifications, images and availability at the nearest store for a ZIP code (or the site's default store).
lowes.com/get_productChecks a Target product's stock and pickup, drive-up and same-day delivery availability at the stores nearest a US ZIP code.
target.com/check_store_stock