Deposits and withdrawals
Correct assets, exact amounts and durable transfer state.
All paths below begin /v1/accounts/{externalUserId}. Require a ready account
and appropriate scopes. Do not accept a browser-selected external ID without
checking your own session.
Deposit overview
GET /wallet/funding returns balance, deposit instructions/supported assets and
withdrawal-source availability. GET /wallet/deposit-instructions returns current
Bridge addresses and supported assets separately. Render only assets supported
on the selected network; never reuse an address from another user or network.
Balance uses exact baseUnit and six-decimal formatted pUSD values. A partial
RPC outage can return 200 with balance: null,
balanceStatus: "temporarily_unavailable" and withdrawals disabled. Keep usable
deposit instructions visible, show balance unavailable, and offer retry—not zero.
Quote and originate the source transfer
POST /wallet/deposit-quote{
"fromAmountBaseUnit": "25000000",
"fromChainId": "1",
"fromTokenAddress": "0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
}Choose a currently supported asset. The amount is source-token base units, not universally six decimals. CRISP fixes the quote recipient to the managed account. The quote itself does not move money. The user signs the source-chain transaction in their connected wallet or transfers to the appropriate returned instructions. Show token, network, amount, recipient and quote fees before signing. Revalidate wallet/account changes; never silently send from a different connected wallet.
GET /wallet/transfers?limit=50&cursor=… reports Bridge status for that account,
not arbitrary addresses. Empty history is valid; distinguish pending bridge
delivery from credited trading cash. Refresh funding after confirmed delivery.
Withdrawal intent
Requires explicit wallet:write and environment enablement; it is not a default
permission. Your authenticated user must approve the exact recipient. Provisioned
contact wallet data does not authorize a withdrawal.
Quote via POST /wallet/withdrawal-quote, then submit the same destination fields
to POST /withdrawals with an Idempotency-Key:
{
"amountBaseUnit": "25000000",
"recipientAddress": "0x1111111111111111111111111111111111111111",
"toChainId": "1",
"toTokenAddress": "0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
}This placeholder recipient must be replaced by the user's approved destination. Amount is source Polygon pUSD, six decimals. CRISP creates the Bridge destination and signs from the managed wallet. A balance/quote is not a reservation; unsettled fee obligations or changed funds can block a request.
Poll GET /withdrawals/{withdrawalId}; list via GET /withdrawals.
| State | Meaning |
|---|---|
| queued | Durable request accepted |
| submitting | Worker preparing/signing; do not replace |
| submitted | Relayer accepted; chain confirmation pending |
| confirmed | Source pUSD transfer confirmed; use transfers endpoint for final Bridge destination |
| failed | Failed before accepted submission; inspect safe failure code before a new intent |
| manual_review | Uncertain transfer outcome; contact CRISP, do not resubmit |