---
title: "The account's subscription state"
method: GET
path: "/subscription"
tags: ["Stats"]
---

# The account's subscription state

`GET /subscription`

## Request

- Base URL: `https://statable.com/api/v1`
- URL: `https://statable.com/api/v1/subscription`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/statable/apis/statable-stats-api/docs/subscription/get.ts> (a function with typed inputs; its response is checked against the schema)

The subscription of the key's owner, in one line's worth of fields: enough to say "Trial — N days left", not a billing page. Hobby-only accounts have no subscription and answer `status: "none"` with `only_hobby: true`.

## Response `200`

The current subscription state.

- object
  - `status` 'trialing' | 'active' | 'past_due' | 'expired' | 'trial_expired' | 'none', required
  - `is_trial` boolean, required
  - `ends_at` string, date-time: When the current state stops being true — the trial's end while trialing, the grace end (when collection stops) once the trial has expired, the paid period's end otherwise. Absent when unknown.
  - `only_hobby` boolean, required: True when the account has hobby sites and nothing else.

## Other responses

- `401`: Missing/malformed/invalid/revoked bearer token (`unauthorized`), or a key past its expiry (`key_expired`; the message names the expiry time).
- `403`: `insufficient_scope` (the key lacks the `read` scope every endpoint here requires), `key_not_scoped` (single-site key asked for a different site), `tracking_inactive` (the site's tracking has stopped) or `plan_expired` (the site owner's plan has expired: tracking may still run through the grace period, but reports are closed until the owner chooses a plan).
- `429`: Hourly account (default 2000/h) or per-key (default 600/h) limit hit (`rate_limited`). Retry after the `Retry-After` seconds. The X-RateLimit-* headers report the window that tripped (account on an account limit).
- `500`: Unexpected server error (`internal`). Report it with the `request_id` from the body or the X-Request-ID header: it is what lets the exact log entry be found, and without it a 500 can only be matched by guessing at a time window.

---

[API](https://skmtc.dev/statable/apis/statable-stats-api.md) - [All operations](https://skmtc.dev/statable/apis/statable-stats-api/llms.txt) - [OpenAPI document](https://skmtc.dev/statable/apis/statable-stats-api/revisions/352b6d47c186?raw)
