---
title: "Change plan or interval"
method: PATCH
path: "/v1/billing/plan"
tags: ["Billing"]
---

# Change plan or interval

`PATCH /v1/billing/plan`

## Request

- Base URL: `https://api.signvoy.com`
- URL: `https://api.signvoy.com/v1/billing/plan`
- Auth: one of:
  - API key in header `X-Workspace-Id`
  - HTTP bearer

Moves an existing subscription to another plan or billing interval. Upgrades are prorated and take effect at once. Downgrades issue no credit and the lower price applies from the next renewal. Seats already paid for carry over; pass `seats` to change that number at the same time.

## Request body

- SelectPlanDto
  - `plan` 'pro' | 'team', required: Plan to subscribe to or move to
  - `interval` 'month' | 'year', required: Billing interval. Annual is billed once for twelve months at a 20% discount.
  - `seats` number: Total seats to buy, including the ones the plan already bundles — the same number the dashboard displays. Omit it to buy exactly what the plan bundles, or what the account already occupies if that is more. Values below the seats currently in use are raised to that floor.

## Response `200`

Updated billing summary

- BillingSummaryDto
  - `plan` 'free' | 'pro' | 'team' | 'enterprise', required: Plan on the subscription, i.e. what the account pays for
  - `effectivePlan` 'free' | 'pro' | 'team' | 'enterprise', required: Plan actually in force. Differs from `plan` only when the subscription has lapsed, in which case entitlements fall back to Free.
  - `status` string, nullable: Stripe subscription status; null on an account that never paid
  - `interval` 'month' | 'year', nullable: Billing interval; null on Free
  - `cancelAtPeriodEnd` boolean, required: Whether the subscription stops at the end of the period
  - `currentPeriodEnd` string, date-time, nullable: End of the current billing period; null on Free
  - `hasBillingHistory` boolean, required: Whether this account has ever reached checkout, and therefore whether the Customer Portal has invoices and a payment method to show
  - `seats` BillingSeatsDto, required
    - `included` number, required: Seats bundled with the current plan
    - `purchased` number, required: Extra seats bought on top
    - `allowed` number, required: Seats the account may fill (included + purchased)
    - `used` number, required: Seats in use: distinct members across every workspace on the account, plus pending invitations to addresses that are not already members
  - `documents` BillingDocumentsDto, required
    - `sent` number, required: Documents sent in the current billing period
    - `limit` number, nullable: Documents included per period; null means unlimited
  - `workspaces` BillingWorkspacesDto, required
    - `count` number, required: Workspaces on this account
    - `limit` number, nullable: Workspaces allowed; null means unlimited
  - `features` BillingFeaturesDto, required
    - `customBranding` boolean, required: Custom logo and colours; Signvoy branding removed
    - `customEmailSender` boolean, required: Custom from / reply-to address on signing emails
    - `sharedTemplates` boolean, required: Templates shared with the whole workspace
    - `workspaceWideVisibility` boolean, required: Members can see every document in the workspace
  - `extraSeatMonthlyUsd` number, required: Price per extra seat per month, in USD
  - `extraSeatAnnualUsd` number, required: Price per extra seat per month when billed annually, in USD
  - `availablePlans` BillingPlanOptionDto[], required
    - `plan` 'pro' | 'team', required
    - `monthlyUsd` number, required: Monthly price in USD
    - `annualMonthlyUsd` number, required: Effective monthly price when billed annually, in USD
    - `includedSeats` number, required: Seats bundled with this plan

## Other responses

- `403`: Not the workspace owner
- `404`: No subscription to change

---

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