---
title: "Staff Get Organization Billing"
method: GET
path: "/v1/admin/organizations/{organization_id}/billing"
tags: ["admin"]
---

# Staff Get Organization Billing

`GET /v1/admin/organizations/{organization_id}/billing`

## Request

- Base URL: `https://api.evidenso.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.evidenso.com/v1/admin/organizations/{organization_id}/billing`
- Auth: HTTP bearer

Billing state for any organization: the read-only twin of
GET /v1/billing/status, for the staff Team view.

Same response model on purpose, for the same reason the invite/member
routes above reuse org_api's — one React component renders both surfaces,
so a shape divergence would only ever show up in the UI.

`can_manage` is hardcoded False, and that is the whole security posture of
this route. Staff are not org admins of the organization they are looking
at, and "Manage billing" opens a Stripe portal session against THAT
organization's customer. The UI already refuses to render the button in
staff mode; this is the second lock, on the side a browser cannot reach.
Note also what is NOT returned: get_organization_billing hands back
stripe_customer_id, stripe_subscription_id and billing_livemode, and the
response model drops all three. Staff need to answer "why is this customer
blocked", not to hold their Stripe identifiers.

Which is exactly why the CREDIT fields are returned. Omitting them left
support looking at a customer whose every run is being refused and reading
"Everything is up to date" — the one question this route exists to answer,
unanswerable from its own response. Resolved the same way
GET /v1/billing/status resolves them, through visible_credit_balance and
credits_are_blocked, so staff see the customer's verdict rather than a
second opinion computed from a raw column.

to_thread for the same reason as the routes above: get_organization_billing
is blocking psycopg, and this process serves SSE streams.

## Path parameters

- `organization_id` string, required

## Response `200`

Successful Response

- BillingStatusResponse
  - `billing_status` string, nullable
  - `billing_exempt` boolean
  - `trial_ends_at` string, date-time, nullable
  - `current_period_end` string, date-time, nullable
  - `cancel_at_period_end` boolean
  - `can_manage` boolean
  - `configured` boolean
  - `blocked` boolean
  - `billing_enforcement_enabled` boolean
  - `credit_balance` integer, nullable
  - `credits_blocked` boolean
  - `topup_configured` boolean
  - `topup_credits` integer, nullable
  - `subscription_terminal` boolean
  - `monthly_credits` integer, nullable
  - `has_payment_method` boolean, nullable
  - `access` 'full' | 'limited'
  - `full_access_requested_at` string, date-time, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/evidenso/apis/persona-rag-api.md) - [All operations](https://skmtc.dev/evidenso/apis/persona-rag-api/llms.txt) - [OpenAPI document](https://skmtc.dev/evidenso/apis/persona-rag-api/revisions/86408c178d4f?raw)
