---
name: buy-products
description: Buy from Ace as an AI agent: read the catalog, open a UCP or ACP checkout session for one offer, and hand the buyer to the Stripe-hosted checkout page.
version: 2026.09.15
---

# buy-products — Ace

Agents can start a purchase on https://ace-bl.tech without an account, a registration or an API key. Payment always happens on the Stripe-hosted checkout page, entered by the buyer. This API never takes card details or payment tokens.

## 1. Read the catalog

`GET https://ace-bl.tech/agent/commerce/products`

Each offer has an `id`, `title`, `description`, `platform`, `price` (amount in cents, currency, billing interval, free-trial days and a display string), `quantity` limits, `delivery` and live `availability`. Prices are read from Stripe. A paid first period, where an offer has one, is in `price.first_period` (amount in cents and days). Only offers with `availability.available: true` can be bought.

## 2. Create a checkout session for one offer

Use one protocol. Sessions last 24 hours. Send an `Idempotency-Key` header so retries are safe.

UCP (profile `https://ace-bl.tech/.well-known/ucp`):

    POST https://ace-bl.tech/agent/commerce/ucp/checkout-sessions
    {"line_items": [{"item": {"id": "<offer id>"}, "quantity": 1}]}

ACP (discovery `https://ace-bl.tech/.well-known/acp.json`):

    POST https://ace-bl.tech/agent/commerce/acp/checkout_sessions
    {"line_items": [{"id": "<offer id>"}]}

MCP (`POST https://ace-bl.tech/mcp`): call `list_products`, then `create_checkout` with `{"offer_id": "<offer id>"}`.

One product per session. A quantity above 1 is accepted only where the offer's `quantity.max` allows it.

## 3. Hand off to the buyer

A sellable session answers `status: "requires_escalation"` with a `continue_url`. Show the buyer the price and billing terms from the session `messages`, then send the buyer to `continue_url`. It redirects to the Stripe-hosted checkout page, where the buyer pays and enters an email, plus a shipping address for hardware. Subscriptions with a free trial collect the card at checkout and bill when the trial ends. On this store `continue_url` first opens the start page, where the buyer reads and accepts the subscription terms; the page then continues to the Stripe-hosted checkout page. The session carries a `terms_acknowledgment` message saying so.

After payment the store's normal receipt and delivery follow. Each offer's `delivery` field says where Stripe returns the buyer.

## Status values

- `requires_escalation`: ready for the buyer at `continue_url`.
- UCP `incomplete`, ACP `not_ready_for_payment`: the store is not selling this offer right now, and the message says why.
- `canceled` (UCP also uses it after expiry) and ACP `expired`: start a new session.
- A complete call that carries a payment instrument or a delegated token returns the session with its `continue_url`, because those are not accepted.
- `POST .../cancel` cancels a session.

## Not accepted

Payment instruments or delegated payment tokens sent to the API, MPP HTTP 402 credentials, x402 payments and AP2 mandates.

## Reference

- OpenAPI: https://ace-bl.tech/openapi.json
- Registration and credentials: https://ace-bl.tech/auth.md
- Terms https://ace-bl.tech/terms, privacy https://ace-bl.tech/privacy, support https://ace-bl.tech/support
