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

# List questions

> List active questions with their titles and markets, and the standalone markets that belong to no question.

No API key required.



## OpenAPI

````yaml /hyperliquid/openapi.json get /v1/discovery
openapi: 3.1.1
info:
  title: Totalis Hyperliquid API
  description: >-
    REST API for Totalis singles and parlays on Hyperliquid HIP-4 outcome
    markets, for client integrations and external market makers.


    There are three ways in, each sent as `Authorization: Bearer <credential>`:


    - **Scoped API key** (`ttk_`), for servers, bots and market makers. The
    account owner creates it in the Totalis app, or a wallet-session user
    creates one with `POST /v1/me/api-keys` and a fresh wallet signature (see
    API keys). It acts for one account, yours or a maker's, with only the scopes
    it holds, and needs no `Origin`.

    - **Wallet session**, for users who bring their own wallet to a partner's
    web page. The page signs the wallet in with `POST
    /v1/auth/wallet-challenges` and `POST /v1/auth/wallet-sessions`; the session
    is bound to the page's registered `Origin` and must be sent from it. Pages
    may also label their traffic with their publishable browser key in
    `X-Totalis-Partner: tpb_...`.

    - **Partner server key** (`tpk_`), only for `POST
    /v1/partner/wallet-admissions`, which lets a new wallet open its account
    during the invite-only launch. Server to server, never in a browser, and
    never with an `Origin`.


    Public market reads need no credential. A credential only authenticates:
    every bet, cash-out and withdrawal also carries the wallet or maker
    signature the HyperEVM contract verifies. An external wallet sends `POST
    /v1/core-exits` to move its vault cash to HyperCore before a HyperCore
    order.


    For access, partner credentials (origins, browser and server keys), builder
    codes or staging, email
    [founders@totalis.trade](mailto:founders@totalis.trade).


    Amounts are base-10 strings in native USDC atomic units, large identifiers
    are decimal strings, and every command `POST` requires an `Idempotency-Key`
    header.


    Every error is `{error: {code, message, retry, request_id,
    field_violations}}`. `code` is stable; each operation lists the codes it
    returns per status. `retry` is `NEVER` (stop), `BACKOFF` (resend the same
    request with the same `Idempotency-Key` after `Retry-After` seconds) or
    `REFRESH` (re-read state, then send a new request with a new key).
    `field_violations` names invalid inputs by JSON pointer, such as
    `/legs/0/side`.
  version: 162.0.0-accept-before
servers:
  - url: https://hip4-api.totalis.trade
    description: Production public edge
  - url: https://hip4-api-staging.totalis.trade
    description: Staging and chain-998 public edge
security: []
tags:
  - name: Markets
    description: >-
      HIP-4 questions and markets, their sides and price history. No API key
      needed.
  - name: RFQs & Quotes
    description: >-
      RFQs and the quotes that answer them: what a taker calls, then what a
      maker calls.
  - name: Positions
    description: Positions the account holds, or its maker backs.
  - name: Account
    description: >-
      The account a key acts for: identity, balances, activity, operations,
      withdrawals, deposits and HyperCore exits.
  - name: Makers
    description: >-
      The rest of a maker's setup after Making: admission, quote history,
      capital and collateral.
  - name: Partners & wallet sign-in
    description: >-
      A partner admits its users' own wallets, which sign in from the partner's
      pages.
  - name: API keys
    description: >-
      Issue, rotate and revoke scoped keys from a wallet session. An API key
      cannot manage keys.
  - name: Deployment
    description: The contract deployment every signature is made against.
  - name: WebSocket
    description: The authenticated WebSocket for account and maker updates.
paths:
  /v1/discovery:
    get:
      tags:
        - Markets
      summary: List questions
      description: >-
        List active questions with their titles and markets, and the standalone
        markets that belong to no question.


        No API key required.
      operationId: listDiscovery
      parameters:
        - $ref: '#/components/parameters/Cursor'
        - $ref: '#/components/parameters/Category'
        - $ref: '#/components/parameters/Subcategory'
        - $ref: '#/components/parameters/Limit'
      responses:
        '200':
          description: >-
            One page of display groups. A `QUESTION` item carries the question's
            `title` and its outcomes in `markets`; a `STANDALONE` item carries
            one market that belongs to no question, never a made-up question.
            Native market state controls visibility: during a reference outage
            items stay readable with unavailable prices and trading disabled,
            and informational dates do not close markets. Filtering may return a
            short or empty page while `has_more` is true; only a null
            `next_cursor` ends the list. `GET /v1/markets` and `GET
            /v1/markets/{outcome_id}` keep the complete supported catalog.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DiscoveryList'
              example:
                items:
                  - id: question:198
                    kind: QUESTION
                    native_question_id: '198'
                    title: 2026/2027 English Premier League winner
                    state: ACTIVE
                    category: Sports
                    subcategory: epl
                    markets:
                      - outcome_id: '1473'
                        native_question_id: '198'
                        title: Arsenal
                        state: ACTIVE
                        result:
                          availability: AVAILABLE
                          result_state: UNRESOLVED
                        metadata_revision: '14269'
                        eligibility:
                          state: ENABLED
                        combo:
                          state: CLOSED
                          reason: OUTSIDE_WINDOW
                          opens_at: '1811592000'
                        deployer:
                          name: Outcome
                          address: '0x0c46eb73fae2816f219fcf11f50d6d3c59b5819e'
                        category: Sports
                        subcategory: epl
                        sides:
                          - side: 'YES'
                            coin: '#14730'
                            reference:
                              availability: AVAILABLE
                              quality: BOOK_MID
                              value: '603145000000000000'
                              best_bid: '603140000000000000'
                              best_ask: '603150000000000000'
                              last_trade: '603140000000000000'
                              last_trade_at: '2026-10-18T05:15:28.404Z'
                              chance: '603145000000000000'
                              chance_basis: MID
                              mark: '603145000000000000'
                              scale: '1000000000000000000'
                              freshness: FRESH
                              received_at: '2026-10-18T05:22:53.874256929Z'
                          - side: 'NO'
                            coin: '#14731'
                            reference:
                              availability: AVAILABLE
                              quality: BOOK_MID
                              value: '396855000000000000'
                              best_bid: '396850000000000000'
                              best_ask: '396860000000000000'
                              last_trade: '396860000000000000'
                              last_trade_at: '2026-10-18T05:15:28.404Z'
                              chance: '396855000000000000'
                              chance_basis: MID
                              mark: '396855000000000000'
                              scale: '1000000000000000000'
                              freshness: FRESH
                              received_at: '2026-10-18T05:22:53.874256929Z'
                        dates:
                          event: null
                          result_by: '1812196800'
                          resolves_after: null
                          scheduled_event_at: null
                          observation_ends_at: null
                          market_class: SPORTS_TOURNAMENT
                      - outcome_id: '1474'
                        native_question_id: '198'
                        title: Manchester City
                        state: ACTIVE
                        result:
                          availability: AVAILABLE
                          result_state: UNRESOLVED
                        metadata_revision: '14269'
                        eligibility:
                          state: ENABLED
                        combo:
                          state: CLOSED
                          reason: OUTSIDE_WINDOW
                          opens_at: '1811592000'
                        deployer:
                          name: Outcome
                          address: '0x0c46eb73fae2816f219fcf11f50d6d3c59b5819e'
                        category: Sports
                        subcategory: epl
                        sides:
                          - side: 'YES'
                            coin: '#14740'
                            reference:
                              availability: AVAILABLE
                              quality: BOOK_MID
                              value: '208925000000000000'
                              best_bid: '208920000000000000'
                              best_ask: '208930000000000000'
                              last_trade: '208920000000000000'
                              last_trade_at: '2026-10-18T05:21:59.572Z'
                              chance: '208925000000000000'
                              chance_basis: MID
                              mark: '208925000000000000'
                              scale: '1000000000000000000'
                              freshness: FRESH
                              received_at: '2026-10-18T05:22:54.269357435Z'
                          - side: 'NO'
                            coin: '#14741'
                            reference:
                              availability: AVAILABLE
                              quality: BOOK_MID
                              value: '791075000000000000'
                              best_bid: '791070000000000000'
                              best_ask: '791080000000000000'
                              last_trade: '791080000000000000'
                              last_trade_at: '2026-10-18T05:21:59.572Z'
                              chance: '791075000000000000'
                              chance_basis: MID
                              mark: '791075000000000000'
                              scale: '1000000000000000000'
                              freshness: FRESH
                              received_at: '2026-10-18T05:22:54.269357435Z'
                        dates:
                          event: null
                          result_by: '1812196800'
                          resolves_after: null
                          scheduled_event_at: null
                          observation_ends_at: null
                          market_class: SPORTS_TOURNAMENT
                  - id: market:2597
                    kind: STANDALONE
                    native_question_id: null
                    title: Anthropic IPO confirmed by Oct 31, 2026 23:59 UTC
                    state: ACTIVE
                    category: Finance
                    subcategory: stocks
                    markets:
                      - outcome_id: '2597'
                        native_question_id: null
                        title: Anthropic IPO confirmed by Oct 31, 2026 23:59 UTC
                        state: ACTIVE
                        result:
                          availability: AVAILABLE
                          result_state: UNRESOLVED
                        metadata_revision: '14269'
                        eligibility:
                          state: ENABLED
                        combo:
                          state: CLOSED
                          reason: OUTSIDE_WINDOW
                          opens_at: '1792886340'
                        deployer:
                          name: trade[XYZ]
                          address: '0x7aca09667816a4817b8bc697fb239ad42ff9f553'
                        category: Finance
                        subcategory: stocks
                        sides:
                          - side: 'YES'
                            coin: '#25970'
                            reference:
                              availability: AVAILABLE
                              quality: BOOK_MID
                              value: '75000000000000000'
                              best_bid: '20000000000000000'
                              best_ask: '130000000000000000'
                              last_trade: '20000000000000000'
                              last_trade_at: '2026-10-17T09:16:32.476Z'
                              chance: '20000000000000000'
                              chance_basis: LAST_TRADE
                              mark: '20000000000000000'
                              scale: '1000000000000000000'
                              freshness: FRESH
                              received_at: '2026-10-18T05:23:07.27382175Z'
                          - side: 'NO'
                            coin: '#25971'
                            reference:
                              availability: AVAILABLE
                              quality: BOOK_MID
                              value: '925000000000000000'
                              best_bid: '870000000000000000'
                              best_ask: '980000000000000000'
                              last_trade: '980000000000000000'
                              last_trade_at: '2026-10-17T09:16:32.476Z'
                              chance: '980000000000000000'
                              chance_basis: LAST_TRADE
                              mark: '980000000000000000'
                              scale: '1000000000000000000'
                              freshness: FRESH
                              received_at: '2026-10-18T05:23:07.27382175Z'
                        dates:
                          event: null
                          result_by: null
                          resolves_after: '1794095940'
                          scheduled_event_at: null
                          observation_ends_at: '1793491140'
                          market_class: COMPANY_IPO
                catalog_generation: '14269'
                next_cursor: null
                has_more: false
        '400':
          description: >-
            - `INVALID_QUERY` (retry `NEVER`): A query parameter is malformed,
            out of range or not accepted by this operation. `field_violations`
            names it.

            - `INVALID_CURSOR` (retry `NEVER`): The cursor is malformed or was
            issued for a different query.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Error'
                  - properties:
                      error:
                        description: The error this operation returns with this status.
                        properties:
                          code:
                            description: >-
                              One of the registered codes listed in this
                              response's description.
                            enum:
                              - INVALID_QUERY
                              - INVALID_CURSOR
                          retry:
                            description: >-
                              The retry rule the registry fixes for the returned
                              code.
                            enum:
                              - NEVER
        '409':
          description: >-
            - `STALE_CURSOR` (retry `REFRESH`): The cursor belongs to an older
            catalog or browse generation; restart from the first page.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Error'
                  - properties:
                      error:
                        description: The error this operation returns with this status.
                        properties:
                          code:
                            description: >-
                              One of the registered codes listed in this
                              response's description.
                            enum:
                              - STALE_CURSOR
                          retry:
                            description: >-
                              The retry rule the registry fixes for the returned
                              code.
                            enum:
                              - REFRESH
        '503':
          description: >-
            - `MARKET_DATA_UNAVAILABLE` (retry `BACKOFF`): No complete market
            catalog is available.

            - `BROWSE_UNAVAILABLE` (retry `BACKOFF`): The published browse view
            is unavailable.
          headers:
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Error'
                  - properties:
                      error:
                        description: The error this operation returns with this status.
                        properties:
                          code:
                            description: >-
                              One of the registered codes listed in this
                              response's description.
                            enum:
                              - MARKET_DATA_UNAVAILABLE
                              - BROWSE_UNAVAILABLE
                          retry:
                            description: >-
                              The retry rule the registry fixes for the returned
                              code.
                            enum:
                              - BACKOFF
      security:
        - {}
components:
  parameters:
    Cursor:
      name: cursor
      in: query
      description: >-
        Omit for the first page; then send the previous response's next_cursor
        unchanged.
      schema:
        $ref: '#/components/schemas/PageCursor'
      example: eyJ2IjoxLCJzIjoiMTIzNDUifQ
    Category:
      name: category
      in: query
      description: Platform taxonomy category slug. The cursor is bound to this filter.
      schema:
        $ref: '#/components/schemas/CategorySlug'
      example: sports
    Subcategory:
      name: subcategory
      in: query
      description: Platform taxonomy subcategory slug. The cursor is bound to this filter.
      schema:
        type: string
        enum:
          - nba
          - ncaa
          - nfl
          - nhl
          - mlb
          - ufc
          - lol
          - epl
          - ucl
          - uel
          - efl
          - la_liga
          - world_cup
          - bundesliga
          - liga_portugal
          - ligue_1
          - f1
          - ipl
          - cricket
          - transfers
          - btc
          - eth
          - sol
          - hype
          - up_down
          - stocks
          - indices
          - etfs
          - earnings
          - rates
          - inflation
          - commodities
          - fx
          - usa
          - global
          - other
      example: epl
    Limit:
      name: limit
      in: query
      schema:
        $ref: '#/components/schemas/PageLimit'
      description: >-
        Maximum items per page, 1 to 200, default 50. A page may hold fewer,
        even none, while has_more is true.
      example: 50
  schemas:
    DiscoveryList:
      type: object
      required:
        - items
        - catalog_generation
        - next_cursor
        - has_more
      properties:
        items:
          type: array
          maxItems: 200
          items:
            $ref: '#/components/schemas/DiscoveryItem'
          description: Matching questions and standalone markets, best match first.
        catalog_generation:
          $ref: '#/components/schemas/PositiveInt64'
          description: >-
            Catalog generation every item was read from; pages from different
            generations must not be mixed.
        next_cursor:
          $ref: '#/components/schemas/NextCursor'
          description: >-
            Pass as cursor with the same query to read the next page; null when
            there are no more pages.
        has_more:
          type: boolean
          description: True when another page follows.
    Error:
      properties:
        error:
          $ref: '#/components/schemas/ErrorDetail'
          description: The one error this request failed with.
      required:
        - error
      type: object
    PageCursor:
      type: string
      minLength: 1
      maxLength: 2048
      description: >-
        Opaque list cursor. Send a previous response's next_cursor back
        unchanged; never build or parse one.
    CategorySlug:
      type: string
      enum:
        - crypto
        - economics
        - entertainment
        - esports
        - finance
        - politics
        - sports
        - tech
        - weather
    PageLimit:
      type: integer
      minimum: 1
      maximum: 200
      default: 50
      description: >-
        Maximum items in one page. A page may hold fewer, even none, while
        has_more is true.
    DiscoveryItem:
      oneOf:
        - $ref: '#/components/schemas/DiscoveryQuestionItem'
        - $ref: '#/components/schemas/DiscoveryStandaloneItem'
    PositiveInt64:
      type: string
      pattern: ^[1-9][0-9]*$
      maxLength: 19
      format: positive-int64-decimal
      description: Positive generation or version bounded by signed int64 storage.
    NextCursor:
      type:
        - string
        - 'null'
      minLength: 1
      maxLength: 2048
      description: Opaque cursor for the next page, or null when has_more is false.
    ErrorDetail:
      properties:
        code:
          $ref: '#/components/schemas/ErrorCode'
          description: Stable registered code; branch on this, not on message or status.
        field_violations:
          description: >-
            Each invalid input by JSON pointer; empty when the error is not
            about a specific input.
          items:
            $ref: '#/components/schemas/FieldViolation'
          type: array
        message:
          description: Human-readable; may change without notice.
          minLength: 1
          type: string
        request_id:
          description: >-
            UUIDv7 of this request, also returned in the X-Request-ID header.
            Quote it when reporting a problem.
          format: uuid
          pattern: >-
            ^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
          type: string
        retry:
          $ref: '#/components/schemas/Retry'
          description: What the caller should do next; fixed by the registry for each code.
      required:
        - code
        - message
        - retry
        - request_id
        - field_violations
      type: object
    DiscoveryQuestionItem:
      type: object
      allOf:
        - $ref: '#/components/schemas/DiscoveryDisplay'
        - required:
            - id
            - kind
            - native_question_id
            - markets
          properties:
            id:
              type: string
              pattern: ^question:[0-9]+$
              maxLength: 32
              description: 'Item ID, question: followed by the native question ID.'
            kind:
              const: QUESTION
              description: 'QUESTION: a multi-outcome question.'
            native_question_id:
              $ref: '#/components/schemas/RealQuestionId'
              description: Hyperliquid question ID.
            markets:
              type: array
              minItems: 1
              maxItems: 256
              items:
                $ref: '#/components/schemas/Market'
              description: The question's markets in the current catalog.
      unevaluatedProperties: false
    DiscoveryStandaloneItem:
      type: object
      allOf:
        - $ref: '#/components/schemas/DiscoveryDisplay'
        - required:
            - id
            - kind
            - native_question_id
            - markets
          properties:
            id:
              type: string
              pattern: ^market:[0-9]+$
              maxLength: 32
              description: 'Item ID, market: followed by the outcome ID.'
            kind:
              const: STANDALONE
              description: 'STANDALONE: a single binary market with no question.'
            native_question_id:
              type: 'null'
              description: Always null for a standalone market.
            markets:
              type: array
              minItems: 1
              maxItems: 1
              items:
                $ref: '#/components/schemas/Market'
              description: The single standalone market.
      unevaluatedProperties: false
    ErrorCode:
      description: >-
        Stable HTTP error code. Each code has one HTTP status and one retry
        value.
      enum:
        - INVALID_REQUEST
        - INVALID_QUERY
        - INVALID_CURSOR
        - INVALID_IDEMPOTENCY_KEY
        - ORIGIN_REQUIRED
        - SUBPROTOCOL_REQUIRED
        - UNSUPPORTED_BROWSE_CONTRACT
        - UNAUTHENTICATED
        - FORBIDDEN
        - ORIGIN_NOT_ALLOWED
        - ACCESS_REQUIRED
        - NOT_FOUND
        - IDENTITY_NOT_FOUND
        - QUOTE_NOT_FOUND
        - INVITE_CODE_NOT_FOUND
        - IDEMPOTENCY_KEY_REUSED
        - STATE_CONFLICT
        - INVITE_CODE_EXHAUSTED
        - STALE_CURSOR
        - CURSOR_EXPIRED
        - CURSOR_RESET
        - RECURRING_DEFINITION_CONFLICT
        - EMBEDDED_WALLET_CONFLICT
        - SECRET_UNAVAILABLE
        - ROTATION_IN_PROGRESS
        - TELEMETRY_CONFLICT
        - RFQ_NOT_CANCELLABLE
        - RFQ_NOT_OPEN
        - RFQ_GENERATION_STALE
        - RFQ_GENERATION_IN_FLIGHT
        - QUOTE_EXPIRED
        - QUOTE_CANCELLED
        - QUOTE_REPLACED
        - QUOTE_SIGNER_CHANGED
        - QUOTE_CAPACITY_EXCEEDED
        - CORE_ACCOUNT_NOT_READY
        - CORE_ACCOUNT_ACTIVATION_REQUIRED
        - CORE_EXIT_ABANDONED
        - CORE_MOVE_IN_FLIGHT
        - USERNAME_TAKEN
        - USERNAME_ALREADY_SET
        - INVALID_SIGNATURE
        - WALLET_CONTRACT_UNSUPPORTED
        - WRONG_AUTHORITY
        - KEY_LIMIT_REACHED
        - USERNAME_NOT_ALLOWED
        - RATE_LIMITED
        - CONNECTION_LIMIT
        - RFQ_INTENT_LIMIT
        - QUOTE_EXPOSURE_LIMIT
        - DEPENDENCY_STALE
        - AUTHORIZATION_UNAVAILABLE
        - SOURCE_UNAVAILABLE
        - CONTRACT_UNAVAILABLE
        - MARKET_DATA_UNAVAILABLE
        - BROWSE_UNAVAILABLE
        - FINANCIAL_ACTIONS_DISABLED
        - CORE_EXIT_UNAVAILABLE
        - COLLATERAL_REDUCTION_UNAVAILABLE
        - SPONSORSHIP_UNAVAILABLE
        - CONTRACT_SIGNATURE_OVERLOADED
        - QUOTE_EXPOSURE_STALE
        - COMBO_AUTOMATIC_DISABLED
        - EMBEDDED_WALLET_UNAVAILABLE
        - CONNECTION_DRAIN
      type: string
    FieldViolation:
      properties:
        code:
          description: >-
            REQUIRED: the input is missing. INVALID: it is present but malformed
            or out of range. UNEXPECTED: the input is not accepted here.
          enum:
            - REQUIRED
            - INVALID
            - UNEXPECTED
          type: string
        field:
          description: >-
            JSON pointer into the body, or into the query parameters as one flat
            object for requests without a body, for example /legs/0/stake or
            /limit.
          pattern: ^(/([^~/]|~[01])*)+$
          type: string
      required:
        - field
        - code
      type: object
    Retry:
      description: >-
        NEVER: stop. BACKOFF: resend the same request with the same
        Idempotency-Key after Retry-After. REFRESH: re-read state, then send a
        new request with a new Idempotency-Key.
      enum:
        - NEVER
        - BACKOFF
        - REFRESH
      type: string
    DiscoveryDisplay:
      required:
        - title
        - state
        - category
        - subcategory
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 512
          description: Display title of the question, standalone market or price series.
        state:
          $ref: '#/components/schemas/MarketState'
          description: >-
            Lifecycle of the item: ACTIVE, CLOSED or UNSUPPORTED; for a question
            or price series, ACTIVE when any of its markets is active.
        category:
          $ref: '#/components/schemas/Category'
          description: Display category, or null when the item is not mapped to one.
        subcategory:
          $ref: '#/components/schemas/Subcategory'
          description: >-
            Display subcategory slug within the category; null when unmapped or
            not subdivided.
    RealQuestionId:
      allOf:
        - $ref: '#/components/schemas/UInt32String'
        - not:
            const: '4294967295'
      description: >-
        A real native question identifier; the standalone NO_QUESTION sentinel
        is excluded.
    Market:
      type: object
      required:
        - outcome_id
        - native_question_id
        - title
        - state
        - result
        - metadata_revision
        - eligibility
        - combo
        - deployer
        - category
        - subcategory
        - sides
        - dates
      properties:
        outcome_id:
          $ref: '#/components/schemas/UInt32String'
          description: Hyperliquid outcome ID of the market.
        native_question_id:
          oneOf:
            - $ref: '#/components/schemas/RealQuestionId'
            - type: 'null'
          description: >-
            Hyperliquid question this market belongs to; null for a standalone
            market.
        title:
          type: string
          minLength: 1
          maxLength: 512
          description: Display title derived from the market definition.
        state:
          $ref: '#/components/schemas/MarketState'
          description: >-
            Native lifecycle: ACTIVE while the market is live on Hyperliquid,
            CLOSED once it is no longer live, UNSUPPORTED when Totalis does not
            support it.
        result:
          $ref: '#/components/schemas/Result'
          description: Native result as last read from HyperEVM.
        metadata_revision:
          $ref: '#/components/schemas/PositiveInt64'
          description: >-
            Revision of this market's catalog metadata; it increases when the
            metadata changes.
        eligibility:
          $ref: '#/components/schemas/Eligibility'
          description: >-
            Whether Totalis currently accepts new positions on this market, with
            the reason when it does not.
        combo:
          $ref: '#/components/schemas/Combo'
          description: >-
            Whether a Combo may take this market as a leg, decided at read time.
            Independent of eligibility: a market can trade alone while Combos
            are closed to it.
        deployer:
          $ref: '#/components/schemas/Deployer'
          description: Who deployed the market on Hyperliquid.
        category:
          $ref: '#/components/schemas/Category'
          description: Display category, or null when the market is not mapped to one.
        subcategory:
          $ref: '#/components/schemas/Subcategory'
          description: >-
            Display subcategory slug within the category, for example btc; null
            when unmapped or not subdivided.
        sides:
          type: array
          minItems: 2
          maxItems: 2
          items:
            $ref: '#/components/schemas/MarketSide'
          description: The YES and NO sides, in that order.
        dates:
          oneOf:
            - $ref: '#/components/schemas/MarketDates'
            - type: 'null'
          description: >-
            Display dates and the market class; null when the market has neither
            reviewed timing nor a market class. Never controls availability or
            settlement.
    MarketState:
      type: string
      enum:
        - ACTIVE
        - CLOSED
        - UNSUPPORTED
    Category:
      oneOf:
        - type: string
          enum:
            - Crypto
            - Economics
            - Entertainment
            - Esports
            - Finance
            - Politics
            - Sports
            - Tech
            - Weather
        - type: 'null'
    Subcategory:
      oneOf:
        - type: string
          pattern: ^[a-z0-9]+(?:_[a-z0-9]+)*$
          maxLength: 50
        - type: 'null'
    UInt32String:
      type: string
      pattern: >-
        ^(0|[1-9][0-9]{0,8}|[1-3][0-9]{9}|4[01][0-9]{8}|42[0-8][0-9]{7}|429[0-3][0-9]{6}|4294[0-8][0-9]{5}|42949[0-5][0-9]{4}|429496[0-6][0-9]{3}|4294967[0-1][0-9]{2}|42949672[0-8][0-9]|429496729[0-5])$
      maxLength: 10
    Result:
      oneOf:
        - $ref: '#/components/schemas/ResultUnresolved'
        - $ref: '#/components/schemas/ResultNumeric'
        - $ref: '#/components/schemas/ResultNonnumeric'
        - $ref: '#/components/schemas/ResultUnavailable'
    Eligibility:
      oneOf:
        - $ref: '#/components/schemas/EligibilityEnabled'
        - $ref: '#/components/schemas/EligibilityDisabled'
    Combo:
      oneOf:
        - type: object
          required:
            - state
          properties:
            state:
              type: string
              const: OPEN
              description: 'OPEN: an RFQ may include this market as a leg.'
          title: Open
        - type: object
          required:
            - state
            - reason
            - opens_at
          properties:
            state:
              type: string
              const: CLOSED
              description: >-
                CLOSED: an RFQ that includes this market is refused; reason says
                why.
            reason:
              type: string
              enum:
                - EXCLUDED
                - UNLISTED_DEPLOYER
                - OUTSIDE_WINDOW
              description: >-
                EXCLUDED: Totalis keeps this market out of Combos.
                UNLISTED_DEPLOYER: its deployer is not one Totalis lists.
                OUTSIDE_WINDOW: its event is unknown or more than 7 days away.
            opens_at:
              oneOf:
                - $ref: '#/components/schemas/PositiveInt64'
                - type: 'null'
              description: >-
                When the market enters the 7-day window, in Unix seconds: its
                best-known event time minus 7 days. Set only for OUTSIDE_WINDOW
                with a known event time; approximate.
          title: Closed
    Deployer:
      type: object
      required:
        - name
        - address
      properties:
        name:
          oneOf:
            - type: string
              minLength: 1
              maxLength: 64
            - type: 'null'
          description: >-
            Display name: Hyperliquid for its own markets, the listed deployer's
            name, or null for a deployer Totalis does not list.
        address:
          oneOf:
            - type: string
              pattern: ^0x[0-9a-f]{40}$
            - type: 'null'
          description: Deployer address, lowercase hex; null for Hyperliquid's own markets.
    MarketSide:
      type: object
      required:
        - side
        - coin
        - reference
      properties:
        side:
          $ref: '#/components/schemas/Side'
          description: Which side of the binary market this entry describes, YES or NO.
        coin:
          type: string
          pattern: ^#[0-9]+$
          maxLength: 12
          description: >-
            Hyperliquid coin name of this side, # followed by outcome_id times
            10 plus the side index (0 for YES, 1 for NO).
        reference:
          $ref: '#/components/schemas/Reference'
          description: Current reference price of this side, or why none is available.
    MarketDates:
      type: object
      required:
        - event
        - result_by
        - resolves_after
        - scheduled_event_at
        - observation_ends_at
        - market_class
      description: >-
        Display-only UTC instants from typed Hyperliquid template keywords, and
        the reviewed market class. event, result_by and resolves_after are null
        when already interpolated into the title; scheduled_event_at and
        observation_ends_at are always given when known.
      properties:
        event:
          oneOf:
            - $ref: '#/components/schemas/DateEvent'
            - type: 'null'
          description: >-
            The scheduled event the market is about; null when unknown or
            already in the title.
        result_by:
          oneOf:
            - $ref: '#/components/schemas/PositiveInt64'
            - type: 'null'
          description: >-
            Latest instant at which the source rules fix the result, in Unix
            seconds; null when unknown or already in the title.
        resolves_after:
          oneOf:
            - $ref: '#/components/schemas/PositiveInt64'
            - type: 'null'
          description: >-
            Resolution cannot occur before this instant, in Unix seconds; not a
            settlement promise. Null when unknown or already in the title.
        scheduled_event_at:
          oneOf:
            - $ref: '#/components/schemas/PositiveInt64'
            - type: 'null'
          description: >-
            Scheduled start or decision named by the source rules, in Unix
            seconds; null when the market has none.
        observation_ends_at:
          oneOf:
            - $ref: '#/components/schemas/PositiveInt64'
            - type: 'null'
          description: >-
            End of the observation window named by the source rules, in Unix
            seconds; null when the market has none.
        market_class:
          oneOf:
            - type: string
              minLength: 1
              maxLength: 64
            - type: 'null'
          description: >-
            Reviewed market class, for example PRICE_BINARY, PRICE_TOUCH or
            SPORTS_TOURNAMENT; null when no reviewed rule classifies the market.
    ResultUnresolved:
      type: object
      required:
        - availability
        - result_state
      properties:
        availability:
          type: string
          const: AVAILABLE
          description: 'AVAILABLE: the native result was read successfully.'
        result_state:
          type: string
          const: UNRESOLVED
          description: 'UNRESOLVED: the native market has not recorded a result.'
      title: Unresolved
    ResultNumeric:
      type: object
      required:
        - availability
        - result_state
        - yes_factor_numerator
        - factor_scale
        - recorded_at_block
        - evidence_digest
      properties:
        availability:
          type: string
          const: AVAILABLE
          description: 'AVAILABLE: the native result was read successfully.'
        result_state:
          type: string
          const: NUMERIC_RECORDED
          description: >-
            NUMERIC_RECORDED: the native market recorded a numeric payout for
            the YES side.
        yes_factor_numerator:
          $ref: '#/components/schemas/FactorNumerator'
          description: >-
            YES payout as a fraction of factor_scale; 100000000 pays YES in
            full, 0 pays NO in full.
        factor_scale:
          type: string
          const: '100000000'
          description: Denominator for yes_factor_numerator; always 100000000.
        recorded_at_block:
          $ref: '#/components/schemas/PositiveInt64'
          description: HyperEVM block number of the native read that observed this result.
        evidence_digest:
          $ref: '#/components/schemas/NonZeroBytes32'
          description: >-
            SHA-256 over the chain, contracts, block number and hash, outcome
            and result of the native read that observed this result.
      title: Numeric result
    ResultNonnumeric:
      type: object
      required:
        - availability
        - result_state
        - recorded_at_block
        - evidence_digest
      properties:
        availability:
          type: string
          const: AVAILABLE
          description: 'AVAILABLE: the native result was read successfully.'
        result_state:
          type: string
          const: RECOGNIZED_NONNUMERIC_OBSERVED
          description: >-
            RECOGNIZED_NONNUMERIC_OBSERVED: the native market recorded a
            recognized result that carries no numeric payout factor.
        recorded_at_block:
          $ref: '#/components/schemas/PositiveInt64'
          description: HyperEVM block number of the native read that observed this result.
        evidence_digest:
          $ref: '#/components/schemas/NonZeroBytes32'
          description: >-
            SHA-256 over the chain, contracts, block number and hash, outcome
            and result of the native read that observed this result.
      title: Named result
    ResultUnavailable:
      type: object
      required:
        - availability
        - reason
      properties:
        availability:
          type: string
          const: UNAVAILABLE
          description: 'UNAVAILABLE: the native result could not be read; reason says why.'
        reason:
          type: string
          enum:
            - NOT_QUERIED
            - NATIVE_READ_FAILED
            - RPC_UNAVAILABLE
            - MALFORMED_RETURN
            - PROVIDER_DISAGREEMENT
            - UNSUPPORTED_PROTOCOL_VERSION
          description: >-
            NOT_QUERIED: not read yet; NATIVE_READ_FAILED: the on-chain read
            failed; RPC_UNAVAILABLE: no RPC provider answered; MALFORMED_RETURN:
            the contract returned an unexpected shape; PROVIDER_DISAGREEMENT:
            providers returned different results; UNSUPPORTED_PROTOCOL_VERSION:
            the outcome uses an unsupported protocol version.
      title: Result unavailable
    EligibilityEnabled:
      type: object
      required:
        - state
      properties:
        state:
          type: string
          const: ENABLED
          description: 'ENABLED: Totalis currently accepts new positions on this market.'
      title: Enabled
    EligibilityDisabled:
      type: object
      required:
        - state
        - reason
      properties:
        state:
          type: string
          const: DISABLED
          description: >-
            DISABLED: Totalis does not currently accept new positions on this
            market; reason says why.
        reason:
          type: string
          enum:
            - UNSUPPORTED_PROTOCOL_VERSION
            - UNSUPPORTED_QUOTE_ASSET
            - IDENTITY_CONFLICT
            - DEADLINE_UNAVAILABLE
            - SOURCE_UNQUALIFIED
            - FINANCIAL_PROFILE_DISABLED
            - MARKET_NOT_ACTIVE
            - NATIVE_STATE_UNAVAILABLE
            - NATIVE_STATE_STALE
            - DEADLINE_BUFFER_ENTERED
            - REFERENCE_UNAVAILABLE
            - REFERENCE_STALE
            - SOURCE_GENERATION_MISMATCH
          description: >-
            Why new positions are refused. UNSUPPORTED_PROTOCOL_VERSION,
            UNSUPPORTED_QUOTE_ASSET and IDENTITY_CONFLICT are permanent support
            failures; MARKET_NOT_ACTIVE means the native market is no longer
            live; NATIVE_STATE_UNAVAILABLE, NATIVE_STATE_STALE,
            REFERENCE_UNAVAILABLE, REFERENCE_STALE and
            SOURCE_GENERATION_MISMATCH are temporary data outages;
            FINANCIAL_PROFILE_DISABLED means trading is switched off in this
            environment; SOURCE_UNQUALIFIED marks cached catalog copies that
            carry no live eligibility.
      title: Disabled
    Side:
      type: string
      enum:
        - 'YES'
        - 'NO'
    Reference:
      oneOf:
        - $ref: '#/components/schemas/ReferenceAvailable'
        - $ref: '#/components/schemas/ReferenceUnavailable'
    DateEvent:
      type: object
      required:
        - kind
        - at
      properties:
        kind:
          enum:
            - START
            - DECISION
            - DEADLINE
          description: >-
            Scheduled start, scheduled decision, or deadline named by the source
            rules.
        at:
          $ref: '#/components/schemas/PositiveInt64'
          description: When the event happens, in Unix seconds.
    FactorNumerator:
      type: string
      pattern: ^(0|[1-9][0-9]{0,7}|100000000)$
      maxLength: 9
      description: >-
        Native result numerator in the inclusive range zero through Q =
        100000000.
    NonZeroBytes32:
      allOf:
        - $ref: '#/components/schemas/Bytes32'
        - not:
            const: '0x0000000000000000000000000000000000000000000000000000000000000000'
    ReferenceAvailable:
      type: object
      required:
        - availability
        - quality
        - value
        - scale
        - freshness
        - received_at
      properties:
        availability:
          type: string
          const: AVAILABLE
          description: >-
            AVAILABLE: a qualified reference price has been observed for this
            side.
        quality:
          $ref: '#/components/schemas/Quality'
          description: >-
            How the reference price was derived: BOOK_MID from the order book or
            best bid and offer, MARK_PRICE from the mark price,
            ALL_MIDS_FALLBACK from the all-mids fallback, TRADE from executed
            trades.
        value:
          $ref: '#/components/schemas/IntegerValue'
          description: >-
            Reference price of this side as an integer; divide by scale for the
            probability price between 0 and 1.
        best_bid:
          oneOf:
            - $ref: '#/components/schemas/IntegerValue'
            - type: 'null'
          description: Best bid at scale when the feed carries a book, otherwise null.
        best_ask:
          oneOf:
            - $ref: '#/components/schemas/IntegerValue'
            - type: 'null'
          description: Best ask at scale when the feed carries a book, otherwise null.
        last_trade:
          oneOf:
            - $ref: '#/components/schemas/IntegerValue'
            - type: 'null'
          description: >-
            Price of the latest book execution on this side at scale, kept
            across restarts; a fill prints on both sides at prices summing to
            scale. Null when no trade is known.
        last_trade_at:
          oneOf:
            - $ref: '#/components/schemas/CommonTimestamp'
            - type: 'null'
          description: >-
            Hyperliquid time of last_trade, RFC 3339 UTC; null exactly when
            last_trade is null.
        chance:
          oneOf:
            - $ref: '#/components/schemas/IntegerValue'
            - type: 'null'
          description: >-
            Crowd probability at scale: the book midpoint when best_ask -
            best_bid is at most 10% of scale, last_trade when the spread is at
            most 50% and last_trade lies within [best_bid, best_ask], otherwise
            null. The midpoint rounds half to even, so YES and NO chances sum to
            scale. chance_basis says which applied.
        chance_basis:
          oneOf:
            - type: string
              enum:
                - MID
                - LAST_TRADE
            - type: 'null'
          description: >-
            Which input chance is: MID, the book midpoint, so a midpoint history
            describes it; LAST_TRADE, last_trade on a wide book, where midpoint
            history does not. Null exactly when chance is null.
        mark:
          oneOf:
            - $ref: '#/components/schemas/IntegerValue'
            - type: 'null'
          description: >-
            Value of one held share at scale: chance when known, else best_bid,
            else 0 when only asks exist; null when no book is known. Not a price
            a trade receives.
        scale:
          $ref: '#/components/schemas/Scale'
          description: >-
            Divisor for value, best_bid, best_ask, last_trade, chance and mark;
            currently 1000000000000000000 (18 decimals).
        freshness:
          type: string
          enum:
            - FRESH
            - STALE
          description: FRESH when received within the last 15 seconds, otherwise STALE.
        received_at:
          $ref: '#/components/schemas/CommonTimestamp'
          description: When Totalis received the observation, RFC 3339 UTC.
      title: Available
    ReferenceUnavailable:
      type: object
      required:
        - availability
        - reason
        - freshness
        - received_at
      properties:
        availability:
          type: string
          const: UNAVAILABLE
          description: >-
            UNAVAILABLE: no qualified reference price exists for this side;
            reason says why.
        reason:
          type: string
          enum:
            - NOT_OBSERVED
            - AMBIGUOUS_SOURCE
            - STALE_GENERATION
            - UNSUPPORTED_MARKET
            - SOURCE_UNQUALIFIED
          description: >-
            NOT_OBSERVED: no price seen yet; AMBIGUOUS_SOURCE: the source gave
            conflicting values; STALE_GENERATION: the last price belongs to an
            older feed generation; UNSUPPORTED_MARKET: the market is not
            supported; SOURCE_UNQUALIFIED: the copy carries no live price, as in
            cached catalog pages and finished markets that left the catalog.
        freshness:
          type: string
          const: UNKNOWN
          description: Always UNKNOWN while no price is available.
        received_at:
          $ref: '#/components/schemas/CommonTimestamp'
          description: >-
            Last update time of the market record this state was derived from,
            RFC 3339 UTC; 1970-01-01T00:00:00Z in cached catalog copies.
      title: Reference unavailable
    Bytes32:
      type: string
      pattern: ^0x[0-9a-f]{64}$
    Quality:
      type: string
      enum:
        - BOOK_MID
        - MARK_PRICE
        - ALL_MIDS_FALLBACK
        - TRADE
    IntegerValue:
      type: string
      pattern: ^(0|[1-9][0-9]*)$
      maxLength: 78
      format: uint256-decimal
      description: Nonnegative integer value paired with an explicit positive scale.
    CommonTimestamp:
      type: string
      format: date-time
      pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}([.][0-9]{1,9})?Z$
      maxLength: 30
    Scale:
      type: string
      pattern: ^[1-9][0-9]*$
      maxLength: 78
      format: uint256-decimal
      description: Positive base-10 scale for an integer value.
  headers:
    RetryAfter:
      description: Seconds to wait before resending the same request
      schema:
        type: integer
        minimum: 1

````

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