---
title: "Where the team stands with its plan, read from our own rows"
method: GET
path: "/api/v1/billing/standing"
tags: ["Billing"]
---

# Where the team stands with its plan, read from our own rows

`GET /api/v1/billing/standing`

## Request

- Base URL: `http://localhost:5180`
- URL: `http://localhost:5180/api/v1/billing/standing`
- Auth: API key in cookie `better-auth.session_token`

The cheap half of `/billing`, for the chrome that is on screen everywhere. It reads the copy of the subscription kept on the team row and never Stripe, reconciles nothing and writes nothing. A team already on a plan is answered from that one row alone; only a team without one is asked whether a trial is still theirs, which is the one question that looks further. `/billing` is the read that reconciles, and reconciling is a thing an owner asks for by opening the billing screen, never a side effect of loading a page.

## Response `200`

The standing.

- object
  - `ok` unknown, required
  - `data` object, required
    - `configured` boolean, required
    - `status` string, required
    - `trialEndsAt` number, nullable, required
    - `trialOffered` boolean, required
    - `exempt` boolean, required: True on a team an admin owns: nothing asks it for a plan and nothing it files is refused for want of one.
  - `meta` object, required
    - `requestId` string, required: Echoed in the x-request-id header. Quote it in a bug report.

## Other responses

- `403`: A caller who is not an owner of the team (`details.reason` `owner_only`), or one using an access token rather than a signed-in session (`on_screen`).

---

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