Skip to content

Agent checkout (ACP, MPP, UCP)

An AI agent can buy a Keel plan on a person’s behalf through the Agentic Commerce Protocol (ACP). The agent creates a checkout session, pays with a Stripe Shared Payment Token, and Keel sets up a new workspace on that plan. The buyer gets an email invitation to sign in as the workspace owner.

The same purchase is also on sale over the Machine Payments Protocol (MPP) and the Universal Commerce Protocol (UCP). All three take the same token, sell the same six items and set up the workspace the same way.

Discovery document: https://keelgrc.com/.well-known/acp.json. Endpoints start at https://app.keelgrc.com/api/acp/checkout_sessions. ACP version: 2026-04-17.

One plan for one prepaid term per checkout. The price is the one on the pricing page, read from the same Stripe price the normal checkout uses.

Item id Plan Term
keel-starter-monthly Starter one month
keel-starter-annual Starter one year
keel-pro-monthly Pro one month
keel-pro-annual Pro one year
keel-enterprise-monthly Enterprise one month
keel-enterprise-annual Enterprise one year

An agent purchase does not renew. A Shared Payment Token approves one charge, so Keel charges it once and the plan ends when the term does. The workspace then moves to the Free plan, and the owner can choose a paid plan from Billing in Keel. Add-ons, credit packs and the MSP plan are not sold through this channel, because each needs an existing workspace.

  1. POST /checkout_sessions with one line item and currency: "usd". Include buyer.email now or later; the invitation goes to that address.

  2. POST /checkout_sessions/{id} to change the plan or the buyer.

  3. POST /checkout_sessions/{id}/complete with a Shared Payment Token:

    {
    "payment_data": {
    "handler_id": "stripe_spt",
    "instrument": { "type": "card", "credential": { "type": "spt", "token": "spt_..." } }
    }
    }

    On success the session is completed and carries an order. On a decline it returns to ready_for_payment with an error message, and the agent can retry with another token.

  4. POST /checkout_sessions/{id}/cancel abandons an unpaid session. GET /checkout_sessions/{id} returns the current state at any point.

Every POST needs an Idempotency-Key header of at least 16 characters; use a UUID. Repeating a request with the same key and body returns the stored response instead of charging again. Sessions expire an hour after creation.

MPP uses HTTP 402 Payment Required with the stripe payment method and the charge intent. Discovery document: https://keelgrc.com/openapi.json, which lists one operation per item with its price in x-payment-info.

  1. POST to the item’s URL, for example https://app.keelgrc.com/api/mpp/plans/keel-pro-monthly, with {"buyer": {"email": "..."}} and no Authorization header. Keel answers 402 with a WWW-Authenticate: Payment challenge. The challenge’s request carries the amount in cents and Keel’s Stripe network profile id.
  2. Mint a Shared Payment Token for that amount and send the same request again with Authorization: Payment <credential>.
  3. A paid request returns 200 and a Payment-Receipt header naming the Stripe PaymentIntent.

A challenge expires 15 minutes after it is issued and pays for one purchase. A decline returns 402 with a new challenge. A 503 means the payment went through but setup did not finish: send the exact same request again, and Keel finishes the setup without charging a second time.

Business profile: https://keelgrc.com/.well-known/ucp. UCP version 2026-08-25, REST transport, checkout capability. Endpoints start at https://app.keelgrc.com/api/ucp/v1/checkout-sessions. Payment uses Stripe’s com.stripe.payments handler: tokenize the card with Stripe, then send the token to /complete.

  1. POST /checkout-sessions with {"line_items": [{"item": {"id": "keel-pro-monthly"}, "quantity": 1}], "buyer": {"email": "..."}}.

  2. PUT /checkout-sessions/{id} to change the plan or the buyer.

  3. POST /checkout-sessions/{id}/complete:

    {
    "payment": {
    "instruments": [{
    "id": "instr_1",
    "handler_id": "stripe_payments",
    "type": "card",
    "selected": true,
    "credential": { "type": "stripe_payment_token", "token": "spt_..." }
    }]
    }
    }
  4. POST /checkout-sessions/{id}/cancel and GET /checkout-sessions/{id} work as in ACP.

The Idempotency-Key rule is the same as for ACP. Only the card instrument is accepted.

  • No Authorization header is required. The Shared Payment Token authorizes the charge, and the session id is the only handle on a session, so treat it as a secret. A completed session no longer returns the buyer’s details.
  • Cards that need 3-D Secure are declined with requires_3ds; this checkout cannot run the challenge.
  • Requests are rate limited per IP address.
  • Prices are in US dollars.

Questions about an agent purchase go to help@keelgrc.com.