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

Fetch one crypto deposit by id

The deposit in its current state, including a FAILED record, which is reported as the object rather than as an error. This is the fetch half of the thin crypto_deposit.credited webhook payload. The id is stable across replays of the same on-chain transfer.

GET
/api/partner/v1/crypto-deposits/{id}

The deposit in its current state, including a FAILED record, which is reported as the object rather than as an error. This is the fetch half of the thin crypto_deposit.credited webhook payload. The id is stable across replays of the same on-chain transfer.

AuthorizationBearer <token>

In: header

Path Parameters

id*string

The cryptoDepositId from the list, or carried by the event's resource pointer.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/partner/v1/crypto-deposits/2b7e1c6a-2d59-46a4-8f38-7c1542be9038"
{  "data": {    "amount": "1000",    "asset": "USDC",    "chain": "ARBITRUM",    "creditedAccountId": "7e2a0c53-4d81-49b6-8f37-1a5c9e0b2d74",    "creditedAt": {},    "cryptoDepositId": "2b7e1c6a-2d59-46a4-8f38-7c1542be9038",    "detectedAt": "2026-09-02T10:15:30.000Z",    "disclosure": {      "items": [        "ENVIRONMENT_IS_TESTNET: The environment is a testnet (Arbitrum Sepolia). No mainnet deployment exists.",        "YIELD_IS_SIMULATED: The vault rate is set administratively and the interest it produces is minted as fresh underlying, not earned. It does not represent a return generated by deployed capital.",        "FIAT_RAILS_ARE_MOCKED: No real fiat movement occurs. Balances are ledger entries against a sandbox provider.",        "CONVERSION_RATES_ARE_MARKET_QUOTED_OR_REFUSED: A conversion is priced only by an external venue that quotes independently of TCB. When no such venue can price the pair, the conversion is refused rather than priced from an internal table. Read rate.pricingModel on every conversion: MARKET is a venue quote; any other value is not a market rate and must not be presented as one.",        "CONTRACTS_ARE_UNAUDITED: No audit has been performed. Mainnet is gated on a two-firm audit that has not been commissioned.",        "CUSTODY_IS_TCB_SUBACCOUNT: Everything held for the client — its vault shares, and the tcbUSD it holds between the steps of the tokenised deposit chain — is held in TCB custody, in the one TCB wallet assigned to the client. The client holds no keys and moves those tokens only through this API; each sub-account's shares and tcbUSD are book entries against what that wallet holds.",        "INTEGRATION_AGREEMENT_ONLY: Fees as published on the rate card; no yield share, no return commitment."      ],      "summary": "This is a pilot integration on a testnet. Nothing in this system earns anything: the yield is simulated and the fiat rails are mocked.",      "version": "2026-10-27"    },    "status": "CREDITED",    "transferIndex": "2",    "txHash": "0x4a1f9c07d3b28e615a0c47f8d29b3e6c15087af2d94b6c308e17b5d02fa4c396"  },  "success": true,  "timestamp": "2026-09-02T10:15:30.000Z"}

List crypto deposits GET

Every recorded arrival at your deposit addresses, newest first — credited deposits and FAILED records alike. A deposit appears here the moment it is recorded; there is no POST, because a crypto deposit is initiated on-chain and the transfer itself is the request.

Convert one currency you hold into another POST

Sells an exact amount of fromCurrency for toCurrency between two accounts you already hold, executed by TCB's trading pipeline. It is a stage in its own right, not something the deposit or withdrawal endpoints do for you: convert first, read the rate you got, then deposit or withdraw. An idempotency key is MANDATORY: send it as the Idempotency-Key header or as the idempotencyKey body field. Replaying a key returns the original result without re-executing; reusing one with different parameters is rejected with IDEMPOTENCY_KEY_REUSED. The rate comes only from an external venue that prices independently of TCB. When no such venue can price the pair, the request is refused with 503 PRICING_UNAVAILABLE and nothing is converted — TCB never prices a conversion from an internal table instead. READ rate.pricingModel ON EVERY RESPONSE: MARKET means a venue quoted it; any other value (SIMULATED appears only on conversions settled before 2026-09-06) is not a market rate and must never be presented or reported as one. Every response also carries the pilot disclosure. Converting into a currency and straight back out is priced twice. A shared trading risk check limits order rate, size and daily volume, scoped to your client principal — every sub-account shares one bucket. A refusal is 400 CONVERSION_RISK_REJECTED with details.reasons listing the failed checks. Name toAccountId to end the conversion in another account of your tree: one of your own fiat accounts in toCurrency, or a sub-client's. Into a sub-client's account the converted amount lands in your own account first and moves on in the same step that settles the conversion; transferId names that move. A key naming toAccountId needs transfer:execute as well as trade:execute. To see the rate and the commission before you convert, quote the conversion first (POST /conversions/quote) and name the quoteId here: the conversion then executes at that quote and is never re-quoted. Every response states the commission charged (commission) and networkFee, which is always null: TCB covers any network cost.