Static wallets
GUIDES

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.

01

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.

terminal
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.

02

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.

terminal
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.

03

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.

terminal
# 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.