CChainPay
Sign in

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

NetworkDepositsFund forwarding
tronnative TRX + any supported TRC20 token (USDT, USDC)yes
bscnative BNB + BEP20 tokens (USDT, USDC)yes
ethnative 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
}
FieldRequiredDescription
tickeryesFormat — see below
callbackUrlyesPublic 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.
forwardAddressyesAddress that receives the net deposit (minus fee). Only format-checked for the chain.
externalReferenceyesYour own address/order id. Returned in every webhook.
pendingno (default false)If true — extra early webhook status: "pending" when the deposit is first seen on-chain, before finality.
confirmationsnoOverride confirmations for this address (min 1). Defaults: tron — 19, bsc — 15, eth — 12.
multiTokenno (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. protocol selects the network (trc20→tron, bep20→bsc, erc20→eth).
  • Contract instead of symbol — trc20/T... or bep20/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

CodeMeaning
400Validation / unknown ticker / private callback URL
404Unknown address id