The four steps
1
Quote
Ask “what would I get?” Inputs: wallet, amount, token, destination (bank account or
@username). Outputs: exchange rate, fee, fiat amount, estimated processing time. Quoting commits to nothing — you can call it as often as you like.2
Execute
Lock in the conversion. Veil creates a pending transaction. When a confirmation code is required, it’s sent to your email at this point.
3
Confirm (when required)
When a code is required, you pass it back to release the funds; the code is single-use and short-lived, and Veil submits the order to the banking partner only after this step. When your settings waive the code, the offramp settles without it.
4
Settle
Veil processes the conversion and pays out to the bank. Sandbox settlement is instant; production takes minutes to hours depending on the rail.
The dashboard path
The dashboard uses session re-verification instead of a per-transaction OTP, so its offramp flow goes directly from execute to submission without a separate confirm step.Offramp security
The confirmation code is a gate you control. In the dashboard, under Settings → Offramp security, you choose how much friction your offramps carry for sends to your own bank:- Require a code on every send — the default.
- Require a code only above an amount you choose — smaller sends settle in one step.
- Never require a code — your sends settle without one.
@handle always require a code, and so does changing these settings — so a stolen session alone can’t quietly weaken the gate. Sandbox never asks for a code.
These settings live in the dashboard only. The CLI and MCP server honor whatever you’ve set, but they can’t read or change it — the dashboard is the single place to manage your offramp security.
Where the funds land
Self-offramps accept abankAccountId. If you omit it, the offramp uses the wallet’s default bank account. Either way, the destination is the sender’s own bank.
Handle-routed offramps don’t take a bankAccountId. The sender names the recipient by @handle and Veil resolves the destination to the recipient’s primary bank server-side — the sender never sees or picks among the recipient’s banks.
Rate-drift protection
Exchange rates can move between quote and settlement. Veil re-quotes before submitting and rejects the offramp if the rate has shifted too much. A cancelled or rejected offramp can’t be retried in place — start a new one.See also
- Wallets — the source of the funds
- Bank accounts — the destination
- Auto-settle — the no-user-in-the-loop path
- Usernames — handle-routed offramps