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

# List Plans

> Get the active broker plan catalog for service creation and plan changes.

Returns the active plans assigned to your broker, ordered by `sort_order` and then `display_name`. Requires `services:read` or `admin:full`.

## Use the catalog

Pass a returned `slug`, `id`, or `display_name` to [Create Service](/api/services/create-service). For live [upgrades](/api/services/upgrade) and [downgrades](/api/services/downgrade), pass it as `new_plan`.

Plan names, specifications, and prices are broker-specific. Compare `upgrade_rank` to determine plan-change direction. The target must have the same `billing_type` as the current plan; monthly/hourly conversion requires cancellation and recreation.

The response is an array without pagination. Missing specifications or prices can be `null`. An empty array means no active plans are available.

<Note>
  A Sandbox key returns the real broker catalog, not generated plans. Sandbox service creation validates against this catalog, while Sandbox upgrade and downgrade simulations use fixed standard plans. See [Sandbox Mode](/api/sandbox-mode).
</Note>

For authentication, permissions, rate limits, and error handling, see [Errors and Retries](/api/errors-and-retries).


## OpenAPI

````yaml api/openapi.yaml GET /v1/plans
openapi: 3.1.0
info:
  title: Broker API
  version: 1.0.0
  description: API for broker-scoped service, request, and report operations.
servers:
  - url: https://brokers.newyorkcityservers.com/api
    description: Broker Panel API
security:
  - bearerAuth: []
tags:
  - name: Authentication
  - name: Services
  - name: Requests
  - name: Reports
paths:
  /v1/plans:
    get:
      tags:
        - Services
      summary: List Plans
      description: >-
        Returns the active broker catalog, ordered by sort_order and
        display_name. Requires `services:read` or `admin:full`. Sandbox keys
        also return the real catalog.
      operationId: listPlans
      responses:
        '200':
          description: Active broker plans. No pagination; the array can be empty.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/SuccessEnvelope'
                  - type: object
                    required:
                      - data
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/BrokerPlan'
              example:
                success: true
                data:
                  - id: 5d5b0465-4ff9-4198-80df-f86fa55dcd64
                    slug: standard-vps
                    display_name: Standard VPS
                    service_kind: vps
                    billing_type: monthly
                    price_monthly: 50
                    price_hourly: null
                    currency: USD
                    cpu: 2 vCPU
                    ram: 4 GB
                    storage: 80 GB
                    upgrade_rank: 1
                    sort_order: 1
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '403':
          $ref: '#/components/responses/PermissionError'
        '429':
          $ref: '#/components/responses/RateLimitError'
        '500':
          $ref: '#/components/responses/ServerError'
components:
  schemas:
    SuccessEnvelope:
      type: object
      required:
        - success
      properties:
        success:
          type: boolean
          const: true
        message:
          type: string
        pagination:
          $ref: '#/components/schemas/Pagination'
    BrokerPlan:
      type: object
      required:
        - id
        - slug
        - display_name
        - service_kind
        - billing_type
        - price_monthly
        - price_hourly
        - currency
        - cpu
        - ram
        - storage
        - upgrade_rank
        - sort_order
      properties:
        id:
          type: string
          format: uuid
        slug:
          type: string
        display_name:
          type: string
        service_kind:
          type: string
          example: vps
        billing_type:
          type: string
          example: monthly
        price_monthly:
          type:
            - number
            - 'null'
        price_hourly:
          type:
            - number
            - 'null'
        currency:
          type: string
          example: USD
        cpu:
          type:
            - string
            - 'null'
        ram:
          type:
            - string
            - 'null'
        storage:
          type:
            - string
            - 'null'
        upgrade_rank:
          type: integer
          description: Compare ranks to determine live upgrade or downgrade direction.
        sort_order:
          type: integer
    Pagination:
      type: object
      required:
        - page
        - perPage
        - total
        - totalPages
      properties:
        page:
          type: integer
          minimum: 1
        perPage:
          type: integer
          minimum: 1
          maximum: 100
        total:
          type: integer
          minimum: 0
        totalPages:
          type: integer
          minimum: 0
    ErrorResponse:
      type: object
      required:
        - success
        - error
      properties:
        success:
          type: boolean
          const: false
        error:
          $ref: '#/components/schemas/Error'
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
        message:
          type: string
        details:
          type: object
          additionalProperties: true
  responses:
    AuthenticationError:
      description: >-
        Code `authentication_failed` for a missing, malformed, invalid,
        inactive, or expired API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: authentication_failed
              message: Invalid API key
    PermissionError:
      description: >-
        Code `insufficient_permissions` when the request IP is not whitelisted
        or a required scope is missing.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: insufficient_permissions
              message: IP address not whitelisted
    RateLimitError:
      description: Code `rate_limit_exceeded` when the API key exceeds its rate limit.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
            minimum: 1
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: rate_limit_exceeded
              message: Rate limit exceeded
    ServerError:
      description: >-
        Code `server_error` when authentication or internal processing cannot
        complete.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: server_error
              message: Internal server error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: >-
        Send the API key in the Authorization bearer header. Production keys
        begin with `sk_live_`.

````