- Docs
- Api%2Freference%2Fwallets%2FListOrganizationWallets
List the organization's accounts
Every end-user account that belongs to the organization in the path — the people who sign in, hold an address and own objects, as opposed to the team members who administer the organization. For the team, use `GET /organizations/{organizationId}/members`. Narrow it with `autocomplete` to search by nickname, email address or on-chain address, and with `id` to fetch one account. The list is paginated: read `next` from the response and send it back to get the following page. You have to be a member of the organization in the path, and the scope never widens beyond it. Requires the `organizations.wallets.read` permission — the one that covers the organization's end users, not `wallets`, which is an account's own.
The access token returned after a successful sign-in, sent as
Authorization: Bearer <access_token>.
It identifies the person and the organization they are working in, and
it lasts about fifteen minutes. When it runs out, use their refresh
token at POST /auth/refresh-token instead of asking them to sign in
again.
In: header
Path Parameters
Identifier of the organization. Each endpoint states whether it must be the caller's active organization or may be used without authentication.
Query Parameters
Return only the resource with this identifier. Equivalent to fetching it by path, but usable together with the other list filters.
Search the accounts by nickname, email address or on-chain address. The match
is case-insensitive and anywhere in the field, so acme.com finds everyone at
that domain, ale finds alexf, and a pasted 0x1234... finds the account
that owns it.
Unlike autocomplete on other lists this one accepts the punctuation an email
address needs, because a whole address is a thing you would paste in.
length <= 320How many items to return in one page. The default and the maximum are both
25; a larger value is rejected with 400.
25int641 <= value <= 25Cursor for the next page, taken verbatim from the next field of the previous
response. Keep every other query parameter the same between pages: sortBy
and order are part of what the cursor means. An absent or empty next in a
response means there are no more pages.
The value is opaque. Do not parse it or build one yourself.
Sort direction. Defaults to desc, newest first.
"desc""asc" | "desc"Field used to sort the result. Supported fields depend on the endpoint; use
when_created for chronological ordering where it is available. The default
is the resource identifier, and identifiers break ties so cursor paging stays
stable.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://api.dual.network/organizations/665f1c2d4b1a2c3d4e5f6aa0/wallets"{
"wallets": [
{
"id": "665f1c2d4b1a2c3d4e5f6a01",
"fqdn": "dual.network",
"email": "alex@example.com",
"nickname": "alexf",
"language": "en",
"activated": true,
"disabled": false,
"account": {
"address": "0x1234567890abcdef1234567890abcdef12345678",
"type": "SMART_WALLET",
"controller": {
"address": "0x9876543210fedcba9876543210fedcba98765432",
"type": "SECP256K1",
"custody": "self-custodial"
},
"smart_account": {
"chain_id": 42161,
"factory": "0x7777777777777777777777777777777777777777",
"implementation": "0x8888888888888888888888888888888888888888",
"index": 0,
"validator": "0x9999999999999999999999999999999999999999",
"validator_type": "ECDSA",
"version": "0.3.1"
}
},
"when_created": "2026-02-01T09:00:00Z",
"when_modified": "2026-02-01T09:00:00Z"
}
],
"next": ""
}{
"code": 3,
"message": "Key: 'limit' Error:Field validation for 'limit' failed on the 'lte' tag"
}{
"code": 16,
"message": "no auth provided"
}{
"code": 5,
"message": "object not found"
}{
"code": 13,
"message": "internal error"
}