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

# Start Checkout

`POST /api/billing/checkout`

## Request

- Base URL: `https://api.parlel.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.parlel.com/api/billing/checkout`
- Auth: none declared

Create a hosted checkout and return its URL for the client to navigate to.

Returns the URL rather than issuing a 302. A redirect from an XHR is followed by
the browser and lands the JSON response in a fetch the client cannot use, so the
client has to navigate. Being explicit about that here beats a redirect that
happens to work only because someone used a form post.

Already-Pro is refused with 409 rather than quietly making a second subscription.
Two live subscriptions for one account is a double charge, and the honest answer
to "buy Pro" when you already have it is "you already have it".

## Headers

- `authorization` string, nullable

## Response `200`

Successful Response

- object

## Other responses

- `422`: Validation Error

---

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