Log inRead my store
Docs

Developer reference

The feed, checkout sessions, MCP, UCP and the store agent. Everything an agent needs to find products and hand a shopper a checkout.

Base URLhttps://bmos-v3.apps.art-and-see.com

On this page

Start here

Every published store gets the same public surfaces. No key, CORS open, JSON unless noted. Replace STORE_ID with the id in your dashboard under Install.

  1. Read the catalogGET the feed, or the plain-language skill.md.
  2. Pick what can be boughtOnly products with is_eligible_checkout: true. Affiliate items (external: true) are recommend-only.
  3. Hand the shopper a checkoutCreate a checkout session and give the shopper links.pay, or send a checkout link. They confirm the total and pay on the store's checkout.

Agents that speak MCP can do all three through https://bmos-v3.apps.art-and-see.com/mcp.

Feed JSON

Fields follow the OpenAI Product Feed Spec plus a BMOS checkout block. Feeds are cached for 60 seconds.

GET/feeds/:storeId
curl https://bmos-v3.apps.art-and-see.com/feeds/STORE_ID

Top level

FieldTypePresentExample
feed_versionstringAlways"0.2"
Version of this spec.
generated_atstring (ISO 8601)Always"2026-10-01T12:00:00.000Z"
When the feed was built. Cached 60 s.
merchant.idstringAlways"STORE_ID"
Use it as store_id everywhere else.
merchant.name · url · currencystringAlways"Excalibur Brothers"
The store, its own website and ISO 4217 currency.
merchant.return_policy · terms_of_service · privacy_policystring (URL) | nullNullablenull
Set by the merchant in Settings.
capabilities.human_checkoutstring (URL)Always"…/c/STORE_ID"
Base of the checkout link.
capabilities.agent_checkoutstring (URL)Always"…/api/checkout_sessions"
Checkout sessions endpoint.
capabilities.payment_methodsstring[]Always["card","apple_pay","google_pay","paypal"]
crypto appears when the store has a USDC wallet.
capabilities.crypto_railsstring[]Always["base"]
Any of base, solana, tempo, coinbase.
capabilities.test_modebooleanAlwaystrue
Nothing is charged while true.
productsProduct[]Always[…]
Hidden products are left out.

Product

FieldTypePresentExample
idstringAlways"lJY0B7QjtBV5Uw"
Use this in items[].id.
item_idstringAlways"KTN4"
Merchant SKU, or id when there is none. Checkout accepts it too.
title · descriptionstringAlways"Kumori Katana"
Description is an empty string when missing.
link · image_linkstring (URL)Always"https://…"
Product page and main image. Empty string when missing.
additional_image_linkstring[]Always[]
Up to 5 more images.
pricestring | nullNullable"1199.97 USD"
Amount and currency, always without thousands separators.
availabilitystringAlways"in_stock"
in_stock, out_of_stock or preorder.
brand · seller_namestringAlways"Excalibur Brothers"
Brand falls back to the store name.
gtin · mpnstring | nullNullablenull
GTIN is 8, 12, 13 or 14 digits.
product_category · item_group_id · variantstring | nullNullablenull
is_eligible_searchbooleanAlwaystrue
Agents may show it.
is_eligible_checkoutbooleanAlwaystrue
Only these can be bought here.
channels_excludedstring[]Always[]
Agents this product is hidden from, e.g. ["grok"].
external · external_linkboolean · string | nullAlwaysfalse
true = sold elsewhere (affiliate). Recommend it, never buy it.
checkoutobject | nullNullable{ "type": "bmos_checkout_session", … }
Ready request: endpoint, method, body, and human_url for the shopper. null when not buyable.

skill.md

Plain instructions an agent can follow: where the feed is, what can be bought, how to open a checkout. Markdown.

GET/feeds/:storeId/skill.md
curl https://bmos-v3.apps.art-and-see.com/feeds/STORE_ID/skill.md

Checkout sessions

States follow the Agentic Checkout spec: not_ready_for_payment → ready_for_payment → completed or canceled. Amounts are in cents.

POST/api/checkout_sessions

Create a session from feed ids or SKUs. Returns 201. Items that cannot be bought come back in errors; if none can, 422. agent stamps the order with who sent it.

POST/api/checkout_sessions
curl -X POST https://bmos-v3.apps.art-and-see.com/api/checkout_sessions \
  -H 'content-type: application/json' \
  -d '{"store_id":"STORE_ID","items":[{"id":"PRODUCT_ID","quantity":1}],"agent":"Claude"}'
GET/api/checkout_sessions/:id

Status, line items, totals, delivery options and links.pay.

GET/api/checkout_sessions/:id
curl https://bmos-v3.apps.art-and-see.com/api/checkout_sessions/SESSION_ID
POST/api/checkout_sessions/:id

Set buyer, fulfillment_address, fulfillment_option_id, or replace items. With email and address the status becomes ready_for_payment.

POST/api/checkout_sessions/:id
curl -X POST https://bmos-v3.apps.art-and-see.com/api/checkout_sessions/SESSION_ID \
  -H 'content-type: application/json' \
  -d '{"buyer":{"email":"sam@example.com","name":"Sam Lee"},"fulfillment_address":{"line1":"1 Main St","city":"Austin","state":"TX","zip":"78701","country":"US"},"fulfillment_option_id":"standard"}'
POST/api/checkout_sessions/:id/complete

payment.method: card, applepay, googlepay, paypal or crypto (with payment.rail). Returns status: "completed" and order.id. Test mode: nothing is charged.

POST/api/checkout_sessions/:id/complete
curl -X POST https://bmos-v3.apps.art-and-see.com/api/checkout_sessions/SESSION_ID/complete \
  -H 'content-type: application/json' \
  -d '{"payment":{"method":"card"}}'
POST/api/checkout_sessions/:id/cancel

Cancel an unpaid session. A completed session stays completed.

POST/api/checkout_sessions/:id/cancel
curl -X POST https://bmos-v3.apps.art-and-see.com/api/checkout_sessions/SESSION_ID/cancel

Most agents should not pay for the shopper. Give the shopper links.pay so they confirm the exact total on the store's checkout.

MCP server

Streamable HTTP: POST JSON-RPC 2.0 to one endpoint. Four tools, all scoped by store_id.

GET/mcp
curl https://bmos-v3.apps.art-and-see.com/mcp
POST/mcp · initialize

Protocol version and server info.

POST/mcp
curl -X POST https://bmos-v3.apps.art-and-see.com/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize"}'
POST/mcp · tools/list

The four tools with their input schemas.

POST/mcp
curl -X POST https://bmos-v3.apps.art-and-see.com/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
ToolRequiredOptionalReturns
search_productsstore_id, querymax_priceUp to 10 products with price, stock, buyable and buy_url.
get_offerstore_id, product_id—One product with live price, stock and buy link.
ask_store_agentstore_id, message—The store's own agent answers from its catalog and policies only.
create_checkoutstore_id, itemsagentA checkout session. The shopper confirms the total at links.pay.
POST/mcp · tools/call

Call a tool by name with arguments. Results come as text content and structuredContent.

POSTtools/call · search_products
curl -X POST https://bmos-v3.apps.art-and-see.com/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"search_products","arguments":{"store_id":"STORE_ID","query":"leather flask gift","max_price":60}}}'
POSTtools/call · get_offer
curl -X POST https://bmos-v3.apps.art-and-see.com/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"get_offer","arguments":{"store_id":"STORE_ID","product_id":"PRODUCT_ID"}}}'
POSTtools/call · ask_store_agent
curl -X POST https://bmos-v3.apps.art-and-see.com/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"ask_store_agent","arguments":{"store_id":"STORE_ID","message":"Do you ship to Canada?"}}}'
POSTtools/call · create_checkout
curl -X POST https://bmos-v3.apps.art-and-see.com/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":6,"method":"tools/call","params":{"name":"create_checkout","arguments":{"store_id":"STORE_ID","items":[{"id":"PRODUCT_ID","quantity":1}],"agent":"Claude"}}}'

UCP

Universal Commerce Protocol discovery: services, catalog and checkout capabilities, and the merchant's feed. Pass store to scope it.

GET/.well-known/ucp
curl 'https://bmos-v3.apps.art-and-see.com/.well-known/ucp?store=STORE_ID'

Agent card

An A2A agent card for the store's own agent: skills, transport and the chat endpoint.

GET/.well-known/agent-card.json
curl 'https://bmos-v3.apps.art-and-see.com/.well-known/agent-card.json?store=STORE_ID'

llms.txt

A short plain-text index of the store's agent surfaces. Text, not JSON.

GET/llms.txt
curl 'https://bmos-v3.apps.art-and-see.com/llms.txt?store=STORE_ID'

Store agent chat

Ask the store's own agent. It answers from the live catalog and the merchant's policies and FAQ, and returns product cards. Limited to 20 questions a minute per visitor.

POST/api/agent/:storeId/chat

Body: message (up to 400 characters) and optional origin. Returns reply, products, suggestions and answered.

POST/api/agent/:storeId/chat
curl -X POST https://bmos-v3.apps.art-and-see.com/api/agent/STORE_ID/chat \
  -H 'content-type: application/json' \
  -d '{"message":"A leather flask for a gift, under $60","origin":"widget"}'

Widget

One script tag adds the cart, the checkout and the store agent to the merchant's site. It reads the feed, so prices always match.

HTML · before </body>
<script src="https://bmos-v3.apps.art-and-see.com/widget.js" data-store="STORE_ID" defer></script>

Your own buttons

Mark any button with a feed product id or SKU.

HTML
<button data-bmos-add="PRODUCT_ID">Add to cart</button>
JavaScript
window.BMOS.add('PRODUCT_ID', 2); // add 2 and open the cart
window.BMOS.open();               // open the cart
window.BMOS.products;             // products the widget loaded

Errors

Errors are JSON { "error": "message" }, written for a person. Show them as they are. MCP errors use JSON-RPC error.code.

StatusWhenMessage
201Session createdMay include errors[] for items left out
303Checkout link openedRedirects to /pay/SESSION_ID
404Unknown or unpublished store“Feed not found or not published” · “Unknown or unpublished store”
404Unknown session“Not found”
422Nothing in the cart can be bought“None of the items can be bought here”
422Complete before email and address“Email and delivery address are required before payment”
422Crypto without a network“Pick a crypto network”
429Too many chat questions“Too many questions. Try again in a minute.”
500Our side“Something went wrong on our side. Try again.”

Test mode

Every store runs in test mode today. Payments are simulated end to end, nothing is charged, and orders are real records in the dashboard. Feeds and sessions say test_mode: true.

Test card 4242 4242 4242 4242, any future date, any 3 digits. Apple Pay, Google Pay, PayPal and USDC are simulated too.