Receiving On-Chain Transfers

Generating deposit addresses and receiving on-chain transfers

Receiving on-chain transfers is a relatively straightforward process. The Cybrid Platform interacts with real-world blockchains both for Sandbox and Production banks when generating on-chain addresses as well as when receiving deposits to those addresses.

For Sandbox banks, the generated on-chain wallet addresses are created on the blockchain's associated development network.

For Production banks, the generated on-chain wallet addresses are generated on the blockchain's associated mainnet network.

❗️

The instructions below do not apply to generating on-chain deposit addresses for tokens, e.g., USDC, on the Solana blockchain

Solana requires that "rent" be paid in order to generate a token deposit address. This applies to both addresses generated in both the Production and Sandbox environments.

In Production, rent is automatically paid by the Cybrid Platform and you are invoiced for the rent at the end of the month. Rent on the Solana blockchain is 0.01 SOL for each token deposit address you generate.

In Sandbox, rent needs to be funded by you please see this article on how to successfully generate a deposit address for tokens, e.g., USDC, in Sandbox on Solana.

Note: if you do not follow these instructions your deposit address will be stuck in the storing state indefinitely.

The first step in generating an on-chain deposit address is to create a trading account for the asset. You can follow our guide here to generate a trading account.

Once your trading account is created, you can create a deposit address by hitting the POST /api/deposit_addresses endpoint with the following parameters:

{
  "account_guid": "<trading account guid>"
}

You can find the full API reference for this endpoint here.

The response you'll initially receive from the POST call will look something like this:

{
  "created_at": "2025-07-31T11:27:28.628086Z",
  "updated_at": "2025-07-31T11:27:28.628086Z",
  "guid": "<deposit address guid>",
  "bank_guid": "<your bank guid>",
  "customer_guid": "<your customer's guid>",
  "account_guid": "<trading account guid>",
  "asset": "<the asset of the trading account>",
  "state": "storing",
  "labels": null
}

Note that the initial state will be storing. You'll need to poll on this resource until you see a state of created. You can use the GET endpoint documented here for this.

Once you see a state of created you'll also see the on-chain address in the address attribute. Here is an example of the response you'll see:

{
  "created_at": "2025-07-31T11:27:28.628086Z",
  "updated_at": "2025-07-31T11:27:32.102665Z",
  "guid": "<deposit address guid>",
  "bank_guid": "<your bank guid>",
  "customer_guid": "<your customer's guid>",
  "account_guid": "<trading account guid>",
  "asset": "<the asset of the trading account>",
  "state": "created",
  "address": "<on-chain address>",
  "format": "standard",
  "labels": null
}

At this stage, you have an on-chain address that can receive deposits.

Any deposits made to this on-chain address will automatically be reconciled to the underlying trading account and can be used for further transactions.