Agent Console
Walk a UCP purchase end to end: this app plays the shopping platform, the store is CartThrob AI. Run run_20260918114701_8865d24b.
Discover the store
Unsigned GET https://store.dev.example.com/.well-known/ucp. The REST endpoint is read from the profile's services["dev.ucp.shopping"].
Search the catalog and choose a variant
Create a cart
Signed POST /carts with the selected variant, buyer and optional coupon. CartThrob prices it natively.
Create a checkout with a shipping destination
Signed POST /checkout-sessions with cart_id and fulfillment.methods[0].destinations. Cart items, buyer and discounts are inherited.
Select a shipping option
Signed PUT /checkout-sessions/{id} — a full replace built from the current checkout (server-owned fields removed) with groups[0].selected_option_id set.
Create a checkout with a destination first.
Complete the checkout (browser handoff)
Signed POST /checkout-sessions/{id}/complete with {"payment":{}}. No card data is sent: the expected result is requires_escalation with a continue_url.
Shopper continues on the store and pays
Complete the checkout (step 6) to get the shopper handoff link.
Order status and webhook
Signed GET /checkout-sessions/{id} using the same platform identity. After payment it becomes completed with an order. The store's outbox worker then POSTs a signed order event to https://agent.dev.example.com/webhooks/orders.
Webhooks for this checkout
None received yet. Delivery happens when the store runs php system/ee/eecli.php ct_ai:outbox (normally cron, about once a minute).