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

# Register a public provider version

> Preview: served on the sandbox to every venue; production availability is arranged when a venue qualifies. Trading API keys and Partner keys do not authorize these routes. Requires the named venue-key scope and current owner membership. provider:manage. Strictly validates the manifest and saves a candidate. Repeating the same Idempotency-Key and body returns the original version; changed input conflicts. No provider endpoint is contacted, approved or enabled.



## OpenAPI

````yaml /partner-platform/openapi.json post /api/partner/venues/{venueId}/providers
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: >-
      The venue routes, in preview: a venue’s providers, instruments,
      conditions, groups, routes, stages, level 2, keys, accounts, usage,
      balance receipts and webhooks. Served on the sandbox to every venue;
      production availability is arranged when a venue qualifies. Every route
      documented here under /api/partner/ takes a Venue key and is also served
      under /api/operator/ to a verified owner session, by the same router with
      a different credential: a browser never holds a Venue key, so the back
      office reaches the identical checks that way. Additive-only from here; the
      Legacy Partner API routes 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 provider’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 Trading 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 routes: 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 account at a provider (or opens their own Demo
      on the paper book) in the app, and a venue issues accounts on the paper
      book (Venue platform → Issue an account into a group; the Legacy Partner
      API’s Create evaluation accounts does the same) or pre-registers accounts
      at a provider through Connect (Pre-register a trader’s account). Account
      state and the durable ledgers: balances, positions, working orders, fills,
      P&L history, and the live account stream.
  - name: Connect
    description: >-
      Connect is the account picker a trader opens, in our app or embedded on a
      firm’s site: the built-in providers, plus every listed venue. These three
      routes are how a firm PRE-FILLS it. You tell us 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.
      Nothing here sends a password or grants access before the trader’s own
      login succeeds. You can list who you pre-registered and who has linked,
      and cancel a pre-registration that has not been used. Pre-registrations
      expire after 30 days; repeating one refreshes it. These routes take the
      Partner key and are Connect’s own; they are not part of the Legacy Partner
      API. The end-to-end flow is **[Quick Start](/docs/guides/quick-start)**.
  - name: Firm accounts (legacy)
    description: >-
      Legacy Partner API. Every route in this group has a venue twin under
      `/api/partner/venues/{venueId}/accounts…`, reached with a Venue key and a
      named scope, and new integrations use those; this group stays for firms
      that predate venues, and the same operation runs behind both. Evaluation
      accounts your firm issues on the paper book, through your Partner key.
      Connect pre-registers accounts that exist at a provider; these routes
      create and manage accounts on the paper book: 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: Billing
    description: >-
      Legacy Partner API, per firm. What your firm is billed for in a month,
      computed from the execution ledger, and the accounts behind the number.
      The venue platform will carry per-venue usage; until it does these two
      routes answer the Partner key.
  - name: Webhooks
    description: >-
      Legacy Partner API, being replaced by venue-scoped events, which are not
      built yet; this is the one job a venue-only backend still needs a Partner
      key for, and nothing here is removed until they are. 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 every venue alike: the account-registration
      (`registration.*`) events fire wherever Connect does, and the account
      events fire where the prop engine runs.
  - name: Challenges
    description: >-
      Legacy Partner API, being replaced by stage rules on the venue, which
      carry the firm’s half of this; the trader’s enroll flow has not moved yet.
      The prop evaluation routes: 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 admin half of this is deliberately not
      documented here. It is platform administration, not licensed API.
paths:
  /api/partner/venues/{venueId}/providers:
    post:
      tags:
        - Venue platform preview
      summary: Register a public provider version
      description: >-
        Preview: served on the sandbox to every venue; production availability
        is arranged when a venue qualifies. Trading API keys and Partner keys do
        not authorize these routes. Requires the named venue-key scope and
        current owner membership. provider:manage. Strictly validates the
        manifest and saves a candidate. Repeating the same Idempotency-Key and
        body returns the original version; changed input conflicts. No provider
        endpoint is contacted, approved or enabled.
      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/VenueProviderSaveRequest'
      responses:
        '201':
          description: 'Scoped result. Cache-Control: no-store.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VenueProviderSaveResponse'
        '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}/providers',
            {
              method: 'POST',
              headers: {
                'content-type': 'application/json',
                Authorization: `Bearer ${process.env.TRDRS_VENUE_KEY}`,
                "Idempotency-Key": "example-request-1",
              },
              body: JSON.stringify({
                "name": "Example provider",
                "manifest": {
                  "providerVersion": "example-v1",
                  "protocolVersion": "1.0",
                  "schemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
                  "capabilities": {
                    "accounts": true,
                    "execution": true,
                    "marketData": false,
                    "generationFencing": true,
                    "completeOrderBook": true,
                    "executionHistory": true,
                    "executionCorrections": false,
                    "orderTypes": [
                      "market",
                      "limit"
                    ],
                    "timeInForce": [
                      "day"
                    ],
                    "reduceOnly": true,
                    "nativeReplace": false,
                    "nativeOco": false,
                    "accountProvisioning": false,
                    "positionModels": [
                      "net"
                    ],
                    "replayRetentionSeconds": 604800
                  }
                }
              }),
            })

            const data = await res.json()
        - lang: shell
          label: cURL
          source: >-
            curl -X POST
            'https://app.trdrs.co/api/partner/venues/{venueId}/providers' \
              -H "Authorization: Bearer $TRDRS_VENUE_KEY" \
              -H 'Idempotency-Key: example-request-1' \
              -H 'content-type: application/json' \
              -d '{"name":"Example provider","manifest":{"providerVersion":"example-v1","protocolVersion":"1.0","schemaDigest":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","capabilities":{"accounts":true,"execution":true,"marketData":false,"generationFencing":true,"completeOrderBook":true,"executionHistory":true,"executionCorrections":false,"orderTypes":["market","limit"],"timeInForce":["day"],"reduceOnly":true,"nativeReplace":false,"nativeOco":false,"accountProvisioning":false,"positionModels":["net"],"replayRetentionSeconds":604800}}}'
components:
  schemas:
    VenueProviderSaveRequest:
      type: object
      additionalProperties: false
      properties:
        name:
          type: string
        manifest:
          $ref: '#/components/schemas/VenueProviderManifest'
      required:
        - name
        - manifest
      example:
        name: Example provider
        manifest:
          providerVersion: example-v1
          protocolVersion: '1.0'
          schemaDigest: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
          capabilities:
            accounts: true
            execution: true
            marketData: false
            generationFencing: true
            completeOrderBook: true
            executionHistory: true
            executionCorrections: false
            orderTypes:
              - market
              - limit
            timeInForce:
              - day
            reduceOnly: true
            nativeReplace: false
            nativeOco: false
            accountProvisioning: false
            positionModels:
              - net
            replayRetentionSeconds: 604800
    VenueProviderSaveResponse:
      type: object
      additionalProperties: false
      properties:
        provider:
          $ref: '#/components/schemas/VenueProviderVersion'
      required:
        - provider
      example:
        provider:
          id: 00000000-0000-0000-0000-000000000001
          venueId: 00000000-0000-0000-0000-000000000001
          name: Example provider
          manifest:
            providerVersion: example-v1
            protocolVersion: '1.0'
            schemaDigest: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
            capabilities:
              accounts: true
              execution: true
              marketData: false
              generationFencing: true
              completeOrderBook: true
              executionHistory: true
              executionCorrections: false
              orderTypes:
                - market
                - limit
              timeInForce:
                - day
              reduceOnly: true
              nativeReplace: false
              nativeOco: false
              accountProvisioning: false
              positionModels:
                - net
              replayRetentionSeconds: 604800
          manifestHash: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
          state: candidate
          creationKey: example-request
          creationHash: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
          createdAt: '2026-09-14T12:00:00.000Z'
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
      required:
        - error
      example:
        error: invalid_instrument
    VenueProviderManifest:
      type: object
      additionalProperties: false
      properties:
        providerVersion:
          type: string
        protocolVersion:
          const: '1.0'
        schemaDigest:
          type: string
          pattern: ^[a-f0-9]{64}$
        capabilities:
          type: object
          additionalProperties: false
          properties:
            accounts:
              type: boolean
            execution:
              type: boolean
            marketData:
              type: boolean
            generationFencing:
              type: boolean
            completeOrderBook:
              type: boolean
            executionHistory:
              type: boolean
            executionCorrections:
              type: boolean
            orderTypes:
              type: array
              items:
                type: string
                enum:
                  - market
                  - limit
                  - stop
                  - stop_limit
            timeInForce:
              type: array
              items:
                type: string
                enum:
                  - day
                  - gtc
                  - ioc
                  - fok
                  - post_only
            reduceOnly:
              type: boolean
            nativeReplace:
              type: boolean
            nativeOco:
              type: boolean
            accountProvisioning:
              type: boolean
            positionModels:
              type: array
              items:
                type: string
                enum:
                  - net
                  - hedged
            replayRetentionSeconds:
              type: integer
              minimum: 0
              maximum: 31536000
          required:
            - accounts
            - execution
            - marketData
            - generationFencing
            - completeOrderBook
            - executionHistory
            - executionCorrections
            - orderTypes
            - timeInForce
            - reduceOnly
            - nativeReplace
            - nativeOco
            - accountProvisioning
            - positionModels
            - replayRetentionSeconds
      required:
        - providerVersion
        - protocolVersion
        - schemaDigest
        - capabilities
      description: >-
        Strict protocol declaration. Execution requires accounts, generation
        fencing, a complete order book, execution history, at least seven days
        replay and nonempty order types, time-in-force and position models.
        Lists contain no duplicates. No execution features may be advertised
        without execution; account provisioning/models require accounts. At
        least accounts or market data is required. Registration and a matching
        manifest do not certify these claims.
    VenueProviderVersion:
      type: object
      additionalProperties: false
      properties:
        id:
          type: string
          format: uuid
        venueId:
          type: string
          format: uuid
        name:
          type: string
        manifest:
          $ref: '#/components/schemas/VenueProviderManifest'
        manifestHash:
          type: string
        state:
          type: string
          enum:
            - candidate
            - sandbox_usable
            - qualified
        creationKey:
          type: string
        creationHash:
          type: string
        createdAt:
          type: string
          format: date-time
      required:
        - id
        - venueId
        - name
        - manifest
        - manifestHash
        - state
        - creationKey
        - creationHash
        - createdAt
  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.

````