Skip to main content
PATCH
Update a membership plan

Authorizations

Authorization
string
header
required

Organization-scoped bearer credential: a customer API key (1club_sk_live_...) or an MCP OAuth access token.

Path Parameters

id
integer
required

Body

application/json
name
string
Maximum string length: 120
description
string | null
Maximum string length: 5000
clubId
integer | null
planCategoryId
integer | null

Category the plan is grouped under on price lists, from GET /v1/platform/plan-categories. null takes it out of every category.

revenueAccountId
integer | null

Ledger account a sale of this plan posts to, from GET /v1/platform/revenue-accounts. Leave it out and the sale falls to the organization's default account, resolved at the time of the sale - so omitting this is a choice, not a gap. null clears it back to that.

price
number
Required range: x >= 0
signupFee
number
Required range: x >= 0
billingFrequency
enum<string>
Available options:
one_time,
weekly,
monthly,
quarterly,
annually,
custom
customPeriod
integer | null
Required range: x >= 1
customPeriodUnit
enum<string> | null
Available options:
days,
weeks,
months
isActive
boolean
maxUses
number | null
Required range: x >= 0
sessionUnit
enum<string> | null
Available options:
booking,
hour
validityPeriod
integer | null
Required range: x >= 1
autoRenews
boolean
renewalDaysInAdvance
integer
Required range: 0 <= x <= 60
requirePaymentUpfront
boolean
sports
string[]
Maximum array length: 50
features
string[]
Maximum array length: 100
visibility
enum<string>
Available options:
Private,
Member_only,
Public
validFor
object

Response

Plan updated

A membership plan. It carries its own price, joining fee, billing frequency and session allowance, so creating a membership only has to name the plan and the customer.

planId
integer
name
string
description
string | null
clubId
integer | null

Club the plan is limited to; null when organization-wide.

seasonId
integer | null

Set when the plan sells a season, and the marker that it is not for sale through this API: a season pass costs the sum of the slots the buyer picks, so the plan's own price is 0 and a membership created against it would put a member on a large contract for nothing. GET /v1/platform/plans excludes these; get-by-id resolves one so a membership already sold against it can be explained. Check it before treating any plan as sellable.

planCategoryId
integer | null

Category the plan is grouped under on price lists; null when ungrouped.

revenueAccountId
integer | null

Ledger account a sale posts to; null means the organization's default account is used at the time of the sale.

price
number

Charged each billing period.

signupFee
number

Charged once when the membership starts, on top of the price.

billingFrequency
string
isActive
boolean

False for a retired plan that is no longer sold.

maxUses
number | null

Session allowance a membership gets; null when unlimited.

sessionUnit
string | null

What a use is counted in - a booking or an hour.

validityPeriod
integer | null

Days the membership stays valid, when time-limited.

autoRenews
boolean

Whether a membership on this plan renews by default.

renewalDaysInAdvance
integer
requirePaymentUpfront
boolean
customPeriod
integer | null
customPeriodUnit
string | null
features
string[]
visibility
enum<string>
Available options:
Private,
Member_only,
Public
validFor
object

Booking resource scopes and optional type filters covered by the plan.

sports
string[]