Remove a destination
Takes the destination out of use. The record is kept — the response and later reads show it with deletedAt set — and nothing can be sent to it once removed. Removing an already-removed destination answers its current state, so a retry is safe.
Takes the destination out of use. The record is kept — the response and later reads show it with deletedAt set — and nothing can be sent to it once removed. Removing an already-removed destination answers its current state, so a retry is safe.
Authorization
bearer In: header
Path Parameters
The destination id, as returned by POST /beneficiaries.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X DELETE "https://example.com/api/partner/v1/beneficiaries/9b3e5c17-2a80-4f64-b1d9-6c0e8a4f2d53"{ "data": { "addressFamily": "EVM", "beneficiaryId": "9b3e5c17-2a80-4f64-b1d9-6c0e8a4f2d53", "chain": null, "createdAt": "2026-09-03T10:15:30.000Z", "currency": "EUR", "deletedAt": null, "details": { "bicSwift": "COBADEFFXXX", "iban": "DE89370400440532013000" }, "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" }, "extensibility": { "extensible": false, "reason": "OWNERSHIP_NOT_PROVEN" }, "extensible": false, "instrumentId": "1d7a9f42-6b05-4e83-a2c1-8f3b0d6e4c97", "kind": "FIAT_BANK", "last4": "3000", "name": "Acme Supplies GmbH", "networks": [ { "addedAt": "2026-10-21T10:15:30.000Z", "chain": "ARBITRUM", "id": "4f0c2a91-7d3e-4b58-9a16-2e8d5c7b0f34", "screening": { "at": "2026-09-02T10:15:30.000Z", "result": "CLEAR" }, "status": "ACTIVE" } ], "ownership": { "at": null, "proven": false }, "rail": "SEPA", "reachableChains": [ "ETHEREUM", "POLYGON", "ARBITRUM" ], "screening": { "status": "CLEAR" }, "status": "PENDING_APPROVAL", "usable": false, "usableAt": null }, "success": true, "timestamp": "2026-09-02T10:15:30.000Z"}Fetch one destination by id GET
The destination in its current state — where it stands in the lifecycle, and whether a payout may name it right now (usable). A destination belonging to any other principal answers 404 rather than 403, so an id cannot be probed for existence. Removed destinations stay readable, with deletedAt set.
Pay a registered destination POST
Sends fiat from one of your accounts to a destination you registered and that has completed screening, TCB approval and its holding period. The request names the destination by instrumentId — there is no way to pass raw bank details. Before anything is charged the payout is checked against your money caps, your balance, and the destination's current state; it is checked again immediately before the money leaves. The payout pays the Sending fee for the rail it travels (the destination's rail), the same per-rail fee a payment sent from the TCB app pays: on top of amount, in the same currency, from the same source account, so the account must cover both. The response states it as fee. Money caps count amount alone. To see the fee before you pay, quote the payout first (POST /payouts/quote) and name the quoteId here: the payout is then charged the quoted fee. The fee is refunded with the payout whenever the payout is refunded or returned. The response is PROCESSING once the rail has accepted the payment; settlement arrives as the payout.settled webhook, or on GET /partner/v1/payouts/{id}. An idempotency key is MANDATORY: send it as the Idempotency-Key header or as the idempotencyKey body field. Replaying a key returns the same payout in its current state without paying again; reusing one with different parameters is rejected with IDEMPOTENCY_KEY_REUSED. Every response carries the pilot disclosure: the fiat rail is mocked, so no real money moves. Send x-on-behalf-of to pay with one of your sub-clients' money: the payment then leaves that sub-client's own account and carries its own name and account details as the sending party, never yours. The destination is still one from YOUR registry, and a destination you filed for a different sub-client is not payable from this one. The sub-client needs the sendExternal capability. The header is part of the payment: the same idempotency key with and without it is rejected as reused.