---
title: "Start a checkout"
method: POST
path: "/v1/billing/checkout"
tags: ["billing"]
---

# Start a checkout

`POST /v1/billing/checkout`

## Request

- Base URL: `https://botmail.pro`
- URL: `https://botmail.pro/v1/billing/checkout`
- Auth: API key in cookie `bm_session`

Signed-in human only (agents get 403 with a link to give their human).
Errors: 400 unknown_plan / addon_not_available, 409 already_on_plan,
402 payment_required.

## Request body

- object
  - `plan` 'free' | 'pro' | 'team' | 'scale' | 'storage_10gb', required
  - `success_path` string: Same-origin path to return to. Default `/settings/billing?checkout=success`.

## Response `200`

Open `url` in the browser.

- object
  - `url` string, uri, required

## Other responses

- `400`: Invalid request (`bad_request` or a more specific code).
- `401`: Missing or invalid credentials (`unauthorized`, `invalid_token`).
- `402`: Plan limit or payment needed (`plan_limit`, `payment_required`). Upgrade, then retry.
- `403`: The credential can't do this (`forbidden`, `csrf`, `account_inactive`, …). Missing scopes are listed in `details.required_scope`; pending keys get a hint to wait for the claim.
- `409`: Conflicts with current state.

---

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