---
title: "Get Clinic Billing"
method: GET
path: "/clinic/billing"
tags: ["clinic", "billing"]
---

# Get Clinic Billing

`GET /clinic/billing`

## Request

- Base URL: `https://api.projectindi.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.projectindi.com/clinic/billing`
- Auth: none declared

The clinic's plan state (§3.2).

200 with `plan: null` is *confirmed unpaid* - the answer the paywall renders
on. 404 is "you have no clinic", which is a different thing and which the
client reads as couldn't-confirm. Nothing here is wrapped in a try/except: a
read that fails has to reach the client AS a failure.

## Response `200`

Successful Response

- ClinicBillingResponse
  - `plan` string, nullable
  - `can_manage` boolean
  - `unit` 'clinic' | 'seat', nullable
  - `seats` ClinicSeats: Seats the clinic has *paid for* - the Stripe mirror. The live headcount is a different number; §5.2 is what reconciles the two.
    - `full` integer
    - `light` integer
  - `has_stripe_customer` boolean
  - `current_period_end` string, nullable
  - `access` ClinicAccessBlock: Does this clinic's payment still stand - the lapse plan's §2.1 shape. `subscription_status` is never on the wire, in any spelling: the raw Stripe vocabulary is an unbounded vendor enum, and the moment it is client-side somebody writes `status !== 'active'` - the check that walls every grandfathered clinic. The client receives only the conclusion. No `days_left` (goes stale in a cached tab; the client derives it from `expires_on` at render time) and no raw instants (a shipped instant invites a client re-derivation that disagrees by a timezone).
    - `state` 'ok' | 'retrying' | 'grace' | 'expired'
    - `expires_on` string, nullable
    - `last_full_day` string, nullable
    - `owner` ClinicAccessOwner: Who the lapse copy tells the team to email. Name and email are already visible to colleagues on the team page; the mailto IS the feature.
      - `name` string, required
      - `email` string, required
    - `owner_action` 'update_card' | 'choose_plan', nullable
  - `country` string, nullable

---

[API](https://skmtc.dev/projectindi/apis/indi-agent-api-first-principles.md) - [All operations](https://skmtc.dev/projectindi/apis/indi-agent-api-first-principles/llms.txt) - [OpenAPI document](https://skmtc.dev/projectindi/apis/indi-agent-api-first-principles/revisions/25a7813e21fd?raw)
