---
title: "The plan catalog (prices in cents + monthly credit allotments)."
method: GET
path: "/api/v1/billing/plans"
tags: ["Billing"]
---

# The plan catalog (prices in cents + monthly credit allotments).

`GET /api/v1/billing/plans`

## Request

- Base URL: `https://api.avatarfactory.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.avatarfactory.io/api/v1/billing/plans`
- Auth: one of:
  - API key in cookie `session`
  - HTTP bearer

<br/>Deliberately ANONYMOUS: this is the price list. ``/packages`` is a public<br/>route in the SPA, so gating it behind ``@login_required`` bounced a visitor<br/>who had not signed in yet to ``/?reason=session-expired`` instead of<br/>showing them the plans (mobile QA fix round 1). The payload carries the<br/>same numbers the marketing pricing page publishes and nothing about any<br/>user; every other billing route stays gated. Also allowlisted by endpoint<br/>name in ``app/__init__.py`` so the app-wide auth gate lets it through.

## Response `200`

OK

- PlansResponse
  - `plans` PlanResponse[], required
    - `blurb` string, required
    - `credits` integer, required
    - `featured` boolean, required
    - `funnel_only` boolean
    - `group` string, nullable
    - `monthly_cents` integer, required
    - `name` string, required
    - `slug` string, required
    - `yearly_cents` integer, required
    - `yearly_monthly_cents` integer, required

## Other responses

- `422`: Unprocessable Entity

---

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