> ## 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.

# Set the risk controls (deprecated)

> Deprecated: removed after 2026-10-30. A trader sets no risk controls of their own now. The body is not read and nothing is stored: the call answers as `GET /api/risk` does, with every control off.

Required key: Trading API key. A Connect app's backend can also send it with the app's API key, and a venue's backend with its Venue key, which carries `trader:trade`, each naming one of its own traders in `x-trdrs-trader`: it then runs on that trader's own accounts.



## OpenAPI

````yaml /api/openapi.json put /api/risk
openapi: 3.1.0
info:
  title: trdrs Engine API
  version: 1.1.0
  description: >-
    ## API Reference


    Every route the trdrs engine serves, with what to send and what comes back.
    It covers market

    data and news, trading and account state for a trader's own software, the
    Connect API a Connect

    app's backend calls and the Connect dashboard's routes, Connect
    pre-registration, the statements

    that carry a Connect account between environments, the venue routes a prop
    firm or brokerage runs its

    accounts through, and a trader's own challenges.


    Start with the Quickstart for your first call. The API standards hold the
    rules every route

    shares: keys, errors, rate limits, idempotency, paging and streaming.
servers:
  - url: https://app.trdrs.co
    description: Production
  - url: /
    description: This engine
security: []
tags:
  - name: Venue platform preview
    description: >-
      Run your venue: its providers, instruments, conditions, groups, routes,
      stages, venue rules, keys, accounts, usage, balance receipts and webhooks.
      These routes are in preview. They are served on the sandbox to every
      venue, and production access is arranged when a venue qualifies. Every
      route here under `/api/venues/` takes a Venue key. The back office reaches
      the same routes under `/api/back-office/` with a verified owner’s session,
      because the Venue key stays on your server, and both run the same checks.
      The team’s routes under `/api/organizations` serve the back office and the
      Connect dashboard alike, since one organization can run venues and Connect
      apps with one team.
  - name: Market data
    description: >-
      Search and look up symbols, read price history and quotes, check the
      server clock, and stream live bars. Crypto prices come from each
      provider’s public feed. Futures prices are licensed to each user and
      stream only from that trader’s own futures source: a login on their
      venue’s production Rithmic system, under their own market data
      subscription. A Rithmic Test login carries no market data. Futures reach
      the trader’s own signed-in session, and a venue’s or Connect app’s backend
      acting for its trader. A Trading API key reads crypto market data only.
      Without a source, a futures request answers 503 `feed_requires_connection`
      and the symbol search lists no futures.
  - name: News
    description: >-
      Market news and the economic calendar, from licensed and open sources,
      tagged with futures roots as they arrive. The content is the same for
      everyone, and these routes admit the same callers as market data: a
      licensed origin, a session or a Trading API key. Page headlines by publish
      time, filter them by instrument root, and stream them live over
      server-sent events. Thumbnails come through the image route.
  - name: Trading
    description: >-
      Place, change and cancel orders, protect a position with a bracket and
      change or withdraw it, and close or flatten positions. Every call that
      places an order takes a `clientOrderId` as its idempotency key.
  - name: Account
    description: >-
      Read an account a trader can trade: its balance, positions, working
      orders, fills, profit and loss history, and the live account stream. You
      don’t create accounts here. A trader connects their own account at a
      provider, or opens their own Demo on the paper book, in the trdrs app. A
      venue issues accounts on the paper book with Issue an account into a
      group, and a venue pre-registers accounts at a provider through Connect
      with Pre-register a trader’s account.
  - name: Connect
    description: >-
      Connect is the account picker a trader opens: in the trdrs app, where it
      lists the built-in providers and every listed venue, and in hosted Connect
      on a Connect app’s website, where it lists the tiles the app chose. The
      pre-registration routes let a venue fill Connect in the trdrs app ahead of
      time, for a trader who signs in to trdrs. You tell trdrs that a trader has
      an account at a built-in provider: their sign-in email, and optionally the
      account number and login name. When that trader signs in, Connect shows
      the account ready to link, and they sign in to the provider themselves,
      once. The trader types their own password, and access starts when their
      own login succeeds. You can list who you pre-registered and who has
      linked, and cancel a pre-registration that hasn’t been used. A
      pre-registration expires after 30 days, and sending it again refreshes it.
      These routes take the pre-registration key. [Register an
      account](/guides/register-an-account) walks through the whole flow.
  - name: Connect apps preview
    description: >-
      Run a Connect app: your own trading interface, whose traders connect their
      accounts in hosted Connect on your website and trade them on your screens.
      The Connect API is what your backend calls with your app’s API key: Create
      a Connect link, read and close it, and the account, market and trading
      routes with your trader named in `x-trdrs-trader`. Hosted Connect calls
      its own routes with the frame session a Connect link opens. The Connect
      dashboard calls the rest with your Connect sign-in session: your apps,
      each app’s name and logo, API keys, websites, tiles, white-label paper and
      Demos, traders and active traders, invoices, conformance runs and its
      Connect pass. These routes are in preview, served on the sandbox, where
      they are free. An app’s production opens when production records the app’s
      Connect pass, which the sandbox signs once the app passes its Connect
      conformance run.
  - name: Connect accounts
    description: >-
      A Connect client's team signs in to the Connect dashboard with a Connect
      account of its own, never a trader's, and one login reaches both
      environments. Production answers a short statement for the signed-in
      account, naming its verified email and the Connect apps it owns, and
      sandbox exchanges it for a sandbox session and the counterpart app of
      each: the sandbox app that stands for the production one. The environments
      share no credential: production signs the statement with its own key, and
      sandbox checks it with production's public key alone. These routes take
      the Connect dashboard's own session, from the dashboard's origin; a
      trader's session and every key are refused, and a Connect account's
      session reaches no trading, account, market or AI route.
  - name: Challenges
    description: >-
      List evaluation programs, enroll in one, and read a trader’s own
      enrollments and their history. **Preview: outside the additive-only
      promise**, so these shapes can change; see Versioning and stability.
      **They take a signed-in session, not a key**, and exist only on an engine
      that runs with `CHALLENGES_ENABLED`. Anywhere else every one answers
      `404`.
paths:
  /api/risk:
    put:
      tags:
        - Account
      summary: Set the risk controls (deprecated)
      description: >-
        Deprecated: removed after 2026-10-30. A trader sets no risk controls of
        their own now. The body is not read and nothing is stored: the call
        answers as `GET /api/risk` does, with every control off.


        Required key: Trading API key. A Connect app's backend can also send it
        with the app's API key, and a venue's backend with its Venue key, which
        carries `trader:trade`, each naming one of its own traders in
        `x-trdrs-trader`: it then runs on that trader's own accounts.
      parameters:
        - name: provider
          in: query
          required: true
          schema:
            type: string
          description: The provider the account is at. Required.
        - name: account
          in: query
          schema:
            type: string
          description: >-
            The account number, when the login holds more than one. It must be
            one of your own accounts, or the call is refused with 400.
      responses:
        '200':
          description: Every control off and the lock state now.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RiskStateResponse'
        '400':
          description: The provider is missing or unknown, or the account isn't yours.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: The key is missing, unknown or revoked.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: >-
            `engine_draining` with a `Retry-After` header: the engine you
            reached is restarting for a release and did nothing. Wait for
            `Retry-After`, then send the same request again, with the same
            `clientOrderId` or `Idempotency-Key` where the route takes one:
            another engine takes it. A write refused before any route takes it
            says `server draining` as its `error`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
      deprecated: true
      security:
        - tradingApiKey: []
        - connectApiKey: []
          trader: []
        - venueKey: []
          trader: []
      x-codeSamples:
        - lang: javascript
          label: TypeScript
          source: >-
            const res = await
            fetch('https://app.trdrs.co/api/risk?provider=rithmic&account=PA-4821-07',
            {
              method: 'PUT',
              headers: { Authorization: `Bearer ${process.env.TRDRS_API_KEY}` },
            })

            const data = await res.json()
        - lang: shell
          label: cURL
          source: >-
            curl -X PUT
            'https://app.trdrs.co/api/risk?provider=rithmic&account=PA-4821-07'
            \
              -H "Authorization: Bearer $TRDRS_API_KEY"
components:
  schemas:
    RiskStateResponse:
      type: object
      description: >-
        The retired risk state: every control off, whether the account is locked
        now, and, on an account bound to a risk policy, every limit set on it by
        its venue.
      properties:
        settings:
          $ref: '#/components/schemas/RiskSettings'
          description: Every control off.
        lock:
          $ref: '#/components/schemas/RiskLock'
          description: Whether the account is locked now.
        limits:
          type:
            - object
            - 'null'
          description: >-
            Every limit on an account bound to a risk policy, read-only.
            `inForce` is the version the account is held to now, and `next` is a
            version recorded since, which takes effect at the next session day.
            Null on an account no risk policy binds.
          properties:
            inForce:
              oneOf:
                - $ref: '#/components/schemas/RiskLimitsVersion'
                - type: 'null'
              description: The version in force now, or null.
            next:
              oneOf:
                - $ref: '#/components/schemas/RiskLimitsVersion'
                - type: 'null'
              description: The version that takes effect at the next session day, or null.
          required:
            - inForce
            - next
      required:
        - settings
        - lock
        - limits
      example:
        settings:
          provider: rithmic
          accountNumber: PA-4821-07
          dailyLossEnabled: false
          dailyLossValue: null
          weeklyLossEnabled: false
          weeklyLossValue: null
          dailyProfitEnabled: false
          dailyProfitValue: null
          weeklyProfitEnabled: false
          weeklyProfitValue: null
          eodCloseEnabled: false
          eodCloseValue: null
          lockSettingsWhenTradingLocked: false
          updatedAt: 0
        lock:
          provider: rithmic
          accountNumber: PA-4821-07
          tradingLocked: false
          settingsLocked: false
          lockReason: null
          lockWindow: null
          tradingUnlockAt: null
          settingsUnlockAt: null
          triggerPnl: null
          flattenConfirmed: false
          monitoring: live
          clearable: true
          settings:
            provider: rithmic
            accountNumber: PA-4821-07
            dailyLossEnabled: false
            dailyLossValue: null
            weeklyLossEnabled: false
            weeklyLossValue: null
            dailyProfitEnabled: false
            dailyProfitValue: null
            weeklyProfitEnabled: false
            weeklyProfitValue: null
            eodCloseEnabled: false
            eodCloseValue: null
            lockSettingsWhenTradingLocked: false
            updatedAt: 0
        limits:
          inForce:
            version: 4f1c0e9a7b2d6e31a8c5f0d2b9e7a614
            terms:
              - rule: daily_loss
                authority: firm
                amount: '2500'
            endOfDay: null
            session:
              timeZone: America/Chicago
              rolloverHour: 17
          next: null
    ErrorResponse:
      type: object
      description: >-
        The body of every error response. It always carries `error`, an English
        sentence you can show. A refused trading request also carries `code`,
        one of the refusal codes, and `params`, the details of that refusal.
        Translate by `code` and `params`, and show a generic message for a code
        you don't recognize. Other errors may carry a `code` of their own.
      properties:
        error:
          type: string
          description: What went wrong, as an English sentence.
        code:
          type: string
          description: >-
            A stable machine code. On a refused trading request, it is one of
            the refusal codes.
        params:
          type: object
          description: >-
            The details of the refusal named by `code`, on a refused trading
            request.
      required:
        - error
      example:
        error: invalid_instrument
    RiskSettings:
      type: object
      description: >-
        The five risk controls a trader could once set on their own account, as
        the retired risk routes still state them. A trader sets none now, so
        every control is off and every value reads null, and nothing enforces or
        stores them.
      properties:
        provider:
          type: string
          description: The provider the account is at.
        accountNumber:
          type: string
          description: The account number.
        dailyLossEnabled:
          type: boolean
          description: Always false.
        dailyLossValue:
          type:
            - number
            - 'null'
          description: Always null.
        weeklyLossEnabled:
          type: boolean
          description: Always false.
        weeklyLossValue:
          type:
            - number
            - 'null'
          description: Always null.
        dailyProfitEnabled:
          type: boolean
          description: Always false.
        dailyProfitValue:
          type:
            - number
            - 'null'
          description: Always null.
        weeklyProfitEnabled:
          type: boolean
          description: Always false.
        weeklyProfitValue:
          type:
            - number
            - 'null'
          description: Always null.
        eodCloseEnabled:
          type: boolean
          description: Always false.
        eodCloseValue:
          type:
            - number
            - 'null'
          description: Always null.
        lockSettingsWhenTradingLocked:
          type: boolean
          description: Always false.
        updatedAt:
          type: number
          description: Always 0.
      required:
        - provider
        - accountNumber
        - dailyLossEnabled
        - dailyLossValue
        - weeklyLossEnabled
        - weeklyLossValue
        - dailyProfitEnabled
        - dailyProfitValue
        - weeklyProfitEnabled
        - weeklyProfitValue
        - eodCloseEnabled
        - eodCloseValue
        - lockSettingsWhenTradingLocked
        - updatedAt
    RiskLock:
      type: object
      description: >-
        Whether the account is locked, why, and when it unlocks. While
        `tradingLocked` is true, every route that places an order refuses with
        423 `risk_locked`. `settingsLocked`, `settingsUnlockAt`, `monitoring`,
        `clearable` and `settings` belong to the retired risk controls and carry
        constants.
      properties:
        provider:
          type: string
          description: The provider the account is at.
        accountNumber:
          type: string
          description: The account number.
        tradingLocked:
          type: boolean
          description: >-
            True while trading is locked. Every route that places an order
            checks it and refuses while it is true.
        settingsLocked:
          type: boolean
          description: 'Always false: no settings are locked.'
        lockReason:
          type:
            - string
            - 'null'
          enum:
            - daily_loss
            - weekly_loss
            - daily_profit
            - weekly_profit
            - eod_close
            - eval_breach
            - firm_halt
            - max_drawdown
            - daily_drawdown
            - margin_stop_out
            - pnl_unverified
            - null
          description: >-
            Which rule locked the account, or null while it can trade.
            `daily_loss` and `weekly_loss` are a loss limit the account's venue
            or firm set on it, reached: it locks the account until the venue
            resets it, as a drawdown breach does. `daily_profit`,
            `weekly_profit` and `eod_close` are a profit target or an end-of-day
            close the account's venue or firm set on it, reached, which lock it
            to the end of the day or the week. `eval_breach` is a failed
            evaluation. `firm_halt` is the account's venue halting it, which
            lasts until the venue resumes it. `max_drawdown` and
            `daily_drawdown` are the venue's stage drawdown rule breached on an
            account it issued, which last like `eval_breach`. `margin_stop_out`
            is a margin stop-out on the paper book. It holds until the account
            is covered again and its risk is resolved. `pnl_unverified` is
            retired: no lock is placed for it now.
        lockWindow:
          type:
            - string
            - 'null'
          enum:
            - daily
            - weekly
            - null
          description: >-
            The period a profit target or an end-of-day close lock belongs to,
            and null for every other lock, a loss limit among them. A daily lock
            ends at the next 17:00 CT reopen, and a weekly lock at 17:00 CT on
            Sunday.
        tradingUnlockAt:
          type:
            - number
            - 'null'
          description: >-
            When trading unlocks by itself, in epoch seconds, or null when there
            is no lock or the lock has no set end. A loss limit has none: it
            lasts until the venue resets the account.
        settingsUnlockAt:
          type:
            - number
            - 'null'
          description: Always null.
        triggerPnl:
          type:
            - number
            - 'null'
          description: >-
            Always null: it stated the profit and loss a trader's own control
            fired on.
        flattenConfirmed:
          type: boolean
          description: >-
            Always false: it stated that the account had been seen flat after a
            trader's own control closed it.
        monitoring:
          type: string
          enum:
            - live
            - paused
          description: Always `live`.
        clearable:
          type: boolean
          description: >-
            True only while nothing is locked. No lock is cleared by hand, so
            never offer an unlock.
        settings:
          $ref: '#/components/schemas/RiskSettings'
          description: Every control off.
      required:
        - provider
        - accountNumber
        - tradingLocked
        - settingsLocked
        - lockReason
        - lockWindow
        - tradingUnlockAt
        - settingsUnlockAt
        - triggerPnl
        - flattenConfirmed
        - monitoring
        - clearable
        - settings
    RiskLimitsVersion:
      type: object
      description: >-
        One version of the limits an account is held to, read-only: every limit
        with who sets it, the end-of-day close with who sets it, and the session
        the day and week are counted in.
      properties:
        version:
          type: string
          description: The version id.
        terms:
          type: array
          description: The loss and profit limits.
          items:
            type: object
            properties:
              rule:
                type: string
                enum:
                  - daily_loss
                  - weekly_loss
                  - daily_profit
                  - weekly_profit
                description: Which limit this is.
              authority:
                type: string
                enum:
                  - firm
                  - venue
                description: >-
                  Who states the limit: `firm` is the risk controls the
                  account's venue set on the account itself, and `venue` is the
                  venue's conditions for the account. Every one of them applies
                  at once.
              amount:
                type: string
                description: >-
                  The limit, as an exact decimal string in the account's
                  currency.
            required:
              - rule
              - authority
              - amount
        endOfDay:
          type:
            - object
            - 'null'
          description: The end-of-day close, or null when there is none.
          properties:
            authority:
              type: string
              enum:
                - firm
                - venue
              description: >-
                Who states the limit: `firm` is the risk controls the account's
                venue set on the account itself, and `venue` is the venue's
                conditions for the account. Every one of them applies at once.
            minutesBeforeClose:
              type: integer
              description: How many minutes before the session close positions close.
          required:
            - authority
            - minutesBeforeClose
        session:
          type: object
          description: The session the day and week are counted in.
          properties:
            timeZone:
              type: string
              description: The IANA time zone.
            rolloverHour:
              type: integer
              description: The hour the trading day starts, in that time zone.
          required:
            - timeZone
            - rolloverHour
      required:
        - version
        - terms
        - endOfDay
        - session
  headers:
    RetryAfter:
      description: >-
        How many seconds to wait before sending the same request again. A `503`
        carries it only when the engine did nothing, so the request may be sent
        again as it is.
      schema:
        type: integer
        minimum: 1
  securitySchemes:
    tradingApiKey:
      type: http
      scheme: bearer
      description: >-
        The Trading API key (`trdrs_sk_…`), for market data, orders and account
        state on the accounts its owner holds. Use it server-to-server, and keep
        it on your server. Its scope is named `trading` in the API.
    connectApiKey:
      type: http
      scheme: bearer
      description: >-
        A Connect app's API key (`trdrs_ck_sandbox_…` or
        `trdrs_ck_production_…`), in preview. It belongs to one app in one
        environment, has a name and an expiry, and carries the whole Connect
        API. An owner of the app creates it in the Connect dashboard. It
        creates, reads and closes the app's Connect links under
        `/api/connect/links`, and on the account, market and trading routes it
        reads the app's own traders' accounts and market data and routes their
        orders, each request naming its trader in `x-trdrs-trader`. It stops
        working when it is revoked or expires, or when the owner who created it
        stops being an owner. Keep it on your server.
    trader:
      type: apiKey
      in: header
      name: x-trdrs-trader
      description: >-
        Your own id for one of your traders: the id your Connect links name, or
        the id the accounts your venue issues them use. Send it with your app's
        API key, or with your Venue key carrying `trader:read`, or
        `trader:trade` to also route the trader's orders, and the request runs
        as that trader on their own accounts. An id that names none of your
        traders is refused with `404` `trader_not_found` and a suspended trader
        with `403` `trader_suspended`. A request that also carries a cookie or a
        browser `Origin` is refused with `400` `credential_not_allowed`.
    venueKey:
      type: http
      scheme: bearer
      description: >-
        The Venue key (`trdrs_vk_sandbox_…` or `trdrs_vk_production_…`), in
        preview. It belongs to one venue in one environment and carries the
        scopes it was created with. The venue's verified owner creates it while
        signed in. It works on the `/api/venues/{venueId}` routes and, with
        `trader:read` or `trader:trade`, on the account, market and trading
        routes, reading the venue's own traders' accounts and routing their
        orders, each request naming its trader in `x-trdrs-trader`. A
        `trdrs_sk_…` key can't be used in its place. It reaches its venue's
        routes and its venue's own traders, and the owner manages keys from a
        signed-in session. Keep it on your server.

````

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