Skip to main content

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.

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.

Quote

Preview the rate and fees before committing:
veil offramp quote --token USDC --amount 100
Flags:
FlagRequiredDescription
--tokenYesUSDC or USDT
--amountYesAmount to convert
--bank-account-idNoSpecific payout account
--beneficiary-usernameNoSend to a @handle instead
--wallet-idNoCheck wallet balance before quoting
Quoting commits to nothing. You can call it repeatedly. When --wallet-id is given, the CLI also checks whether the wallet holds enough balance.

Create (execute + OTP + confirm)

veil offramp create --wallet-id <id> --amount <n> --token USDC
This is a two-step interactive command:
1

Pre-send confirmation

The CLI fetches a quote, prints the amount, fee, and destination, and asks you to confirm:
About to send 100 USDC from wallet abc123 to your primary bank (fee ~1.00 USD, you receive ~99.00 USD).
? Continue? (y/N)
Pass --yes to skip this prompt — the OTP step that follows is still required.
2

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:
Sent a 6-digit code to y***@example.com. The code expires in 10 minutes.
3

Enter the OTP

? Enter the 6-digit code:
The CLI accepts up to 5 attempts. On success, it prints the transaction ID, amounts, and status.
Flags:
FlagRequiredDescription
--wallet-idYesWallet to draw from
--amountYesAmount to convert
--tokenNoUSDC (default) or USDT
--bank-account-idNoOverride the wallet’s default bank
--beneficiary-usernameNoSend to a @handle
--binding-tokenNoBinding token from veil usernames beneficiary-preview
--yesNoSkip the pre-send confirmation prompt
--liveNoExecute against live mode
--bank-account-id and --beneficiary-username are mutually exclusive.

Show

veil offramp show <id>
Prints current status, amounts in and out, fee, wire reference (once settled), and timestamps.

Idempotency and retries

Each veil 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 codes veil offramp create surfaces and what each means:
CodeCLI messageWhat to do
OTP_INVALIDIncorrect code. N attempt(s) remaining.Re-enter the code
OTP_EXPIREDThe verification code has expired.Run veil offramp create again
OTP_ALREADY_USEDThe verification code has already been used.Run veil offramp create again
OTP_TOO_MANY_ATTEMPTSToo many incorrect attempts on this code.Run veil offramp create again
OTP_EMAIL_MISMATCHVerification code was sent to a different email address.Run veil offramp create again
RATE_CHANGEDThe exchange rate changed too much between quote and confirmation.Run veil offramp create again
CONFIRMATION_EXPIREDThe confirmation window has expired.Run veil offramp create again
USERNAME_BENEFICIARY_NOT_READYThe recipient is not ready to receive offramps.Check recipient status with veil usernames beneficiary-preview
For any code followed by “Run veil offramp create again”, the failed transaction is closed — starting a new one is always safe.

See also