---
title: "Create donation checkout session"
method: POST
path: "/donations/checkout"
tags: ["Donations"]
---

# Create donation checkout session

`POST /donations/checkout`

Creates a Stripe checkout session for a one-time or recurring donation.

## Request body

- DonationCheckoutRequest
  - `email` string, email, required — Donor email address
  - `amount_cents` integer, required — Donation amount in minor units for the selected currency
  - `currency` 'usd' | 'eur' | 'brl' | 'inr' | 'pln' | 'try' | 'sek' | 'dkk' | 'nok', required
  - `interval` 'month' | 'year', nullable, required — Billing interval (null for one-time donation)
  - `is_business` boolean — Whether the donation is from a business. When true, Stripe Checkout requires a billing address for tax invoicing. When false or omitted, billing address collection is left to Stripe.

## Response `200`

Success

- DonationCheckoutResponse
  - `url` string, uri, required — Stripe checkout URL to redirect the user to

## Other responses

- `400` — Bad Request - The request was malformed or contained invalid data
- `429` — Too Many Requests - You are being rate limited
- `500` — Internal Server Error - An unexpected error occurred

## Changes

> 16 revisions in range; 1 not diffed.

- **2026-09-18** `dd0ad4ea1c88` — 1 warning
  - changed the pattern of the request property `email` from `^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$` to `^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$`
- **2026-09-15** `e36d9bcd8fbe` — 3 info
  - added the new `dkk` enum value to the request property `currency`
  - added the new `nok` enum value to the request property `currency`
  - added the new `sek` enum value to the request property `currency`
- **2026-09-06** `a52a2cf49d9b` — 16 warning
  - added the new `IP_BAN_DECLINED` enum value to the `code` response property for the response status `400`
  - added the new `IP_BAN_DECLINED` enum value to the `code` response property for the response status `500`
  - added the new `PHONE_COUNTRY_NOT_SUPPORTED` enum value to the `code` response property for the response status `400`
  - added the new `PHONE_COUNTRY_NOT_SUPPORTED` enum value to the `code` response property for the response status `500`
  - …12 more
  - …this revision’s changelog is incomplete
- **2026-09-05** `4dbb738a3e22` — 2 info
  - removed the `NSFW_EMOJI_STICKER_BLOCKED` enum value from the `code` response property for the response status `400`
  - removed the `NSFW_EMOJI_STICKER_BLOCKED` enum value from the `code` response property for the response status `500`
- …earlier changes not shown

[Full history](https://skmtc.dev/fluxer/apis/fluxer-api/changes/donations/checkout/post.md)

---

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