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

# Get a trader's settled picks

> Settled picks (won, lost or void), newest opened first, drawn from the trader's 100 most recent picks that the public can see. Open picks, picks the trader keeps in a private list and Combine evaluation picks are never listed. For players, a settled parlay leg stays hidden while another leg of that parlay is open. Picks closed early by selling are not settlements, so they are left out too. No exchange ticker, market title, entry price or live price appears: marketLabel is Arena's own label from the universal ticker.



## OpenAPI

````yaml /openapi.json get /traders/{traderId}/picks
openapi: 3.1.0
info:
  title: Arena API
  version: 1.7.0
  summary: >-
    Arena Predictions paper trading with an API key: read, and place paper
    orders with trade:write. Arena-owned data only.
  description: >-
    Arena Predictions (arena-predictions.com) is a sandbox for paper trading
    prediction markets at live prices. Every endpoint here serves Arena's
    sandbox, where every trade is a paper trade (mode "paper"); routing to live
    trading is coming. Keys are read-only and reach Arena-owned data only: the
    key's own identity and account, the leaderboards and published trader
    records with their resets and settled picks. Keys are managed with the
    signed-in browser session, never with a key. No exchange ticker, market
    title, entry price or venue price appears in any keyed response; the owner's
    own portfolio carries the owner's own paper numbers (a resting order's
    limitCents, a position's costDollars and contracts). Balances carry over:
    every account starts with 100,000 paper dollars, and a reset (at most one
    every 30 days, shown on a public profile) starts a new run. 1.2.0: seasons
    removed (no season field anywhere), leaderboard windows and kinds, trader
    resets, GET /account. 1.3.0: accounts are private by default. A private
    trader answers private: true with every P&L and rank null (resets and busts
    0) and an empty pick list; a public trader whose earlier trades are still
    hidden has numbersShown: false and no P&L or rank. The key owner reads their
    own picks (each with placedPrivate and shown) and their own eval rows (GET
    /me/eval) with portfolio:read. No key can make an account public. 1.4.0:
    keys are managed by a person's session, on the website or as a signed-in
    CLI's session token (arena keys), never by a key; keys rotate with a grace
    period; every keyed answer carries the plan and its counts (RateLimit-*,
    Arena-Quota-*, Arena-Plan) and GET /usage says where the account stands; a
    new scope, markets:read, reads instruments, games and quotes; GET /portfolio
    and /portfolio/trades read the owner's positions, orders and trades. Venue
    references and venue prices are served only while the venue-data switch is
    on (it ships off): until then the quotes routes answer 403 venue_data_off
    and nothing keyed names a ticker or a venue's price. 1.5.0: GET /eval, the
    public eval board (records:read), each row with 95% intervals clustered by
    game. 1.6.0: GET /traders/{traderId}/track-record, a trader's Ed25519-signed
    90-day record exactly as Arena signed it (records:read; it names Kalshi
    series inside its signed bytes, so it is served only while the venue-data
    switch is on), and tiedWithAbove on each eval row (null while this row's or
    the row above's interval is unknown). 1.7.0: a key created with trade:write
    (only when asked for by name: the Settings checkbox, arena keys create
    --trade, or scopes in the body) places paper orders with POST
    /portfolio/orders and cancels them with DELETE /portfolio/orders/{orderId},
    at Kalshi's paths. Market and limit orders, buys by instrument or ticker and
    sells of a whole position, each with an idempotencyKey: the same key again
    answers the stored order with replayed: true and places nothing. Hard trade
    limits are always enforced: per key 10 new orders a minute and 50 a day, and
    20 sells and cancels a minute; per account, across every key and connected
    app, 20 new orders a minute, 100 a day, and 40 sells and cancels a minute.
    The keyless website routes (/api/quotes/{instrumentId}, /api/quotes/batch,
    /api/gaps, /api/gaps/{instrumentId}) are described in their own document,
    /openapi-public.json.
  termsOfService: https://arena-predictions.com/terms
  contact:
    name: Arena
    email: support@zbgcllc.com
    url: https://arena-predictions.com/support
servers:
  - url: https://arena-predictions.com/api/v1
    description: >-
      The Arena API. Every account on it trades in the sandbox (paper trading);
      routing to live trading is coming.
security: []
tags:
  - name: Status
    description: Is the API up.
  - name: Identity
    description: Whose account a key acts for, and what it may do.
  - name: API keys
    description: >-
      Create, list, rotate and revoke keys, at the same path Kalshi uses. A
      person's session only (the website, or a signed-in CLI's session token): a
      key can never mint, rotate or revoke a key.
  - name: Records
    description: >-
      Arena's public records: the leaderboards, trader records with their
      resets, and settled picks. Scope records:read. Arena-owned data only: no
      exchange tickers, market titles, entry prices or live prices. Points equal
      paper dollars 1:1.
  - name: Portfolio
    description: >-
      The key owner's own paper account, positions, orders and trades. Scope
      portfolio:read. Arena-owned data only while the venue-data switch is off.
  - name: Markets
    description: >-
      Arena's instruments and games, and venue quotes. Scope markets:read. Venue
      references and prices only while the venue-data switch is on.
  - name: Trading
    description: >-
      Place and cancel paper orders for the key owner. Scope trade:write, which
      a key carries only when its creator asked for it. Paper only: nothing is
      sent to any venue.
  - name: Usage
    description: >-
      Where the key's account stands against its plan. Any valid key; never
      counted.
externalDocs:
  description: Arena API docs
  url: https://docs.arena-predictions.com
paths:
  /traders/{traderId}/picks:
    get:
      tags:
        - Records
      summary: Get a trader's settled picks
      description: >-
        Settled picks (won, lost or void), newest opened first, drawn from the
        trader's 100 most recent picks that the public can see. Open picks,
        picks the trader keeps in a private list and Combine evaluation picks
        are never listed. For players, a settled parlay leg stays hidden while
        another leg of that parlay is open. Picks closed early by selling are
        not settlements, so they are left out too. No exchange ticker, market
        title, entry price or live price appears: marketLabel is Arena's own
        label from the universal ticker.
      operationId: getTraderPicks
      parameters:
        - name: traderId
          in: path
          required: true
          schema:
            type: string
            minLength: 2
          description: >-
            A trader's user id (uuid) or display name. Names match exactly,
            ignoring case.
          examples:
            id:
              value: 4d2f8c1e-9b0a-4c6e-8f21-3a7b5d9e0c12
            name:
              value: sharp_joe
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
          description: >-
            Rows per page, 1 to 100. Default 20. Anything else is a 400
            invalid_request.
        - name: cursor
          in: query
          required: false
          schema:
            type: string
          description: The nextCursor of the previous page. Opaque.
      responses:
        '200':
          description: One page of settled picks.
          headers:
            Cache-Control:
              description: private, max-age=30
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PickList'
              example:
                picks:
                  - pickId: 6f1c2a3b-4d5e-4f60-8a71-b2c3d4e5f607
                    side: 'yes'
                    result: won
                    stakeDollars: null
                    pnlDollars: 3.7
                    openedAt: '2026-09-21T16:58:02Z'
                    closedAt: '2026-09-21T20:31:44Z'
                    instrumentId: ins_0123456789AB
                    marketLabel: KC -3.5
                  - pickId: 7a1c2a3b-4d5e-4f60-8a71-b2c3d4e5f608
                    side: 'no'
                    result: lost
                    stakeDollars: 6.3
                    pnlDollars: -6.3
                    openedAt: '2026-09-20T01:12:40Z'
                    closedAt: '2026-09-20T04:05:09Z'
                    instrumentId: null
                    marketLabel: null
                    marketLabelReason: no_arena_label
                nextCursor: null
                mode: paper
        '400':
          description: >-
            invalid_request: limit is not an integer from 1 to 100, or cursor is
            malformed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: >-
            Missing, malformed, unknown, revoked or expired key. Carries a
            WWW-Authenticate: Bearer challenge.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: 'insufficient_scope: the key does not carry records:read.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: 'trader_not_found: no trader has that id or display name.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            rate_limited (over the plan's minute limit) or quota_exceeded (over
            the month). Only while the limits are enforced; until then requests
            are counted and the headers set, and nothing is refused.
            error.retryAfterSeconds equals Retry-After.
          headers:
            Retry-After:
              $ref: '#/components/headers/Retry-After'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
            Arena-Quota-Limit:
              $ref: '#/components/headers/Arena-Quota-Limit'
            Arena-Quota-Remaining:
              $ref: '#/components/headers/Arena-Quota-Remaining'
            Arena-Quota-Reset:
              $ref: '#/components/headers/Arena-Quota-Reset'
            Arena-Plan:
              $ref: '#/components/headers/Arena-Plan'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: >-
            The key could not be verified, or the records could not be read,
            right now. Retry after the Retry-After seconds.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - apiKey:
            - records:read
components:
  schemas:
    PickList:
      type: object
      required:
        - picks
        - nextCursor
        - mode
      properties:
        picks:
          type: array
          items:
            $ref: '#/components/schemas/Pick'
        nextCursor:
          type:
            - string
            - 'null'
          description: Pass back as cursor for the next page. Null on the last page.
        private:
          type: boolean
          const: true
          description: Present for a private account, whose pick list is always empty.
        note:
          type: string
        mode:
          type: string
          const: paper
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Stable machine token. Branch on this, never on message.
              enum:
                - invalid_request
                - unauthorized
                - invalid_token
                - insufficient_scope
                - guest_account
                - scope_not_available
                - key_limit_reached
                - key_not_found
                - trader_not_found
                - account_not_found
                - route_not_found
                - method_not_allowed
                - internal_error
                - session_required
                - key_creation_limited
                - rate_limited
                - quota_exceeded
                - venue_data_off
                - instrument_not_found
                - game_not_found
                - membership_required
                - trading_off
                - idempotency_key_reused
                - insufficient_balance
                - market_not_found
                - no_tradable_listing
                - market_not_open
                - market_resolved
                - no_liquidity
                - price_moved
                - trade_not_found
                - already_closed
                - order_not_found
            message:
              type: string
              description: Human sentence. May change.
            retryAfterSeconds:
              type: integer
              minimum: 1
              description: 'On every 429: the same number as the Retry-After header.'
    Pick:
      type: object
      required:
        - pickId
        - side
        - result
        - stakeDollars
        - pnlDollars
        - openedAt
        - closedAt
        - instrumentId
        - marketLabel
      properties:
        pickId:
          type: string
          format: uuid
        side:
          type: string
          enum:
            - 'yes'
            - 'no'
          description: >-
            The side the pick holds. With an instrumentId it is the side of that
            instrument: yes means the outcome marketLabel names happens. Without
            one it is the side of the underlying market, which a key does not
            name.
        result:
          type: string
          enum:
            - won
            - lost
            - void
          description: void is a push or a cancelled market.
        stakeDollars:
          type:
            - number
            - 'null'
          description: >-
            The stake, where the result alone fixes it: a lost pick loses its
            whole stake. Null for won and void picks, because next to the P&L a
            won pick's stake would give away the entry price, which a key does
            not carry.
        pnlDollars:
          type: number
          description: Profit or loss in paper dollars. 0 for a void pick.
        openedAt:
          type: string
          format: date-time
          description: RFC 3339, UTC, second precision.
        closedAt:
          type:
            - string
            - 'null'
          format: date-time
          description: RFC 3339, UTC, second precision.
        instrumentId:
          type:
            - string
            - 'null'
          pattern: ^ins_[0-9A-HJKMNP-TV-Z]{12}$
          description: >-
            Arena's universal ticker id when the pick's market maps to an Arena
            instrument, else null. Opaque: store it, never parse it.
        marketLabel:
          type:
            - string
            - 'null'
          description: >-
            Arena's own label for the instrument's YES outcome, built from team
            codes: KC ML, KC -3.5 (KC win by more than 3.5), Over 44.5. Null
            when Arena has not labelled the market. Today Arena labels NFL
            full-game moneylines, spreads and totals.
        marketLabelReason:
          type: string
          enum:
            - no_arena_label
          description: Present only when marketLabel is null.
        placedPrivate:
          type: boolean
          description: >-
            Only on the key owner's own picks (portfolio:read): the pick was
            placed while the account was private.
        shown:
          type: boolean
          description: >-
            Only on the key owner's own picks: others can see this pick right
            now.
  headers:
    Retry-After:
      description: Seconds to wait before trying again.
      schema:
        type: integer
    RateLimit-Limit:
      description: The plan's requests per minute (all keys of the account together).
      schema:
        type: integer
    RateLimit-Remaining:
      description: Requests left in this minute.
      schema:
        type: integer
    RateLimit-Reset:
      description: Seconds until the minute window resets.
      schema:
        type: integer
    Arena-Quota-Limit:
      description: The plan's requests per month (UTC).
      schema:
        type: integer
    Arena-Quota-Remaining:
      description: Requests left this month.
      schema:
        type: integer
    Arena-Quota-Reset:
      description: Seconds until 00:00 UTC on the 1st.
      schema:
        type: integer
    Arena-Plan:
      description: none (signed in, without a plan), basic, builder, desk or enterprise.
      schema:
        type: string
    X-Request-Id:
      description: Quote it when asking for help.
      schema:
        type: string
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      bearerFormat: arena_sk_ + 43 base64url characters
      description: >-
        Authorization: Bearer arena_sk_... (the x-arena-key header is accepted
        too). Keys are made in Settings
        (https://arena-predictions.com/settings#api-keys) or with `arena keys
        create`, shown once, stored hashed.

````