List users in the tenant
const url = 'https://example.com/v1/identity/users?limit=25&include=grants';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://example.com/v1/identity/users?limit=25&include=grants' \ --header 'Authorization: Bearer <token>'Cursor-paginated list of tenant users (sort order is binding-defined), for tenant admins only. Optional ?query= is a prefix match on displayName — the natural filter shape for a “search users” surface. primaryEmail may be redacted per tenant policy. Anyone else adds a person to a project by their email or id (POST /v1/projects/{projectId}/memberships).
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”1..100. Default 25.
Where the previous page ended: its nextCursor, as it came. A runtime that seals cursors takes one only for the same list, filters and caller, within a day; otherwise 400 bad-input, and the list starts again without it. Absent → first page.
Prefix match on displayName.
With true, people who were removed (unregisteredAt) too.
With true, only people with an open invitation (invite: pending or expired), who haven’t signed in yet. An older runtime ignores it and lists everyone (from 0.1.9).
Extra fields, comma-separated. grants: each person’s grants, as GET /v1/identity/users/{userId}/grants answers them, in this one read. A runtime that doesn’t read grants (no authorization store) leaves grants out, as an older one does.
Responses
Section titled “Responses”Page of users.
object
Tenant-scoped user record (admin plane). primaryEmail may be redacted on the wire based on tenant policy (the routes treat it as opaque). metadata is free-form JSON — deployments carry IdP claims / provisioning source / roles here.
object
When they were removed from the tenant (POST /v1/identity/users/{userId}/unregister); absent while they are here.
Their invitation, while they haven’t signed in: absent once they have, for people added without an email, and for people added before invitations (from 0.1.9).
object
When it was last emailed; absent when it never was.
Their first sign-in that made a session. Absent before it, and for people who last signed in before it was kept (from 0.1.9).
object
The person’s grants: only on GET /v1/identity/users?include=grants, and only from a runtime that reads grants.
object
Whether the person is a tenant admin. Absent when the runtime has no authorization store: nothing grants it then.
Whether the person is a tenant member: they read the tenant’s settings (providers, policies, adapters, signing keys, deployments), not its projects. A person is one from being added. Absent when the runtime has no authorization store, or doesn’t report it.
Direct project memberships.
A person’s direct role on a project.
object
Role on a project, as read. member is only read, on a role given before it was retired: it grants what viewer does, and writes refuse it.
Team memberships.
A person’s role in a team.
object
Role on a team membership.
A person’s active entry on the reviewer roster.
object
Reviewer role class. Hierarchy: standard < senior < admin.
Example
{ "data": [ { "invite": { "state": "pending" }, "grants": { "projects": [ { "role": "viewer" } ], "teams": [ { "role": "member" } ], "reviewer": { "role": "standard" } } } ]}Missing / malformed / expired / revoked bearer token.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Not a tenant admin.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}