Skip to main content
At the end of this page, you will have created a Sumvin user, added a wallet, and made a real call to: GET /v0/wallets/{wallet_id}/assets — Returns a JSON body listing the wallet’s balances with _links for navigation. Nothing here is a toy. The call you make in five minutes is the call you run in production.

Prerequisites

  • A Platform API JWT from your configured auth provider (Dynamic Labs, Privy, or ). See Authentication.
  • Your platform’s base URL — https://api.sumvin.com/v0.
  • A wallet address for the user () on Sei (chain_id: 1329).
  • Your x-juno-orgid if your credentials span multiple Sumvin organisations (see Authentication). Single-org integrations can omit this header.
The Platform API uses the x-juno-jwt header (no Bearer prefix). Reserve Authorization: Bearer for SIS API calls. Multi-tenant callers also pass x-juno-orgid: <your-org-id> to scope the request to a specific organisation.
The first call you make is POST, not GET. GET /v0/user/me returns 404 USR-404-001 until the user is created — it does not auto-provision. If you see a 404 on the first request, follow it with POST /v0/user/ rather than retrying the GET.
1

Create the user

Register the user with their primary EOA address. Sumvin queues a Safe smart account for deployment on the specified chain in the background — you do not wait for it here.
Background Safe deployment is the default ai_agent cohort behaviour. Environments configured for user-signed Safe deploy (recommended for partners who want user-controlled wallets) or BYO Safe (existing on-chain Safe) follow a different onboarding step instead. See Onboarding cohorts.

Supported chain_id values

chain_id follows EIP-155 and must be one of Sumvin’s supported EVM networks:The example below uses 1329 (Sei). Pass any value from the table — Sumvin deploys the user’s Safe on the chain you specify.
Response: 201 Created

safe_creation_status values

The Safe smart wallet is deployed by a background worker after the user record is created. Poll GET /v0/user/me to watch this field transition.Treat pending and processing as the same non-terminal state. completed and failed are terminal — once you observe one, stop polling this field.

When the user already exists — 208 Already Reported

If the authenticated identity already maps to a Sumvin user, POST /v0/user/ returns 208 Already Reported with the existing record. The body is the same UserResponse shape as the 201 Created response above — same user object, same _links, no slim variant. This means you can call POST /v0/user/ idempotently from your onboarding entry point without checking for duplicates first.

Error responses

All errors follow the RFC 7807 Problem Details format. The three you should design UI for:
The x-juno-jwt header is missing, malformed, or expired. Refresh the token from your auth provider and retry.
Returned when FastAPI rejects the request body before it reaches the handler — for example, a non-integer chain_id, a missing required field, or an invalid email shape.
Fix the field at loc and retry. This response uses FastAPI’s default validation error envelope, not RFC 7807 — it is the one place in the user-creation flow where the shape differs.
Not strictly an error — Sumvin returns 208 to signal an idempotent replay rather than 409 Conflict. The body is the existing user record (see above).
Treat 201 and 208 as the same success path — the record is yours either way.
Other status codes worth handling defensively: 400 WAL-400-001 if primary_eoa_address is not a valid EVM address, and 403 WAL-403-003 if the address cannot be verified against your auth provider’s connected identity. Both follow the RFC 7807 shape shown above.
2

Check onboarding status

The onboarding state machine tells you which step the user is on. is_complete: true gates the next step.
Response: 200 OK
The server drives the transitions — you submit the prompted data for each step until is_complete is true. See the onboarding guide for the full flow, including phone and KYC.
3

Add a wallet

Once onboarding completes, add the user’s wallet. If you use Dynamic Labs, pass the credential_id from the user’s verified credential — Sumvin resolves the address and chain from Dynamic’s API.
Response: 201 Created
For auth providers that do not issue credential IDs, use the SIWE challenge/verify flow instead — see the wallets guide for all three ownership verification methods.
4

Query wallet balances

This is the working artefact. The response lists token balances with USD valuations, plus HAL _links to navigate to the wallet itself and set-primary action.
Response: 200 OK
You have a live Sumvin integration. The _links field is how every response advertises its next actions — use them instead of hardcoding URLs.

Minting a public RPC key

If your integration calls the RPC endpoint from a browser or mobile bundle, mint a public-partition key with rpc.invoke. Public-partition keys are scoped to a single namespace (rpc.*) and are safe to ship in client-side code.
The response carries partition: "public", scopes: ["rpc.invoke"], and a _links.rpc_docs HAL link pointing at the RPC method reference. All requests authenticate with the returned key via Authorization: Bearer:
The RPC method catalogue is documented separately. Use _links.rpc_docs from the create response to find the latest method list.
For the server-side flow (full sis.* scope set) and the partition / scope reference, see SIS scopes & partitions.

What’s next