---
title: "Move plan, cadence or quantity"
method: POST
path: "/workspaces/{id}/plan"
tags: ["billing"]
---

# Move plan, cadence or quantity

`POST /workspaces/{id}/plan`

## Request

- Base URL: `https://api.swingfactor.ai/v1`
- URL: `https://api.swingfactor.ai/v1/workspaces/{id}/plan`
- Auth: HTTP bearer

Up is immediate and prorated; down — a smaller plan, fewer units, annual to monthly, or cancelling to the free plan — waits for the end of the period already paid for. With no live subscription it answers with a checkout.

## Path parameters

- `id` string, uuid, required

## Request body

- PlanBody
  - `plan` 'observer' | 'investigator' | 'institute', required
  - `cycle` 'monthly' | 'annual', required
  - `quantity` integer

## Response `200`

What the change came to.

- union
  - object
    - `kind` 'checkout', required
    - `url` string, uri, required
  - object
    - `kind` 'applied', required
  - object
    - `kind` 'scheduled', required
    - `effectiveAt` string, nullable, required

## Other responses

- `400`: Billing is in a state this cannot change.
- `401`: No token, or not a valid one: `unauthorized`.
- `403`: Only the owner manages billing.
- `409`: More in use than the target holds.

---

[API](https://skmtc.dev/swingfactor/apis/swingfactor-api.md) · [All operations](https://skmtc.dev/swingfactor/apis/swingfactor-api/llms.txt) · [OpenAPI document](https://skmtc.dev/swingfactor/apis/swingfactor-api/revisions/c2fe881a39c3?raw)
