---
title: "Read the cached plan tier and status"
method: GET
path: "/api/billing/subscription"
tags: ["Billing"]
---

# Read the cached plan tier and status

`GET /api/billing/subscription`

## Request

- Base URL: `https://api.setluca.com`
- URL: `https://api.setluca.com/api/billing/subscription`
- Auth: API key in cookie `luca.session_token`

The plan tier, status, and billing period cached on the coach row, plus whether this workspace can be sold an annual plan. Stripe is still the source of truth. This is the mirror the app reads.

**Session-only.** This endpoint isn't on the API-key allowlist. An organization API key gets a 403 here, whatever scopes it holds.

## Headers

- `Luca-API-Version` '1'

## Response `200`

ok

- BillingSubscriptionResponse
  - `coachId` string, uuid, required
  - `planTier` string, nullable, required
  - `planStatus` string, nullable, required
  - `stripeCustomerId` string, nullable, required
  - `billingInterval` 'month' | 'year', required
  - `annualBillingAvailable` boolean, required

## Other responses

- `401`: unauthorized
- `404`: not found
- `429`: rate limited
- `500`: internal error

---

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