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

# Publish a condition profile

> Private preview, disabled unless VENUE_CONFIGURATION_ENABLED is enabled and the vault is configured. This branch has not enabled these routes in the public sandbox. Existing trdrs_sk partner/tenant keys do not authorize these routes. Requires venue:configure. Publishing does not apply anything; activate it separately. An identical retry recovers the same profile and a changed body conflicts. Every policy must be explicitly tagged and the profile complete: there is no partial venue profile, because the venue layer is the floor every other layer narrows.



## OpenAPI

````yaml /partner-platform/openapi.json post /api/partner/venues/{venueId}/conditions/profiles
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: Venue platform preview
    description: >-
      Disabled private-preview venue configuration APIs.
      VENUE_CONFIGURATION_ENABLED and a vault are required. Every route
      documented here under /api/partner/ is also served under /api/operator/ to
      a verified owner session, by the same router with a different credential:
      a browser must never hold a venue key, so an operator console reaches the
      identical checks that way rather than through a second copy of this
      surface. Not part of the stable public contract until qualification and
      release; existing partner APIs remain unchanged.
  - 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/partner/venues/{venueId}/conditions/profiles:
    post:
      tags:
        - Venue platform preview
      summary: Publish a condition profile
      description: >-
        Private preview, disabled unless VENUE_CONFIGURATION_ENABLED is enabled
        and the vault is configured. This branch has not enabled these routes in
        the public sandbox. Existing trdrs_sk partner/tenant keys do not
        authorize these routes. Requires venue:configure. Publishing does not
        apply anything; activate it separately. An identical retry recovers the
        same profile and a changed body conflicts. Every policy must be
        explicitly tagged and the profile complete: there is no partial venue
        profile, because the venue layer is the floor every other layer narrows.
      parameters:
        - name: venueId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: Idempotency-Key
          in: header
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 128
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VenueConditionProfileSaveRequest'
      responses:
        '201':
          description: 'Scoped result. Cache-Control: no-store.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VenueConditionProfileSaveResponse'
        '400':
          description: Invalid input, cursor or required request/version header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Required credential missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            Verified identity, current owner membership or required scope
            missing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Disabled feature, unavailable resource or wrong venue/environment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Changed idempotent request or stale version.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '413':
          description: Request exceeds the bounded body size.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '415':
          description: JSON body required.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Service or credential vault unavailable; no success is implied.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - venueOperatorKey: []
      x-codeSamples:
        - lang: javascript
          label: TypeScript
          source: >-
            const res = await
            fetch('https://app.trdrs.co/api/partner/venues/{venueId}/conditions/profiles',
            {
              method: 'POST',
              headers: {
                'content-type': 'application/json',
                Authorization: `Bearer ${process.env.TRDRS_VENUE_KEY}`,
                "Idempotency-Key": "example-request-1",
              },
              body: JSON.stringify({
                "name": "Standard",
                "profile": {
                  "margin": {
                    "kind": "fixedPerUnit",
                    "initial": "1000",
                    "maintenance": "500",
                    "currency": "USD"
                  },
                  "commission": {
                    "kind": "perUnit",
                    "amount": "2.50",
                    "currency": "USD",
                    "orderMinimum": null
                  },
                  "markup": {
                    "buyMarkupTicks": 0,
                    "sellMarkupTicks": 0
                  },
                  "financing": {
                    "kind": "none"
                  },
                  "risk": {
                    "maxOrderQuantity": "10",
                    "maxPositionQuantity": null,
                    "maxPositionNotional": null,
                    "instrumentAllowlist": null,
                    "dailyLossLimit": null,
                    "weeklyLossLimit": null,
                    "entryHalted": false,
                    "stopOutEquityRatio": null
                  }
                }
              }),
            })

            const data = await res.json()
        - lang: shell
          label: cURL
          source: >-
            curl -X POST
            'https://app.trdrs.co/api/partner/venues/{venueId}/conditions/profiles'
            \
              -H "Authorization: Bearer $TRDRS_VENUE_KEY" \
              -H 'Idempotency-Key: example-request-1' \
              -H 'content-type: application/json' \
              -d '{"name":"Standard","profile":{"margin":{"kind":"fixedPerUnit","initial":"1000","maintenance":"500","currency":"USD"},"commission":{"kind":"perUnit","amount":"2.50","currency":"USD","orderMinimum":null},"markup":{"buyMarkupTicks":0,"sellMarkupTicks":0},"financing":{"kind":"none"},"risk":{"maxOrderQuantity":"10","maxPositionQuantity":null,"maxPositionNotional":null,"instrumentAllowlist":null,"dailyLossLimit":null,"weeklyLossLimit":null,"entryHalted":false,"stopOutEquityRatio":null}}}'
components:
  schemas:
    VenueConditionProfileSaveRequest:
      type: object
      additionalProperties: false
      properties:
        name:
          type: string
        profile:
          $ref: '#/components/schemas/VenueConditionProfile'
      required:
        - name
        - profile
      example:
        name: Standard
        profile:
          margin:
            kind: fixedPerUnit
            initial: '1000'
            maintenance: '500'
            currency: USD
          commission:
            kind: perUnit
            amount: '2.50'
            currency: USD
            orderMinimum: null
          markup:
            buyMarkupTicks: 0
            sellMarkupTicks: 0
          financing:
            kind: none
          risk:
            maxOrderQuantity: '10'
            maxPositionQuantity: null
            maxPositionNotional: null
            instrumentAllowlist: null
            dailyLossLimit: null
            weeklyLossLimit: null
            entryHalted: false
            stopOutEquityRatio: null
    VenueConditionProfileSaveResponse:
      type: object
      additionalProperties: false
      properties:
        profile:
          $ref: '#/components/schemas/VenueConditionProfileRecord'
      required:
        - profile
      example:
        profile:
          id: 00000000-0000-0000-0000-000000000001
          venueId: 00000000-0000-0000-0000-000000000001
          environment: sandbox
          name: Standard
          profile:
            margin:
              kind: fixedPerUnit
              initial: '1000'
              maintenance: '500'
              currency: USD
            commission:
              kind: perUnit
              amount: '2.50'
              currency: USD
              orderMinimum: null
            markup:
              buyMarkupTicks: 0
              sellMarkupTicks: 0
            financing:
              kind: none
            risk:
              maxOrderQuantity: '10'
              maxPositionQuantity: null
              maxPositionNotional: null
              instrumentAllowlist: null
              dailyLossLimit: null
              weeklyLossLimit: null
              entryHalted: false
              stopOutEquityRatio: null
          contentHash: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
          createdAt: '2026-09-14T12:00:00.000Z'
          state: published
          inForce: false
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
      required:
        - error
      example:
        error: invalid_instrument
    VenueConditionProfile:
      type: object
      additionalProperties: false
      properties:
        margin:
          oneOf:
            - type: object
              additionalProperties: false
              properties:
                kind:
                  const: fixedPerUnit
                initial:
                  type: string
                  description: >-
                    Exact base-ten decimal string, at most 18 fractional digits.
                    No exponent notation or binary floating-point conversion.
                maintenance:
                  type: string
                  description: >-
                    Exact base-ten decimal string, at most 18 fractional digits.
                    No exponent notation or binary floating-point conversion.
                currency:
                  type: string
              required:
                - kind
                - initial
                - maintenance
                - currency
            - type: object
              additionalProperties: false
              properties:
                kind:
                  const: linearNotional
                initialRate:
                  type: string
                  description: >-
                    Exact base-ten decimal string, at most 18 fractional digits.
                    No exponent notation or binary floating-point conversion.
                maintenanceRate:
                  type: string
                  description: >-
                    Exact base-ten decimal string, at most 18 fractional digits.
                    No exponent notation or binary floating-point conversion.
              required:
                - kind
                - initialRate
                - maintenanceRate
        commission:
          oneOf:
            - type: object
              additionalProperties: false
              properties:
                kind:
                  const: perUnit
                amount:
                  type: string
                  description: >-
                    Exact base-ten decimal string, at most 18 fractional digits.
                    No exponent notation or binary floating-point conversion.
                currency:
                  type: string
                orderMinimum:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Exact base-ten decimal string, or null where this layer
                    states no limit.
              required:
                - kind
                - amount
                - currency
                - orderMinimum
            - type: object
              additionalProperties: false
              properties:
                kind:
                  const: notionalBps
                bps:
                  type: string
                  description: >-
                    Exact base-ten decimal string, at most 18 fractional digits.
                    No exponent notation or binary floating-point conversion.
                minAmount:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Exact base-ten decimal string, or null where this layer
                    states no limit.
                currency:
                  type: string
                orderMinimum:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Exact base-ten decimal string, or null where this layer
                    states no limit.
              required:
                - kind
                - bps
                - minAmount
                - currency
                - orderMinimum
        markup:
          type: object
          additionalProperties: false
          properties:
            buyMarkupTicks:
              type: integer
              minimum: 0
              maximum: 1000
            sellMarkupTicks:
              type: integer
              minimum: 0
              maximum: 1000
          required:
            - buyMarkupTicks
            - sellMarkupTicks
        financing:
          oneOf:
            - type: object
              additionalProperties: false
              properties:
                kind:
                  type: string
                  enum:
                    - none
                    - providerReported
              required:
                - kind
            - type: object
              additionalProperties: false
              properties:
                kind:
                  const: dailyRate
                longRate:
                  type: string
                  description: >-
                    Exact base-ten decimal string, at most 18 fractional digits.
                    No exponent notation or binary floating-point conversion.
                shortRate:
                  type: string
                  description: >-
                    Exact base-ten decimal string, at most 18 fractional digits.
                    No exponent notation or binary floating-point conversion.
                timezone:
                  type: string
                rolloverMinute:
                  type: integer
                  minimum: 0
                  maximum: 1439
                dayMultipliers:
                  type: array
                  items:
                    type: integer
                    minimum: 0
                    maximum: 7
                dayCountBasis:
                  type: integer
                  enum:
                    - 360
                    - 365
              required:
                - kind
                - longRate
                - shortRate
                - timezone
                - rolloverMinute
                - dayMultipliers
                - dayCountBasis
        risk:
          $ref: '#/components/schemas/VenueRiskPolicy'
      required:
        - margin
        - commission
        - markup
        - financing
        - risk
      description: >-
        Every policy is explicitly tagged. Zero commission and financing none
        are real choices; an omitted field is inheritance, not a default.
        Initial margin must be at least maintenance, and a linear rate above one
        is refused as a percentage typo.
    VenueConditionProfileRecord:
      type: object
      additionalProperties: false
      properties:
        id:
          type: string
          format: uuid
        venueId:
          type: string
          format: uuid
        environment:
          type: string
          enum:
            - sandbox
            - production
        name:
          type: string
        profile:
          $ref: '#/components/schemas/VenueConditionProfile'
        contentHash:
          type: string
        createdAt:
          type: string
          format: date-time
        state:
          const: published
        inForce:
          type: boolean
      required:
        - id
        - venueId
        - environment
        - name
        - profile
        - contentHash
        - createdAt
        - state
        - inForce
    VenueRiskPolicy:
      type: object
      additionalProperties: false
      properties:
        maxOrderQuantity:
          type:
            - string
            - 'null'
          description: >-
            Exact base-ten decimal string, or null where this layer states no
            limit.
        maxPositionQuantity:
          type:
            - string
            - 'null'
          description: >-
            Exact base-ten decimal string, or null where this layer states no
            limit.
        maxPositionNotional:
          type:
            - string
            - 'null'
          description: >-
            Exact base-ten decimal string, or null where this layer states no
            limit.
        instrumentAllowlist:
          type:
            - array
            - 'null'
          items:
            type: string
        dailyLossLimit:
          type:
            - string
            - 'null'
          description: >-
            Exact base-ten decimal string, or null where this layer states no
            limit.
        weeklyLossLimit:
          type:
            - string
            - 'null'
          description: >-
            Exact base-ten decimal string, or null where this layer states no
            limit.
        entryHalted:
          type: boolean
        stopOutEquityRatio:
          type:
            - string
            - 'null'
          description: >-
            Exact base-ten decimal string, or null where this layer states no
            limit.
      required:
        - maxOrderQuantity
        - maxPositionQuantity
        - maxPositionNotional
        - instrumentAllowlist
        - dailyLossLimit
        - weeklyLossLimit
        - entryHalted
        - stopOutEquityRatio
      description: >-
        Safety ceilings. null means this layer states no limit, never unlimited
        for everyone. A more specific layer may lower a limit, narrow the
        allowlist or halt entries, and can never do the reverse.
  securitySchemes:
    venueOperatorKey:
      type: http
      scheme: bearer
      description: >-
        Private-preview venue operator key (trdrs_vk_sandbox_… or
        trdrs_vk_production_…). Bound to one venue/environment and explicit
        scopes. Issued by a verified owner session; accepted only on documented
        /api/partner/venues/{venueId} routes. Existing trdrs_sk keys are not
        interchangeable. Never grants trader, login or key-management authority.

````