Pilot environment: testnet, simulated yield, mocked fiat rails — read the disclosure
Concepts

How it works

The object model behind a position: you, your sub-clients, their accounts, and the vault sub-accounts your position is partitioned into.

The object model

Your API key authenticates as one principal, and that principal is the root of everything you can reach. Two separate structures sit below it.

StructureHoldsWhat it is made of
The account treeFiatAccounts owned by you, or by an end customer you register. An account can carry an IBAN.
The vault ledgerYour vault positionShares held in one wallet TCB custodies for you, partitioned into named sub-accounts for your own reporting.

Keep the two apart when you read the rest of this page: an account holds fiat, a vault sub-account holds shares. In the diagram below, blue holds fiat, gold holds shares, and the blue lines are money moving between them.

The objects

ObjectWhat it isCreated / read by
ClientYou. The principal your key authenticates as, and the root of your tree.GET /me
Sub-clientOne of your end customers, registered with TCB under your root. Each sub-client holds its own account with TCB, in its own name. You collect the identity information and TCB accepts it. You instruct on the sub-client's behalf.POST /sub-clients, GET /sub-clients
Verification levelWhich onboarding model TCB granted you for your sub-clients, and therefore what a sub-client may do once it is verified.GET /sub-clients/{id}
AccountAn account holding one currency — fiat, or a crypto asset — belonging to you or to one sub-client.POST /accounts, GET /accounts
MAIN / SUBAn account's role. One account per owner per currency, the MAIN; SUB is retired. To hold the same currency separately, open another account.POST /accounts
IBANThe payment coordinate on an account, carrying the owner's verified legal name as the payee name. It is inactive until its owner is verified.POST /accounts/{id}/iban
Vault sub-accountA named partition of your own vault position, used to attribute shares to your own funds, strategies or products.POST /sub-accounts, GET /sub-accounts
PositionWhat a sub-account holds in a vault: settled, reserved and available shares.GET /positions
VaultThe contract your shares live in — one per currency.Named on every money response
TransferAn instant move of fiat between two accounts inside your tree.POST /transfers, GET /transfers

Sub-client, account and vault sub-account

The three names are similar. The objects are not.

Sub-clientAccountVault sub-account
HoldsAn identityFiat or a crypto asset, one per accountVault shares
Belongs toYouYou or a sub-clientYou, always
Whose name is on itYour end customer's, as the payee name on its IBANsThe owner'sYours
Has an IBANNo — its accounts doOptionallyNever
Identified bysubClientIdaccountIdsubAccountId
Your own label for itexternalRefexternalRefexternalRef
Used toHold money attributable to an end customerSend, receive and hold fiat or a crypto assetAttribute a slice of your own position

Registering a sub-client opens accounts for your end customer. Each sub-client holds its own account with TCB, in its own name. You collect the identity information and TCB accepts it. You instruct on the sub-client's behalf. Creating a vault sub-account attributes a slice of your own position to a fund, a strategy or a product of yours. A vault sub-account that stands for one of your end customers must be linked to a registered sub-client; how that link is expressed in the API is being finalised.

Use either, or both. A client that never registers a sub-client can still partition its own position by fund, strategy or product.

If you have seen TCB describe client-money accounts, that is what these two objects are: the sub-client is the end customer whose money it is, and the accounts under it are where that money sits. The API uses the word sub-client everywhere — in every route, field and webhook name — so read it that way.

externalRef and the tcb: namespace

Sub-clients, accounts and vault sub-accounts each take an externalRef: your own identifier, unique within your tree, that you can look the object up by later. Anything starting with tcb: is reserved and refused. TCB uses that namespace for the objects it provisions for you, and there is exactly one today.

tcb:default is the vault sub-account every client holds from the moment the relationship exists. A deposit, withdrawal or conversion that names no subAccountId lands there. You never have to create it and you cannot delete it.

Shares, position and accrual

A deposit converts fiat into shares of a vault. Three rules govern what happens next.

  1. Your shares sit in one wallet TCB custodies for you, not one per sub-account and not one per sub-client. A vault sub-account is a book entry recording which slice of that wallet you attribute to which fund, strategy or product.
  2. The share count does not change. Nothing is credited, compounded or swept on a schedule.
  3. The share price rises as yield accrues. The same share count is worth more each time you read it. That is what accrual means on this API.

A position has three figures per sub-account, and the arithmetic between them is fixed.

FigureMeaning
settledSharesWhat the sub-account holds. The sum of its posted ledger entries.
reservedSharesShares held back against a withdrawal that is in flight from this sub-account.
availableSharessettledShares minus reservedShares — what you can withdraw right now.

Your totals are the sum of the sub-accounts, never a separately stored number, so a total and its decomposition cannot disagree. GET /positions publishes walletShares alongside them. totals.settledShares is your entitlement; walletShares is the holding it is against. They are different facts, so the API states both.

FieldWhat it isWhen to use it
totals.settledSharesYour entitlement — the sum of your sub-accounts' posted ledger entries.Your own book: what you attribute to each fund, strategy or product, and what you report.
totals.walletSharesThe holding — the share balance of the wallet TCB custodies for you, read from the vault.Checking your book against the chain. While a deposit or withdrawal is in flight the two legitimately differ, so a difference is not by itself an error.

Amounts are decimal strings

Every amount on this API is a decimal string, and there is no decimals field anywhere. Parse them with a decimal library, not a float. The scales, including the vault's own share scale, are in Conventions.

Where the money can go

FromToHow
Your fiat accountA vault positionPOST /deposits
A vault positionYour fiat accountPOST /withdrawals
One currency you holdAnother currencyPOST /conversions
One account in your treeAnother account in your treePOST /transfers
An external walletAn account you controlAn on-chain transfer to the address POST /crypto-deposit-addresses issues you
An account you controlA registered destinationPOST /payouts — a bank destination today

The guides cover all six. The states the first four pass through, and what to do at each one, are in The money lifecycle; a crypto deposit's states are in its own guide, and a payout's are in Payouts and its own lifecycle ladder.

Pilot disclosure

On this page