---
title: "Create Checkout"
method: POST
path: "/api/v1/billing/checkout"
tags: ["billing"]
---

# Create Checkout

`POST /api/v1/billing/checkout`

## Request

- Base URL: `https://api.billcommons.org`
- URL: `https://api.billcommons.org/api/v1/billing/checkout`
- Auth: none declared

C2: guest-capable, Origin-checked only (plus E2/item 4's own strict
rate limit -- this endpoint is an unauthenticated write against the
shared Stripe account, `QuotaMiddleware` never sees it). A4/B4: 409 if
the (optional) logged-in customer already has an active/non-terminal
subscription (item 3: `incomplete_expired` counts as terminal, not
just `canceled`) -- they should use the Portal to change plans, not
open a second Checkout.

## Request body

- CheckoutRequest
  - `plan` 'builder' | 'scale', required
  - `interval` 'monthly' | 'annual', required

## Response `200`

Successful Response

- CheckoutResponse
  - `url` string, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/billcommons/apis/bill-commons-api.md) · [All operations](https://skmtc.dev/billcommons/apis/bill-commons-api/llms.txt) · [OpenAPI document](https://skmtc.dev/billcommons/apis/bill-commons-api/revisions/bfb8cd50a317?raw)
