Create or amend the network profile
The handle is set once. Sending a different handle later is refused with 409 HANDLE_IMMUTABLE — changing one is a support action, because a handle that could be re-issued is one a payer's saved payee could silently start pointing at somebody else. With x-on-behalf-of the profile is that sub-client's, and its handle is namespaced under yours: acme/zayn-retail.
The handle is set once. Sending a different handle later is refused with 409 HANDLE_IMMUTABLE — changing one is a support action, because a handle that could be re-issued is one a payer's saved payee could silently start pointing at somebody else. With x-on-behalf-of the profile is that sub-client's, and its handle is namespaced under yours: acme/zayn-retail.
Authorization
bearer In: header
Header Parameters
Act on behalf of one of your sub-clients. The value is that sub-client id, and the request then reads and writes that sub-client's own accounts and registry rows rather than yours. Omit it to act as yourself. A route that does not accept the header refuses it with 400 ON_BEHALF_OF_NOT_ALLOWED_HERE rather than ignoring it — that includes every vault route (deposits, withdrawals, conversions, sub-accounts, positions), the webhook registry, and POST /sub-clients, since a sub-client never has sub-clients of its own. An id that is not one of your sub-clients answers 404 ON_BEHALF_OF_NOT_FOUND; a closed one answers 409 ON_BEHALF_OF_SUB_CLIENT_CLOSED; and a key restricted to a subset of your sub-clients answers 403 ON_BEHALF_OF_NOT_ALLOWED_FOR_KEY for any node outside it.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
How this member is addressed on the network: the handle it is paid by, whether it is listed in search, whether it accepts settlements from anyone, the trading names it is also known by, and whether what it receives is converted into one currency on arrival.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PUT "https://example.com/api/partner/v1/network/profile" \ -H "Content-Type: application/json" \ -d '{ "aliases": [ "Acme Trading" ], "discoverable": false, "handle": "acme-treasury", "inboundConversionCurrency": "EUR", "receivePolicy": "ANYONE" }'{ "data": { "aliases": [ "Acme Trading" ], "clientAccountId": "9f1c2a54-7b3d-4e08-9a61-2c5f0b7d4e13", "createdAt": "2026-09-08T10: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" }, "discoverable": false, "handle": "acme-treasury", "inboundConversionCurrency": null, "receivePolicy": "ANYONE", "retiredAt": null, "updatedAt": "2026-09-08T10:15:30.000Z" }, "success": true, "timestamp": "2026-09-02T10:15:30.000Z"}Read the network profile GET
Your own, or — with x-on-behalf-of — that sub-client's. null when the node has not joined the network yet.
Resolve a handle or a TCB IBAN to a member GET
Supply exactly one of handle or iban, and optionally the name you believe you are paying. The answer carries the verified legal name, the currencies that member can receive, and a verdict on your name: MATCH is the legal name exactly, CLOSE_MATCH is a trading name or a near miss, NO_MATCH is neither, and null means you supplied no name to check. Cite resolveToken on POST /settlements so what you were shown is what you pay; it lasts ten minutes.