Skip to main content
GET
List organization members
admin scope: this route enumerates real people (id, email, display name, role), so it follows the same posture as GET /v1/usage — org-wide enumeration requires an admin key, and a non-admin key gets 403 permission_denied. Rows with role='service' (provisioned subjects and sandbox identities) are never returned: they are not team members and their internal user ids are an isolation detail. Ordered by joinedAt ascending with the member id as a stable tiebreaker; page with nextCursor until hasMore is false. No totals — use memberCount on GET /v1/team for the size of the team.

Authorization

This route requires the admin scope. A missing or invalid credential returns 401 authentication_error. A valid credential without the scope returns 403 permission_denied, and the problem body names the exact scope required.

Headers

These are request conventions the contract does not declare as parameters, so they do not appear in the schema tables below.

Success responses

Errors

Every error is an RFC 9457 application/problem+json body carrying a stable code, a requestId, and a suggestedAction where Exo has one. See Errors.

Notes

  • Admin scope, because this enumerates real people. Provisioned subjects and sandbox identities are never returned: they are not team members and their internal ids are an isolation detail.

Authorizations

X-Exo-API-Key
string
header
required

An Exo API key (exo_...) sent as the X-Exo-API-Key header.

Query Parameters

cursor
string | null

Opaque cursor from a previous nextCursor.

pageSize
integer | null

Page size, coerced into [1, 100] (default 25).

Response

Successful Response

data
TeamMember · object[]
required
hasMore
boolean
default:false
nextCursor
string | null