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.
What an agent can buy
Section titled “What an agent can buy”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.
The flow
Section titled “The flow”-
POST /checkout_sessionswith one line item andcurrency: "usd". Includebuyer.emailnow or later; the invitation goes to that address. -
POST /checkout_sessions/{id}to change the plan or the buyer. -
POST /checkout_sessions/{id}/completewith a Shared Payment Token:{"payment_data": {"handler_id": "stripe_spt","instrument": { "type": "card", "credential": { "type": "spt", "token": "spt_..." } }}}On success the session is
completedand carries anorder. On a decline it returns toready_for_paymentwith an error message, and the agent can retry with another token. -
POST /checkout_sessions/{id}/cancelabandons 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.
Machine Payments Protocol (MPP)
Section titled “Machine Payments Protocol (MPP)”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.
POSTto the item’s URL, for examplehttps://app.keelgrc.com/api/mpp/plans/keel-pro-monthly, with{"buyer": {"email": "..."}}and noAuthorizationheader. Keel answers402with aWWW-Authenticate: Paymentchallenge. The challenge’srequestcarries the amount in cents and Keel’s Stripe network profile id.- Mint a Shared Payment Token for that amount and send the same request again with
Authorization: Payment <credential>. - A paid request returns
200and aPayment-Receiptheader 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.
Universal Commerce Protocol (UCP)
Section titled “Universal Commerce Protocol (UCP)”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.
-
POST /checkout-sessionswith{"line_items": [{"item": {"id": "keel-pro-monthly"}, "quantity": 1}], "buyer": {"email": "..."}}. -
PUT /checkout-sessions/{id}to change the plan or the buyer. -
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_..." }}]}} -
POST /checkout-sessions/{id}/cancelandGET /checkout-sessions/{id}work as in ACP.
The Idempotency-Key rule is the same as for ACP. Only the card instrument is accepted.
Limits
Section titled “Limits”- No
Authorizationheader 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.