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

# List connected CEX markets

> Requires `marketdata:read`; available on Free, Plus and Pro subject to connected-resource eligibility. Lists cached CCXT unified market definitions from the specified connected exchange without forcing a refresh. Filters combine with AND. Strings match exactly and case-sensitively except for venue normalization. Only documented parameters are accepted, and duplicates are rejected. Results include inactive and unknown states unless filtered. The data array contains the current page; meta.total counts all filtered matches. No match or an offset beyond the end returns an empty array. Each response uses one directory snapshot, but the directory may change between requests; restart at offset zero if it changes. Results may not include every regional, historical or delisted market. A listed market does not guarantee that your account can trade it or that an order will be accepted.



## OpenAPI

````yaml /openapi/portfobit-openapi.yaml get /market-data/markets
openapi: 3.1.0
info:
  title: Portfobit Open API
  version: 0.1.0
  description: >
    Public REST API for direct API clients, CI, scripts, service accounts,
    third-party agents, and developer integrations.

    Public REST requests use scoped Portfobit Open API keys. OAuth access tokens
    issued for the Portfobit MCP resource are not accepted by `/api/v1/*`
    endpoints.

    Portfobit is crypto-CEX-only. Financial values are decimal strings and
    timestamps are RFC 3339 UTC strings.

    The API never supports withdrawals, external-address transfers,
    cross-exchange transfers, or P2P transfers.
servers:
  - url: https://api.portfobit.com/api/v1
security:
  - bearerAuth: []
tags:
  - name: Context
  - name: Accounts
  - name: Portfolios
  - name: Valuation
  - name: Activity
  - name: Trading
  - name: Market data
  - name: Support
paths:
  /market-data/markets:
    get:
      tags:
        - Market data
      summary: List connected CEX markets
      description: >-
        Requires `marketdata:read`; available on Free, Plus and Pro subject to
        connected-resource eligibility. Lists cached CCXT unified market
        definitions from the specified connected exchange without forcing a
        refresh. Filters combine with AND. Strings match exactly and
        case-sensitively except for venue normalization. Only documented
        parameters are accepted, and duplicates are rejected. Results include
        inactive and unknown states unless filtered. The data array contains the
        current page; meta.total counts all filtered matches. No match or an
        offset beyond the end returns an empty array. Each response uses one
        directory snapshot, but the directory may change between requests;
        restart at offset zero if it changes. Results may not include every
        regional, historical or delisted market. A listed market does not
        guarantee that your account can trade it or that an order will be
        accepted.
      operationId: listMarkets
      parameters:
        - name: venue
          in: query
          required: true
          description: >-
            Connected CEX venue, such as bybit or okx. Leading and trailing
            whitespace is removed and the value is normalized to lowercase.
            Results come only from the specified exchange.
          schema:
            type: string
            minLength: 1
        - name: type
          in: query
          required: false
          description: >-
            Exact unified market type. Omit to include all four types present in
            the loaded directory; margin is an independent capability flag.
          schema:
            type: string
            enum:
              - spot
              - swap
              - future
              - option
        - name: symbol
          in: query
          required: false
          description: >-
            Exact, case-sensitive CCXT unified symbol, such as BTC/USDT or
            BTC/USDT:USDT. Do not substitute the exchange-native market id.
          schema:
            type: string
            minLength: 1
        - name: base
          in: query
          required: false
          description: Exact unified base currency, such as BTC.
          schema:
            type: string
            minLength: 1
        - name: quote
          in: query
          required: false
          description: Exact unified quote currency, such as USDT.
          schema:
            type: string
            minLength: 1
        - name: settle
          in: query
          required: false
          description: Exact unified settlement currency; does not match null.
          schema:
            type: string
            minLength: 1
        - name: active
          in: query
          required: false
          description: >-
            Exact active flag. Omit to include true, false and unknown; an
            explicit true or false does not match null.
          schema:
            type: boolean
        - name: margin
          in: query
          required: false
          description: >-
            Exact margin flag. Omit to include true, false and unknown; an
            explicit true or false does not match null.
          schema:
            type: boolean
        - name: linear
          in: query
          required: false
          description: >-
            Exact linear flag. Omit to include true, false and unknown; an
            explicit true or false does not match null.
          schema:
            type: boolean
        - name: inverse
          in: query
          required: false
          description: >-
            Exact inverse flag. Omit to include true, false and unknown; an
            explicit true or false does not match null.
          schema:
            type: boolean
        - name: limit
          in: query
          required: false
          description: Page size, applied after all filters.
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
        - name: offset
          in: query
          required: false
          description: >-
            Non-negative offset into the filtered directory, ordered by unified
            symbol ascending.
          schema:
            type: integer
            minimum: 0
            default: 0
      responses:
        '200':
          $ref: '#/components/responses/MarketCatalogResponse'
        '400':
          $ref: '#/components/responses/InvalidMarketCatalogQueryResponse'
        '401':
          $ref: '#/components/responses/MarketCatalogAuthenticationRequiredResponse'
        '403':
          $ref: '#/components/responses/MarketCatalogForbiddenResponse'
        '404':
          $ref: '#/components/responses/MarketCatalogVenueUnavailableResponse'
        '429':
          $ref: '#/components/responses/MarketCatalogRateLimitedResponse'
        '503':
          $ref: '#/components/responses/MarketDataUnavailableResponse'
components:
  responses:
    MarketCatalogResponse:
      description: >-
        Loaded market definitions, classifications, precision and limits. All
        nullable fields and bound objects are present; unknown values are not
        replaced with zero or false. Example values are illustrative, not
        current trading rules.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/MarketCatalogResponseSchema'
    InvalidMarketCatalogQueryResponse:
      description: >-
        invalid_request for missing/empty venue, empty strings,
        unknown/duplicate parameters or invalid pagination; invalid_filter for
        an invalid type or boolean; invalid_market_symbol for malformed unified
        symbols. A well-formed symbol with no match returns an empty success.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: invalid_filter
              message: type must be spot, swap, future or option
            meta:
              request_id: req_catalog
              generated_at: '2026-11-05T02:00:00Z'
    MarketCatalogAuthenticationRequiredResponse:
      description: >-
        Authentication is required. Missing, invalid, expired or inactive Open
        API keys return authentication_required. MCP OAuth tokens cannot be used
        directly with this REST endpoint.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: authentication_required
              message: Open API requests must use Bearer authentication.
            meta:
              request_id: req_market_catalog_01
              generated_at: '2026-11-05T02:00:00Z'
    MarketCatalogForbiddenResponse:
      description: >-
        The key lacks marketdata:read (insufficient_scope), or existing
        connector read eligibility is explicitly denied
        (provider_permission_denied).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    MarketCatalogVenueUnavailableResponse:
      description: >-
        No usable connected source is available for the requested exchange
        (market_venue_not_available).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: market_venue_not_available
              message: the requested market venue is not available
            meta:
              request_id: req_market_catalog_01
              generated_at: '2026-11-05T02:00:00Z'
    MarketCatalogRateLimitedResponse:
      description: >-
        The request is rate limited (rate_limited), or an upstream rate limit is
        reported (market_upstream_rate_limited). Retry-After gives the number of
        seconds to wait.
      headers:
        Retry-After:
          schema:
            type: integer
          description: Seconds to wait before retrying.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          examples:
            request_rate_limit:
              value:
                error:
                  code: rate_limited
                  message: Too many requests.
                meta:
                  request_id: req_market_catalog_01
                  generated_at: '2026-11-05T02:00:00Z'
            upstream_rate_limit:
              value:
                error:
                  code: market_upstream_rate_limited
                  message: upstream market data request is rate limited
                meta:
                  request_id: req_market_catalog_01
                  generated_at: '2026-11-05T02:00:00Z'
    MarketDataUnavailableResponse:
      description: >-
        The selected CEX or its dependency is temporarily unavailable. The API
        does not retry against another venue or return a stale cached result.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: unavailable
              message: market data is unavailable
              details: {}
            meta:
              request_id: req_01J2K8B7QW
              generated_at: '2026-08-14T08:00:00Z'
  schemas:
    MarketCatalogResponseSchema:
      type: object
      required:
        - data
        - meta
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Market'
        meta:
          type: object
          required:
            - total
            - limit
            - offset
            - has_next
            - source
            - source_venue
            - markets_loaded_at
            - request_id
            - generated_at
          properties:
            total:
              type: integer
              minimum: 0
              description: Total after all filters, before pagination.
            limit:
              type: integer
              minimum: 1
              maximum: 100
            offset:
              type: integer
              minimum: 0
            has_next:
              type: boolean
              description: Whether offset + data.length is less than total.
            source:
              type: string
              const: ccxt
            source_venue:
              type: string
              description: Actual venue; equals the normalized requested venue.
            markets_loaded_at:
              type:
                - string
                - 'null'
              format: date-time
              description: >-
                Time the market definitions used for this response were loaded,
                when known; not the exchange's last update time. Null means the
                load time is unavailable. Reading the directory does not force a
                refresh.
            request_id:
              type: string
            generated_at:
              type: string
              format: date-time
              description: >-
                Current response generation time; does not indicate a new market
                load.
      example:
        data:
          - id: BTCUSDT
            symbol: BTC/USDT:USDT
            type: swap
            base: BTC
            quote: USDT
            settle: USDT
            active: true
            margin: false
            contract: true
            linear: true
            inverse: false
            contract_size: '1'
            expiry: null
            strike: null
            option_type: null
            precision_mode: tick_size
            precision:
              amount: '0.001'
              price: '0.1'
              cost: null
              base: null
              quote: null
            limits:
              amount:
                min: '0.001'
                max: null
              price:
                min: null
                max: null
              cost:
                min: '5'
                max: null
              leverage:
                min: '1'
                max: '100'
        meta:
          total: 1
          limit: 50
          offset: 0
          has_next: false
          source: ccxt
          source_venue: bybit
          markets_loaded_at: '2026-11-04T05:50:00Z'
          request_id: req_market_catalog_01
          generated_at: '2026-11-04T06:00:00Z'
    ErrorEnvelope:
      type: object
      required:
        - error
        - meta
      properties:
        error:
          $ref: '#/components/schemas/Error'
        meta:
          $ref: '#/components/schemas/Meta'
    Market:
      type: object
      required:
        - id
        - symbol
        - type
        - base
        - quote
        - settle
        - active
        - margin
        - contract
        - linear
        - inverse
        - contract_size
        - expiry
        - strike
        - option_type
        - precision_mode
        - precision
        - limits
      properties:
        id:
          type: string
          description: >-
            Exchange-native market id, not a Portfobit resource id. May overlap
            across market types; do not deduplicate using this value.
        symbol:
          type: string
          description: >-
            CCXT unified symbol, unique within this directory. Pass this value
            to quote/candles.
        type:
          type: string
          enum:
            - spot
            - swap
            - future
            - option
          description: Spot, perpetual swap, expiring future, or option.
        base:
          type: string
          description: Unified base currency.
        quote:
          type: string
          description: Unified quote currency.
        settle:
          type:
            - string
            - 'null'
          description: Unified settlement currency; typically not applicable to spot.
        active:
          type:
            - boolean
            - 'null'
          description: >-
            Unified active flag; unknown remains null. True does not guarantee
            this account can trade.
        margin:
          type:
            - boolean
            - 'null'
          description: >-
            Unified margin capability flag. Does not grant account borrowing or
            trading permission.
        contract:
          type:
            - boolean
            - 'null'
          description: Unified contract flag.
        linear:
          type:
            - boolean
            - 'null'
          description: Unified linear-contract flag.
        inverse:
          type:
            - boolean
            - 'null'
          description: Unified inverse-contract flag.
        contract_size:
          type:
            - string
            - 'null'
          description: >-
            CCXT contractSize in its original market units. Do not use it alone
            to derive inverse-contract base quantities.
          pattern: ^-?[0-9]+(\.[0-9]+)?$
        expiry:
          type:
            - string
            - 'null'
          description: >-
            CCXT expiry converted from milliseconds to a UTC timestamp; spot and
            swap return null.
          format: date-time
        strike:
          type:
            - string
            - 'null'
          description: Option strike price; null for other market types.
          pattern: ^-?[0-9]+(\.[0-9]+)?$
        option_type:
          type:
            - string
            - 'null'
          enum:
            - call
            - put
            - null
          description: CCXT optionType; null for other market types or unknown.
        precision_mode:
          type:
            - string
            - 'null'
          enum:
            - tick_size
            - decimal_places
            - significant_digits
            - null
          description: >-
            Precision mode. Tick size means a precision increment, decimal
            places means the number of decimal positions, significant digits
            means significant-digit precision. Integer precision values are
            still strings and may be negative when supported by CCXT. Null means
            the mode cannot be determined; do not infer it from a numeric
            precision.
        precision:
          $ref: '#/components/schemas/MarketPrecision'
        limits:
          $ref: '#/components/schemas/MarketLimits'
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
        message:
          type: string
        details:
          type: object
          additionalProperties: true
    Meta:
      type: object
      required:
        - request_id
        - generated_at
      properties:
        request_id:
          type: string
        generated_at:
          type: string
          format: date-time
    MarketPrecision:
      type: object
      required:
        - amount
        - price
        - cost
        - base
        - quote
      properties:
        amount:
          type:
            - string
            - 'null'
          description: >-
            CCXT amount precision; interpret using precision_mode. Not an order
            minimum or maximum.
          pattern: ^-?[0-9]+(\.[0-9]+)?$
        price:
          type:
            - string
            - 'null'
          description: >-
            CCXT price precision; interpret using precision_mode. Not an order
            minimum or maximum.
          pattern: ^-?[0-9]+(\.[0-9]+)?$
        cost:
          type:
            - string
            - 'null'
          description: >-
            CCXT cost precision; interpret using precision_mode. Not an order
            minimum or maximum.
          pattern: ^-?[0-9]+(\.[0-9]+)?$
        base:
          type:
            - string
            - 'null'
          description: >-
            CCXT base precision; interpret using precision_mode. Not an order
            minimum or maximum.
          pattern: ^-?[0-9]+(\.[0-9]+)?$
        quote:
          type:
            - string
            - 'null'
          description: >-
            CCXT quote precision; interpret using precision_mode. Not an order
            minimum or maximum.
          pattern: ^-?[0-9]+(\.[0-9]+)?$
    MarketLimits:
      type: object
      required:
        - amount
        - price
        - cost
        - leverage
      properties:
        amount:
          $ref: '#/components/schemas/MarketRange'
          description: >-
            Order-amount bounds in CCXT market units: usually base quantity for
            spot and contracts for derivatives. The minimum is not an amount
            step.
        price:
          $ref: '#/components/schemas/MarketRange'
          description: CCXT order-price bounds.
        cost:
          $ref: '#/components/schemas/MarketRange'
          description: >-
            CCXT market cost bounds; not converted to USD or inferred from
            missing values.
        leverage:
          $ref: '#/components/schemas/MarketRange'
          description: >-
            CCXT market leverage bounds; not the account's effective leverage or
            a risk verdict.
    MarketRange:
      type: object
      required:
        - min
        - max
      properties:
        min:
          type:
            - string
            - 'null'
          description: >-
            Minimum, or null when unknown/not applicable. Known zero remains
            "0".
          pattern: ^-?[0-9]+(\.[0-9]+)?$
        max:
          type:
            - string
            - 'null'
          description: >-
            Maximum, or null when unknown/not applicable. Null does not mean
            unlimited.
          pattern: ^-?[0-9]+(\.[0-9]+)?$
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Portfobit Open API key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.