---
title: "Open weekly subscription checkout"
method: POST
path: "/api/billing/checkout"
---

# Open weekly subscription checkout

`POST /api/billing/checkout`

## Request

- Base URL: `https://api.peelaway.io`
- URL: `https://api.peelaway.io/api/billing/checkout`
- Auth: one of:
  - API key in cookie `better-auth.session_token`
  - HTTP bearer

Returns a hosted Stripe URL. First-time subscribers pay $2.99 for the first week, then $9.99/week. Prior subscribers pay $9.99/week. All weeks are paid upfront; there is no free trial. The server checks eligibility and applies the introductory coupon automatically. Send introOffer=weekly_first_week_299_v1 when the customer selected the introductory price; an ineligible quote returns 409 instead of charging more. Existing legacy subscriptions open Stripe confirmation to switch the same agreement to weekly; no second subscription is created. Credits arrive only after a signed paid invoice and expire at the next renewal.

## Request body

- object
  - `plan` 'weekly', required
  - `billingInterval` 'week'
  - `introOffer` 'weekly_first_week_299_v1': Require the advertised introductory price; otherwise return 409
  - `returnTo` string: Same-site path to return to after checkout

## Response `200`

Hosted checkout URL

## Other responses

- `400`: Invalid plan or billing interval; free trials and retired offers are unavailable
- `401`: Authentication required
- `409`: Introductory quote is no longer eligible, weekly plan is already active, or subscription needs attention in Billing
- `503`: Selected Stripe price has not been provisioned

---

[API](https://skmtc.dev/peelaway/apis/peelaway-image-api.md) · [All operations](https://skmtc.dev/peelaway/apis/peelaway-image-api/llms.txt) · [OpenAPI document](https://skmtc.dev/peelaway/apis/peelaway-image-api/revisions/8ce45533c9d0?raw)
