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

# Start Stripe checkout

`POST /v1/billing/checkout`

## Request

- Base URL: `https://api.briefgate.dev`
- URL: `https://api.briefgate.dev/v1/billing/checkout`
- Auth: HTTP bearer

Create a Stripe Checkout session to upgrade or change the plan. Returns a `url` to redirect the user to. Unless the purchase is a business declaration or a consumer who expressly consented to immediate access, the plan is started on a 14-day Stripe trial instead of immediately: nothing is charged and the account stays on its current tier until the trial ends, because performing before a consumer asked us to would forfeit any right to charge for it if they withdraw (§ 1834 NOZ / Art. 14(3) CRD).

## Request body

- object
  - `plan` 'solo' | 'studio' | 'agency', required: Plan to purchase.
  - `interval` 'monthly' | 'yearly'
  - `seats` integer: Extra seat add-ons to include (Agency plan only, +$15/seat/mo — Studio is a single-seat plan and rejects a nonzero value with 402 plan_required).
  - `customer_type` 'consumer' | 'business': What the buyer declared at checkout. Omitted over the API, where there is no form to declare on — an omission is recorded as undeclared, treated as a consumer purchase with the full 14-day withdrawal period, and gets the same deferred plan start a consumer without immediate_access_consent gets. Declare `business` or `consumer` with immediate_access_consent to start (and be charged) immediately instead.
  - `immediate_access_consent` boolean: A consumer expressly asking for the plan to start before the 14-day withdrawal period ends, and acknowledging that the right is lost once the service has been fully performed (§ 1837 l) NOZ / Art. 16(m) CRD). Ignored unless customer_type is `consumer`.
  - `language` 'cs' | 'sk' | 'pl' | 'de' | 'es' | 'en': The language the declarations were shown in, i.e. the one GET /v1/billing/withdrawal was called with. Recorded as consent_language. Omitted over the API, where the account's default language stands in.

## Response `200`

Checkout session URL

- object
  - `url` string, uri

## Other responses

- `400`: Invalid request — malformed body or query parameters
- `401`: Missing or invalid API key

---

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