Every deposit credits the balance of its own asset (a USDC wallet
credits your USDC balance; the Bitcoin wallet credits your BTC balance).
GOLD is the only balance with no on-chain rail: it moves only via
internal transfers and operator credits.
Your account is born with its wallets
Every account — person and company — is created with one deposit wallet per supported combination (tron/usdt, eth/usdt, eth/usdc and
btc/btc), free of charge and automatically: as soon as you
register, your four addresses are ready to receive funds.
Provisioning runs in the background when the account is created: if you
query at the very second of registration an address may still be missing —
retry a few seconds later.
Two products, two routes: deposit wallets live under
/v1/crypto/wallets
and segregated wallets under /v1/segregated-wallets. Every wallet
response carries a type discriminator (deposit / segregated) so you
can always tell them apart.Can I create more deposit wallets?
No. Every account — person and company — holds exactly one deposit wallet per network+asset pair, and all of them are born with the account.POST /v1/crypto/wallets exists only to restore a missing pair (an
exceptional case): with the four wallets already provisioned it responds
422 wallet_limit_reached.
422:
- Birth wallets are always free; the
wallet_creationfee would only apply to a manual restoration (with a fee of 0, the default, it is free; if creation fails, the charge is refunded automatically). - Need several wallets with their own balance (per client, per project, per business unit)? That is the segregated wallets product: companies have no limit, persons hold 1 per network+asset pair.
View my wallets
Bitcoin addresses are native bech32 (
bc1q…): any modern wallet or
exchange can send funds to them. BTC amounts use 8 decimals
("0.00050000").Deposit
Send the wallet’s asset to its address, over the correct network. When the deposit confirms on-chain, that asset’s balance is credited automatically (net of thefunding fee if CBPay configured one) and the
crypto_deposit_credited webhook fires:
Confirmation times
The credit always arrives with the webhook and the
tx_id so you can
verify it on the network explorer.
Transfer (on-chain withdrawals)
Send USDT, USDC or BTC from its balance to any external address (asset
is optional: default USDT on tron/eth and BTC on btc; USDC only
over eth):
On Bitcoin the destination can be a bech32 (
bc1q…), taproot (bc1p…) or
legacy (1… / 3…) address. The Bitcoin network fee is covered by
the operation itself — you receive the final status via webhook like any
other withdrawal.202 — amount + fee is debited and the transaction broadcasts:
Every withdrawal saves the address as a contact
automatically — name it with
"contact_name" in the body, or disable it
with "save_contact": false. To repeat a send, use "to_contact_id"
instead of to_address (the contact’s saved address for that chain is
used).crypto_withdrawal_status_changed webhook:
completed (the tx_id is your receipt) or failed (the full
debit is refunded).
You can also query the withdrawal at any time:
To move balance to another CBPay account, skip the blockchain:
internal transfers are instant and free.
Travel Rule (withdrawals above the threshold)
International regulation (FATF R.16, the “Travel Rule”) requires on-chain withdrawals from 1,000 USD to declare who receives the funds before moving the money. Below the threshold nothing changes. There are two paths:- Own wallet (self-hosted)
- Another institution (travel address)
If the destination is a wallet owned by the account holder (not an
exchange), declare The response includes
wallet_type and the beneficiary name:"travel_rule_status": "self_hosted_attested".