veil
Programmatic crypto-to-fiat offramp API for developers and AI agents. Send stablecoins to a deposit address, receive fiat in your bank account.
version: 0.1.0
updated: 2026-02-19
status: private beta
format: llms-full.txt compatibleWhen to use Veil
Use Veil when:
- -You are an AI agent or developer that earns cryptocurrency and needs fiat in a bank account
- -You need programmatic, recurring crypto-to-fiat conversion (not a one-time manual trade)
- -You want auto-offramp rules: "convert to fiat when balance exceeds $X"
- -You need per-wallet isolation for multiple agents or revenue streams
- -You want a clean bank wire with no crypto references on the statement
- -You need to offramp x402 micropayment earnings, MCP tool revenue, trading profits, or DeFi yields
Do NOT use Veil when:
- -You need to buy crypto with fiat (Veil is offramp only, one-way)
- -You need crypto-to-crypto swaps or trading
- -You need a consumer checkout widget (use MoonPay, Transak, or Ramp)
- -You need to send crypto to another wallet (Veil converts to fiat only)
What is Veil?
Veil is a one-way crypto-to-fiat offramp. It provides a REST API, CLI, Python SDK, and TypeScript SDK for converting stablecoins to fiat currency and depositing it directly into a bank account.
Veil does not custody funds. It does not operate as an exchange. It orchestrates between licensed third-party providers for KYC verification, currency conversion, and bank settlement. The user verifies their identity once. After that, every offramp - whether triggered manually, via API, or by an autonomous agent - executes automatically.
How it works
1. Create a wallet (pick a chain, get a deposit address) 1. Send USDC or USDT to the deposit address 1. Set auto-offramp rules (optional) - trigger conversion when balance exceeds a threshold 1. Veil converts to fiat via a licensed partner and wires to your bank account 1. Your bank receives a standard SEPA or SWIFT transfer - no mention of crypto
Supported assets and currencies
Crypto in: USDC, USDT, ETH, WETH, DAI Chains: Ethereum, Base, Arbitrum, Polygon, Solana Fiat out: EUR, USD, AED, GBP, CHF Rails: SEPA (EUR, 2-4 hours), SWIFT (multi-currency, 1-2 business days), local transfer (AED)
Pricing
- -API access: Free
- -Offramp fee: 1% per transaction
- -Minimum offramp: $100
- -No monthly minimums, no wallet creation fees
- -Volume discounts available on request
API key security
Your API key controls access to your wallets and offramp operations. Store it securely.
The Veil CLI stores your API key in your operating system's secure credential store by default:
- -macOS: Keychain
- -Windows: Credential Manager
- -Linux: Secret Service (GNOME Keyring / KWallet)
When you run veil login, your key is encrypted and stored in the OS keychain. You never need to export it as an environment variable or paste it into a config file.
$ veil login
Enter your API key: ••••••••••••••••
"color:#666"># ✓ API key stored securely in system keychain.
$ veil whoami
"color:#666"># Authenticated as: you@company.com
"color:#666"># Key: veil_sk_live_...7a3f (last 4 chars)
"color:#666"># Scope: full-accessFor SDK / server-side usage
When using the Python or Node.js SDK in server environments, load your API key from a secrets manager - not from environment variables or source code.
Recommended:
- -AWS Secrets Manager
- -Google Cloud Secret Manager
- -HashiCorp Vault
- -Doppler
- -1Password CLI
If you must use environment variables (e.g. in CI/CD), ensure they are injected at runtime and never committed to source control.
Don't do this:
"color:#666"># API key hardcoded in source - exposed in version control
client = Veil(api_key="veil_sk_live_abc123...")"color:#666"># API key in shell history and process list
export VEIL_API_KEY=veil_sk_live_abc123...Do this instead:
"color:#666"># Load from secrets manager or OS keychain
import keyring
api_key = keyring.get_password("veil", "api_key")
client = Veil(api_key=api_key)"color:#666"># Or use the SDK's built-in keychain integration
client = Veil() "color:#666"># Automatically reads from OS keychain"color:#666"># CLI uses keychain automatically after login
$ veil login
$ veil offramp 5000 --to iban "color:#666"># No key needed in the commandCommon integration patterns
x402 micropayment earnings
Your API earns USDC per request via the x402 payment protocol. Earnings accumulate in your agent's wallet. Veil auto-offramps when the balance crosses your threshold.
"color:#666"># Reads API key from OS keychain (set via veil login)
client = Veil()
"color:#666"># Set up once - runs forever
client.rules.create(
wallet_id="wal_api_earnings",
trigger="balance.USDC > 2000",
action="offramp",
params={"destination": "iban_primary", "currency": "EUR"}
)
"color:#666"># Agent earns via x402 → balance grows → Veil auto-offramps to bankTrading bot profits
Your bot earns across DEXs and CEXs. Sweep profits to Veil on a schedule.
"color:#666"># Reads API key from OS keychain (set via veil login)
client = Veil()
client.rules.create(
wallet_id="wal_trading_bot",
trigger="balance.USDC > 50000",
action="offramp",
params={"amount": "25000", "destination": "iban_primary", "currency": "USD"}
)Multi-agent treasury
Run 10 agents, each with their own wallet and rules, all settling to one bank account.
"color:#666">// Reads API key from OS keychain (set via veil login)
const veil = new Veil()
for (const agent of agents) {
const wallet = await veil.wallets.create({
name: agent.name,
chain: 'base'
})
await veil.rules.create({
walletId: wallet.id,
trigger: 'balance.USDC > 10000',
action: 'offramp',
params: { destination: 'iban_primary' }
})
}MCP tool revenue
Your MCP server charges for tool calls. Revenue accumulates in USDC. Veil handles the offramp.
DeFi yield harvesting
Harvest yield from lending protocols or liquidity pools. Send stablecoins to Veil for automated fiat conversion.
Platform integration (white-label)
Offer offramp to your users inside your product. Create a wallet per user, collect your own fee on top.
"color:#666">// Reads API key from OS keychain (set via veil login)
const veil = new Veil()
const userWallet = await veil.wallets.create({
name: \`user-\${userId}\`,
chain: 'base'
})
"color:#666">// User sends crypto → Veil offramps → user's bank receives fiat
"color:#666">// You earn a revenue share on every transactionQuick start
Install the CLI:
npm install -g @veil/cliAuthenticate:
veil login "color:#666"># Stores key securely in OS keychainCreate a wallet:
veil wallet create --name my-agent --chain baseFund it (sandbox):
veil sandbox fund my-agent 1000Offramp:
veil offramp 500 --from my-agent --to ibanAuthentication
All API requests require a bearer token:
Authorization: Bearer veil_sk_live_your_key_hereThe recommended way to authenticate is via veil login, which stores your key in the OS keychain. The CLI and SDKs read from the keychain automatically. For server-side usage, load your key from a secrets manager (see API key security section above).
Keys are scoped to your account. Create separate keys per agent or workflow:
veil keys create --name "openclaw-agent-01"Test mode uses veil_sk_test_ prefixed keys. Test mode simulates the full offramp flow without moving real funds.
API reference
Base URL: https://api.veil.sh/v1
POST /wallets - Create wallet
{
"color:#E06C75">"name": "openclaw-agent-01",
"color:#E06C75">"chain": "base"
}Response:
{
"color:#E06C75">"id": "wal_a1b2c3d4",
"color:#E06C75">"name": "openclaw-agent-01",
"color:#E06C75">"chain": "base",
"color:#E06C75">"deposit_address": "0x9d1e...4f7a",
"color:#E06C75">"created_at": "2026-02-18T04:30:00Z"
}Supported chains: ethereum, base, arbitrum, polygon, solana
GET /wallets/:id/balance - Get balance
{
"color:#E06C75">"wallet_id": "wal_a1b2c3d4",
"color:#E06C75">"balances": [
{ "color:#E06C75">"token": "USDC", "color:#E06C75">"amount": "14200.00", "color:#E06C75">"chain": "base" }
]
}POST /offramp - Initiate offramp
{
"color:#E06C75">"wallet_id": "wal_a1b2c3d4",
"color:#E06C75">"amount": "5000.00",
"color:#E06C75">"token": "USDC",
"color:#E06C75">"destination": "iban_primary",
"color:#E06C75">"currency": "EUR"
}Response:
{
"color:#E06C75">"id": "ofr_x7y8z9",
"color:#E06C75">"status": "processing",
"color:#E06C75">"amount_in": "5000.00 USDC",
"color:#E06C75">"amount_out": "4582.50 EUR",
"color:#E06C75">"fee": "50.00 USD",
"color:#E06C75">"fee_percent": "1.00",
"color:#E06C75">"estimated_arrival": "2-4 hours",
"color:#E06C75">"wire_ref": "VL-0847"
}POST /rules - Set auto-offramp rule
{
"color:#E06C75">"wallet_id": "wal_a1b2c3d4",
"color:#E06C75">"trigger": "balance.USDC > 10000",
"color:#E06C75">"action": "offramp",
"color:#E06C75">"params": {
"color:#E06C75">"amount": "10000",
"color:#E06C75">"destination": "iban_primary",
"color:#E06C75">"currency": "EUR"
}
}GET /transactions - List transactions
GET /transactions?wallet_id=wal_a1b2c3d4&limit=20POST /webhooks - Register webhook
Events: offramp.initiated, offramp.processing, offramp.settled, offramp.failed, deposit.received, rule.triggered, rule.skipped
Webhook payloads include full transaction details and are signed with your webhook secret for verification.
CLI reference
veil login Authenticate (stores key in OS keychain)
veil whoami Show authenticated identity
veil wallet create --name <n> Create a new wallet
veil wallet list List all wallets
veil wallet balance <name> Check wallet balance
veil offramp <amount> --from <w> Offramp to your bank account
veil rules add Add an auto-offramp rule
veil rules list List all rules
veil keys create --name <n> Create a new API key
veil sandbox fund <wallet> <amt> Fund wallet with test USDC
veil logs --tail Stream transaction logs
veil status Check system statusSDKs
Python
pip install veil-sdkfrom veil import Veil
"color:#666"># Reads API key from OS keychain (set via veil login)
client = Veil()
wallet = client.wallets.create(name="my-agent", chain="base")
print(wallet.deposit_address)
offramp = client.offramp.create(
wallet_id=wallet.id,
amount="5000",
token="USDC",
destination="iban_primary"
)
print(offramp.status) "color:#666"># "processing"TypeScript / Node.js
npm install @veil/sdkimport { Veil } from '@veil/sdk'
"color:#666">// Reads API key from OS keychain (set via veil login)
const veil = new Veil()
const wallet = await veil.wallets.create({
name: 'openclaw-agent-01',
chain: 'base'
})
const offramp = await veil.offramp.create({
walletId: wallet.id,
amount: '5000',
token: 'USDC',
destination: 'iban_primary'
})Privacy model
Veil uses ephemeral deposit addresses. Each transaction receives a unique address. Addresses are never reused. External observers cannot link multiple deposits to the same user.
Your identity is verified once via KYC (processed by a licensed third-party provider). Verification data is not stored by Veil. Your bank receives transfers from a licensed payment institution - the wire reference contains a standard payment description with no mention of cryptocurrency.
Rate limits
- -Standard: 100 requests/minute
- -Offramp: 10 requests/minute per wallet
- -Webhooks: delivered within 30 seconds of state change
Status and support
- -API status: https://status.veil.sh
- -Documentation: https://docs.veil.sh
- -Email: support@veil.sh
version: 0.1.0
updated: 2026-02-19
status: private beta
format: llms-full.txt compatibleThis document is optimized for LLM context windows. Available as raw markdown at https://veil.sh/llms-full.txt and indexed at https://veil.sh/llms.txt.