---
title: "Start a hosted Stripe checkout for a plan/interval"
method: POST
path: "/v1/billing/checkout"
tags: ["billing"]
---

# Start a hosted Stripe checkout for a plan/interval

`POST /v1/billing/checkout`

## Request

- Base URL: `https://api.cueframe.ai`
- URL: `https://api.cueframe.ai/v1/billing/checkout`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.cueframe.ai/api/auth/mcp/authorize`, token URL `https://api.cueframe.ai/api/auth/mcp/token`, scopes: `billing:write`)
  - API key in header `PAYMENT-SIGNATURE`

Body `{ plan, interval }` → returns a hosted Stripe checkout `url` to open in a browser to complete payment. Upgrades the CURRENT org (server-resolved from your key/identity, NEVER the body). Always a hosted URL — an existing saved card is NEVER charged without the human confirming on Stripe. `interval:"year"` selects the annual plan. Discover valid combos with GET /v1/billing/plans. Requires `billing:write`.

## Request body

- CheckoutRequest
  - `plan` 'credit_pack_10' | 'credit_pack_30' | 'credit_pack_100', required: Plan tier to subscribe to.
  - `interval` 'month' | 'year', required: Billing interval: 'month' (monthly) or 'year' (annual, ~2 months free).

## Response `200`

Hosted Stripe checkout URL to open in a browser.

- CheckoutResponse
  - `url` string, required: Hosted Stripe checkout URL to open in a browser to complete payment. Always present on success — an existing saved card is never charged without confirming here.
  - `plan` string, required
  - `interval` string, required
  - `productId` string, required: Resolved billing catalog product id.

## Other responses

- `400`: Bad request — validation_error / invalid_cursor / invalid_query.
- `401`: Missing or invalid Authorization header.
- `402`: Payment required. Returned when the caller presents no API key on a priced operation: the body AND the `Payment-Required` header carry the x402 v2 challenge (accepted scheme, network, USDC asset, amount, payTo). Sign the EIP-3009 authorization and retry with a `PAYMENT-SIGNATURE` header. A KEYED caller sees this status instead when their plan lacks or has exhausted the feature (`billing_required`).
- `403`: Forbidden — permission insufficient.
- `429`: Rate limited. Retry-After header present.
- `500`: Internal error.
- `503`: Service unavailable — billing_unavailable / honest-503 for runtime deps.

---

[API](https://skmtc.dev/cueframe/apis/cueframe-api.md) · [All operations](https://skmtc.dev/cueframe/apis/cueframe-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cueframe/apis/cueframe-api/revisions/8f9bfe362b4a?raw)
