Skip to main content
POST
/
plans
Create Plan
curl --request POST \
  --url https://{defaultHost}/plans \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "product_id": "<string>",
  "account_id": "<string>",
  "plan_type": "<string>",
  "release_method": "<string>",
  "split_pay_required_payments": 123,
  "adaptive_pricing_enabled": true,
  "billing_period": 123,
  "checkout_styling": {},
  "currency": "<string>",
  "custom_fields": [
    {
      "id": "<string>",
      "field_type": "text",
      "name": "<string>",
      "order": 123,
      "placeholder": "<string>",
      "required": true
    }
  ],
  "description": "<string>",
  "expiration_days": 123,
  "image": {
    "id": "<string>",
    "direct_upload_id": "<string>"
  },
  "initial_price": 123,
  "internal_notes": "<string>",
  "legacy_payment_method_controls": true,
  "metadata": {},
  "override_tax_type": "<string>",
  "payment_method_configuration": {
    "enabled": [
      "<string>"
    ],
    "disabled": [
      "<string>"
    ],
    "include_platform_defaults": true
  },
  "renewal_price": 123,
  "stock": 123,
  "title": "<string>",
  "trial_period_days": 123,
  "unlimited_stock": true,
  "visibility": "<string>"
}
'
{
  "id": "<string>",
  "created_at": "<string>",
  "updated_at": "<string>",
  "account": {},
  "product": {},
  "invoice": {},
  "billing_period": 123,
  "title": "<string>",
  "description": "<string>",
  "purchase_url": "<string>",
  "expiration_days": 123,
  "initial_price": 123,
  "renewal_price": 123,
  "trial_period_days": 123,
  "member_count": 123,
  "internal_notes": "<string>",
  "metadata": {},
  "stock": 123,
  "unlimited_stock": true,
  "split_pay_required_payments": 123,
  "adaptive_pricing_enabled": true,
  "payment_method_configuration": {},
  "tax_type": "<string>",
  "collect_tax": true,
  "custom_fields": "<array>"
}

Authorizations

Authorization
string
header
required

A company API key, company scoped JWT, app API key, or user OAuth token.

Headers

Api-Version-Date
string<date>

Pins the request to a dated API version. When omitted, the request uses the original (2025-01-01) request/response shapes, so existing unversioned callers are never broken. Generated SDKs always send the latest version they were built against. An unrecognized value is rejected with a 400. The schemas documented here always describe the latest version.

Example:

"2026-06-09"

Body

application/json
product_id
string
required

The unique identifier of the product to attach this plan to.

account_id
string

The unique identifier of the account to create this plan for. Defaults to the caller's account.

plan_type
string

The billing type of the plan, such as one_time or renewal.

release_method
string

The method used to sell this plan (e.g., buy_now, waitlist).

split_pay_required_payments
integer | null

The number of installment payments required before the subscription pauses.

adaptive_pricing_enabled
boolean | null

Whether this plan accepts local currency payments via adaptive pricing.

billing_period
integer | null

The number of days between recurring charges. For example, 30 for monthly or 365 for yearly.

checkout_styling
object

Checkout styling overrides for this plan.

currency
string

The three-letter ISO currency code for the plan's pricing. Defaults to USD.

custom_fields
object[] | null

An array of custom field definitions to collect from customers at checkout. Omitting this field clears existing custom fields.

description
string | null

A text description of the plan displayed to customers on the product page.

expiration_days
integer | null

The number of days until the membership expires and access is revoked.

image
object

An image displayed on the product page to represent this plan.

initial_price
number | null

The amount charged on the first purchase, in the plan's currency (e.g., 10.43 for $10.43).

internal_notes
string | null

Private notes visible only to the business owner. Not shown to customers.

legacy_payment_method_controls
boolean | null

Whether this plan uses legacy payment method controls.

metadata
object

Custom key-value pairs to store on the plan. Included in webhook payloads for payment and membership events.

override_tax_type
string

Override the default tax classification for this specific plan.

payment_method_configuration
object

Explicit payment method configuration for the plan. When not provided, the account's defaults apply.

renewal_price
number | null

The amount charged each billing period for recurring plans, in the plan's currency.

stock
integer | null

The maximum number of units available for purchase. Ignored when unlimited_stock is true.

three_ds_level
enum<string>

The 3D Secure behavior for this plan. Send null to inherit the account default.

Available options:
mandate_challenge,
frictionless
title
string | null

The display name of the plan shown to customers on the product page.

trial_period_days
integer | null

The number of free trial days before the first charge on a recurring plan.

unlimited_stock
boolean | null

Whether the plan has unlimited stock. When true, the stock field is ignored.

visibility
string

Whether the plan is visible to customers or hidden from public view.

Response

plan created

id
string
required

The ID of the plan, which will look like plan_*************

created_at
string
required

When the plan was created, as an ISO 8601 timestamp

updated_at
string
required

When the plan was last updated, as an ISO 8601 timestamp

visibility
enum<string>
required

Whether the plan is visible to customers or hidden from public view

Available options:
visible,
hidden,
archived,
quick_link
plan_type
enum<string>
required

The billing model for this plan: 'renewal' for recurring subscriptions or 'one_time' for single payments

Available options:
renewal,
one_time
release_method
enum<string>
required

The method used to sell this plan, e.g. 'buy_now' or 'waitlist'

Available options:
buy_now,
waitlist
currency
enum<string>
required

The three-letter ISO currency code all prices on this plan are denominated in

Available options:
usd,
sgd,
inr,
aud,
brl,
cad,
dkk,
eur,
nok,
gbp,
sek,
chf,
hkd,
huf,
jpy,
mxn,
myr,
pln,
czk,
nzd,
aed,
eth,
ape,
cop,
ron,
thb,
bgn,
idr,
dop,
php,
try,
krw,
twd,
vnd,
pkr,
clp,
uyu,
ars,
zar,
dzd,
tnd,
mad,
kes,
kwd,
jod,
all,
xcd,
amd,
bsd,
bhd,
bob,
bam,
khr,
crc,
xof,
egp,
etb,
gmd,
ghs,
gtq,
gyd,
ils,
jmd,
mop,
mga,
mur,
mdl,
mnt,
nad,
ngn,
mkd,
omr,
pyg,
pen,
qar,
rwf,
sar,
rsd,
lkr,
tzs,
ttd,
uzs,
rub,
btc,
cny,
usdt,
kzt,
awg,
whop_usd,
xau
account
object
required

The account that sells this plan, an object with an id and title. Null for standalone invoice plans

product
object
required

The product this plan belongs to, an object with an id and title. Null for standalone plans

invoice
object
required

The invoice this plan was generated for, an object with an id. Null unless the plan was created for an invoice

billing_period
number | null
required

The number of days between recurring charges. Null for one-time plans

title
string | null
required

The display name of the plan shown to customers

description
string | null
required

A text description of the plan visible to customers

purchase_url
string
required

The full URL where customers can purchase this plan directly

expiration_days
number | null
required

The number of days until the membership expires, for expiration-based plans

initial_price
number
required

The initial purchase price in the plan's currency

renewal_price
number
required

The recurring price charged every billing period in the plan's currency

trial_period_days
number | null
required

The number of free trial days before the first charge on a recurring plan

three_ds_level
enum<string> | null
required

The 3D Secure behavior for this plan. Null means the plan inherits the account default

Available options:
mandate_challenge,
frictionless
member_count
number | null
required

The number of active memberships on this plan. Only visible to authorized team members

internal_notes
string | null
required

Private notes visible only to authorized team members

metadata
object
required

Custom key-value pairs stored on the plan

stock
number | null
required

The number of units available for purchase. Only visible to authorized team members

unlimited_stock
boolean
required

Whether the plan has unlimited stock

split_pay_required_payments
number | null
required

The number of installment payments required before the subscription pauses

adaptive_pricing_enabled
boolean
required

Whether this plan accepts local currency payments via adaptive pricing

payment_method_configuration
object
required

The explicit payment method configuration for the plan, an object with enabled, disabled and include_platform_defaults. Null if the plan uses default settings

tax_type
string
required

How tax is handled for this plan: 'inclusive', 'exclusive', or 'unspecified'

collect_tax
boolean
required

Whether tax is collected on purchases of this plan

custom_fields
array
required

Custom input fields displayed on the checkout form, objects with id, field_type, name, order, placeholder and required