---
title: "Get Billing State"
method: GET
path: "/v1/orgs/{org_id}/billing"
tags: ["billing"]
---

# Get Billing State

`GET /v1/orgs/{org_id}/billing`

## Request

- Base URL: `https://api.sonenta.dev`
- URL: `https://api.sonenta.dev/v1/orgs/{org_id}/billing`
- Auth: none declared

Current plan + subscription state, for the client-admin billing tab.

`subscription` is null when the org is on free with no Stripe sub.
`has_payment_method` is true once Stripe has assigned a customer id —
a proxy for "the user completed checkout at least once."

## Path parameters

- `org_id` string, required

## Response `200`

Successful Response

- BillingStateOut
  - `plan` 'free' | 'hobby' | 'pro' | 'team' | 'enterprise', required
  - `has_payment_method` boolean, required
  - `subscription` SubscriptionOut, required
    - `stripe_subscription_id` string, required
    - `status` string, required
    - `cadence` string, required
    - `current_period_end` string, date-time, nullable, required
    - `cancel_at_period_end` boolean, required
    - `cancel_at` string, date-time, nullable
    - `seats` integer, required
  - `enterprise_pricing` AppRoutesBillingEnterprisePricingOut, required
    - `monthly_cents` integer, nullable, required
    - `yearly_cents` integer, nullable, required
    - `currency` string, nullable, required
  - `feedback_addon` FeedbackAddonState, required
    - `active` boolean, required
    - `sku` 'feedback_starter' | 'feedback_unlimited', nullable, required
    - `status` string, nullable, required
    - `feedback_languages_limit` integer, nullable, required
    - `ever_activated` boolean, required
    - `cancel_at_period_end` boolean
    - `cancel_at` string, date-time, nullable
  - `in_context_addon` InContextAddonState, required: In-context editing add-on billing state (task 903). camelCase contract throughout (avoids the snake_case `is_active` gotcha from the feedback add-on's billing model). `tosVersion` is the current in-context ToS version the SDK should present.
    - `isActive` boolean, required
    - `sku` 'in_context', nullable, required
    - `status` string, nullable, required
    - `tosVersion` string, required
    - `everActivated` boolean, required
    - `cancelAtPeriodEnd` boolean
    - `cancelAt` string, date-time, nullable
  - `tax_handled_by_stripe` boolean, required
  - `seat_usage` SeatUsageOut, required: Seat consumption vs the plan cap (task #2087). `used` = active members + pending invitations; a suspended member frees their seat. `included` = plan members cap (null = unlimited). This is a COUNT only — no metering/overage (founder decision, held for v1.1).
    - `used` integer, required
    - `included` integer, nullable, required
    - `members` integer, required
    - `pending` integer, required

## Other responses

- `422`: Validation Error

---

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