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

# Pre-register a trader’s account

> Creates a pending account registration through the supported connector and system already configured on your venue partner record. It does not add an execution adapter or connect an arbitrary provider URL. It tells trdrs an account exists on your venue and names the trader who should see it in Connect. The trader finds it in the connect flow when they sign in with `email`; the connect step pre-fills your firm and system, and the trader enters their own credential to finish. `venueLogin` is the login name you issued; never send a password (there is no field for one, by design). Your firm is solely responsible for notifying the trader and delivering every venue credential directly; trdrs sends no customer handoff email. The retired `handover` field is rejected. Idempotent: per (email, accountNumber), re-registering refreshes the 30-day expiry instead of duplicating.



## OpenAPI

````yaml /partner-platform/openapi.json post /api/partner/connect/accounts
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: >-
      Connect is the account picker a trader opens, in our app or embedded on a
      partner’s site: the brokers we run, plus every listed venue. These three
      routes are how a firm PRE-FILLS it. You tell us a trader has an account at
      a broker we support (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 type only their own password. 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 API key
      today and are Connect’s own; they are not part of the legacy
      firm-operations surface. The end-to-end flow is **[Quick
      Start](/docs/guides/quick-start)**.
  - name: Firm accounts (legacy)
    description: >-
      Legacy. 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 doors.
      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: Billing
    description: >-
      Legacy, 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 API key.
  - name: Webhooks
    description: >-
      Being replaced by the venue API: venue-scoped events are not built yet, so
      this is the one job a venue-only backend still needs a Partner key for;
      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 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: >-
      Being replaced by the venue API: stage rules on the venue carry the firm’s
      half of this; the trader’s enroll flow has not moved yet. 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/connect/accounts:
    post:
      tags:
        - Connect
      summary: Pre-register a trader’s account
      description: >-
        Creates a pending account registration through the supported connector
        and system already configured on your venue partner record. It does not
        add an execution adapter or connect an arbitrary provider URL. It tells
        trdrs an account exists on your venue and names the trader who should
        see it in Connect. The trader finds it in the connect flow when they
        sign in with `email`; the connect step pre-fills your firm and system,
        and the trader enters their own credential to finish. `venueLogin` is
        the login name you issued; never send a password (there is no field for
        one, by design). Your firm is solely responsible for notifying the
        trader and delivering every venue credential directly; trdrs sends no
        customer handoff email. The retired `handover` field is rejected.
        Idempotent: per (email, accountNumber), re-registering refreshes the
        30-day expiry instead of duplicating.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PartnerRegistrationRegisterRequest'
      responses:
        '200':
          description: The registration as created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PartnerRegistrationRegisterResponse'
        '400':
          description: Malformed input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: The bearer is not a partner-scoped key for an active partner firm
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - partnerKey: []
      x-codeSamples:
        - lang: javascript
          label: TypeScript
          source: >-
            const res = await
            fetch('https://app.trdrs.co/api/partner/connect/accounts', {
              method: 'POST',
              headers: {
                'content-type': 'application/json',
                Authorization: `Bearer ${process.env.TRDRS_API_KEY}`,
              },
              body: JSON.stringify({
                "email": "trader@example.com",
                "accountNumber": "PA-4821-07",
                "venueLogin": "jsmith-apex"
              }),
            })

            const data = await res.json()
        - lang: shell
          label: cURL
          source: |-
            curl -X POST 'https://app.trdrs.co/api/partner/connect/accounts' \
              -H "Authorization: Bearer $TRDRS_API_KEY" \
              -H 'content-type: application/json' \
              -d '{"email":"trader@example.com","accountNumber":"PA-4821-07","venueLogin":"jsmith-apex"}'
components:
  schemas:
    PartnerRegistrationRegisterRequest:
      type: object
      properties:
        email:
          type: string
          description: The trader’s sign-in email
        accountNumber:
          type: string
          description: The venue account id (≤40 chars), when known
        venueLogin:
          type: string
          description: The firm-issued login name (≤60 chars), never a password
      required:
        - email
      example:
        email: trader@example.com
        accountNumber: PA-4821-07
        venueLogin: jsmith-apex
    PartnerRegistrationRegisterResponse:
      type: object
      properties:
        registration:
          $ref: '#/components/schemas/PartnerRegistration'
      required:
        - registration
      example:
        registration:
          id: reg_7f3ka9
          email: trader@example.com
          connector: rithmic
          system: Apex
          accountNumber: PA-4821-07
          venueLogin: jsmith-apex
          status: pending
          expiresAt: '2026-09-23T14:32:00Z'
          createdAt: '2026-08-24T14:32:00Z'
          linkedAt: null
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
      required:
        - error
      example:
        error: invalid_instrument
    PartnerRegistration:
      type: object
      properties:
        id:
          type: string
        email:
          type: string
          description: The buyer’s sign-in email (lowercased)
        connector:
          type: string
          description: The connect flow the registration routes to (your firm’s venue)
        system:
          type:
            - string
            - 'null'
          description: Your Rithmic system, pre-filled for the trader; null on other venues
        accountNumber:
          type:
            - string
            - 'null'
        venueLogin:
          type:
            - string
            - 'null'
          description: The firm-issued login name, never a password
        status:
          type: string
          enum:
            - pending
            - linked
            - revoked
            - expired
        expiresAt:
          type: string
          description: ISO 8601
        createdAt:
          type: string
          description: ISO 8601
        linkedAt:
          type:
            - string
            - 'null'
          description: ISO 8601. Set when the trader’s own connect succeeded
      required:
        - id
        - email
        - connector
        - system
        - accountNumber
        - venueLogin
        - status
        - expiresAt
        - createdAt
        - linkedAt
  securitySchemes:
    partnerKey:
      type: http
      scheme: bearer
      description: >-
        A partner-scoped API key (`trdrs_sk_…`), issued to a trdrs Connect
        partner firm and accepted only under `/api/partner/`. Same format as the
        firm (`tenant`) key, different scope: a firm API key is refused here,
        and this key is refused everywhere else.

````