> ## Documentation Index
> Fetch the complete documentation index at: https://docs.useveil.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Offramp lifecycle

> An offramp moves through Quote → Execute → Settle, with a confirmation step in between that depends on your security settings and who you're paying.

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

<Steps>
  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="Settle">
    Veil processes the conversion and pays out to the bank. Sandbox settlement is instant; production takes minutes to hours depending on the rail.
  </Step>
</Steps>

## 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](/concepts/wallets) default bank account. Either way, the destination is the sender's own bank.

[Handle-routed](/concepts/usernames) 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](/concepts/wallets) — the source of the funds
* [Bank accounts](/concepts/bank-accounts) — the destination
* [Auto-settle](/concepts/auto-settle) — the no-user-in-the-loop path
* [Usernames](/concepts/usernames) — handle-routed offramps
