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

# Create checkout session

`POST /api/v1/billing/checkout`

## Request

- Base URL: `https://api.proof.holdings`
- URL: `https://api.proof.holdings/api/v1/billing/checkout`
- Auth: HTTP bearer

Create a Stripe checkout session for subscribing to a plan.

## Request body

- CheckoutRequest: Request body for creating a Stripe checkout session
  - `plan` 'free' | 'pro' | 'business' | 'enterprise', required: Plan to check out. `free` adds a card for pay as you go (the metered price past the included proofs); it is offered once billing is live.
  - `success_url` string, uri, required
  - `cancel_url` string, uri, required

## Response `200`

Checkout session created

- CheckoutResponse: Checkout session creation response
  - `url` string, uri, required: Stripe Checkout URL to redirect user to

## Other responses

- `400`: Validation error
- `403`: `account_key_required` — this API key is bound to one sub-account; account-level changes need an account-wide key or the dashboard.
- `409`: subscription_exists — this account already has a subscription Stripe may still charge (active, past_due, trialing or incomplete); change the plan or the card in the billing portal.

---

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