Skip to main content
operationId: generateFirmAccount Onboards a trader (creating the Tradara user if necessary) and provisions one or more evaluation accounts under your firm via the accounts service.

Authentication

Firm API key, or staff JWT with firm scope. Scope is resolved from X-Firm-ID (auto-injected for API keys) or firm_id in the body.

Headers

Body

plan_reference (or plan_id / eval_template_id) is still required. Position limits, scaling, commissions, and trading sessions always come from the plan. Omitted overlay keys inherit from the template. A later funded upgrade uses the plan’s funded template unless you generate that funded account with its own overlays. Send idempotency_key when one purchase should produce one account. Tradara stores it on that account. A later generate with the same key returns the original account (200) and does not create another, including after the account is closed. The retry body is not applied, so a different price_paid on that call does not change the stored amount. Omit the field when you intend to create another account. The key stays on the original account; Replace account mints a new account and does not move the key. Send price_paid when you want that purchase amount stored for later risk analysis. Tradara keeps it on each account, separate from the plan’s catalog price. For a single account, the account’s price_paid is the amount you sent. For a bulk request, Tradara splits the amount into equal cent shares. Any leftover cents go to the earliest accounts so the shares add up to the total. 149.00 with count: 3 is stored as 49.67, 49.67, and 49.66. Omit the field to leave price_paid null. 0 or 0.00 records a free account. A value with more than two decimal places is rejected.

risk_profile fields

Reuse the existing risk-profile contract. Partial overlays are allowed.

passing_criteria fields

Example

Override rules for one account without changing the shared plan:

Response

201 Created means a new account was minted. 200 OK means idempotency_key already belonged to an account in your firm: the body is the original account and no second account is created.
The accounts payload is forwarded from the accounts service. Generated account rows include idempotency_key and price_paid when you sent them, plus risk_profile_id and, when a passing overlay was sent, passing_criteria_id. On a bulk create, each row’s price_paid is that account’s share, not the request total. Pass id / account_id values to POST /v1/orders. Look the account up later with GET /v1/firm-control/accounts?idempotency_key=. To move the trailing max-loss cap after the account exists, call the account-specific PATCH /v1/firm-control/accounts/{account_id}/max-loss-limit route. It clones a shared profile before writing. Confirm the live floor with GET /v1/firm-control/accounts/{account_id}/risk-state. To close an existing account and mint a fresh one from the same evaluation template, call POST /v1/firm-control/accounts/{account_id}/replace.

Errors