---
title: "Change a billing plan"
method: POST
path: "/v1/billing/plans/change"
tags: ["Billing"]
---

# Change a billing plan

`POST /v1/billing/plans/change`

## Request

- Base URL: `https://api.inth.com`
- URL: `https://api.inth.com/v1/billing/plans/change`
- Auth: HTTP bearer

May charge the default method. Rechecks the complete approvedQuote before attach; changed pricing returns 409 with the current quote. Same UUID and same plan/promotion preserve existing provider and durable-checkout idempotency. Payment setup/confirmation returns requires_action and a Dashboard URL without client secrets. Existing grandfathered/Enterprise/Consent/promotion rules apply. Requires billing.write, a verified person and owner role. Subject to rollout-agent-access-writes (default off) and allow-public-agent-writes before account/provider effects. Return and person handoff URLs always use the canonical Dashboard origin; redirect URLs, payment details and provider tokens are not accepted.

## Request body

- BillingPlanChangeInput
  - `organizationId` string
  - `input` union, required
    - object
      - `checkoutAttemptId` string, uuid, required
      - `promotionCode` string
      - `plan` 'free' | 'starter' | 'starter_annual' | 'pro' | 'pro_annual' | 'business' | 'business_annual' | 'startup' | 'startup_annual', required
      - `product` 'inth', required
    - object
      - `billingInterval` 'month' | 'year', required
      - `checkoutAttemptId` string, uuid, required
      - `plan` 'hobby' | 'starter' | 'pro', required
      - `product` 'consent', required
      - `promotionCode` string
  - `approvedQuote` object, required
    - `currency` string, required
    - `discount` object, nullable
      - `amount` integer, required
      - `label` string, nullable, required
    - `lineItems` object[], required
      - `amount` integer, required
      - `description` string, nullable, required
      - `label` string, required
    - `nextCycle` object, nullable, required
      - `startsAt` string, required
      - `total` integer, required
    - `subtotal` integer, required
    - `total` integer, required

## Response `200`

Change a billing plan

- object
  - `success` true, required
  - `data` union, required
    - object
      - `status` 'completed', required
    - object
      - `status` 'failed', required
      - `code` 'checkout-attempt-conflict' | 'payment-action-required' | 'payment-declined' | 'payment-method-processing' | 'payment-method-invalid' | 'payment-provider-unavailable' | 'request-failed', required
      - `message` string, required
    - object
      - `status` 'already_active', required
    - object
      - `status` 'requires_action', required
      - `reason` 'payment_method' | 'payment_confirmation', required
      - `dashboardUrl` string, required
      - `checkoutAttemptId` string, uuid, required
    - object
      - `status` 'processing', required
      - `billingProviderInvoiceId` string, nullable, required
      - `dashboardUrl` string, required

## Other responses

- `400`: The request payload or parameters are invalid.
- `401`: Authentication is missing, invalid, or expired.
- `403`: The credential is valid but may not perform the operation. `INSUFFICIENT_SCOPE`: the credential was never granted the capability the operation needs. `details.requiredScope` names it, and the `WWW-Authenticate` header carries `Bearer error="insufficient_scope"`. An OAuth client fixes this by requesting the scope; an organization API key cannot gain it. `FORBIDDEN`: the capability is present but the membership behind the credential lacks the role, or the resource belongs to another organization.
- `404`: The requested resource was not found.
- `409`: The request conflicts with the current resource state.
- `503`: The capability is temporarily paused by an operator. Retry later.

## Changes

- **2026-10-31** `a3f4100e14c9`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/inth/apis/inth-api/changes/v1/billing/plans/change/post.md)

---

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