---
title: "Open the Stripe Customer Portal for this org"
method: POST
path: "/orgs/{org_id}/billing/portal-session"
tags: ["Organizations"]
---

# Open the Stripe Customer Portal for this org

`POST /orgs/{org_id}/billing/portal-session`

## Request

- Base URL: `https://api.mnemom.ai/v1`
- URL: `https://api.mnemom.ai/v1/orgs/{org_id}/billing/portal-session`
- Auth: HTTP bearer

Mints a single-use URL into Stripe's hosted Customer Portal where the org owner can view invoices, download PDFs, update payment methods, change billing details, and manage their subscription. The portal is the primary surface for invoice access — there is no direct invoice API. `owner` only (the portal is a mixed read+mutate surface exposing subscription cancel / payment-method mutation; per the org RBAC matrix only `owner` holds `billing: full`, while `admin` and `auditor` hold `billing: view` and have a separate read-only path via `GET /orgs/{org_id}/billing/summary`). A non-owner receives 403 before any billing state is read — Stripe-customer existence is never disclosed to unauthorized roles.

## Path parameters

- `org_id` string, required

## Request body

- object
  - `return_url` string, uri: Where Stripe redirects the customer after they finish in the portal. Must be `https://*.mnemom.ai`. Defaults to the dashboard billing page.

## Response `200`

Portal session created. Redirect the customer to `url`.

- object
  - `url` string, uri

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `403`: Forbidden
- `404`: Resource not found
- `409`: Resource conflict — the request cannot proceed because of a current state conflict (e.g., resource already exists, version mismatch, in-flight idempotency key with a different body).
- `429`: Rate-limit exceeded. The global per-IP limiter (100 requests/minute, applied to every `/v1/*` route) rejected this request. Back off until the window resets — `Retry-After` carries the cooldown in seconds and `X-RateLimit-Reset` the absolute reset time.
- `500`: Server error — request was well-formed but the server failed to fulfill it. Typically a downstream dependency (DB / RPC / external API) returned an unexpected error.

---

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