---
title: "Open Billing Portal"
method: POST
path: "/api/v1/billing/portal"
tags: ["billing"]
---

# Open Billing Portal

`POST /api/v1/billing/portal`

Redirect to the Stripe customer portal.

## Request body

- PortalSessionRequest — Which portal screen to open on. ``flow`` names a destination rather than setting a boolean per screen, so a second deep link is a new member instead of a second flag. Absent opens the portal's own home, which is what an admin managing a card wants; ``cancel`` opens the cancellation screen the cancel dialog sends them to after stating what expires.
  - `flow` 'cancel', nullable

## Response `200`

Successful Response

- PortalSessionResponse — Where to send the browser to manage billing.
  - `portal_url` string, required

## Other responses

- `422` — Validation Error
- `503` — Service Unavailable

## Changes

- **2026-09-19** `924eeadc29ad` — 2 info
  - added optional request body
  - added the non-success response with the status `422`
- **2026-09-18** `73f618ba0a7e` — 1 warning
  - added the new `price_not_found` enum value to the `code` response property for the response status `503`
- **2026-09-15** `499d0b94aa94` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/maia-analytics/apis/maia-api/changes/api/v1/billing/portal/post.md)

---

[API](https://skmtc.dev/maia-analytics/apis/maia-api.md) · [All operations](https://skmtc.dev/maia-analytics/apis/maia-api/llms.txt) · [OpenAPI document](https://skmtc.dev/maia-analytics/apis/maia-api/revisions/924eeadc29ad?raw)
