Deposits & Withdrawals

Complete workflow for moving funds in and out

Deposits and Withdrawals

This guide covers the complete workflow for depositing and withdrawing funds.

Overview

The platform supports:

  • Crypto deposits/withdrawals: On-chain transactions via whitelisted addresses
  • Fiat deposits/withdrawals: Bank transfers

Prerequisites

  • Authenticated session (JWT or API key)
  • CanDeposit permission (for deposits)
  • CanWithdraw permission (for withdrawals)
  • Verified Client Account

Part 1: Whitelisted External Addresses

Before making crypto withdrawals, you must whitelist destination addresses.

Step 1: Create Whitelisted Address

Endpoint: POST /api/rest/v1/investors/addresses/external

Request

curl -X POST "https://api.t-dx.com/api/rest/v1/investors/addresses/external" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "instrumentId": "7a3fae7e-5a17-4931-821c-54b021f643da",
    "address": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq",
    "label": "My Hardware Wallet",
    "memo": ""
  }'

Request Fields

FieldTypeRequiredDescription
instrumentIdUUIDYesInstrument ID (e.g., BTC)
addressstringYesBlockchain address
labelstringYesHuman-readable label
memostringNoMemo/tag (required for some chains)

Response (200 OK)

{
  "result": {
    "id": "whitelist-uuid",
    "instrumentId": "7a3fae7e-5a17-4931-821c-54b021f643da",
    "address": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq",
    "label": "My Hardware Wallet",
    "status": "STATUS_PENDING_CONFIRMATION",
    "createdAt": "2024-01-15T10:30:00Z"
  }
}

Step 2: Resend Confirmation Code (if needed)

Endpoint: POST /api/rest/v1/investors/addresses/external/init

curl -X POST "https://api.t-dx.com/api/rest/v1/investors/addresses/external/init" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "addressId": "whitelist-uuid"
  }'

Step 3: Confirm Address Whitelisting

After receiving the confirmation code via email, confirm with 2FA.

Endpoint: POST /api/rest/v1/investors/addresses/external/confirm

curl -X POST "https://api.t-dx.com/api/rest/v1/investors/addresses/external/confirm" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "code": "123456789",
    "challenge": "123456"
  }'

Request Fields

FieldTypeRequiredDescription
codestringYesValidation code from email
challengestringYes2FA TOTP code

Step 4: Verify Address (for some addresses)

Some addresses require additional verification.

Endpoint: POST /api/rest/v1/investors/addresses/external/verify

curl -X POST "https://api.t-dx.com/api/rest/v1/investors/addresses/external/verify" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "addressId": "whitelist-uuid"
  }'

Response (200 OK)

{
  "address": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq",
  "amount": "0.00001",
  "validUntil": "2024-01-15T12:30:00Z"
}

Step 5: List Whitelisted Addresses

Endpoint: GET /api/rest/v1/investors/addresses/external

curl -X GET "https://api.t-dx.com/api/rest/v1/investors/addresses/external" \
  -H "Authorization: Bearer <access-token>"

Query Parameters

This endpoint supports standard pagination, sorting, and filtering.

Response (200 OK)

{
  "result": [
    {
      "id": "whitelist-uuid",
      "instrumentId": "7a3fae7e-5a17-4931-821c-54b021f643da",
      "address": "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq",
      "label": "My Hardware Wallet",
      "status": "STATUS_ACTIVE",
      "createdAt": "2024-01-15T10:30:00Z"
    }
  ],
  "pagination": {
    "cursors": {
      "self": "eyJTb3J0cyI6W10sIkZpbHRlcnMiOltdLCJJc0ZpcnN0Ijp0cnVlfQ==",
      "first": "eyJTb3J0cyI6W10sIkZpbHRlcnMiOltdLCJJc0ZpcnN0Ijp0cnVlfQ==",
      "last": "",
      "next": "",
      "previous": ""
    }
  }
}

Step 6: Get Specific Address

Endpoint: GET /api/rest/v1/investors/addresses/external/{id}

curl -X GET "https://api.t-dx.com/api/rest/v1/investors/addresses/external/whitelist-uuid" \
  -H "Authorization: Bearer <access-token>"

Step 7: Delete Whitelisted Address

Endpoint: DELETE /api/rest/v1/investors/addresses/external/{id}

curl -X DELETE "https://api.t-dx.com/api/rest/v1/investors/addresses/external/whitelist-uuid" \
  -H "Authorization: Bearer <access-token>"

Part 2: Bank Accounts

Step 1: List Bank Accounts

Endpoint: GET /api/rest/v1/bank-accounts/mine

curl -X GET "https://api.t-dx.com/api/rest/v1/bank-accounts/mine" \
  -H "Authorization: Bearer <access-token>"

Response (200 OK)

{
  "result": [
    {
      "id": "bank-account-uuid",
      "iban": "CH93 0076 2011 6238 5295 7",
      "currency": "",
      "bank": {
        "swiftbic": "EXBKCHZZ",
        "name": "My Bank AG",
        "street": "",
        "postalCode": "",
        "city": "",
        "country": "CH",
        "sicCode": ""
      },
      "owner": {
        "name": "John Doe",
        "street": "",
        "postalCode": "",
        "city": "",
        "country": ""
      },
      "label": "My Primary Account",
      "instrumentId": "8b4gbf8f-6b28-5042-932d-65c132g754eb",
      "externalBankAccountNumber": "",
      "createdAt": "2024-01-15T10:30:00Z"
    }
  ],
  "pagination": {
    "cursors": {
      "self": "eyJTb3J0cyI6W10sIkZpbHRlcnMiOltdLCJJc0ZpcnN0Ijp0cnVlfQ==",
      "first": "eyJTb3J0cyI6W10sIkZpbHRlcnMiOltdLCJJc0ZpcnN0Ijp0cnVlfQ==",
      "last": "",
      "next": "",
      "previous": ""
    }
  }
}

Bank Account Fields

FieldTypeDescription
idUUIDBank account identifier
ibanstringIBAN number
currencystringCurrency code (optional)
bankobjectBank information
bank.swiftbicstringSWIFT/BIC code
bank.namestringBank name
bank.countrystringBank country code
ownerobjectAccount holder information
owner.namestringAccount holder name
labelstringUser-defined label
instrumentIdUUIDAssociated fiat instrument ID
externalBankAccountNumberstringExternal account number (if applicable)
createdAttimestampCreation time

Step 2: Create Bank Account

Endpoint: POST /api/rest/v1/bank-accounts/mine

curl -X POST "https://api.t-dx.com/api/rest/v1/bank-accounts/mine" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "bankAccount": {
      "iban": "CH93 0076 2011 6238 5295 7",
      "bank": {
        "swiftbic": "EXBKCHZZ",
        "name": "My Bank AG",
        "country": "CH"
      },
      "owner": {
        "name": "John Doe"
      },
      "label": "My Primary Account",
      "instrumentId": "8b4gbf8f-6b28-5042-932d-65c132g754eb"
    }
  }'

Step 3: Delete Bank Account

Endpoint: DELETE /api/rest/v1/bank-accounts/mine/{id}

curl -X DELETE "https://api.t-dx.com/api/rest/v1/bank-accounts/mine/bank-account-uuid" \
  -H "Authorization: Bearer <access-token>"

Part 3: Deposits

Step 1: Create Deposit Declaration

Declare an incoming deposit (required for tracking).

Endpoint: POST /api/rest/v1/deposits

Request (Crypto Deposit)

curl -X POST "https://api.t-dx.com/api/rest/v1/deposits" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "subAccountId": "7376524e-6b6b-4137-9719-7e07a7709804",
    "instrumentId": "7a3fae7e-5a17-4931-821c-54b021f643da",
    "declaredQuantity": "0.50000000",
    "sourceType": "SOURCE_TYPE_CRYPTO_ADDRESS",
    "externalAddressId": "whitelist-uuid"
  }'

Request (Fiat Deposit)

curl -X POST "https://api.t-dx.com/api/rest/v1/deposits" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "subAccountId": "7376524e-6b6b-4137-9719-7e07a7709804",
    "instrumentId": "8b4gbf8f-6b28-5042-932d-65c132g754eb",
    "declaredQuantity": "10000.00",
    "sourceType": "SOURCE_TYPE_BANK_ACCOUNT",
    "bankAccountId": "bank-account-uuid"
  }'

Request Fields

FieldTypeRequiredDescription
subAccountIdUUIDYesSub-account to credit
instrumentIdUUIDYesInstrument ID
declaredQuantitydecimalYesExpected deposit amount
sourceTypeenumYesSource type (see below)
externalAddressIdUUIDNoWhitelisted address ID (for crypto)
bankAccountIdUUIDNoBank account ID (for fiat)
thirdPartyExchangeenumNoExternal exchange name

Source Types

ValueDescription
SOURCE_TYPE_BANK_ACCOUNTFiat bank transfer
SOURCE_TYPE_CRYPTO_ADDRESSCrypto from external address
SOURCE_TYPE_INTERNALInternal transfer

Response (200 OK)

{
  "result": {
    "id": "deposit-uuid",
    "clientAccountId": "8aee564e-2eb1-4a57-b686-05476c2cfd93",
    "subAccountId": "7376524e-6b6b-4137-9719-7e07a7709804",
    "instrumentId": "7a3fae7e-5a17-4931-821c-54b021f643da",
    "declaredQuantity": "0.50000000",
    "status": "STATUS_NEW",
    "type": "TYPE_CRYPTO",
    "sourceType": "SOURCE_TYPE_CRYPTO_ADDRESS",
    "createdAt": "2024-01-15T10:30:00Z",
    "updatedAt": "2024-01-15T10:30:00Z"
  }
}

Step 2: List Deposits

Endpoint: GET /api/rest/v1/deposits/by-sub-account/{subAccountId}

curl -X GET "https://api.t-dx.com/api/rest/v1/deposits/by-sub-account/7376524e-6b6b-4137-9719-7e07a7709804" \
  -H "Authorization: Bearer <access-token>"

Query Parameters

This endpoint supports standard pagination, sorting, and filtering.

ParameterTypeDescription
fields[]stringLoad sub-resources (e.g., instrument)

Supported filters: instrument_id, status

Response (200 OK)

{
  "result": [
    {
      "id": "deposit-uuid",
      "clientAccountId": "8aee564e-2eb1-4a57-b686-05476c2cfd93",
      "subAccountId": "7376524e-6b6b-4137-9719-7e07a7709804",
      "userId": "user-uuid",
      "instrumentId": "7a3fae7e-5a17-4931-821c-54b021f643da",
      "externalId": "external-reference",
      "declaredQuantity": "0.50000000",
      "receivedQuantity": "0.50000000",
      "status": "STATUS_EXECUTED",
      "type": "TYPE_CRYPTO",
      "messageId": "123456789",
      "referenceNumber": "deposit-ref",
      "valuedAt": "2024-01-15T11:30:00Z",
      "cryptoTransactionId": "",
      "externalAddressId": "whitelist-uuid",
      "thirdPartyExchange": "THIRD_PARTY_EXCHANGE_UNDEFINED",
      "fee": "0.00",
      "attributes": [],
      "createdAt": "2024-01-15T10:30:00Z",
      "updatedAt": "2024-01-15T11:30:00Z"
    }
  ],
  "pagination": {
    "cursors": {
      "self": "eyJTb3J0cyI6W10sIkZpbHRlcnMiOltdLCJJc0ZpcnN0Ijp0cnVlfQ==",
      "first": "eyJTb3J0cyI6W10sIkZpbHRlcnMiOltdLCJJc0ZpcnN0Ijp0cnVlfQ==",
      "last": "",
      "next": "",
      "previous": ""
    }
  }
}

Deposit Fields

FieldTypeDescription
idUUIDDeposit identifier
clientAccountIdUUIDClient account ID
subAccountIdUUIDSub-account ID
userIdUUIDUser who declared the deposit
instrumentIdUUIDInstrument being deposited
externalIdstringExternal reference ID
declaredQuantitydecimalAmount declared
receivedQuantitydecimalAmount received
statusenumDeposit status (see below)
typeenumTYPE_CRYPTO or TYPE_BANK_TRANSFER
messageIdstringInternal message reference
referenceNumberstringReference for tracking
valuedAttimestampValue date (null if pending)
cryptoTransactionIdstringBlockchain transaction ID (for crypto)
externalAddressIdUUIDSource address ID (for crypto)
thirdPartyExchangeenumThird party exchange if applicable
feedecimalFee amount
attributesarrayAdditional attributes
createdAttimestampCreation time
updatedAttimestampLast update time

Deposit Status Values

StatusDescription
STATUS_NEWDeposit declared, awaiting funds
STATUS_TO_CONFIRMAwaiting confirmation
STATUS_CONFIRMEDConfirmed, processing
STATUS_IN_PROGRESSProcessing in progress
STATUS_EXECUTEDCompleted, balance credited
STATUS_FAILEDDeposit failed
STATUS_CANCELEDCancelled

Step 3: Get Specific Deposit

Endpoint: GET /api/rest/v1/deposits/by-sub-account/{subAccountId}/{id}

curl -X GET "https://api.t-dx.com/api/rest/v1/deposits/by-sub-account/7376524e-6b6b-4137-9719-7e07a7709804/deposit-uuid" \
  -H "Authorization: Bearer <access-token>"

Step 4: Cancel Deposit

Cancel a pending deposit declaration.

Endpoint: POST /api/rest/v1/deposits/by-sub-account/{subAccountId}/{id}/cancel

curl -X POST "https://api.t-dx.com/api/rest/v1/deposits/by-sub-account/7376524e-6b6b-4137-9719-7e07a7709804/deposit-uuid/cancel" \
  -H "Authorization: Bearer <access-token>"

Part 4: Withdrawals

Step 1: Create Withdrawal

Endpoint: POST /api/rest/v1/withdrawals

Request (Crypto Withdrawal)

curl -X POST "https://api.t-dx.com/api/rest/v1/withdrawals" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "subAccountId": "7376524e-6b6b-4137-9719-7e07a7709804",
    "instrumentId": "7a3fae7e-5a17-4931-821c-54b021f643da",
    "quantity": "0.50000000",
    "externalAddressId": "whitelist-uuid"
  }'

Request (Fiat Withdrawal)

curl -X POST "https://api.t-dx.com/api/rest/v1/withdrawals" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "subAccountId": "7376524e-6b6b-4137-9719-7e07a7709804",
    "instrumentId": "8b4gbf8f-6b28-5042-932d-65c132g754eb",
    "quantity": "10000.00",
    "bankAccountId": "bank-account-uuid"
  }'

Request Fields

FieldTypeRequiredDescription
subAccountIdUUIDYesSub-account to debit
instrumentIdUUIDYesInstrument ID
quantitydecimalYesWithdrawal amount
externalAddressIdUUIDNoWhitelisted address (for crypto)
bankAccountIdUUIDNoBank account (for fiat)

Response (200 OK)

{
  "result": {
    "id": "withdrawal-uuid",
    "clientAccountId": "8aee564e-2eb1-4a57-b686-05476c2cfd93",
    "subAccountId": "7376524e-6b6b-4137-9719-7e07a7709804",
    "instrumentId": "7a3fae7e-5a17-4931-821c-54b021f643da",
    "quantity": "0.50000000",
    "fee": "0.00005000",
    "status": "STATUS_PENDING_USER_CONFIRMATION",
    "type": "TYPE_CRYPTO",
    "externalAddressId": "whitelist-uuid",
    "createdAt": "2024-01-15T10:30:00Z",
    "updatedAt": "2024-01-15T10:30:00Z"
  }
}

Step 2: Initialize Withdrawal Confirmation

Request a confirmation code via email.

Endpoint: POST /api/rest/v1/withdrawals/init

curl -X POST "https://api.t-dx.com/api/rest/v1/withdrawals/init" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "withdrawalId": "withdrawal-uuid",
    "subAccountId": "7376524e-6b6b-4137-9719-7e07a7709804"
  }'

Step 3: Confirm Withdrawal

Confirm with email code and 2FA.

Endpoint: POST /api/rest/v1/withdrawals/confirm

curl -X POST "https://api.t-dx.com/api/rest/v1/withdrawals/confirm" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "code": "123456789",
    "challenge": "123456"
  }'

Request Fields

FieldTypeRequiredDescription
codestringYesValidation code from email
challengestringYes2FA TOTP code

Step 4: List Withdrawals

Endpoint: GET /api/rest/v1/withdrawals/by-sub-account/{subAccountId}

curl -X GET "https://api.t-dx.com/api/rest/v1/withdrawals/by-sub-account/7376524e-6b6b-4137-9719-7e07a7709804" \
  -H "Authorization: Bearer <access-token>"

Query Parameters

This endpoint supports standard pagination, sorting, and filtering.

ParameterTypeDescription
fields[]stringLoad sub-resources (e.g., instrument, external_address)

Supported filters: instrument_id, status

Response (200 OK)

{
  "result": [
    {
      "id": "withdrawal-uuid",
      "clientAccountId": "8aee564e-2eb1-4a57-b686-05476c2cfd93",
      "subAccountId": "7376524e-6b6b-4137-9719-7e07a7709804",
      "userId": "user-uuid",
      "instrumentId": "7a3fae7e-5a17-4931-821c-54b021f643da",
      "externalId": "external-reference",
      "quantity": "0.50000000",
      "fee": "0.00005000",
      "feeInstrumentId": "7a3fae7e-5a17-4931-821c-54b021f643da",
      "status": "STATUS_EXECUTED",
      "type": "TYPE_CRYPTO",
      "messageId": "123456789",
      "valuedAt": "2024-01-15T10:45:00Z",
      "externalAddressId": "whitelist-uuid",
      "bankAccountId": "",
      "attributes": [],
      "externalAddress": null,
      "instrument": null,
      "createdAt": "2024-01-15T10:30:00Z",
      "updatedAt": "2024-01-15T10:45:00Z"
    }
  ],
  "pagination": {
    "cursors": {
      "self": "eyJTb3J0cyI6W10sIkZpbHRlcnMiOltdLCJJc0ZpcnN0Ijp0cnVlfQ==",
      "first": "eyJTb3J0cyI6W10sIkZpbHRlcnMiOltdLCJJc0ZpcnN0Ijp0cnVlfQ==",
      "last": "",
      "next": "",
      "previous": ""
    }
  }
}

Withdrawal Fields

FieldTypeDescription
idUUIDWithdrawal identifier
clientAccountIdUUIDClient account ID
subAccountIdUUIDSub-account ID
userIdUUIDUser who initiated the withdrawal
instrumentIdUUIDInstrument being withdrawn
externalIdstringExternal reference ID
quantitydecimalWithdrawal amount
feedecimalFee amount
feeInstrumentIdUUIDInstrument ID for fee
statusenumWithdrawal status (see below)
typeenumTYPE_CRYPTO or TYPE_BANK_TRANSFER
messageIdstringInternal message reference
valuedAttimestampValue date (null if pending)
externalAddressIdUUIDWhitelisted address (for crypto)
bankAccountIdUUIDBank account (for fiat)
attributesarrayAdditional attributes
externalAddressobjectPopulated when fields=external_address
instrumentobjectPopulated when fields=instrument
createdAttimestampCreation time
updatedAttimestampLast update time

Withdrawal Status Values

StatusDescription
STATUS_ACTIVEWithdrawal created, awaiting confirmation
STATUS_PENDING_USER_CONFIRMATIONAwaiting user confirmation (2FA)
STATUS_TO_CONFIRMAwaiting admin confirmation
STATUS_ACCEPTEDAccepted, processing
STATUS_PENDING_BOOKING_IN_CORE_BANKING_SYSTEMPending core banking
STATUS_PENDING_EXECUTIONPending execution
STATUS_EXECUTEDCompleted
STATUS_REFUSEDRefused by admin
STATUS_CANCELEDCancelled by user
STATUS_FAILEDFailed

Step 5: Get Specific Withdrawal

Endpoint: GET /api/rest/v1/withdrawals/by-sub-account/{subAccountId}/{id}

curl -X GET "https://api.t-dx.com/api/rest/v1/withdrawals/by-sub-account/7376524e-6b6b-4137-9719-7e07a7709804/withdrawal-uuid" \
  -H "Authorization: Bearer <access-token>"

Step 6: Cancel Unconfirmed Withdrawal

Cancel a withdrawal before confirmation.

Endpoint: POST /api/rest/v1/withdrawals/unconfirmed/cancel

curl -X POST "https://api.t-dx.com/api/rest/v1/withdrawals/unconfirmed/cancel" \
  -H "Authorization: Bearer <access-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "withdrawalId": "withdrawal-uuid",
    "subAccountId": "7376524e-6b6b-4137-9719-7e07a7709804"
  }'

Error Scenarios

StatusCodeDescription
400INVALID_ARGUMENTInvalid address format or amount
403NOT_ENOUGH_FUNDSInsufficient balance
403WITHDRAWAL_NOT_ENABLEDWithdrawals disabled for instrument
403DEPOSIT_NOT_ENABLEDDeposits disabled for instrument
404NOT_FOUNDWithdrawal, deposit, or address not found
409ALREADY_EXISTSAddress already whitelisted
422FAILED_PRECONDITIONAmount below minimum threshold

Related




  © 2025 Taurus SA. All rights reserved.