Skip to main content
An offramp is the conversion of stablecoin into fiat that lands in a bank account. The lifecycle has the same shape regardless of how you trigger it: a non-binding quote, an execute step that creates the pending transaction, a confirmation gate that applies depending on your settings, and a settlement that arrives via webhook minutes later.

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.
Two things stay fixed and can’t be turned off: sends to someone else by @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 a bankAccountId. 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