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

# Get claimable positions

> Settled positions awaiting on-chain claim. `refund_reason`
distinguishes Resolved-winner redemptions (`resolved_winner`)
from Voided-market refunds (`voided_refund`) — the on-chain
`redeemPositions` call is identical in either case. Submit it
as an ERC-4337 UserOperation through the XO bundler (Redeem
positions guide).




## OpenAPI

````yaml /api-reference/openapi.yaml get /claimable
openapi: 3.0.3
info:
  title: XO Orderbook API
  description: |
    Public REST surface of the XO CLOB API.

    XO mainnet chain id is `3223`. The EIP-712 order domain is
    `XO Market CLOB` with `verifyingContract` set to the
    [CTF Exchange](/) address. See
    [Smart accounts](../guides/smart-accounts) for the smart-account
    identity model and ERC-1271 order signing.

    Wire conventions:
      * Prices are trimmed decimal strings (e.g. `"0.5"`, `"0.555"`).
      * Sizes are decimal-string integers in human shares.
      * Timestamps in trade and book responses are stringified Unix
        seconds / milliseconds (the SDK uses `TimestampSeconds<String>`
        / `TimestampMilliSeconds<String>`).
      * Token IDs are decimal U256 strings; condition IDs are
        `0x`-prefixed 32-byte hex.
  version: 1.0.0
  contact:
    name: XO Market
    url: https://beta.xo.market
servers:
  - url: https://orderbooks.xo.market
    description: Mainnet (XO chain id 3223)
security: []
tags:
  - name: Authentication
    description: >-
      Create and manage API keys. The L1 ClobAuth EIP-712 flow mints HMAC
      credentials that authenticate every other private request.
  - name: Market Data
    description: >-
      Public reads for books, prices, midpoints, spreads, last trades, and price
      history. Also includes server time and per-token configuration.
  - name: Markets
    description: >-
      Discovery for tradable markets, including pagination and SDK-compatible
      simplified shapes.
  - name: Trade
    description: Place, cancel, and inspect orders and trades for the authenticated maker.
  - name: Account
    description: Maker balance, allowance, positions, and claimable settled positions.
paths:
  /claimable:
    get:
      tags:
        - Account
      summary: Get claimable positions
      description: |
        Settled positions awaiting on-chain claim. `refund_reason`
        distinguishes Resolved-winner redemptions (`resolved_winner`)
        from Voided-market refunds (`voided_refund`) — the on-chain
        `redeemPositions` call is identical in either case. Submit it
        as an ERC-4337 UserOperation through the XO bundler (Redeem
        positions guide).
      parameters:
        - in: query
          name: address
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                required:
                  - address
                  - claimable
                properties:
                  address:
                    type: string
                  claimable:
                    type: array
                    items:
                      $ref: '#/components/schemas/ClaimableEntry'
              examples:
                resolved_winner:
                  summary: >-
                    caller holds winning YES from a Resolved market
                    (illustrative)
                  value:
                    address: '0xCAFE000000000000000000000000000000000A11'
                    claimable:
                      - market_id: >-
                          0x39a12d52b63969654926e095ddd96f5c459112714da03edca769aa58173c78fb
                        outcome: 'Yes'
                        token_id: >-
                          26516164265702901957933644848127860370782874751279270726689263951695181556943
                        balance: '50000000'
                        refund_reason: resolved_winner
                voided_refund:
                  summary: >-
                    caller holds both sides of a Voided market (refunded
                    pro-rata)
                  value:
                    address: '0xCAFE000000000000000000000000000000000A11'
                    claimable:
                      - market_id: >-
                          0x39a12d52b63969654926e095ddd96f5c459112714da03edca769aa58173c78fb
                        outcome: 'Yes'
                        token_id: >-
                          26516164265702901957933644848127860370782874751279270726689263951695181556943
                        balance: '50000000'
                        refund_reason: voided_refund
                      - market_id: >-
                          0x39a12d52b63969654926e095ddd96f5c459112714da03edca769aa58173c78fb
                        outcome: 'No'
                        token_id: >-
                          13730057904096984444199595880113152612639388204530324084054099203558669491245
                        balance: '50000000'
                        refund_reason: voided_refund
                nothing_claimable:
                  summary: caller has no settled positions
                  value:
                    address: '0xCAFE000000000000000000000000000000000A11'
                    claimable: []
      x-codeSamples:
        - lang: Rust
          label: xo-orderbook-client-rs
          source: >
            // XO-only endpoint — no dedicated SDK method. Hit it directly via
            reqwest.

            use serde::Deserialize;


            #[derive(Deserialize)]

            struct ClaimableResponse {
                address: String,
                claimable: Vec<ClaimableEntry>,
            }

            #[derive(Deserialize)]

            struct ClaimableEntry {
                market_id: String,
                outcome: String,
                token_id: String,
                balance: String,
                refund_reason: String,  // "resolved_winner" | "voided_refund"
            }


            let resp: ClaimableResponse = reqwest::Client::new()
                .get(format!("{}/claimable", client.host()))
                .query(&[("address", "0xCAFE000000000000000000000000000000000A11")])
                .send().await?
                .json().await?;
components:
  schemas:
    ClaimableEntry:
      type: object
      required:
        - market_id
        - outcome
        - token_id
        - balance
        - refund_reason
      properties:
        market_id:
          type: string
          description: conditionId of the resolved/voided market.
        outcome:
          type: string
          enum:
            - 'Yes'
            - 'No'
        token_id:
          type: string
          description: Decimal U256 token id of the claimable side.
        balance:
          type: string
          description: |
            Redeemable balance in canonical 6-decimal micro-share units,
            decimal string.
        refund_reason:
          type: string
          enum:
            - resolved_winner
            - voided_refund
          description: |
            `resolved_winner` — market resolved with a definite winner;
            this side won. `voided_refund` — market was invalidated;
            on-chain `redeemPositions` refunds pro-rata regardless of
            outcome. The frontend uses this to render distinct UI.

````