Create wallets on seven networks, let your users swap, withdraw and send to each other, and run it all from one console — through one API, with a quickstart that takes about fifteen minutes. Solace holds the keys, runs the ledger and signs the webhooks. Your users never see us.
An end user, a wallet, a withdrawal. Everything after a call arrives as a signed event — deposits as they land and again when they’re final, approvals, broadcasts, completions. Idempotency keys on anything that moves money, so a retry never pays twice.
const solace = (path, body) => fetch(BASE + path, { method: 'POST', body: JSON.stringify(body), headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json', 'Idempotency-Key': crypto.randomUUID(), }, }).then((res) => res.json()); const user = await solace('/end-users', { external_id: 'cust_1042' }); const wallet = await solace(`/end-users/${user.id}/wallets`, { asset: 'USDC', network: 'ethereum', }); // deposit.pending as it lands, deposit.confirmed once it's final — // signed, and retried for about two days await solace('/withdrawals', { end_user: user.id, asset: 'USDC', network: 'ethereum', address: '0x3fA9…8c21', amount: '250.00', });
# 1 · An end user, under your own id for them curl -X POST $BASE/end-users -u $KEY: \ -H "Content-Type: application/json" \ -d '{"external_id": "cust_1042"}' # 2 · A wallet: a deposit address for a coin on a network curl -X POST $BASE/end-users/eu_4kPq9Zm2xV7b/wallets -u $KEY: \ -H "Content-Type: application/json" \ -d '{"asset": "USDC", "network": "ethereum"}' # 3 · A withdrawal, safe to retry with the same key curl -X POST $BASE/withdrawals -u $KEY: \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"end_user": "eu_4kPq9Zm2xV7b", "asset": "USDC", "network": "ethereum", "address": "0x3fA9…8c21", "amount": "250.00"}'
Everything your product does through the API shows up here for the people who need to see it — and the things that should wait for a human, wait.
Limits per withdrawal, per day and per month, approval above a threshold, a hold on new addresses, and sanctions screening on every destination. Held withdrawals wait in a queue; one authenticator code approves a batch.
Every coin’s balances checked against its ledger each hour, an email if they ever differ, and a monthly or daily statement to download. Your business balance takes payments and pays your customers.
Sandbox and live keys with scopes and rotation, endpoints with health, every delivery with its reply — and replay in one click.
Build the whole integration on real testnets first; verification only starts when you’re ready for real funds.
Work email and company. Sandbox keys are issued at once; no documents, no call.
Real chains, test coins. Deposits, swaps, withdrawals, transfers and every webhook, through the same API as live.
Registration, proof of address, owners with 25% or more, and your licence if you hold one. Your sandbox stays open while Solace reviews.
Live keys under a signed agreement, with caps on withdrawals until Solace moves you to the full tier.
The sandbox is free. Live, each transaction is charged a percent of its value, with a minimum and a maximum, from your business balance. Your customers’ amounts never change.
No verification until real funds move. Your first wallet is two calls away.