Upgrade and downgrade
Changing the plan on an active subscription is done by posting a new set of items to the subscription's items endpoint. The request takes two flags that control when the change takes effect and whether the partial cycle is prorated.
Endpoint
POST /v1/public-api/organizations/{organizationId}/subscriptions/{subscriptionId}/items
Posting a new plan to this endpoint replaces the subscription's current items.
Request body
{
"items": [
{ "plan": { "id": "plan_new" } }
],
"retainRenewalTime": "retain",
"proRataCredit": true
}
| Field | Type | Description |
|---|---|---|
items | array | The new set of items. Each item is { plan: { id } }, the same shape used when creating a subscription. |
retainRenewalTime | string ("reset" or "retain") | Controls when the new plan takes effect. "retain" keeps the existing renewal date so the change applies within the current cycle. "reset" starts a fresh cycle from the change date. |
proRataCredit | boolean | Whether the partial cycle on the old plan is prorated against the new plan. See Proration. |
What changes, what stays
- Renewal date: kept when
retainRenewalTime: "retain", reset to the change date whenretainRenewalTime: "reset". - Trial: if the subscription is still in a trial period, switching plans does not extend the trial — the trial runs out as scheduled.
- Payment instrument: unchanged. The new plan is charged against the same instrument as the original subscription.
Charge or credit at change time
Whether the customer is charged or credited at the moment of change, and the exact amount, depends on the combination of retainRenewalTime and proRataCredit, plus the prices of the old and new plans. Confirm the resulting amount in the response from the plan-change call before relying on it for accounting. See Proration for how proRataCredit controls the calculation.