---
title: "Create plan checkout"
method: POST
path: "/api/billing/create-checkout-session/{price_id}"
---

# Create plan checkout

`POST /api/billing/create-checkout-session/{price_id}`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/billing/create-checkout-session/{price_id}`
- Auth: HTTP bearer

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Creates a checkout page where the payer buys a paid plan for your workspace. Nothing is charged until they pay on that page.

Pass the price ID of the plan, from `price_ids` in [List plans](/api-reference/list-plans), then open `url` in a browser and let the payer complete the purchase. The page is on Stripe or Wix, depending on how the workspace is billed. Only the workspace owner can start a checkout.

If the workspace already pays for a plan, move it with [Change plan](/api-reference/change-plan) or [Change Wix plan](/api-reference/change-wix-plan) instead. Checkout refuses it with 409 when the plan is billed through Stripe and 400 when it's billed through Wix. A workspace billed through the App Store, Google Play or an external contract can't check out here either.

Set `checkout_return_path` to send the payer back to a page on Base44 after checkout. Without it, they land on the billing page.

Each call creates a new checkout page, including a retry after a lost response. Send the payer only one.

The base rate limit is 8 requests per hour per user. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

<Warning>Send only `checkout_return_path` in the body. Other request fields aren't supported and their behavior can change.</Warning>

## Path parameters

- `price_id` string, required: Price ID of the plan to buy, from `price_ids` in [List plans](/api-reference/list-plans).

## Request body

- CreateCheckoutSessionRequest: Request model for checkout session creation.
  - `checkout_return_path` string, nullable: Path on Base44 to send the payer back to after checkout, such as `/apps`. It must start with a single `/`. Any other value is ignored, and the payer lands on the billing page.

## Response `200`

The checkout page to send the payer to.

- PlanCheckoutSession: A checkout for a plan.
  - `session_id` string, required: ID of the Stripe Checkout session. An empty string when the workspace checks out through Wix.
  - `url` string, required: Checkout page for this purchase. Open it in a browser so the payer can review and pay. On Wix the link itself opens the checkout, so don't log or share it.

## Other responses

- `400`: `price_id` isn't a plan you can buy here (`invalid_price_id` on Stripe), the workspace already pays for a plan through Wix, or it's billed through the App Store.
- `401`: Missing or invalid credentials. A read-only token gets this response too.
- `403`: You aren't the workspace owner, a payment dispute is open on the workspace, or the plan is only available as a downgrade.
- `409`: The workspace already pays for a plan through Stripe, is billed through Google Play, Apple or an external contract, or is still on a free migration trial.
- `422`: Validation Error
- `429`: Rate limit exceeded. The base rate limit is 8 requests per hour per user. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

## Changes

- **2026-10-29** `b5b4ebd82a1e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/billing/create-checkout-session/:price_id/post.md)

---

[API](https://skmtc.dev/idealspot/apis/base44-app-management-api.md) - [All operations](https://skmtc.dev/idealspot/apis/base44-app-management-api/llms.txt) - [OpenAPI document](https://skmtc.dev/idealspot/apis/base44-app-management-api/revisions/b5b4ebd82a1e?raw)
