Skip to content
FiveCord Docs

Premium

Premium is the paid tier of a FiveCord account. A recurring subscription, a redeemed gift, or a lifetime Visionary purchase pays for it. The routes here read that entitlement and run the subscription self-service operations, while Billing owns purchase creation, refunds and the payment provider webhook.

Every route except get price IDs is user-only. A self-hosted deployment serves only get premium state and set premium perks disabled.

ObjectPurpose
Price IDsThe recurring and gift prices resolved for one country
Current subscription priceThe price the account is billed against, and the current list price
Pending subscription changeA billing cycle change scheduled for the end of the period
Premium stateThe single read behind a billing screen
Actual premium stateThe entitlement backed by billing alone
Effective premium stateThe entitlement every premium feature check reads
Premium billing stateMirrored payment provider data for the account
Billing subscriptionOne mirrored subscription
Billing invoiceOne mirrored invoice
Billing payment methodOne mirrored payment method
Premium pricing stateThe resolved checkout catalogue
ValueNameDescription
0NONENo premium entitlement
1SUBSCRIPTIONRecurring or gift-funded premium entitlement
2LIFETIMELifetime Visionary entitlement, which has a sequence number and community access
ValueDescription
monthlyThe recurring price bills every month
yearlyThe recurring price bills every year

Every amount field is in the minor unit of the currency field its description names, and two amounts in one object can have different currencies.

ValueDescription
USDUnited States dollar
EUREuro
BRLBrazilian real
DKKDanish krone
INRIndian rupee
NOKNorwegian krone
PLNPolish zloty
SEKSwedish krona
TRYTurkish lira

The checkout prices resolved for one country: monthly and yearly recurring, and one-month and one-year gift.

FieldTypeDescription
monthly?1?stringThe payment provider price ID of the monthly recurring plan
yearly?1?stringThe payment provider price ID of the yearly recurring plan
gift_1_month?1?stringThe payment provider price ID of the one-month gift
gift_1_year?1?stringThe payment provider price ID of the one-year gift
monthly_amount_minor?2?integerThe monthly recurring amount, in the minor unit of currency
yearly_amount_minor?2?integerThe yearly recurring amount, in the minor unit of currency
gift_1_month_amount_minor?2?integerThe one-month gift amount, in the minor unit of gift_currency
gift_1_year_amount_minor?2?integerThe one-year gift amount, in the minor unit of gift_currency
currencystringDisplay currency of the recurring prices
gift_currencystringDisplay currency of the gift prices

1 FiveCord resolves the recurring pair and the gift pair separately. Each pair takes the first currency for which both of its prices are configured, so the pairs can resolve to different currencies

2 Null when the amount is unavailable. Price changes can take up to one hour to appear

{
"monthly": "price_1QaMonthlyUsd",
"yearly": "price_1QaYearlyUsd",
"gift_1_month": "price_1QaGift1MonthUsd",
"gift_1_year": "price_1QaGift1YearUsd",
"monthly_amount_minor": 499,
"yearly_amount_minor": 4999,
"gift_1_month_amount_minor": 499,
"gift_1_year_amount_minor": 4999,
"currency": "USD",
"gift_currency": "USD"
}

The price the account is billed against, and the current list price for the same billing cycle and currency.

The complete value is null when the account’s subscription, billing cycle, or amount is unavailable.

FieldTypeDescription
price_id1stringThe price the account is billed against
amount_minorintegerThe amount charged, in the minor unit of currency
currency2stringDisplay currency of the charged amount
billing_cyclestringBilling cycle of the active subscription
is_grandfathered3booleanWhether the account is billed against a price other than the current list price
list_amount_minor4?integerThe current list amount, in the minor unit of currency
list_price_id4?stringThe current list price ID for the same billing cycle and currency

1 The copy in Get premium state reports an empty string when the price identifier is unavailable

2 The subscription’s currency in upper case, including unlisted currencies. The copy in Get premium state defaults to USD when unavailable

3 True only when a list price is configured for the same billing cycle and currency and its identifier differs from price_id, so an unconfigured currency reports false

4 Both are null when the deployment configures no list price for the subscription’s billing cycle and currency. list_amount_minor is also null on its own when that list price is configured but its amount cannot be read

{
"price_id": "price_1QaLegacyMonthlyUsd",
"amount_minor": 399,
"currency": "USD",
"billing_cycle": "monthly",
"is_grandfathered": true,
"list_amount_minor": 499,
"list_price_id": "price_1QaMonthlyUsd"
}

A billing cycle change scheduled for the end of the current period. It is returned in Premium billing state, not through a separate route.

FieldTypeDescription
schedule_idstringThe payment provider subscription schedule ID that has the change
current_billing_cycle1?stringThe current billing cycle
target_billing_cyclestringBilling cycle that takes effect at effective_at
effective_atISO8601 timestampThe start of the scheduled future phase
current_price_id?stringThe price ID of the active subscription item, or null when it cannot be resolved
target_price_id?stringThe price ID of the scheduled future phase, or null when it cannot be resolved
currency?stringDisplay currency of the target price, or null when it is unresolved or unsupported
initial_amount_minor2?integerThe amount of the first invoice after the change, in the minor unit of currency
recurring_amount_minor?integerThe amount of each later invoice, in the minor unit of currency
credit_amount_minor3?integerThe credit applied to the first invoice, in the minor unit of currency

1 Resolved from the live subscription item, and falls back to the billing cycle stored on the account when the live price cannot be resolved

2 The recurring amount plus any scheduled invoice adjustment, clamped at zero, and null when the target amount cannot be resolved

3 Null unless the scheduled adjustment is a credit. A monthly to yearly change credits the smaller of the two amounts, each multiplied by the subscription item quantity, and no credit is scheduled during a trial

The complete value is null in each of these cases.

ConditionDetail
No payment providerThe deployment configures none
No subscriptionThe account has no stored subscription identifier
No usable scheduleThe subscription has no schedule, or the schedule is neither active nor waiting to start
No future phaseThe schedule has no phase starting after now
No target cycleNeither the future phase price nor the schedule metadata resolves it
No changeThe resolved target billing cycle equals the current one
Read failedThe payment provider read failed, and the request still succeeds
{
"schedule_id": "sub_sched_1QaBcDeFgHiJ",
"current_billing_cycle": "monthly",
"target_billing_cycle": "yearly",
"effective_at": "2026-09-28T08:15:00.000Z",
"current_price_id": "price_1QaMonthlyUsd",
"target_price_id": "price_1QaYearlyUsd",
"currency": "USD",
"initial_amount_minor": 4500,
"recurring_amount_minor": 4999,
"credit_amount_minor": 499
}

The account’s entitlement, the effective entitlement that premium feature checks read, and the billing and pricing data behind both. Get premium state and set premium perks disabled both return it.

A client gates a premium feature on effective.is_premium.

FieldTypeDescription
actualactual premium state objectThe entitlement backed by billing, before local perk disabling
effectiveeffective premium state objectThe entitlement every premium feature check reads
billingpremium billing state objectThe mirrored payment provider data for the account
pricingpremium pricing state objectThe resolved checkout prices for the requested country

The entitlement the account holds from billing alone. Nothing here reacts to the perks-disabled flag, to an operator override, or to the instance premium mode.

FieldTypeDescription
premium_type1?integerPremium type
premium_since?ISO8601 timestampThe time premium access first started, or null when it never has
premium_until2?ISO8601 timestampThe time premium access ends, or null for a lifetime entitlement
premium_will_cancelbooleanWhether the subscription is set to cancel at the end of the current period
premium_billing_cycle?stringBilling cycle, or null when no recurring cycle is known
premium_lifetime_sequence3?integerThe Visionary sequence number, or null without lifetime entitlement
premium_grace_ends_at?ISO8601 timestampThe time the post-cancellation grace access ends, or null when no grace is active
has_active_paid_premium4booleanWhether paid premium access is active before local disabling
is_visionarybooleanWhether the entitlement is lifetime Visionary access
has_ever_purchasedbooleanWhether the account has ever completed a premium purchase

1 An account that holds no stored premium type reports 0

2 The later of the subscription period end and any stacked gift extension, so redeeming a gift on an active subscription moves this value

3 Allocated once when lifetime entitlement is first granted, and retained afterwards

4 Still true throughout the post-expiry grace window, which runs to premium_grace_ends_at when one is recorded and otherwise to exactly 3 days after premium_until

{
"premium_type": 1,
"premium_since": "2026-02-14T09:00:00.000Z",
"premium_until": "2026-09-14T09:00:00.000Z",
"premium_will_cancel": false,
"premium_billing_cycle": "monthly",
"premium_lifetime_sequence": null,
"premium_grace_ends_at": null,
"has_active_paid_premium": true,
"is_visionary": false,
"has_ever_purchased": true
}

The effective state decides whether premium features are available. It differs from the actual state when the account has disabled its own perks, when an operator override grants access, and when a self-hosted deployment uses the everyone premium mode.

FieldTypeDescription
is_premium1booleanWhether premium features are available to the account
premium_type2?integerThe effective premium type
premium_since2?ISO8601 timestampThe effective time premium access started
premium_until3?ISO8601 timestampThe time premium access ends, including any stacked gift extension, or null for a lifetime entitlement
premium_will_cancel3booleanWhether the subscription is set to cancel at the end of the current period
premium_billing_cycle3?stringBilling cycle
premium_lifetime_sequence3?integerThe Visionary sequence number, or null without lifetime entitlement
premium_grace_ends_at3?ISO8601 timestampThe time the post-cancellation grace access ends, or null when no grace is active
premium_enabled_override4booleanWhether an operator premium override applies to the account
premium_purchase_disabled4booleanWhether the account has the purchase-disabled flag
premium_perks_disabled4booleanWhether the account has the perks-disabled flag
self_hosted5booleanWhether the deployment is self-hosted
bot6booleanWhether the credential is a bot account with premium-equivalent service access

1 Decided in a fixed order. A self-hosted deployment in the everyone premium mode reports true, then a bot account reports true, then premium_perks_disabled reports false, then premium_enabled_override reports true, and otherwise the value follows actual.has_active_paid_premium

2 The only fields the effective state gates. They report the account value while is_premium is true, and 0 and null respectively while it is false

3 Copied from the actual premium state unchanged, so the value does not react to is_premium

4 Reflects the matching premium flag on the account

5 is_premium follows this only while the instance premium mode is everyone

6 Always false through this API, because both operations that return this object reject a bot credential with 403 ACCESS_DENIED

The account’s billing data behind a premium screen.

Billing details can lag behind changes made through the payment provider.

FieldTypeDescription
stripe_customer_id?stringThe payment provider customer ID, or null when none was ever created
current_subscription_price?current subscription price objectThe price the account is billed against
pending_subscription_change?pending subscription change objectThe scheduled billing cycle change
subscription?billing subscription objectThe mirrored subscription FiveCord selects by the rule below this table
invoices1array[billing invoice]The most recent invoices, newest first
invoices_has_more2booleanWhether the account has invoices beyond the returned page
payment_methods3array[billing payment method]The stored payment methods
refund_eligibility4refund eligibility objectThe self-service refund state for the account

1 At most 12 distinct invoices across the account’s billing history, newest first

2 True when the account has more invoices than the 12 returned. No route pages past the first 12, so use create customer portal for the rest

3 The default payment method sorts first, then the rest by provider creation time descending

4 Computed from the mirrored invoices, and it skips an invoice that already has a pending, succeeded or action-required refund. It can therefore differ from get refund eligibility

FiveCord selects the subscription by preferring an active or trialing mirror, then a past_due, unpaid or incomplete one, then anything else. Ties break on the latest current period end.

One mirrored payment provider subscription. FiveCord passes every member through, so status, plan_interval and plan_currency are the provider’s own values.

FieldTypeDescription
idstringThe payment provider subscription ID
status?stringThe provider subscription status
current_period_start?ISO8601 timestampThe start of the current billing period
current_period_end?ISO8601 timestampThe end of the current billing period
cancel_at_period_endbooleanWhether the subscription cancels at the period end
cancel_at?ISO8601 timestampThe scheduled cancellation time
canceled_at?ISO8601 timestampThe time the cancellation was requested
plan_interval1?stringThe provider recurring interval of the primary price
plan_amount_minor?integerThe primary price amount, in the minor unit of plan_currency
plan_currency?stringThe provider currency of the primary price, as the provider spells it
default_payment_method_id?stringThe payment method the subscription bills

1 The provider interval, month or year, which differs from the billing cycle values used elsewhere on this page

{
"id": "sub_1QaBcDeFgHiJkLmN",
"status": "active",
"current_period_start": "2026-08-14T09:00:00.000Z",
"current_period_end": "2026-09-14T09:00:00.000Z",
"cancel_at_period_end": false,
"cancel_at": null,
"canceled_at": null,
"plan_interval": "month",
"plan_amount_minor": 499,
"plan_currency": "usd",
"default_payment_method_id": "pm_1QaBcDeFgHiJkLmN"
}

One mirrored payment provider invoice. hosted_invoice_url and invoice_pdf are the only links to the invoice document.

FieldTypeDescription
idstringThe payment provider invoice ID
number?stringThe human-readable invoice number
amount_due1integerThe amount due, in the minor unit of currency
amount_paid1integerThe amount paid, in the minor unit of currency
currency2stringThe provider currency of the invoice, as the provider spells it
status?stringThe provider invoice status
created_at?ISO8601 timestampThe provider creation time
paid_at?ISO8601 timestampThe settlement time
billing_reason?stringThe provider reason the invoice was created
subscription_id?stringThe subscription that produced the invoice, or null for a one-off purchase
hosted_invoice_url?stringThe externally hosted invoice page
invoice_pdf?stringThe externally hosted invoice PDF

1 Reported as 0 when the mirror records no amount

2 Falls back to usd when the mirror records no currency

{
"id": "in_1QaBcDeFgHiJkLmN",
"number": "A1B2C3D4-0007",
"amount_due": 499,
"amount_paid": 499,
"currency": "usd",
"status": "paid",
"created_at": "2026-08-14T09:00:00.000Z",
"paid_at": "2026-08-14T09:00:04.000Z",
"billing_reason": "subscription_cycle",
"subscription_id": "sub_1QaBcDeFgHiJkLmN",
"hosted_invoice_url": "https://invoice.example.com/i/acct_1/live_1",
"invoice_pdf": "https://invoice.example.com/i/acct_1/live_1.pdf"
}

One mirrored stored payment method. A non-card method reports every card member as null and still reports type.

FieldTypeDescription
idstringThe payment provider payment method ID
type?stringThe provider payment method type
card_brand?stringThe card brand, or null when the method is not a card
card_last4?stringThe last four digits of the card, or null when the method is not a card
card_exp_month?integerThe expiry month of the card, or null when the method is not a card
card_exp_year?integerThe expiry year of the card, or null when the method is not a card
is_default1booleanWhether the method is the customer’s default

1 An account with more than one billing customer can report more than one default

{
"id": "pm_1QaBcDeFgHiJkLmN",
"type": "card",
"card_brand": "visa",
"card_last4": "4242",
"card_exp_month": 11,
"card_exp_year": 2029,
"is_default": true
}

The checkout catalogue resolved for the request. A client can render prices without a second call to get price IDs. FiveCord resolves one catalogue on every request, and a country with its own localised currency always resolves to that currency.

FieldTypeDescription
country_code1?stringThe country used to resolve the prices
localized2?price IDs objectThe localised catalogue, or null when it cannot be resolved

1 The request-time geolocation country, falling back to the country_code query value uppercased, or null when neither resolves

2 Null unless the deployment configures a complete recurring pair and a complete gift pair for a currency in the currency preference order of country_code, which is the default order when country_code is null, so one missing gift price nulls the whole catalogue. The amounts come from the mirrored price rows

FiveCord reports an unresolvable catalogue as null here, and the request still succeeds. Get price IDs answers 400 STRIPE_ERROR for the same condition.

GET/v1/premium/price-idsUnauthenticated

Returns the price IDs object for a country. FiveCord uses a supplied credential only to count the request against that user’s rate limit, so an unrecognised credential falls back to the client IP address.

The deployment must configure a complete recurring pair and a complete gift pair for at least one currency that the requested country prefers. FiveCord answers 400 STRIPE_ERROR when it does not.

FieldTypeDescription
country_code?1stringThe two-letter country used to select the regional price catalogue

1 FiveCord trims surrounding whitespace and requires exactly two characters, and any other length fails validation with STRING_LENGTH_EXACT. The request-time geolocation country wins, so this value is read only when FiveCord cannot geolocate the request, and the default currency preference order applies when neither resolves

StatusBodyCondition
200price IDs objectThe catalogue was resolved
400error responseNo configured currency satisfies the request and the request returns STRIPE_ERROR

40 requests per 10 seconds for each authenticated user or client IP address, on the stripe:price:ids bucket.

GET/v1/premium/state

Returns the premium state object for the authenticated account.

The route is available even when no payment provider is configured.

FieldTypeDescription
country_code?1stringThe two-letter country used to resolve pricing

1 FiveCord trims surrounding whitespace and requires exactly two characters. The request-time geolocation country wins, so this value is read only when FiveCord cannot geolocate the request. When neither resolves, pricing falls back to the default currency preference order and pricing.country_code is null

StatusBodyCondition
200premium state objectThe state was returned
404error responseThe authenticated account record no longer exists and the request returns UNKNOWN_USER

The read can change a default payment method. When the customer has a default that differs from the subscription’s, FiveCord sets the subscription’s default to the customer’s. When only the subscription has a default, FiveCord sets it as the customer’s default. It does not change entitlement.

30 requests per 10 seconds for each authenticated user, on the stripe:premium:state bucket.

GET/v1/premium/current-subscription-price

Returns the current subscription price object for the authenticated account, or null when no price can be resolved.

Returns null when no payment provider or subscription is configured, or when the price lookup fails.

Subscription price changes can take 5 minutes to appear. List price amount changes can take one hour.

StatusBodyCondition
200?current subscription price objectThe current price or null was returned
404error responseThe authenticated account record no longer exists and the request returns UNKNOWN_USER

20 requests per 10 seconds for each authenticated user, on the stripe:subscription:current_price bucket.

PATCH/v1/premium/perks-disabled

Turns the account’s own premium perks off or on without changing billing state, and returns the resulting premium state object. Emits a User Update Gateway event when the requested value differs from the stored one.

The response is built exactly as get premium state builds it, except that it always resolves pricing without a country code.

FieldTypeDescription
disabledbooleanWhether premium perks are disabled for the account
StatusBodyCondition
200premium state objectThe current state was returned, whether or not the flag changed
404error responseThe authenticated account record no longer exists and the request returns UNKNOWN_USER

When the requested value changes, every account session receives User Update. Repeating the current value leaves the flag untouched. The returned actual state never changes. The response has the same billing side effects as Get premium state.

10 requests per minute for each authenticated user, on the stripe:premium:perks_disabled bucket.

POST/v1/premium/customer-portal

Creates a billing portal session for the authenticated account and returns a redirect URL object. The object has no session identifier, so the returned URL is the only way to open the session.

An account that never had a payment provider customer receives 400 STRIPE_NO_PURCHASE_HISTORY. A deployment that configures no payment provider receives 400 STRIPE_PAYMENT_NOT_AVAILABLE, and a provider call that fails or answers without a URL receives 400 STRIPE_ERROR.

StatusBodyCondition
200redirect URL objectThe portal session was created
400error responseThe account has no payment provider customer, or the provider is not configured or rejected the request
404error responseThe authenticated account record no longer exists and the request returns UNKNOWN_USER

The operation creates an externally hosted billing portal session that returns to the FiveCord premium callback when the user closes it. Nothing is written to FiveCord state, and any change the user makes in the portal reaches FiveCord through receive Stripe webhook.

5 requests per minute for each authenticated user, on the stripe:customer_portal bucket.

POST/v1/premium/grace/end

Ends an active post-cancellation grace period immediately. Emits a User Update Gateway event when a grace period was ended.

The operation is idempotent and reports success without changing anything when no grace deadline is recorded, when the account holds a lifetime entitlement, and when the account’s premium end has not yet passed.

The window this operation ends runs to premium_grace_ends_at. Receive Stripe webhook records that deadline when a subscription is deleted for an account whose stored premium type is subscription.

ConditionRecorded deadline
The subscription ran to its recorded premium endThe subscription end plus 3 days
The subscription ended earlyThe subscription end itself, which leaves no window for this route to close
The early cancellation is already recordedNothing

This route requires an explicit premium_grace_ends_at. It does not end the default 3-day grace period used when that field is absent.

FieldTypeDescription
successbooleanAlways true
StatusBodyCondition
200response bodyThe grace period was ended, or no applicable grace state existed
404error responseThe authenticated account record no longer exists and the request returns UNKNOWN_USER

For an active grace period on a non-lifetime account, the operation clears the premium type, premium start, premium end, gift extension end, cancellation flag, billing cycle and grace deadline together. Every account session receives User Update. A call with no applicable grace state changes nothing. FiveCord contacts no payment provider.

3 requests per minute for each authenticated user, on the stripe:premium:grace:end bucket.

POST/v1/premium/cancel-subscription

Marks the active recurring subscription to cancel at the end of the current period and returns 204 with an empty body. Emits a User Update Gateway event.

A deployment that configures no payment provider receives 400 STRIPE_PAYMENT_NOT_AVAILABLE, an account with no stored subscription receives 400 STRIPE_NO_ACTIVE_SUBSCRIPTION, and a subscription already set to cancel receives 400 STRIPE_SUBSCRIPTION_ALREADY_CANCELING. Every other failure, including a subscription that has a schedule but no future period end, is reported as 400 STRIPE_ERROR.

StatusBodyCondition
204emptyThe subscription was marked to cancel at period end
4001error responseThe subscription cannot be marked to cancel
404error responseThe authenticated account record no longer exists and the request returns UNKNOWN_USER

1 The account has no stored subscription, the subscription is already cancelling, the subscription has a schedule but no future period end, the payment provider is not configured, or the payment provider rejected the request

FiveCord sets the subscription to cancel at the current period end, sets the account’s cancellation flag, and refreshes the mirrored subscription row. Every account session receives User Update. For a subscription with no schedule, FiveCord writes no premium end, so the recorded end is whatever the account already has.

A subscription that has a schedule discards its pending billing cycle change and ends in cancellation at the current period end. FiveCord then rewrites the premium end from the refreshed subscription. Premium access continues through the recorded end, and receive Stripe webhook later applies the final downgrade.

5 requests per minute for each authenticated user, on the stripe:subscription:cancel bucket.

POST/v1/premium/reactivate-subscription

Removes period end cancellation from a subscription that is set to cancel and returns 204 with an empty body. Emits a User Update Gateway event.

A deployment that configures no payment provider receives 400 STRIPE_PAYMENT_NOT_AVAILABLE, an account with no stored subscription receives 400 STRIPE_NO_SUBSCRIPTION, and a subscription that is not set to cancel receives 400 STRIPE_SUBSCRIPTION_NOT_CANCELING. Every other failure is reported as 400 STRIPE_ERROR.

StatusBodyCondition
204emptyThe subscription was reactivated
4001error responseThe subscription cannot be reactivated
404error responseThe authenticated account record no longer exists and the request returns UNKNOWN_USER

1 The account has no stored subscription, the subscription is not set to cancel, the payment provider is not configured, or the payment provider rejected the request

FiveCord releases any subscription schedule, which discards a pending billing cycle change, then clears period end cancellation. The account’s cancellation flag becomes false. Every account session receives User Update.

5 requests per minute for each authenticated user, on the stripe:subscription:reactivate bucket.

POST/v1/premium/change-subscription

Moves the active subscription between the monthly and yearly billing cycles, either immediately or at the end of the current period, and returns 204 with an empty body. Emits a User Update Gateway event when the account state changes.

A deployment that configures no payment provider receives 400 STRIPE_PAYMENT_NOT_AVAILABLE, an account with no stored subscription receives 400 STRIPE_NO_ACTIVE_SUBSCRIPTION, and a deployment with no configured price for the target cycle in the subscription’s currency receives 400 STRIPE_INVALID_PRODUCT_CONFIGURATION. A subscription with no recurring primary item, an unsupported recurring interval, a period end change with no future period end, and any other provider failure are all reported as 400 STRIPE_ERROR.

The operation reports success without changing anything when the subscription already bills on the requested cycle. When a future schedule phase already has the target price, the operation sends nothing further to the payment provider and writes only the account’s cancellation flag, premium end and stored payment provider customer identifier.

FieldTypeDescription
billing_cyclestringThe target billing cycle, either monthly or yearly
effective_at?stringEither now or period_end (default now)
StatusBodyCondition
204emptyThe change was applied, scheduled, or already in effect
4001error responseThe billing cycle cannot be changed
404error responseThe authenticated account record no longer exists and the request returns UNKNOWN_USER

1 The account has no stored subscription, the subscription has no usable recurring item or future period end, no price is configured for the target cycle and currency, the payment provider is not configured, or the payment provider rejected the request

An immediate change clears pending cancellation, replaces the subscription price, and updates the billing cycle and premium end. A period end change clears pending cancellation and schedules the target cycle to begin at the current period end without proration. A monthly to yearly change credits the first invoice of the scheduled phase with the smaller of the two amounts, except during a trial.

A scheduled change becomes visible as billing.pending_subscription_change in get premium state. Every account session receives User Update. Requesting the already active cycle changes nothing.

5 requests per minute for each authenticated user, on the stripe:subscription:change bucket.

POST/v1/premium/switch-to-list-price

Moves a subscription that still bills on a retired price onto the current list price for the same currency and billing cycle, taking effect at the end of the current period. The request takes no body: the target price is resolved on the server, so a client cannot name the price it moves to.

The switch only ever lowers the amount charged. When the current list price is the same as, or higher than, the price the subscription bills on, the request is refused rather than applied.

Nothing is charged when the switch is scheduled. The billing date does not move, the billing cycle does not change, and no proration is invoiced or credited.

A deployment that configures no payment provider receives 400 STRIPE_PAYMENT_NOT_AVAILABLE, an account with no stored subscription receives 400 STRIPE_NO_ACTIVE_SUBSCRIPTION, and a provider failure receives 400 STRIPE_ERROR.

StatusBodyCondition
200switch resultThe switch was scheduled, was already scheduled, or was refused
4001error responseThe payment provider is not configured, the account has no stored subscription, or the provider rejected the request
404error responseThe authenticated account record no longer exists and the request returns UNKNOWN_USER

1 A missing payment provider returns STRIPE_PAYMENT_NOT_AVAILABLE and a missing stored subscription returns STRIPE_NO_ACTIVE_SUBSCRIPTION, so this route never returns the feature_unavailable or no_active_subscription reason. Every other refusal is a 200 with status ineligible

FieldTypeDescription
statusstringscheduled, already_scheduled, or ineligible
effective_at1ISO8601 timestampThe end of the current period, when the switch takes effect
target_price_id1stringThe price ID the subscription bills on after the switch
target_amount_minor1integerThe amount billed after the switch, in the minor unit of currency
current_amount_minor1integerThe amount billed before the switch, in the minor unit of currency
currency1stringDisplay currency of both amounts
reason2stringWhy the switch was refused

1 Present when status is scheduled or already_scheduled

2 Present when status is ineligible

  • feature_unavailable: the deployment configures no payment provider
  • no_active_subscription: the account has no stored subscription
  • subscription_not_chargeable: the subscription is neither active nor on a trial
  • unsupported_subscription: the subscription has no recurring primary item with a resolvable amount, currency and interval
  • no_list_price: no list price is configured for that currency and billing cycle
  • already_on_list_price: the subscription already bills on the current list price
  • not_a_price_decrease: the current list price is not lower than the price the subscription bills on
  • subscription_cancelling: the subscription is set to cancel, so it has no next billing period
  • cancellation_managed_by_schedule: the subscription schedule ends by cancelling the subscription
  • conflicting_pending_change: a different change is already scheduled
  • missing_period_end: the subscription has no future period end
  • switch_in_progress: another switch for the same account is still being applied

A scheduled switch becomes visible as billing.pending_subscription_change with change_kind price in get premium state, and billing.list_price_switch reports pending. Every account session receives User Update. A pending cancellation is never cleared by this route.

5 requests per minute for each authenticated user, on the stripe:subscription:change bucket.

POST/v1/premium/cancel-pending-subscription-change

Cancels a scheduled billing cycle change and returns 204 with an empty body. Emits a User Update Gateway event when a scheduled change was cancelled.

A deployment that configures no payment provider receives 400 STRIPE_PAYMENT_NOT_AVAILABLE, an account with no stored subscription receives 400 STRIPE_NO_ACTIVE_SUBSCRIPTION, and a provider failure receives 400 STRIPE_ERROR.

The operation is idempotent and reports success without changing anything when the subscription has no schedule and when the schedule has no pending billing cycle change.

StatusBodyCondition
204emptyThe pending change was cancelled, or none existed
400error responseThe account has no stored subscription, or the provider is not configured or rejected the request
404error responseThe authenticated account record no longer exists and the request returns UNKNOWN_USER

FiveCord releases the subscription schedule, which removes the scheduled cycle change. The account’s cancellation flag becomes false, and FiveCord refreshes its premium end. Every account session receives User Update. Afterwards billing.pending_subscription_change in get premium state is null.

5 requests per minute for each authenticated user, on the stripe:subscription:change bucket, shared with change subscription billing cycle.

POST/v1/premium/visionary/rejoin

Adds the authenticated account back to the configured Visionary community guild and returns 204 with an empty body.

The route requires a lifetime entitlement, so an account whose premium type is not lifetime receives 403 MISSING_ACCESS.

A join emits Guild Create, Guild Member Add and, when the guild has a system channel and does not suppress join notifications, Message Create. The role grant that follows emits Guild Member Update. An account that already belongs to the guild produces that Dispatch alone.

The operation is idempotent. For an account that already belongs to the guild, FiveCord grants the Visionary role again and changes nothing else. The join bypasses the guild ban check and the join risk gate, so a banned account is added anyway.

Both size ceilings still apply. An account already at its maximum number of guilds receives 400 MAX_GUILDS, and a Visionary guild at its member ceiling receives 400 MAX_GUILD_MEMBERS. Neither check runs for an account that already belongs to the guild.

A deployment that configures no Visionary guild or no Visionary role returns 400 STRIPE_ERROR, and a configured Visionary guild that does not exist returns 404 UNKNOWN_GUILD. A role grant that fails is logged and absorbed, so the response is still 204 and the account keeps its membership without the role.

StatusBodyCondition
204emptyThe account joined the guild or already belonged to it
4001error responseThe deployment is not configured, or a size ceiling is reached
403error responseThe account holds no lifetime entitlement and the request returns MISSING_ACCESS
404error responseThe configured Visionary guild does not exist and the request returns UNKNOWN_GUILD

1 The deployment configures no Visionary guild or no Visionary role and returns STRIPE_ERROR, the account is at its guild ceiling and the request returns MAX_GUILDS, or the guild is at its member ceiling and the request returns MAX_GUILD_MEMBERS

A new membership sends Guild Create with complete guild state to the joining account and Guild Member Add to the guild. It also creates a join system message and sends Message Create unless the guild has no system channel or suppresses join notifications.

A new or existing member then receives the Visionary role, which records a MEMBER_ROLE_UPDATE guild audit log entry attributed to the system user and emits Guild Member Update. An account already holding the role causes no role change and records no audit entry. Billing state is unchanged.

5 requests per minute for each authenticated user, on the stripe:visionary:rejoin bucket.