Sell a paper prop account from a template
create-prop provisions the account, the prop account and the paper trading
state in one transaction. When this is done a trader has an active evaluation
they can place orders against immediately — no agreement step, no deposit.
-
Pick the template
Section titled “Pick the template”You need two ids from the same row: the template
idand the firm that owns it,propTenantId. Onlyactivetemplates can be sold.Terminal window curl -s "https://api.troncharts.xyz/api/v1/prop-templates?activeOnly=true" \-H "authorization: Bearer $TOKEN" \-H "x-tenant-slug: $TC_TENANT_SLUG"# → { "templates": [ { "id": "acme-25k-two-step", "propTenantId": "…", … } ] }const { templates } = await sdk.propTemplates.list({ activeOnly: true }) -
Identify the owner user
Section titled “Identify the owner user”A bearer credential has no user session, so it must name the trader the new account belongs to. Two ways, and you rarely need the first:
ownerUserId— ausers.idyou already hold. Must be a user in your tenant: a stranger’s id returns 404owner_user_not_found.owner— identify the trader inline and let the server find-or-create them. Needs at least one ofexternalId(your own stable key, checked first) oremail(unique per tenant), or you get 400owner_unidentifiable. An existing trader is reused, never duplicated, and the response echoesowner: { id, created }so you can see which happened.
Send neither and you get 400
owner_user_required. -
Create the account
Section titled “Create the account”firmIdis optional — omit it and the server derives the firm from the template, which inpaperpicks the firm’s paper shadow, the one you wanted anyway. Send it (or its older spellingpropTenantId) only to pin a specific firm; either way it is a UUID, never a tenant slug.baselineUsdseeds the simulated cash balance and defaults to10000— it is separate from the template’saccountSizeUsd, which is what the rules judge. Leave it alone and a 25K evaluation starts with 10K of cash; pass it explicitly if you want the two to match.Terminal window curl -s https://api.troncharts.xyz/api/v1/accounts/create-prop \-H "authorization: Bearer $TOKEN" \-H "x-tenant-slug: $TC_TENANT_SLUG" \-H 'content-type: application/json' \-d '{"templateId": "acme-25k-two-step","mode": "paper","owner": { "externalId": "crm-4471", "email": "ana@example.com" },"displayName": "Acme 25K — run 1"}'# → 201 { "mode": "paper", "accountId": "…", "accountNumber": "100042",# "owner": { "id": "…", "created": true },# "propAccount": { "status": "active", "startedAt": "…", … } }const res = await sdk.accounts.createProp({templateId: 'acme-25k-two-step',mode: 'paper',owner: { externalId: 'crm-4471', email: 'ana@example.com' },}) as { accountId: string; accountNumber: string; owner: { id: string; created: boolean } }The prop account lands
status: 'active'withstartedAtset. Rejections to expect: 404template_not_found, 400template_inactive, and 400template_mode_unsupportedwhen the template is marked live-only. -
Reset the run when you need a clean slate
Section titled “Reset the run when you need a clean slate”Paper accounts are resettable: balance and positions go back to the account size, breach state clears, and the evaluation window restarts at its original length. Live and funded accounts reject with 400
not_paper.Terminal window curl -s -X POST https://api.troncharts.xyz/api/v1/prop-accounts/$PROP_ACCOUNT_ID/reset \-H "authorization: Bearer $TOKEN" \-H "x-tenant-slug: $TC_TENANT_SLUG"await sdk.propAccounts.reset(propAccountId)
Next: Create a challenge template · Prop account model · Launch a prop firm