---
title: "Create Checkout"
method: POST
path: "/v2/billing/checkout"
tags: ["billing", "billing"]
---

# Create Checkout

`POST /v2/billing/checkout`

## Request

- Base URL: `https://api.etymolt.com`
- URL: `https://api.etymolt.com/v2/billing/checkout`
- Auth: none declared

Create a Stripe Checkout session.

B-WEBHOOKS (R3 F2, F6) hardened auth posture:
  - The `api_key_hash` and `email` fields in the request body are
    rejected (400). A legacy client must upgrade.
  - The webhook credits the SERVER-RESOLVED subject from one of:
        * Authorization: Bearer <api_key> / X-API-Key   → key's hash
        * X-Tenant-Id (+ X-User-Id)                     → tenant
        * body.checkout_token (server-minted, signed)   → bound subject
  - Without any of those, /checkout returns 401. The anonymous topup
    flow must first call POST /v2/billing/checkout_token.

## Headers

- `X-Tenant-Id` string, nullable
- `X-User-Id` string, nullable
- `Authorization` string, nullable
- `X-API-Key` string, nullable

## Request body

- CheckoutRequest
  - `sku` string, required
  - `success_url` string, nullable
  - `cancel_url` string, nullable
  - `quantity` integer
  - `api_key_hash` string, nullable: DEPRECATED — rejected since 2026-05-17 (R3 F2/F6). The webhook credits the server-resolved identity from auth or from the checkout_token, never from the request body.
  - `email` string, nullable: DEPRECATED — rejected since 2026-05-17 (R3 F2/F6). If you need to credit a specific email, mint a checkout_token via POST /v2/billing/checkout_token first.
  - `checkout_token` string, nullable: One-time signed token binding (subject, sku, exp). Minted by POST /v2/billing/checkout_token. Required when the caller has neither tenant auth nor a Bearer API key.
  - `client_reference_id` string, nullable

## Response `200`

Successful Response

- CheckoutResponse
  - `url` string, required
  - `session_id` string, required
  - `sku` string, required
  - `stripe_price_id` string, required
  - `mode` string, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/etymolt/apis/etymolt-verify-ai-generated-brand-names.md) · [All operations](https://skmtc.dev/etymolt/apis/etymolt-verify-ai-generated-brand-names/llms.txt) · [OpenAPI document](https://skmtc.dev/etymolt/apis/etymolt-verify-ai-generated-brand-names/revisions/7228ffa1efa7?raw)
