---
title: "Create a Stripe checkout session"
method: POST
path: "/billing/checkout"
---

# Create a Stripe checkout session

`POST /billing/checkout`

## Request

- Base URL: `https://ship.page`
- URL: `https://ship.page/billing/checkout`
- Auth: HTTP bearer

## Request body

- object
  - `plan` 'pro' | 'team'

## Response `200`

Redirect the user to `url`.

- object
  - `url` string, uri, required
  - `alreadySubscribed` boolean, required

## Other responses

- `400`: Bad request — unparseable body, bad paths, invalid ttl/name, per-request file cap, invalid zip.
- `401`: Missing or invalid credential.

## Changes

- **2026-10-20** `99aad34506e8`: 28 warning
  - added the new `already_live` enum value to the `code` response property for the response status `400`
  - added the new `already_live` enum value to the `code` response property for the response status `401`
  - added the new `blocked` enum value to the `code` response property for the response status `400`
  - added the new `blocked` enum value to the `code` response property for the response status `401`
  - …24 more

[Operation history](https://skmtc.dev/ship/apis/ship-page/changes/billing/checkout/post.md)

---

[API](https://skmtc.dev/ship/apis/ship-page.md) · [All operations](https://skmtc.dev/ship/apis/ship-page/llms.txt) · [OpenAPI document](https://skmtc.dev/ship/apis/ship-page/revisions/99aad34506e8?raw)
