Skip to main content

Overview

On-chain deposits let your users send crypto over a blockchain network to a deposit address held in custody by DCS. Once credited, the funds appear in the user’s dedicated account balance at DCS (availableBalance) and can be spent with a linked card. The whole flow runs on the blockchain, so no partner float or intermediary funding is required. As a licensed issuer with its own BINs, DCS handles on-chain monitoring, confirmation, and crediting on your behalf, turning “crypto → available balance → card payment” into a single path. The flow is: the user sends crypto in → the platform monitors and confirms it → the funds are credited as available balance. Two core steps:
  1. Call GET /crypto/v2/deposit-address (recommended) to obtain the user’s deposit address on the chosen chain and token; no address is returned when the chain or token is unsupported or deposits are disabled.
  2. The user transfers to that address; the platform monitors the on-chain transaction, credits the funds once the confirmation count is reached, and pushes ORDER_STATUS over webhook and WebSocket.

Prerequisites

Before making an on-chain deposit, the user must complete the following compliance steps. Otherwise no deposit address can be issued and no funds can be credited:

Key concepts

Chain model

The chain model means the user moves crypto directly over a blockchain network by transferring it to an on-chain address issued by the platform (an inbound deposit). The platform keeps the whole flow traceable through the blockchain transaction hash (txHash).

Deposit address

The receiving address the platform allocates to a user for a specific chain and token. Any transfer of the matching asset to that address counts as a deposit into the user’s DCS account.

Confirmation

An on-chain transaction must reach a certain number of block confirmations before it is treated as final. DCS configures the required count per chain, and it varies by chain; no endpoint returns it, so confirm with DCS if you need to show it to users.

API flow

Crypto deposit flowCrypto deposit flow

Endpoints in detail

Step 1: obtain the deposit address

Query parameters: GET /crypto/v2/deposit-address — data fields:
fxRate (conversion rate) lets you show a converted amount, and status tells you whether the address is ready. The minimum deposit and confirmation count are not returned here. When the chain or token does not exist, data is empty; when deposits are disabled for it, the error code NETWORK_COIN_CONFIG_NOT_SUPPORTED is returned.
Request example (placeholders/redacted; for authentication headers see Integration Resources · Authentication guide):
Response example (v2, populated, address is a placeholder):
The response envelope is the same across the documentation: { code, message, messageDetail, data } (no success boolean). messageDetail is normally null; when populated it is an object {message, title, type, icon, action, linkTitle, linkUrl}. The success value of code is SYS_SUCCESS (identical in both integration models).

What happens once the funds arrive

  1. User transfer: the user sends crypto of the matching chain and token to the deposit address, producing a transaction hash txHash on-chain.
  2. Platform monitoring: DCS watches the blockchain network and waits for the transaction to reach the confirmation count that chain requires.
  3. Crediting: once the confirmation count is reached, the funds are credited to the user’s account balance at DCS (the dedicated account availableBalance).
  4. Status push: DCS pushes ORDER_STATUS order status changes in real time over webhook and WebSocket (see Integration Resources · WebSocket real-time push).
  5. Partner query: the partner can call GET /card/v1/fiat/transactions?externalUserId=... at any time to retrieve deposit and fiat transaction records and reconcile what was credited.
For a deposit record in fiat/transactions, the on-chain details sit in the transferDetails sub-object, which contains channelCode, txnAmt, txnCcy, sender, receiving, timeStamp, txHash, network, and asset.
Real-time push is the proactive “funds credited” notification; fiat/transactions is the on-demand reconciliation query. Use both: let WebSocket drive UI updates and use fiat/transactions for final reconciliation.
Time to credit: deposits in DPT mode are typically credited in about 2 minutes (after the on-chain confirmation count is reached). Actual timing varies with network congestion and the required confirmation count; treat the WebSocket push and the status in fiat/transactions as authoritative.

Supported chain and token matrix

The supported chains and tokens are whatever GET /crypto/v2/deposit-address can return an address for; the configuration changes with the business, so do not hard-code a static list.
On the sandbox: sandbox deposit simulation currently supports only two pairs: TRON + USDT and Ethereum + USDC.

Simulating a deposit in the sandbox

To test the on-chain deposit and crediting flow, use the simulation endpoint to create a credit directly:
Request body (placeholder template; do not copy a specific chain or token from it):
When filling this in, set address to the deposit address obtained in step 3. chain and currency currently support only two pairs: TRON + USDT and Ethereum + USDC. Simulated deposits work in the sandbox only, and exist to trigger crediting and the ORDER_STATUS push (webhook and WebSocket) so you can verify your integration; the endpoint returns the simulated txHash. For an overview of the simulation endpoints and other sandbox capabilities, see Simulating Transactions.

Error handling

Request the full error code dictionary from the DCS team; for any specific failure, the code and message returned by the API are authoritative.

Next steps