Opt-in. With zero entries the whitelist is not configured and
withdrawals are unrestricted by destination. Add one entry and the wallet
flips to allowlist mode: from then on, withdrawals are permitted only to
listed addresses.
When it is enforced
The destination check at withdraw time runs only when the platform has withdrawal-security enforcement enabled (a server-side flag, off by default during rollout) and the caller is not apartner_sso integration (exempt).
You can manage the list at any time regardless of enforcement.
This whitelist is a separate control from the AML / sanctions screen and the
high-value review routing, which always run in withdrawal review. (The legacy
return-to-source / cleared-deposit-source gate was retired — CP-D3, 2026-05-22.)
Endpoints
| Method & path | Scope | Rate limit | Purpose |
|---|---|---|---|
GET /api/me/withdrawal-security/whitelist | portfolio:read | 60/min | List entries (newest first) |
POST /api/me/withdrawal-security/whitelist | vault:write | 30/min | Add an entry |
DELETE /api/me/withdrawal-security/whitelist/{id} | vault:write | 30/min | Remove an entry |
multi_wallet API keys every call needs the
X-User-Wallet header naming the acting wallet.
Listing
GET /api/me/withdrawal-security/whitelist
addresses array means the whitelist is not configured (unrestricted
withdrawals).
Adding
POST /api/me/withdrawal-security/whitelist
Destination EVM address (
0x + 40 hex). Any case is accepted (lowercase,
uppercase-hex, or EIP-55 checksum) and stored lowercase — the EIP-55
checksum is irrelevant. Invalid format → 400 invalid_address.Optional human label (≤ 100 chars), e.g.
"My Ledger".201). Constraints:
- Duplicate
(wallet, address)→409 address_already_whitelisted. - Cap of 50 entries per wallet →
409 whitelist_limit_reached.
Removing
DELETE /api/me/withdrawal-security/whitelist/{id} removes one entry by its
id, scoped to the owner. Unknown / non-owned id → 404 whitelist_address_not_found. Returns 204 No Content.
At withdraw time
When the whitelist is configured, the withdraw request’sdestination
(POST /api/withdrawals/request) must
match a listed address (case-insensitive), otherwise:
| Code | HTTP | When |
|---|---|---|
withdrawal_address_not_whitelisted | 403 | Whitelist configured and destination is not on it |
API-key callers
Amulti_wallet partner manages the list per end-user wallet via
X-User-Wallet + vault:write. On the very first request for a freshly-seen
wallet, add may return 409 account_provisioning while partner-backed
onboarding finishes writing the user record — transient, retry after a moment.
Next
Withdrawal 2FA
The TOTP second factor that stacks with the whitelist.
Withdrawals overview
The full dual-sig withdrawal flow.
Error codes
Every withdrawal-security code in one table.
API reference
Withdrawal Security endpoints.