> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mixpeek.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Open 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.



## OpenAPI

````yaml post /v1/organizations/billing/portal
openapi: 3.1.0
info:
  title: Mixpeek API
  description: >-
    This is the Mixpeek API, providing access to various endpoints for data
    processing and retrieval.
  termsOfService: https://mixpeek.com/terms
  contact:
    name: Mixpeek Support
    url: https://mixpeek.com/contact
    email: info@mixpeek.com
  version: '0.82'
servers:
  - url: https://api.mixpeek.com
    description: Production
security:
  - BearerAuth: []
paths:
  /v1/organizations/billing/portal:
    post:
      tags:
        - Organization Billing
      summary: Open Billing Portal
      description: >-
        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.
      operationId: open_billing_portal_v1_organizations_billing_portal_post
      parameters: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BillingPortalRequest'
              default:
                return_url: https://studio.mixpeek.com/billing
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BillingPortalResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BearerAuth: []
components:
  schemas:
    BillingPortalRequest:
      properties:
        return_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Return Url
          description: URL Stripe redirects back to when the customer leaves the portal
          default: https://studio.mixpeek.com/billing
      type: object
      title: BillingPortalRequest
      description: Request to open the Stripe customer billing portal.
    BillingPortalResponse:
      properties:
        portal_url:
          type: string
          title: Portal Url
          description: Stripe-hosted billing portal URL (redirect the user here)
          examples:
            - https://billing.stripe.com/p/session/live_abc123
        session_id:
          type: string
          title: Session Id
          description: Stripe billing portal session ID
          examples:
            - bps_live_abc123
      type: object
      required:
        - portal_url
        - session_id
      title: BillingPortalResponse
      description: >-
        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).
    ErrorResponse:
      properties:
        success:
          type: boolean
          title: Success
          description: Always false for error responses
          default: false
        status:
          type: integer
          title: Status
          description: HTTP status code for this error
        error:
          $ref: '#/components/schemas/ErrorDetail'
          description: Error details payload
      type: object
      required:
        - status
        - error
      title: ErrorResponse
      description: Error response model.
      examples:
        - error:
            details:
              id: ns_123
              resource: namespace
            message: Namespace not found
            type: NotFoundError
          status: 404
          success: false
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ErrorDetail:
      properties:
        message:
          type: string
          title: Message
          description: Human-readable error message
        type:
          type: string
          title: Type
          description: Stable error type identifier (machine-readable)
        code:
          anyOf:
            - type: string
            - type: 'null'
          title: Code
          description: >-
            Fine-grained error code for programmatic handling (e.g.,
            namespace_name_taken, feature_extractor_not_found). Present only
            when consumers may need to branch on a specific error condition.
        details:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Details
          description: >-
            Optional structured details to help debugging (validation errors,
            IDs, etc.)
      type: object
      required:
        - message
        - type
      title: ErrorDetail
      description: Error detail model.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Mixpeek API key, sent as `Authorization: Bearer mxp_sk_...`. Create one
        in Studio under Settings → API Keys, or with an admin key via `POST
        /v1/organizations/users/{user_email}/api-keys`. A missing header returns
        403; an invalid or revoked key returns 401.

````