---
title: "Start a Stripe-hosted Checkout session for a paid plan"
method: POST
path: "/billing/checkout"
tags: ["Billing"]
---

# Start a Stripe-hosted Checkout session for a paid plan

`POST /billing/checkout`

## Request

- Base URL: `https://api.nippy.host`
- URL: `https://api.nippy.host/billing/checkout`
- Auth: `bearer` (a scheme the document does not define)

## Request body

- StartCheckoutDto
  - `plan` 'basic' | 'pro' | 'max', required: Target paid plan (free is not a selectable target here)
  - `interval` 'month' | 'year': Billing interval; defaults to monthly when omitted
  - `currency` 'usd' | 'gbp' | 'eur' | 'chf': Explicit presentment currency for Checkout. Omit to auto-detect from the customer location (USD fallback). Ignored on plan swaps — a subscription currency is locked at creation.
  - `returnTo` 'billing' | 'dashboard': Surface an abandoned Checkout returns to. A completed Checkout always returns to the dashboard.

## Response `200`

- APIBillingRedirect
  - `url` string, required: Stripe-hosted URL to redirect to

## Other responses

- `403`: Only the account owner can manage billing
- `409`: The account already has an active subscription

---

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