tote
Documentation › Getting started
Getting started

Make any store agent-buyable.

Tote is a commerce layer for AI agents. Point your agent at Tote and it can search real stores, build a real cart, and hand back a checkout link. No integration from the store, no plugin from the merchant, no payment handling. Everything below works today.

Add Tote to ClaudeClaude.ai and Claude Desktop, any plan. Sign in by email on first use.
claude mcp add --transport http tote https://usetote.dev/mcp
# then run /mcp inside Claude Code and sign in with your email.
# Prefer an API key? add: --header "Authorization: Bearer YOUR_KEY"

What your agent can do

  • Search a verified index of stores, ranked by real usage.
  • Read live products, prices, and stock from any store's catalog.
  • Add items to a real, per-session cart and read the running total.
  • Get a checkout link a human clicks to pay, on the store's own site.
  • Reach any Shopify or WooCommerce store with no merchant setup.

How it works

agentclaude, appstotefive toolsstorelive cartcheckouthuman pays

Quickstart

Get a key, add the connector, and ask. The whole flow, start to checkout link, is four calls.

  1. 1. Create a key on the keys page.
  2. 2. Add the connector with the snippet above.
  3. 3. Ask your agent: "find a coffee store on Tote and build a cart."
  4. 4. Open the checkout link it returns.

Authentication

Pass your key as a bearer token in the Authorization header. Keys travel in the header only, never in the URL. Create and inspect keys on the keys page.

Authorization: Bearer cg_live_...

Choose your path

MCP

Connect Claude, Cursor, or any MCP client to the five tools.

REST

Call /v1 endpoints directly from any language over HTTPS.

No-install prompt

Paste one prompt into a browsing-enabled chat, zero setup.

search_stores

Find verified stores by name or domain, ranked by real usage (checkouts, adds, and calls).

paramtypedescription
querystringMatch store name or domain. Omit for top-ranked.
limitintMax results, default 10.
Request
GET https://usetote.dev/v1/stores?query=coffee&limit=3
Response
{
  "stores": [
    {
      "domain": "deathwishcoffee.com",
      "name": "Death Wish Coffee",
      "product_count": 146,
      "currency": "USD",
      "avg_latency_ms": 434
    }
  ]
}

list_products

Products, prices, and availability from a store's live catalog. Optional query filters within the store.

paramtypedescription
store_domain*stringA verified store domain.
querystringFilter within the store's catalog.
limitintMax products, default 10.
Request
GET https://usetote.dev/v1/stores/deathwishcoffee.com/products?limit=2
Response
{
  "store": "deathwishcoffee.com",
  "products": [
    {
      "handle": "pumpkin-chai-coffee",
      "title": "Pumpkin Chai Coffee",
      "variants": [
        { "id": 41181425598519, "price": "13.99", "available": true }
      ]
    }
  ]
}

get_product

Full detail for one product by its handle, including images and description.

paramtypedescription
store_domain*stringA verified store domain.
product_handle*stringThe product's handle or id.
Request
GET https://usetote.dev/v1/stores/deathwishcoffee.com/products/pumpkin-chai-coffee
Response
{
  "handle": "pumpkin-chai-coffee",
  "title": "Pumpkin Chai Coffee",
  "vendor": "Death Wish Coffee",
  "images": ["https://..."],
  "variants": [
    { "id": 41181425598519, "price": "13.99", "available": true }
  ]
}

add_to_cart

Add a variant to the session's cart for a store and return the running total. Carts persist per (session, store).

paramtypedescription
session_id*stringYour caller-chosen session id.
store_domain*stringA verified store domain.
variant_id*intVariant id from list_products.
quantityintDefault 1.
Request
POST https://usetote.dev/v1/cart/add
{
  "session_id": "me",
  "store_domain": "deathwishcoffee.com",
  "variant_id": 41181425598519,
  "quantity": 1
}
Response
{
  "store": "deathwishcoffee.com",
  "items": [
    { "variant_id": 41181425598519, "title": "Pumpkin Chai Coffee",
      "quantity": 1, "price": 1399 }
  ],
  "total_price": 1399,
  "currency": "USD",
  "item_count": 1
}

checkout_url

The real checkout link for everything in the session's cart. Tote stops here; a human completes payment on the store's site.

paramtypedescription
session_id*stringThe session whose cart to check out.
store_domain*stringA verified store domain.
Request
GET https://usetote.dev/v1/checkout_url?session_id=me&store_domain=deathwishcoffee.com
Response
{
  "store": "deathwishcoffee.com",
  "checkout_url": "https://deathwishcoffee.com/cart/41181425598519:1",
  "items": 1,
  "total_price": 1399,
  "currency": "USD"
}
Infrastructure

See the index itself.

Every verified store is a node; every search you run traverses them with the same five tools documented above, labeled hop by hop with real latencies. The interactive field lives on its own page.

The living index →
Drag the stores. Search anything. Watch a real cart get built.
/infrastructure

Supported platforms

The same five tools work across every platform. Store carts differ under the hood, but the interface your agent sees does not.

Shopify

~4.6M stores. Public AJAX endpoints, no key needed.

WooCommerce

~3M stores. Public Store API, no key needed.

Best Buy

Official developer API. Marketplace adapter template.

The checkout model

Tote never touches payment. Every flow ends at a checkout URL that a human opens and completes on the store's own site. That is a property of the code, not a policy: there is no payment path to misuse, and merchants have nothing to object to.

For Shopify, the link is a cart permalink that rebuilds the cart in the human's browser. For WooCommerce and Best Buy, it is the store's own add-to-cart URL. Either way, the price at that page is the price that counts.

Telemetry & privacy

Every call logs volume only: tool name, store, outcome, latency, and your key id. Search queries, product handles, and cart contents are never logged as analytics. Check your own usage at /v1/keys/usage, and read the full privacy policy.

Was this page helpful?Get started