---
title: "Change plan"
method: POST
path: "/api/billing/update-subscription/{price_id}"
---

# Change plan

`POST /api/billing/update-subscription/{price_id}`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/billing/update-subscription/{price_id}`
- Auth: HTTP bearer

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Moves your workspace's paid plan to another plan. Pass the price ID of the new plan, from `price_ids` in [List plans](/api-reference/list-plans). Only the workspace owner can change the plan.

<Warning>An upgrade applies right away and charges the saved payment method now, with no confirmation step. The charge is either the prorated difference for the rest of the billing period or the full price difference between the plans, depending on the plans. Check the amount first with [Preview plan change](/api-reference/preview-plan-change).</Warning>

A downgrade charges nothing now. It's scheduled for the end of the billing period, and you can undo it with [Cancel scheduled plan change](/api-reference/cancel-scheduled-plan-change). Either change also clears a pending cancellation, so the plan renews again.

<Warning>`success: false` doesn't mean the change failed. The upgrade is already applied, and its charge needs the payer to act. Send them to `payment_action_url`. Until they pay, the invoice stays open.</Warning>

This works for plans billed through Stripe. If the workspace is billed through Wix, this returns 409 `workspace_billed_through_wix`. Use [Change Wix plan](/api-reference/change-wix-plan) instead.

The base rate limit is 10 requests per hour per user. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

## Path parameters

- `price_id` string, required: Price ID of the plan to move to, from `price_ids` in [List plans](/api-reference/list-plans).

## Response `200`

The plan change, applied now or scheduled.

- PlanChangeResult: The outcome of a plan change.
  - `success` boolean, required: `true` when the change is complete. `false` when an upgrade is already applied but its charge needs the payer to act, for example to confirm the payment with their bank.
  - `payment_action_url` string, nullable, required: Stripe page where the payer completes the charge when `success` is `false`. `null` when no action is needed. It can also be `null` when `success` is `false`. Then find the open invoice with [Get billing info](/api-reference/get-billing-info).
  - `subscription` PlanChangeSubscription, required: The subscription after a plan change.
    - `id` string, required: ID of the Stripe subscription.
    - `status` string, required: Stripe status of the subscription, such as `active` or `past_due`.
    - `is_downgrade` boolean, required: `true` when the change is a downgrade, scheduled for the end of the billing period. `false` for an upgrade, which applies now.
    - `schedule_id` string, nullable, required: ID of the Stripe subscription schedule that applies a downgrade at the end of the period. `null` for an upgrade.
    - `billing_period_change` boolean, required: `true` when the upgrade moves the subscription from monthly to yearly billing. Always `false` for a downgrade.

## Other responses

- `400`: The workspace has no active subscription, `price_id` isn't a plan, or the move isn't allowed: a different currency, yearly to monthly billing, a lower plan while switching to yearly billing, or a lower-priced Business plan from outside the Business plans.
- `401`: Missing or invalid credentials. A read-only token gets this response too.
- `402`: The workspace has an overdue invoice. Pay it before upgrading. Downgrades are still allowed.
- `403`: You aren't the workspace owner, or a payment dispute is open on the workspace.
- `409`: The workspace is billed through Wix (`workspace_billed_through_wix`), the subscription has ended, the workspace is still on a free migration trial, or another upgrade is already in progress.
- `429`: Rate limit exceeded. The base rate limit is 10 requests per hour per user. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

## Changes

> 66 revisions in range; 1 not diffed.

- **2026-10-26** `395a6758864a`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/adexad/apis/base44-app-management-api/changes/api/billing/update-subscription/:price_id/post.md)

---

[API](https://skmtc.dev/adexad/apis/base44-app-management-api.md) - [All operations](https://skmtc.dev/adexad/apis/base44-app-management-api/llms.txt) - [OpenAPI document](https://skmtc.dev/adexad/apis/base44-app-management-api/revisions/d877a932dc19?raw)
