---
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; ``cancel`` opens the cancellation screen the cancel dialog sends them to after stating what expires, and ``payment_method`` opens the screen that adds the card every charge is made on.
  - `flow` 'cancel' | 'payment_method', 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-23** `8dc47faf0418` — 1 breaking, 3 info
  - request property `flow/anyOf[subschema #1]/` was restricted to a list of enum values
  - the `` request property const value `cancel` was removed
  - added the new `cancel` enum value to the request property `flow/anyOf[subschema #1]/`
  - added the new `payment_method` enum value to the request property `flow/anyOf[subschema #1]/`
- **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/bb508e935174?raw)
