Overview
The API provides multi-chain wallet management for EVM-compatible blockchains. Each user can hold multiple wallets across different chains, with two distinct wallet types:- EOA (Externally Owned Account) — user-controlled wallets added through verified ownership
- Safe (Smart Wallet) — smart contract wallets persisted under a user’s primary EOA
Safe creation depends on your environment’s cohort, but the surface is uniform:
GET and POST /v0/user/me/onboarding/safe serve every cohort — the response carries a mode discriminator and a cohort-specific config block. The POST body is a shape-only payload (no mode field — the cohort is derived server-side).mode=agent_create2(default): Sumvin’s signing service deploys the Safe automatically and attaches an agent signer. Clients callPOSTwith an empty body{}and receive204 No Content; the workflow does the work.mode=user_signed_deploy: the user signs the Safe deployment UserOp themselves. Recommended for partners who want user-controlled wallets without an agent signer.mode=byo: the user submits the address of an existing on-chain Safe (Bring Your Own Safe).
Wallet Ownership Verification
Before a wallet can be registered, the user must prove they control it. The API supports three methods depending on your authentication provider and wallet type.Method 1: Dynamic Credential
If your platform uses Dynamic Labs for authentication, wallet ownership is verified automatically through the user’s verified credentials.201 Created
Method 2: SIWE (Sign In With Ethereum)
For platforms that don’t use Dynamic Labs, or when you need standalone wallet verification, use the SIWE challenge/verify flow. Step 1: Request a challenge200 OK
201 Created
The response body matches the wallet object from Method 1.
SIWE challenges expire after 10 minutes. If the challenge expires before verification, request a new one.
Method 3: Manual Safe Creation
For advanced use cases where you need to create a Safe wallet directly (e.g., for agent-controlled wallets), use the manual Safe creation flow. Step 1: Get Safe configuration for the target chain200 OK
included, failed, and rejected statuses.
202 Accepted
201 Created
Setting a Primary Wallet
Promote a wallet to primary status. This may trigger asynchronous Safe creation if no Safe exists on that chain:safe_creation_event_id:
Primary chain is locked once a Safe is deployed
Once a Safe smart wallet is persisted for a user (via thebyo_safe step, the safe_deploy user-signed flow, or agent-driven Safe creation), the user’s primary chain is locked. Promoting an EOA on a different chain to primary returns 400 Bad Request with error code WAL-400-004 (Primary Chain Locked):
Polling for Safe Creation
When you receive a 202, poll the user profile to check Safe creation progress:safe_creation_status field on the user tracks progress. Once completed, the primary_smart_wallet_address field contains the deployed Safe address.
Wallet Types
EOA wallets are standard Ethereum accounts controlled by a private key. Your application registers them after ownership verification so the API can track balances and transactions.
Safe wallets are smart contract wallets deployed by the system (or manually via Method 3). They provide multisig capabilities and are paired with the user’s primary EOA on the same chain. System-created Safe wallets cannot be deleted — they are managed entirely by the system.
A third kind of record is stored alongside these but is not a wallet type you create. Signer keys are addresses recorded as signers on the account’s Safe rather than wallets the account holder chose. A CLI mandate key — the key the Sumvin CLI holds locally so a developer can sign mandates as the user — is the one kind in use today. They are kept apart from the rest of the account’s wallets:
- They are omitted from
GET /v0/walletsand fromGET /v0/user/me?expand=wallets, so those lists hold only wallets the account holder can transact from. Filters such asis_eoa=truedo not bring them back. - They remain readable at
GET /v0/wallets/{wallet_id}by their own wallet ID. - They cannot be deleted.
DELETE /v0/wallets/{wallet_id}refuses any wallet carrying a signer role withWAL-403-005, because soft-deleting the record would not remove the key from the Safe on chain — the account would read as though the key were revoked while it could still sign. - They do not count as wallets the account holder owns for authorization purposes. A contract deployed by a signer key is not evidence the account holder deployed it, so
POST /v0/walletswithmethod=txn_hashreturnsWAL-403-004in that case.
Multi-Chain Support
The API supports wallets across all major EVM-compatible chains:
Each wallet is scoped to a single chain. A user can have wallets on multiple chains, but the primary EOA and its corresponding Safe must be on the same chain.
Safe Creation Flow
When you set a primary EOA on a chain where no Safe exists, the system deploys one asynchronously.Safe Creation Statuses
Endpoints
List Wallets
Response: 200 OK
Get Wallet
Response: 200 OK
Create Wallet
The create wallet endpoint accepts different request bodies depending on the ownership verification method. See Wallet Ownership Verification above for the full flow for each method.
Method 2 — SIWE:
Wallet creation happens automatically when the SIWE verify call succeeds. No separate wallet create call is needed.
POST /v0/auth/siwe/verify— Verify signature and create wallet.POST /v0/wallets— Direct wallet create (not required for SIWE).
Response:
201 Created
Returns the created wallet with _links including set-primary and delete actions.
Update Wallet
Response: 200 OK when the update is synchronous, 202 Accepted when Safe creation is triggered.
When the response is 202, it includes:
safe_creation_event_id— event ID for tracking_links.safe-status— link to poll for Safe deployment completion
Delete Wallet
List Wallet Assets
List Asset Transactions
Response: 200 OK
next, prev) are included in _links when applicable.
Get Balance Summary
Integration Patterns
Choosing a Verification Method
Handling Async Safe Creation
When the wallet update returns 202, implement a polling loop:PATCH /v0/wallets/{wallet_id} — Update wallet (may return 202 when Safe creation is triggered).
Building a Wallet Selector
Fetch all wallets and group by type:Following HAL Links
Responses include_links for discoverable navigation. Non-primary wallets include set-primary and delete action links. Primary wallets omit these since the actions are not permitted.
Error Handling
All error responses follow RFC 7807 Problem Details. See Error Handling for the full reference.Wallet Error Codes
GET /v0/wallets — List wallets.