Change plan
Moves an existing subscription to another plan, prorated, in place.
- Authentication
- Bearer token
- Retries
- Idempotency-Key
- Body
- application/json
- Version
- 2026-09-03
Answers with one of two things for the browser to do:
payment_link the bank wants the customer to authorise the charge - send the browser there; the plan changes when the provider's webhook reports the payment pending the provider accepted it; the plan changes when its subscription.plan_changed webhook lands, usually in seconds, so the screen watches the subscription
The tier is NEVER changed here. A declined proration charge keeps the old plan (on_payment_failure: prevent_change), and only the webhook knows which way it went.
Headers#
Request body#
Responses#
Errors#
Failures use one envelope on every endpoint, described in Retries, versioning and limits. The codes you are most likely to meet here:
validation_error· 422 — The payload was well-formed JSON but failed schema validation.unauthenticated· 401 — The request carried no API key, or one the API could not verify.forbidden· 403 — The key is valid, but it is not allowed to do this — either the scope is missing or the resource belongs to another workspace.idempotency_key_reused· 422 — This `Idempotency-Key` was used before, for a request with a different body.rate_limited· 429 — Too many requests in the current window. The limit is per workspace, and some endpoints add a per-agent limit on top.
More Billing endpoints#
Something unclear or missing? Tell us and we’ll fix it.