The CLI offramp flow is: quote (optional), create (which triggers execute → email OTP → confirm), then show. See Offramp lifecycle for the full picture. Unlike the dashboard, which uses session re-verification, the CLI requires a per-transaction email OTP every time — the same gate the MCP server uses.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.
Quote
Preview the rate and fees before committing:| Flag | Required | Description |
|---|---|---|
--token | Yes | USDC or USDT |
--amount | Yes | Amount to convert |
--bank-account-id | No | Specific payout account |
--beneficiary-username | No | Send to a @handle instead |
--wallet-id | No | Check wallet balance before quoting |
--wallet-id is given, the CLI also checks whether the wallet holds enough balance.
Create (execute + OTP + confirm)
Pre-send confirmation
The CLI fetches a quote, prints the amount, fee, and destination, and asks you to confirm:Pass
--yes to skip this prompt — the OTP step that follows is still required.Execute and receive OTP
After you confirm, the CLI sends the execute request. Veil creates a pending transaction and sends a six-digit code to your account email:
| Flag | Required | Description |
|---|---|---|
--wallet-id | Yes | Wallet to draw from |
--amount | Yes | Amount to convert |
--token | No | USDC (default) or USDT |
--bank-account-id | No | Override the wallet’s default bank |
--beneficiary-username | No | Send to a @handle |
--binding-token | No | Binding token from veil usernames beneficiary-preview |
--yes | No | Skip the pre-send confirmation prompt |
--live | No | Execute against live mode |
--bank-account-id and --beneficiary-username are mutually exclusive.
Show
Idempotency and retries
Eachveil offramp create invocation generates a fresh idempotency key. If the execute request succeeds but the network drops before you enter the OTP, the unconfirmed transaction expires automatically — you can safely run veil offramp create again to start a new one.
If an OTP email was sent before the network error, disregard it — that code is tied to the expired transaction.
Error codes
These are the codesveil offramp create surfaces and what each means:
| Code | CLI message | What to do |
|---|---|---|
OTP_INVALID | Incorrect code. N attempt(s) remaining. | Re-enter the code |
OTP_EXPIRED | The verification code has expired. | Run veil offramp create again |
OTP_ALREADY_USED | The verification code has already been used. | Run veil offramp create again |
OTP_TOO_MANY_ATTEMPTS | Too many incorrect attempts on this code. | Run veil offramp create again |
OTP_EMAIL_MISMATCH | Verification code was sent to a different email address. | Run veil offramp create again |
RATE_CHANGED | The exchange rate changed too much between quote and confirmation. | Run veil offramp create again |
CONFIRMATION_EXPIRED | The confirmation window has expired. | Run veil offramp create again |
USERNAME_BENEFICIARY_NOT_READY | The recipient is not ready to receive offramps. | Check recipient status with veil usernames beneficiary-preview |
veil offramp create again”, the failed transaction is closed — starting a new one is always safe.
See also
- Offramp lifecycle — the full quote-to-settle sequence
- Usernames — using
beneficiary-previewbefore a handle-routed offramp