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

# Open Billing Portal

`POST /v1/organizations/billing/portal`

Open the Stripe customer billing portal.

This is the correct destination for a "Manage subscription" action: the
portal lets an existing customer update their card, view/download invoices,
and change or cancel their plan. It is NOT the same as POST /subscribe —
re-running /subscribe for an existing subscriber starts a brand-new checkout
instead of managing the current one.

Requires an existing Stripe customer. Orgs that have never started billing
have nothing to manage, so they get an actionable 400 pointing at /subscribe.

## Request body

- BillingPortalRequest — Request to open the Stripe customer billing portal.
  - `return_url` string, nullable — URL Stripe redirects back to when the customer leaves the portal

## Response `200`

Successful Response

- BillingPortalResponse — Response with the Stripe-hosted billing portal URL. The portal lets an existing customer update their card, view invoices, and change or cancel their subscription — distinct from /subscribe, which starts a NEW checkout (re-running checkout for an existing subscriber is wrong).
  - `portal_url` string, required — Stripe-hosted billing portal URL (redirect the user here)
  - `session_id` string, required — Stripe billing portal session ID

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `422` — Validation Error
- `500` — Internal Server Error

---

[API](https://skmtc.net/mixpeek/apis/mixpeek-api.md) · [All operations](https://skmtc.net/mixpeek/apis/mixpeek-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/mixpeek/mixpeek-api/revisions/5307993e44d3/schema)
