Static wallets
Static wallets
A reusable deposit address bound to one of your customers. Every deposit is auto-detected and credited — no need to create a payment per transfer, and the address never expires.
Payments
A one-time charge for a fixed amount and a fixed asset. Create it, share the address, and Suward settles the exact amount into your balance. Best for checkouts and invoices.
Static wallets
A permanent per-customer address. Any deposit at any amount is detected and credited automatically. Best for account funding, top-ups, and ongoing balances.
Create a static wallet
A static wallet is a persistent on-chain address scoped to one of your customers. Call POST /v1/static-wallets once per customer and store the returned id and address — you reuse them for every subsequent deposit.
curl -X POST https://api.suward.com/v1/static-wallets \ -H "X-Api-Key: $SUWARD_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "externalId": "customer-99", "asset": "USDT_ETHEREUM" }'externalId ties the wallet to your own customer record and must be unique — reusing a value that already exists returns an error rather than a second wallet, so create each wallet once and store the returned id.
Read deposits
Every inbound transfer to the static wallet address is detected on-chain and recorded as a deposit object. Poll GET /v1/static-wallets/{staticWalletId}/deposits or listen on your webhook to receive deposit events in real time.
curl https://api.suward.com/v1/static-wallets/$STATIC_WALLET_ID/deposits \ -H "X-Api-Key: $SUWARD_API_KEY"- Any amount, any time — deposits are not tied to a prior create call, so customers can top up whenever they want.
- Each deposit has its own status lifecycle (pending → accepted → success) and triggers a webhook event on each transition.
- Deposits appear on the same balance that payments credit. There is no separate wallet ledger — everything lands in one project balance.
Suward credits funds only after the block reaches a Safe checkpoint on the chain. Confirmed-but-not-final deposits show in the accepted balance bucket; final deposits move to safe.
Test your integration
Two independent ways to exercise the deposit flow without moving real funds. Use simulate for instant, no-chain testing; use test tokens for a real on-chain run.
Simulate a deposit
POST to /v1/static-wallets/{staticWalletId}/simulate with a status and subStatus. Suward records a synthetic deposit and fires your webhook — no wallet, no chain, no waiting for blocks.
Pay with test tokens
Send TESTSTABLECOIN_OPTIMISM or TESTCOIN_OPTIMISM to the static wallet address. Suward handles them exactly like live deposits through the full monitoring and finality pipeline.
# Simulate a deposit arriving at the static wallet address.# amount is a smallest-unit integer string: USDT has 6 decimals,# so 50000000 = 50 USDT.curl -X POST https://api.suward.com/v1/static-wallets/$STATIC_WALLET_ID/simulate \ -H "X-Api-Key: $SUWARD_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "amount": "50000000", "asset": "USDT_ETHEREUM", "status": "confirmed" }'Simulate only works against test static wallets (created with a test API key) and never settles real funds.