veil_offramp_quote
Get a non-binding exchange rate quote for converting crypto to fiat. Call this beforeveil_offramp_execute to show the user what they will receive.
Inputs
number
required
Amount of crypto to convert, in whole units (e.g.
50 for 50 USDC).string
required
Token to convert. One of
USDC or USDT.string
Optional. When provided, the tool verifies the wallet holds at least
amount of assetIn before calling the upstream quote service. Fails fast on over-balance requests.string
Optional. Route the quote to a specific bank account. Omit to use the wallet’s primary bank. Mutually exclusive with
beneficiaryUsername.string
Optional. Quote a send-to-handle offramp. Pass the
@handle without the @ prefix. Mutually exclusive with bankAccountId.string
Optional. Obtained from
veil_username_beneficiary_preview’s bindingHint field. Locks the recipient and prevents drift between preview and execute.string
required
ok on success, error on failure.number
Amount of crypto sent.
string
Token sent (
USDC or USDT).number
Estimated fiat amount to receive.
string
Fiat currency (e.g.
EUR, USD).number
Exchange rate (fiat per crypto unit).
number
Processing fee in destination currency.
number
Total fee in destination currency.
string
The bank account that will receive the funds.
string
Last four digits of the destination account for confirmation.
string
Error description when
status is error.beneficiaryUsername instead of a bankAccountId, the response carries the resolved destination from the binding preview — the recipient’s bankAccountId and suffixLast4 reflect their primary bank, not the sender’s.
veil_offramp_execute
Initiate an offramp. When a confirmation code is required, it creates a pending transaction, emails a six-digit code (expires in 10 minutes), and returns arequestId for veil_offramp_confirm. When the user’s offramp security policy waives the code — sandbox, or an own-bank send they’ve turned off or set below their threshold — it settles immediately and returns the transaction directly, with no requestId and no confirm step. Sends to a @username or a one-off recipient always require the code.
The user manages this policy in the dashboard, under Settings → Offramp security. There’s no MCP tool to read or change it — the MCP server only honors it. If a user asks to adjust when codes are required, point them to the dashboard.
Call this only after the user has reviewed the quote and explicitly confirmed they want to proceed. The
userConfirmed field must be true.string
required
ID of the wallet to debit.
number
required
Amount to convert.
string
required
Token to convert. One of
USDC or USDT.boolean
required
Must be
true. The assistant will not call this tool without explicit user approval.string
Optional. Destination bank account. Omit to use the wallet’s primary bank. Mutually exclusive with
beneficiaryUsername.string
Optional. Send to a
@handle recipient. Mutually exclusive with bankAccountId.string
Optional. From
veil_username_beneficiary_preview. Locks the recipient.string
required
ok on success, error on failure.string
Transaction ID. Pass to
veil_offramp_confirm.string
Confirmation request ID. Pass to
veil_offramp_confirm.number
Amount of crypto being converted.
string
Token being converted.
number
Fiat amount to receive.
string
Fiat currency.
number
Fee applied.
number
Rate locked at execute time.
string
ISO 8601 timestamp when the confirmation code expires.
string
Masked email where the code was sent (e.g.
y***@example.com).string
Human-readable instruction for the next step (e.g. prompting the user for the confirmation code).
string
Error description when
status is error.veil_offramp_confirm
Confirm an offramp by submitting the six-digit code sent to the user’s email. This step is irreversible. Inputsstring
required
From
veil_offramp_execute.string
required
From
veil_offramp_execute.string
required
The six-digit code from the user’s email.
string
required
ok on success, error on failure.object
Full transaction record. See
veil_offramp_get_transaction for the shape.string
Error description when
status is error. Common values: Invalid confirmation code, Confirmation code has expired, Exchange rate changed.veil_offramp_get_transaction
Get the current status and details of a specific transaction. Inputsstring
required
Transaction ID from
veil_offramp_execute or veil_transactions_list.string
required
ok on success, error on failure.object
Transaction record with fields:
id, type, status (pending / processing / completed / failed), amountIn, assetIn, amountOut, currencyOut, fee, exchangeRate, wireRef, createdAt, settledAt, wallet.name, wallet.chain, bankAccount.bankName, bankAccount.suffixLast4, bankAccount.currency. The bankAccount.* fields are null when the viewer is not the account owner (e.g. on the sender side of a @handle offramp).string
Error description when
status is error.veil_transactions_list
List offramp and deposit transactions with pagination and filtering. Inputsnumber
Number of results per page. Maximum 100. Server applies a default if omitted.
number
Pagination offset. Server defaults to 0 if omitted.
string
Optional filter. One of
pending, processing, completed, failed.string
Optional filter. One of
offramp, deposit.string
required
ok on success, error on failure.array
Array of transaction records. Each has the same shape as
veil_offramp_get_transaction’s transaction field.number
Total number of matching transactions.
boolean
Whether another page is available.
number
Limit applied to this response.
number
Offset applied to this response.
string
Error description when
status is error.See also
- In-chat flow — how these tools fit into a conversation
- Offramp lifecycle — quote → execute → confirm → settle