Site catalog
Instacart for AI Agents
instacart.com: 51 mapped actions across 10 screens
Instacart is a grocery delivery marketplace that fronts many retailers behind one account. Through Rindler, your agent drives it like an API: pick a store, search its catalog, build a cart item by item, review past orders, edit an order that is already being shopped, and hand your user a ready-to-pay checkout link.
The mapping covers 51 actions across 10 screens, from the storefront down to address and payment method management. Your agent never parses Instacart's HTML. It calls named actions with typed params and reads structured results back.
What is mapped
The full shopping loop is here. select_store navigates to a specific retailer's storefront, search_products searches that store's catalog, view_product opens the product detail dialog, and add_to_cart puts an item in the cart. Cart management is granular: view_cart, increment_quantity, decrement_quantity, and remove_from_cart let the agent shape the order exactly, and the checkout chain ends with a URL your user can pay at.
The account side is mapped too. view_orders returns order history as structured records, view_order opens any single order, and reorder pushes an entire past delivered order back into the cart. For an order that is still being shopped, view_order_items plus update_order_item_quantity let the agent change quantities or remove items mid-flight, with quantity '0' removing an item. view_addresses, add_address, and view_payment_methods round out account management. add_address rides Instacart's Google Places autocomplete and takes the first suggestion automatically.
Quirks worth knowing
These come straight from the mapped action behavior, not guesswork.
**The store slug threads through everything.** After select_store, the resulting URL carries a store_slug (the path segment between '/store/' and '/storefront', e.g. 'costco-warehouse'). search_products requires that slug because Instacart's URL-based ?q= search no longer respects the query param on its new AI-search rollout, so Rindler drives the storefront search input directly. Carts are also scoped per store: switching stores shows a different cart.
**add_to_cart adds exactly one unit.** Once an item is in the cart Instacart swaps the Add button for a quantity stepper, so a repeat call is a safe no-op and the response's data.item_added tells you which case you hit. To order more than one unit, call view_cart and then increment_quantity per extra unit. Do not call add_to_cart in a loop.
**Delivered and active orders behave differently.** reorder only works on delivered orders; in-progress orders do not show the add-all button. Active orders are edited instead through view_order_items and update_order_item_quantity. Also, view_orders only populates after select_store has warmed a store session, and a cold direct navigation to an order can throw a transient 'Something went wrong' page; the fix is simply to retry view_order.
**Filters are dynamic.** The filter set on a listing page depends on the current category, so the mapping exposes list_available_filters actions per screen rather than a hardcoded set. Call them in context.
Checkout is a handoff, not a purchase
The agent builds the order; your user pays. The chain is strict: view_cart opens the cart dialog, go_to_checkout moves to the checkout aisle (an upsell page), continue_to_checkout advances past it to the real checkout, and get_checkout_url is the terminal action. It returns the checkout page URL with the 'Fast' delivery tier preselected by default.
One constraint matters: that URL contains a session ID bound to Rindler's active browser session, so it cannot be opened in a different browser. Present it to the user and let them complete payment there. The agent never touches card entry.
Signing in
Instacart uses email OTP. The login action takes an email, Instacart sends a verification code, and the user supplies that code through Rindler's staged Connect form. The login page is instacart.com/accounts/login, and Rindler tracks the session via Instacart's own auth cookies afterward, so your agent does not re-authenticate every session.
select_store, search_products, view_product, and result paging are not marked auth-gated in the mapping. Sign-in gates the stateful actions, including view_cart, add_to_cart, view_orders, the checkout chain, update_order_item_quantity, and address and payment method management.
Reading results
Every mapped surface is a named screen: landing, storefront, search_results, product_detail, checkout_aisle, checkout, orders, order_detail, addresses, and payment_methods. Your agent always knows which screen it is on and what actions apply there.
The richest structured read is order history. view_orders returns data.listings with one record per order, most recent first: an order_url (its trailing path segment is the order_id you pass to view_order or reorder), a summary with store, status, and date, and the total. Up to 5 orders come back per call; when more exist, data.listings_truncated flips true and data.listings_total carries the full count. Cart writes are legible too: add_to_cart reports data.item_added so the agent knows whether it clicked a fresh Add button or hit an item already in the cart.
Example session
start_session(url: "https://www.instacart.com")
dispatch_action(action: "select_store", params: { store: "..." })
# read store_slug from the returned URL
dispatch_action(action: "search_products", params: { query: "...", store_slug: "..." })
dispatch_action(action: "add_to_cart", params: { item: "..." })
dispatch_action(action: "view_cart")
dispatch_action(action: "increment_quantity", params: { item: "..." })
dispatch_action(action: "go_to_checkout")
dispatch_action(action: "continue_to_checkout")
dispatch_action(action: "get_checkout_url") # hand this URL to the user
close_session()
Every mapped action
Generated from the live site config. 12 of 51 actions require a signed-in session.
| Action | What it does |
|---|---|
| account_addresses | |
| account_payment_methods | |
| add_addressauth | Add a new delivery address. Uses Google Places autocomplete: type the address and the first autocomplete suggestion is selected automatically. |
| add_to_cartauth | Add ONE unit of a product to the cart. Works from search_results (inline Add button) or from product_detail dialog (Add button inside dialog). The response data.item_added is true when a fresh Add button was clicked, and false when the item was already in the cart (Instacart replaces the Add button with a quantity stepper once an item is in the cart, so this call is a safe no-op in that case). To order MORE than one unit, call add_to_cart once, then call view_cart followed by increment_quantity for each additional unit; do not call add_to_cart repeatedly for the same item. |
| apply_promo | |
| browse_category | |
| cancel_order | |
| capture_login | |
| checkout | |
| close_product_dialog | Close the product detail dialog and return to search results. |
| continue_to_checkoutauth | Advance past the upsell checkout_aisle page to the actual checkout page. |
| decrement_quantity | Decrease the quantity of a cart item by 1. IMPORTANT: Call view_cart first. If quantity reaches 0, item is removed. |
| filter_results | |
| get_checkout_urlauth | Terminal action. Returns the current checkout page URL. The 'Fast' delivery tier is preselected by default. IMPORTANT: The URL contains a session ID bound to Rindler's active browser session and cannot be opened in a different browser. Present the URL to the user and ask them to complete checkout at that URL. |
| go_to_checkoutauth | Proceed from the cart dialog to the checkout aisle page. IMPORTANT: Call view_cart first. |
| increment_quantity | Increase the quantity of a cart item by 1. IMPORTANT: Call view_cart first. |
| list_available_filters_addresses | List the filters/facets available on the CURRENT listing page. The filter set is dynamic and depends on the selected category, so always call this in context rather than assuming a fixed set. |
| list_available_filters_order_detail | List the filters/facets available on the CURRENT listing page. The filter set is dynamic and depends on the selected category, so always call this in context rather than assuming a fixed set. |
| list_available_filters_orders | List the filters/facets available on the CURRENT listing page. The filter set is dynamic and depends on the selected category, so always call this in context rather than assuming a fixed set. |
| list_available_filters_payment_methods | List the filters/facets available on the CURRENT listing page. The filter set is dynamic and depends on the selected category, so always call this in context rather than assuming a fixed set. |
| list_available_filters_product_detail | List the filters/facets available on the CURRENT listing page. The filter set is dynamic and depends on the selected category, so always call this in context rather than assuming a fixed set. |
| list_available_filters_search_results | List the filters/facets available on the CURRENT listing page. The filter set is dynamic and depends on the selected category, so always call this in context rather than assuming a fixed set. |
| list_available_filters_storefront | List the filters/facets available on the CURRENT listing page. The filter set is dynamic and depends on the selected category, so always call this in context rather than assuming a fixed set. |
| login | Sign in to Instacart (email-OTP; the verification code is supplied by the user via the staged Connect form). |
| next_page | Navigate to the next page of search results. |
| prev_page | Navigate to the previous page of search results. |
| redeem_points | |
| remove_from_cart | Remove an item from the cart. IMPORTANT: Call view_cart first to open the cart dialog. |
| reorder | Add all items from a past delivered order back to the current cart. IMPORTANT: Only works for delivered orders -- active in-progress orders do not show 'Add all items to cart'. |
| return_order | |
| save_to_wishlist | |
| search_products | Search for products at a specific store. Pass store_slug from the URL returned by select_store (e.g., if the URL was '/store/costco-warehouse/storefront', pass store_slug='costco-warehouse'). Drives the storefront search input directly because Instacart's URL-based ?q= search no longer respects the query param on the new AI-search rollout. |
| select_store | Navigate to a specific store on Instacart. After this action, read the resulting URL -- the path segment after '/store/' and before '/storefront' is the store_slug you must pass to search_products (e.g., '/store/costco-warehouse/storefront' -> slug is 'costco-warehouse'). |
| select_variant | |
| sort_results | |
| track_order | |
| update_order_item_quantityauth | Change the quantity of a specific item in an active in-progress order. Set quantity to '0' to remove the item. IMPORTANT: Call view_order_items first to expand the items list. |
| update_quantityauth | |
| view_addressesauth | Navigate to delivery address management. |
| view_cartauth | Open the cart. On the current Instacart the cart lives on the floating delivery-fee bar at the bottom (aria-label like 'Add $X for $0 delivery fee' / 'Spend $X for $0 delivery fee', carrying the item count); older layouts used a 'View Cart'/'View Order' button. Both open the same cart dialog. Cart contents are scoped to the current store; switching stores shows a different cart. |
| view_loyalty_status | |
| view_order | Navigate to the detail page for a specific order. The order_id is the trailing path segment of an order_url returned by view_orders. Returns order status and items; works for both active (in-progress) and past (delivered) orders. A transient 'Something went wrong' page can appear on a cold direct navigation -- retry the action if so. |
| view_order_detail | |
| view_order_historyauth | |
| view_order_items | Expand the items list on an active in-progress order. IMPORTANT: Only valid on active orders (status is 'confirmed' or 'shopping'). Call view_order first, then this action before update_order_item_quantity. |
| view_ordersauth | Navigate to order history and return the user's past and active orders. PRECONDITION: select_store must run first -- order history only populates once a store session is warm. Returns data.listings, one record per order (most-recent-first): order_url (e.g. /store/orders/062520460626230485160), summary (store, status, and date), and total. Derive order_id as the trailing path segment of order_url, then pass it to view_order or reorder. Up to 5 orders are returned; when more exist data.listings_truncated is true and data.listings_total holds the full count. |
| view_payment_methodsauth | Navigate to payment method management. |
| view_product | Open the product detail dialog for a specific item. Call search_products first. After viewing, call close_product_dialog to return to results, or add_to_cart to add from the dialog. |
| view_reviews | |
| view_store_locator | |
| view_wishlist |
Screens and structured records
addressesreturns structured fields, container recordscheckout(navigation screen)checkout_aisle(navigation screen)landing(navigation screen)order_detailreturns structured fields recordsordersreturns structured fields, container recordspayment_methodsreturns structured fields, container recordsproduct_detailreturns structured fields, container recordssearch_resultsreturns structured fields, container recordsstorefrontreturns structured fields, container records