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

# Get plan switch options

> Return the current tier of a subscription and all tiers it can reach, each with a financial preview. This endpoint runs in the customer context and requires a customer token with the customer.plan.switch scope.



## OpenAPI

````yaml get /api/customer/subscriptions/{id}/plan-options
openapi: 3.1.0
info:
  title: Fynn V2 Plans API
  version: 2026-06
  description: >-
    REST API for the Fynn V2 Plans. Use it to define plans with upgrade and
    downgrade tiers, sell them through checkout links, and let customers switch
    tiers from your customer portal. All amounts use the minor or decimal
    representation documented per field. Authenticate setup endpoints with an
    API token and customer endpoints with a customer token.
servers:
  - url: https://coreapi.io
    description: Production
  - url: https://preview.coreapi.io
    description: Sandbox
security:
  - ApiToken: []
tags:
  - name: Plans
    description: Create and manage plans, tiers and items.
  - name: Checkout Links
    description: Sell a plan tier through a hosted checkout link.
  - name: Plan switching (customer)
    description: Customer facing upgrade and downgrade between tiers.
paths:
  /api/customer/subscriptions/{id}/plan-options:
    get:
      tags:
        - Plan switching (customer)
      summary: Get plan switch options
      description: >-
        Return the current tier of a subscription and all tiers it can reach,
        each with a financial preview. This endpoint runs in the customer
        context and requires a customer token with the customer.plan.switch
        scope.
      operationId: getPlanOptions
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            example: 1280792f-4e23-793d-8e9c-3a1bf36630bd
          description: The subscription UUID.
      responses:
        '200':
          description: Current tier and reachable options.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlanOptions'
        '401':
          description: Authentication is missing or the token is invalid.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemError'
        '403':
          description: The token is valid but lacks the required permission.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemError'
        '404':
          description: The requested resource does not exist for this Organisation.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemError'
        '422':
          description: The request failed validation or a business rule was violated.
          content:
            application/problem+json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ValidationError'
                  - $ref: '#/components/schemas/ProblemError'
      security:
        - CustomerToken: []
components:
  schemas:
    PlanOptions:
      type: object
      properties:
        currentTier:
          $ref: '#/components/schemas/PlanTierWithItems'
        options:
          type: array
          items:
            $ref: '#/components/schemas/PlanSwitchOption'
          description: >-
            All tiers the subscription can reach from its current tier, each
            with a financial preview.
    ProblemError:
      type: object
      description: >-
        Problem detail error body (application/problem+json). Additional members
        may be present depending on the error.
      properties:
        status:
          type: integer
          example: 404
        type:
          type: string
          description: Stable machine readable error key.
          example: PLAN__NOT_FOUND
        title:
          type: string
          example: An error occurred
        detail:
          type: string
          example: Plan not found.
      required:
        - status
        - type
        - title
        - detail
    ValidationError:
      type: object
      description: >-
        Validation error body (application/problem+json) returned when input
        fails field level validation.
      properties:
        status:
          type: integer
          example: 422
        type:
          type: string
          example: https://tools.ietf.org/html/rfc2616#section-10
        title:
          type: string
          example: Validation Failed
        violations:
          type: array
          items:
            type: object
            properties:
              propertyPath:
                type: string
                example: tiers[0].name
              message:
                type: string
                example: This value should not be blank.
              code:
                type: string
                nullable: true
      required:
        - status
        - type
        - title
        - violations
    PlanTierWithItems:
      type: object
      properties:
        id:
          type: string
        planId:
          type: string
        planCode:
          type: string
          example: pro-plan
        position:
          type: integer
        name:
          type: string
          example: Pro
        currency:
          type: string
          example: EUR
        items:
          type: array
          items:
            $ref: '#/components/schemas/CustomerPlanTierItem'
        recurringTotal:
          $ref: '#/components/schemas/RecurringTotals'
    PlanSwitchOption:
      type: object
      properties:
        tier:
          $ref: '#/components/schemas/PlanTierWithItems'
        direction:
          type: string
          enum:
            - upgrade
            - downgrade
        preview:
          allOf:
            - $ref: '#/components/schemas/SwitchPreview'
          nullable: true
    CustomerPlanTierItem:
      type: object
      properties:
        id:
          type: string
        productId:
          type: string
        productName:
          type: string
          example: Pro Plan
        defaultQuantity:
          type: number
        minQuantity:
          type: number
          nullable: true
        maxQuantity:
          type: number
          nullable: true
        quantityEditable:
          type: boolean
          description: >-
            False for usage based products and for items where min, default and
            max are equal.
        pricePlan:
          type: object
          additionalProperties: true
          description: Serialized price plan snapshot for rendering the price.
    RecurringTotals:
      type: object
      description: Recurring amount for one billing period. Amounts are decimal strings.
      properties:
        netAmount:
          type: string
          example: '49.00'
        taxAmount:
          type: string
          example: '9.31'
        grossAmount:
          type: string
          example: '58.31'
        currency:
          type: string
          example: EUR
    SwitchPreview:
      type: object
      description: >-
        Financial preview of a tier switch. creditAmount and chargeAmount are
        absolute decimal strings, the direction is implied by the field name.
      properties:
        creditAmount:
          type: string
          example: '14.50'
          description: >-
            Credit for unused time on the current items. 0.00 when the target
            tier does not credit.
        chargeAmount:
          type: string
          example: '24.50'
          description: Charge for the partial period on the new items.
        currency:
          type: string
          example: EUR
        effectiveAt:
          type: string
          format: date-time
          description: >-
            Date the switch is calculated for. For end_of_period tiers the
            preview uses the current moment, so the amounts are an
            approximation.
        recurringTotal:
          $ref: '#/components/schemas/RecurringTotals'
        warnings:
          type: array
          items:
            type: string
          example:
            - active_discount_will_be_lost
          description: >-
            Hints about side effects, for example that an active discount will
            not carry over.
  securitySchemes:
    ApiToken:
      type: http
      scheme: bearer
      description: >-
        Organisation API token. Send it as Authorization: Bearer api_... The
        token is scoped to a single Organisation.
    CustomerToken:
      type: http
      scheme: bearer
      description: >-
        Customer access token. Send it as Authorization: Bearer <token>. Obtain
        it server side via POST /customers/{id}/authenticate (use the response
        accessToken), or from a customer portal session. The token must carry
        the customer:plan:switch permission.

````