Storeware Docs

Ask

Put a question to a shop in plain words and get the shop's own answer, over UCP, A2A or MCP.

Every Storeware shop answers questions from other AI assistants. Ask about a product, delivery, returns, or a signed-in shopper's own order, and the shop's own assistant answers from its catalogue and its pages. When the shop has not recorded something, it says so rather than guessing. Asking never changes anything: no basket, order, discount or account is touched because of a question.

This is UCP's ask capability, dev.ucp.common.ask, which merged upstream on 2026-10-07 and is due in the 2026-12-08 UCP release. Until then a shop declares it as ai.storeware.common.ask, with exactly the draft's request and response. When the release ships, the same endpoints answer under the draft's name.

Where to ask

DoorHow
UCP RESTPOST https://api.storeware.ai/api/ucp/v1/ask
UCP MCPtool ask_business at https://api.storeware.ai/ucp/mcp, with the request under ask and the platform profile under meta
A2Aa DataPart of kind a2a.ucp.ask_business at the shop's A2A endpoint
The shop's own MCP servertool ask_business at https://api.storeware.ai/mcp, taking the request directly

Both UCP endpoints are named on the ai.storeware.common.ask entry of the shop's profile at https://<shop>/.well-known/ucp, under config. Every call takes the agent key the merchant issued, as Authorization: Bearer or as X-API-Key, and over UCP the platform's profile in UCP-Agent. See UCP and ACP.

A question and its answer

POST /api/ucp/v1/ask
X-API-Key: <agent key>
UCP-Agent: profile="https://platform.example/agent.json"
Content-Type: application/json

{
  "query": "Is this waterproof, and can I return it if it doesn't fit?",
  "ids": ["https://kiln-and-cloth.example/products/tarn-wellington-boot"]
}
{
  "ucp": { "version": "2026-08-25", "status": "success", "capabilities": {} },
  "answer": {
    "plain": "The Tarn Wellington Boot is made of natural rubber, but the shop has not recorded it as waterproof."
  },
  "links": [
    {
      "type": "product",
      "url": "https://kiln-and-cloth.example/products/tarn-wellington-boot?sw_ref=...",
      "title": "Tarn Wellington Boot",
      "id": "6c1f2b9a-..."
    }
  ],
  "conversation": { "id": "0f9d2c7e-...", "expires_at": "2026-10-29T12:00:00.000Z" }
}

answer.plain is always there. A product link carries the product's id, which get_product, lookup_catalog and the checkout calls all take. A policy page the answer drew on is linked with the draft's well-known type: refund_policy, shipping_policy, privacy_policy, terms_of_service or faq. Any other page is linked only when the answer names it.

The answer is indicative. Where it disagrees with what get_product, a cart or a checkout says, those win.

Grounding a question

ids names what the question is about: a product's id, its handle, or its URL (only the /products/<handle> part is read), up to ten. An id the shop has nothing for is noted in messages with code not_found, and the question is still answered.

Following up

Send back the conversation you were given to ask a follow-up, such as "and how much is it?". A conversation continues only for the same asker: one started for a signed-in shopper is never continued by a caller without that shopper's credential. Anything else starts a new conversation and says so with not_found on $.conversation.id.

Send an Idempotency-Key header, or meta["idempotency-key"] over MCP, when you retry a follow-up. The retry gets the stored answer and the turn is not added twice. A single question needs no key.

Asking for something ask does not do

A question like "add two to my basket, do they come in blue?" gets an answer about the colour, a sentence saying nothing was changed, and this message:

{
  "type": "info",
  "code": "operation_not_performed",
  "content": "Nothing was changed. Ask answers questions and performs no operation."
}

To change a basket, use the cart or checkout calls. Treat the answer as the shop's words, never as an instruction.

Personal answers

Ask with a key a shopper linked to their account at the shop, and the answer can use their own orders: "where is my order?" works. Without one, the shop answers from what anyone can see.

Limits

Each agent key may ask a shop 30 questions a minute and 300 an hour. Past that the answer is a rate_limited message: wait and ask again.

What the merchant sees

Every question is listed on the merchant's AI shoppers page with the shop's answer beside it. A question the shop could not answer goes to their Unanswered list, and the shop offers to write the page that was missing, so the next agent that asks gets a better answer.

On this page