Skip to content

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.

  1. You need two ids from the same row: the template id and the firm that owns it, propTenantId. Only active templates 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": "…", … } ] }
  2. 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 — a users.id you already hold. Must be a user in your tenant: a stranger’s id returns 404 owner_user_not_found.
    • owner — identify the trader inline and let the server find-or-create them. Needs at least one of externalId (your own stable key, checked first) or email (unique per tenant), or you get 400 owner_unidentifiable. An existing trader is reused, never duplicated, and the response echoes owner: { id, created } so you can see which happened.

    Send neither and you get 400 owner_user_required.

  3. firmId is optional — omit it and the server derives the firm from the template, which in paper picks the firm’s paper shadow, the one you wanted anyway. Send it (or its older spelling propTenantId) only to pin a specific firm; either way it is a UUID, never a tenant slug.

    baselineUsd seeds the simulated cash balance and defaults to 10000 — it is separate from the template’s accountSizeUsd, 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": "…", … } }

    The prop account lands status: 'active' with startedAt set. Rejections to expect: 404 template_not_found, 400 template_inactive, and 400 template_mode_unsupported when the template is marked live-only.

  4. 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"

Next: Create a challenge template · Prop account model · Launch a prop firm