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

# Get the futures catalog

> Returns static reference data, one row per futures product root: the listing exchange, tick size and tick value, the dollar multiplier, the roll cycle, and — for products whose roll the engine does not approximate — the calendar months that list contracts, so an order ticket can offer the month picker such an order needs. Fetch once and keep it. A root the exchange quotes in thirty-seconds carries `priceFraction` as well, the denominator and sub-fraction its prices are written and traded in, so a ticket reads that fact rather than deriving one from the tick. These are the facts the trdrs ticket itself sizes, snaps and prices with. Crypto instruments are not here: their grid comes from each venue and is resolved client-side. No per-user state, no secrets.



## OpenAPI

````yaml /partner-platform/openapi.json get /api/instruments
openapi: 3.1.0
info:
  title: trdrs Engine API
  version: 1.1.0
  description: >-
    ## API Reference


    This is the served OpenAPI contract for the trdrs engine: market data,
    trading and account

    routes for your firm's traders, trdrs Connect account-registration handoff,
    and preview

    challenge routes.


    See Quick Start for the first integration path: key setup, market config,
    chart data, Connect

    account registrations, idempotency, stream reconnects, and conformance.


    See Overview and API Standards for the cross-cutting contract rules.
servers:
  - url: https://app.trdrs.co
    description: Production
  - url: /
    description: This engine
security: []
tags:
  - name: Market data
    description: >-
      Symbol search and resolution, OHLCV history, quote snapshots, the server
      clock, and the live bar stream. Crypto rides each venue’s public feed;
      futures stream from the caller’s own connected Rithmic account. With none
      connected, futures requests answer 503 `feed_requires_connection`.
  - name: News
    description: >-
      Aggregated market news and the economic calendar, from licensed/open
      sources, keyword-tagged with futures roots at ingest. Platform-wide
      content (nothing per-user), admitted exactly like Market data: a licensed
      origin, a session, or a firm API key. Headlines page by published time,
      scope by instrument root, and stream live over SSE; thumbnails serve
      through the image proxy.
  - name: Trading
    description: >-
      The money surface: entries, exits, replaces, cancels, and position/account
      flattening. Every order-placing call uses `clientOrderId` as its
      idempotency key.
  - name: Account
    description: >-
      Reading a connected account. You do not create trading accounts here: a
      trader connects their own broker account (or creates a free demo account)
      in the app, and firms create evaluation accounts through the Partner API
      (Firm accounts → Create evaluation accounts) or register venue accounts
      through Connect (Create an account registration). Account state and the
      durable ledgers: balances, positions, working orders, fills, P&L history,
      and the live account stream.
  - name: Connect
    description: >-
      trdrs Connect account registration, for partner firms. Register an account
      you issued on your own venue — a pending account registration — with the
      trader’s sign-in email, optionally the venue account id and the login name
      your venue issued. The trader finds it waiting in the connect flow the
      moment they sign in with that email: the connect step is pre-filled with
      everything except the credential, which the trader always enters
      themselves. A registration never transmits a password and never grants
      access to anything before the trader’s own login succeeds. These routes
      answer a partner-scoped key only; a firm API key or a user session gets
      401. Registrations expire after 30 days; re-registering the same email +
      account refreshes the expiry instead of duplicating. The end-to-end flow
      guide is **[Quick Start](/docs/guides/quick-start)**.
  - name: Firm accounts
    description: >-
      Evaluation accounts your firm issues on the trdrs venue, through your
      partner key — the other half of account setup. Connect registrations hand
      off accounts that exist on your venue; these routes create and manage
      accounts on ours: the trader trades them on trdrs, and your firm owns the
      lifecycle. Every route is scoped to accounts your firm created through
      this API — an account the same trader opened themselves is invisible and
      untouchable here, by construction. Creation is batched with per-item
      results, and every write carries your own `referenceId`, so a crashed
      pipeline retries safely. Served when the deployment runs the prop engine;
      without it, every route in this group answers `404`.
  - name: Webhooks
    description: >-
      The outbound event bus: register an https endpoint and the platform pushes
      events to it instead of your back office polling us. Every delivery is
      signed (`trdrs-signature: t=<unix>,v1=<hmac-sha256>` over
      `${t}.${rawBody}`) so you can prove it came from us and is fresh, and
      every delivery is durable — a failed attempt is retried with backoff for
      about nine hours and the whole log is readable, so an endpoint that was
      down is a delay rather than a lost event. Serves brokers and prop firms
      alike: the account-registration (`registration.*`) events fire wherever
      Connect does, and the account events fire where the prop engine runs.
  - name: Challenges
    description: >-
      The prop evaluation surface: challenge programs and a trader’s own
      enrollments. **Preview: the one group on this page outside the
      additive-only guarantee** (the pre-contract v1 scaffold; the Phase-1
      rebuild will change these shapes; see Stability). **Cookie-authenticated,
      not key-authenticated**, and served only when the engine runs with
      `CHALLENGES_ENABLED`; without that flag the bundle is absent and every
      route below returns `404`. The firm-console/admin half of this surface is
      deliberately not documented here. It is back office, not licensed surface.
paths:
  /api/instruments:
    get:
      tags:
        - Market data
      summary: Get the futures catalog
      description: >-
        Returns static reference data, one row per futures product root: the
        listing exchange, tick size and tick value, the dollar multiplier, the
        roll cycle, and — for products whose roll the engine does not
        approximate — the calendar months that list contracts, so an order
        ticket can offer the month picker such an order needs. Fetch once and
        keep it. A root the exchange quotes in thirty-seconds carries
        `priceFraction` as well, the denominator and sub-fraction its prices are
        written and traded in, so a ticket reads that fact rather than deriving
        one from the tick. These are the facts the trdrs ticket itself sizes,
        snaps and prices with. Crypto instruments are not here: their grid comes
        from each venue and is resolved client-side. No per-user state, no
        secrets.
      responses:
        '200':
          description: The contract catalog (InstrumentsResponse)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InstrumentsResponse'
        '401':
          description: Missing/unknown/revoked credential
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - tenantKey: []
      x-codeSamples:
        - lang: javascript
          label: TypeScript
          source: |-
            const res = await fetch('https://app.trdrs.co/api/instruments', {
              headers: { Authorization: `Bearer ${process.env.TRDRS_API_KEY}` },
            })
            const data = await res.json()
        - lang: shell
          label: cURL
          source: |-
            curl 'https://app.trdrs.co/api/instruments' \
              -H "Authorization: Bearer $TRDRS_API_KEY"
components:
  schemas:
    InstrumentsResponse:
      type: object
      description: >-
        InstrumentsResponse. The futures contract catalog this engine trades,
        one row per product root.
      properties:
        instruments:
          type: array
          items:
            $ref: '#/components/schemas/ContractSpec'
      required:
        - instruments
      example:
        instruments:
          - root: ES
            name: E-mini S&P 500
            exchange: CME
            tickSize: 0.25
            tickValue: 12.5
            multiplier: 50
            cycle: quarterly
          - root: CL
            name: Crude Oil
            exchange: NYMEX
            tickSize: 0.01
            tickValue: 10
            multiplier: 1000
            cycle: null
            months:
              - 1
              - 2
              - 3
              - 4
              - 5
              - 6
              - 7
              - 8
              - 9
              - 10
              - 11
              - 12
          - root: ZN
            name: 10-Year T-Note
            exchange: CBOT
            tickSize: 0.015625
            tickValue: 15.625
            multiplier: 1000
            cycle: quarterly
            fractionalPrice: true
            priceFraction:
              denominator: 64
              subFraction: 2
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
      required:
        - error
      example:
        error: invalid_instrument
    ContractSpec:
      type: object
      description: >-
        ContractSpec. One futures product: its listing exchange, tick size and
        tick value, the dollar multiplier, its roll cycle, and the calendar
        months it lists when the roll is not modelled. Static reference data —
        the facts an order ticket sizes and snaps against.
      properties:
        root:
          type: string
          description: Product root, e.g. `ES`.
        name:
          type: string
        exchange:
          type: string
          description: Listing exchange in canonical form, e.g. `CME`.
        tickSize:
          type: number
        tickValue:
          type: number
          description: Dollar value of one tick for one contract.
        multiplier:
          type: number
          description: >-
            Dollar value of a 1.0 price move for one contract (tickValue /
            tickSize).
        cycle:
          type:
            - string
            - 'null'
          enum:
            - quarterly
            - null
          description: >-
            `quarterly` = the front month resolves automatically
            (Mar/Jun/Sep/Dec). `null` = a product-specific roll the engine does
            not approximate, so an order must name its contract month.
        months:
          type: array
          items:
            type: integer
            minimum: 1
            maximum: 12
          description: >-
            The calendar months (1-12) a `cycle: null` product lists contracts
            in. Absent on quarterly products.
        fractionalPrice:
          type: boolean
          description: >-
            True when the exchange quotes the product as counted thirty-seconds
            of a point rather than in decimals (the CBOT Treasury convention).
            It is a quotation fact independent of tickSize, and drives the
            fractional price format on /api/market/symbol-info. Absent means
            decimal.
        priceFraction:
          $ref: '#/components/schemas/PriceFraction'
          description: >-
            The executable counted-fraction facts of a root the exchange quotes
            in thirty-seconds, present exactly where fractionalPrice and
            tickSize together name one of the three writings. Absent means the
            product is priced in decimals, so size and snap against tickSize.
            Read it rather than deriving a denominator from the tick.
        nominalInitialMargin:
          type: number
          description: >-
            Nominal per-contract initial margin in dollars — a maintained
            estimate for backtests, never a live money figure.
        nominalDayMargin:
          type: number
          description: >-
            Nominal per-contract day-trading margin in dollars — the same
            estimate posture.
      required:
        - root
        - name
        - exchange
        - tickSize
        - tickValue
        - multiplier
        - cycle
    PriceFraction:
      type: object
      description: >-
        PriceFraction. The counted-fraction facts of a product the exchange
        quotes in thirty-seconds, in executable form: denominator is the number
        of parts one point divides into, and subFraction says into how many
        parts one of those divides again where the writing divides it. A 1/32
        tick states { denominator: 32 }, a 1/64 tick { denominator: 64,
        subFraction: 2 }, a 1/128 tick { denominator: 128, subFraction: 4 }.
        These are the only three writings; a product quoted in decimals carries
        no PriceFraction at all.
      properties:
        denominator:
          type: integer
          enum:
            - 32
            - 64
            - 128
          description: Parts one point divides into
        subFraction:
          type: integer
          enum:
            - 2
            - 4
          description: >-
            Parts one of those divides again: 2 is halves of a thirty-second, 4
            is quarters. Absent for a whole thirty-second.
      required:
        - denominator
  securitySchemes:
    tenantKey:
      type: http
      scheme: bearer
      description: >-
        Your firm’s API key (the API calls this the `tenant` key; `trdrs_sk_…`),
        server-to-server only.

````