Deposit API
ChainPay API for accepting crypto deposits: no registration and no API key
by default. Everything you need (callbackUrl, forwardAddress,
externalReference) goes in the create-address request.
Optionally send your cabinet x-api-key — the address is then attributed to
your account and listed under Deposits in the cabinet. Without a key the
address stays anonymous: webhook / status API only.
Base URL
https://api.chainpay.site
All paths below are relative to it, e.g. create address is
POST https://api.chainpay.site/deposit-address. TLS is required;
plain HTTP is rejected.
Supported networks
| Network | Deposits | Fund forwarding |
|---|---|---|
tron | native TRX + any supported TRC20 token (USDT, USDC) | yes |
bsc | native BNB + BEP20 tokens (USDT, USDC) | yes |
eth | native ETH + ERC20 tokens (USDT, USDC) | yes |
Other networks (polygon, arbitrum, solana) are not available for
deposits yet. Expansions will be announced and reflected in this table.
1. POST /deposit-address
Public by default — no required auth. Get-or-create: the same
(chain, token, callbackUrl, forwardAddress, externalReference) always returns
the same address — retries with identical params are safe.
Optional header x-api-key: <cabinet key> attributes the address to your
account (clientId in the response, listed in the cabinet).
curl -X POST https://api.chainpay.site/deposit-address \
-H 'content-type: application/json' \
-H 'x-api-key: $CHAINPAY_KEY' \
-d '{
"ticker": "trc20/usdt",
"callbackUrl": "https://your-service.example.com/webhook?token=your-secret",
"forwardAddress": "TYourOwnTronWallet...",
"externalReference": "order-123"
}'
Request body
{
"ticker": "trc20/usdt",
"callbackUrl": "https://your-service.example.com/webhook?token=your-secret",
"forwardAddress": "TYourOwnTronWallet...",
"externalReference": "order-123",
"pending": false,
"confirmations": 19,
"multiToken": false
}
| Field | Required | Description |
|---|---|---|
ticker | yes | Format — see below |
callbackUrl | yes | Public HTTPS/HTTP URL for webhooks. Must not point at localhost or a private IP. Webhooks are not cryptographically signed, so put your own secret in the query string (?token=...) and verify it on your side. |
forwardAddress | yes | Address that receives the net deposit (minus fee). Only format-checked for the chain. |
externalReference | yes | Your own address/order id. Returned in every webhook. |
pending | no (default false) | If true — extra early webhook status: "pending" when the deposit is first seen on-chain, before finality. |
confirmations | no | Override confirmations for this address (min 1). Defaults: tron — 19, bsc — 15, eth — 12. |
multiToken | no (default false) | One address accepts native coin and any supported token on the chain. TRON and EVM chains, only with a bare native ticker (e.g. "trx", "bnb"). |
ticker format
- Bare native ticker —
trx,bnb,eth(aliases:trx→tron,bnb→bsc). Native-coin deposit. protocol/token—trc20/usdt,bep20/usdt,erc20/usdt.protocolselects the network (trc20→tron,bep20→bsc,erc20→eth).- Contract instead of symbol —
trc20/T...orbep20/0x...for a token not listed by symbol. - Unknown symbol that is not an explicit contract →
400 Unknown token symbol.
Response (201)
{
"id": "addr_…",
"address": "T…",
"ticker": "trc20/usdt",
"chain": "tron",
"callbackUrl": "https://…",
"forwardAddress": "T…",
"externalReference": "order-123",
"confirmations": 19,
"createdAt": "2026-01-15T12:00:00.000Z"
}
2. Status & transactions
GET https://api.chainpay.site/deposit-address/:id/status
GET https://api.chainpay.site/deposit-address/:id/transactions
Both are public. Use them as a reliable fallback if a webhook delivery is delayed.
Typical status fields: pending / confirmed / swept, confirmation count, amounts.
3. Webhooks
We POST JSON to your callbackUrl when a deposit is detected (pending, if enabled) and when it reaches the confirmation threshold (confirmed).
Recommended: verify your query-string secret, treat deliveries as at-least-once, and reconcile with GET …/status / …/transactions.
4. Multi-token
With a bare native ticker ("trx", "bnb", "eth"…) and "multiToken": true, one address accepts the chain's native coin and every supported token on it (TRC20, BEP20, ERC20). Each inbound asset is tracked and swept separately; webhooks include the token that arrived. Tokens outside the supported list are not credited. On EVM chains, transfers made by a smart contract (internal transfers) are not detected yet.
Errors
| Code | Meaning |
|---|---|
400 | Validation / unknown ticker / private callback URL |
404 | Unknown address id |