---
title: "Start checkout for a message top-up pack"
method: POST
path: "/api/billing/message-packs/checkout"
tags: ["Billing"]
---

# Start checkout for a message top-up pack

`POST /api/billing/message-packs/checkout`

## Request

- Base URL: `https://api.setluca.com`
- URL: `https://api.setluca.com/api/billing/message-packs/checkout`
- Auth: API key in cookie `luca.session_token`

Opens a Stripe Checkout session for a pack of extra messages on top of the plan's monthly pool, and returns the URL to send the coach to. The messages are only credited once Stripe reports the payment.

**Session-only.** This endpoint isn't on the API-key allowlist. An organization API key gets a 403 here, whatever scopes it holds.

## Headers

- `idempotency-key` string
- `Luca-API-Version` '1'

## Request body

- MessagePackCheckoutBody
  - `packSku` 'msg_1000', required
  - `successUrl` string, uri
  - `cancelUrl` string, uri

## Response `200`

ok

- PackCheckoutResponse
  - `url` string, uri, required

## Other responses

- `400`: bad request
- `401`: unauthorized
- `404`: not found
- `429`: rate limited
- `500`: internal error
- `502`: upstream failure
- `503`: service unavailable

---

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