listTeamMembers
List EVERY member of your organization with their membership facts: the roster.
List EVERY member of your organization with their membership facts: the roster. Offset-paginated (offset + limit; limit defaults to 50, maximum 100; newest member first), so walk pages until one comes back short rather than treating the first page as the whole team. Each row carries organizationRole (ADMIN | MEMBER: ADMIN is the role every ADMIN-scoped operation requires of the key owner) and organizationMembershipStatus (ACTIVE | SUSPENDED). REMOVED MEMBERS ARE INCLUDED: a suspended person is still a row here, so filter on organizationMembershipStatus before reporting who is on the team, and never read a row's presence as "currently works here". Optional searchTerm is a SUBSTRING match on name and email for a plain term and on the id for a uuid; a phone number is matched ONLY when the term is a complete US number (a partial such as the last four digits is searched as a name/email substring and finds no phone: an empty page there is not evidence nobody has the number). Plain terms rank by similarity; a complete email, phone or uuid keeps newest-first and can also return members whose value contains it. Capabilities are not here: the key owner's own come from getMyCapabilities, and an admin reads a teammate's with getTeamMemberCapabilities. Use listTeammates instead when you only need to pick one active person by a partial name.
curl https://server.goliathdata.com/api/v1/call \
-H "Authorization: Bearer $GOLIATH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"operationId": "listTeamMembers",
"variables": {}
}'import { GoliathClient } from '@goliath-data/sdk'
const goliath = new GoliathClient({
apiKey: process.env.GOLIATH_API_KEY!,
baseUrl: 'https://server.goliathdata.com',
})
const result = await goliath.team.listTeamMembers({})const res = await fetch('https://server.goliathdata.com/api/v1/call', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.GOLIATH_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
operationId: 'listTeamMembers',
variables: {}
}),
})
const { data, errors } = await res.json()limit is clamped to 100.
Variables
The example sends only what the schema requires. Some operations also need one of several optional variables (one filter or another, say); the description above says which.
Default 0.
Default 50.
Response
What comes back under data: a list shows as one entry, and a value as its type.
{
"data": {
"teamQuery": {
"listTeamMembers": [
{
"id": "<ID>",
"firstName": "…",
"lastName": "…",
"email": "…",
"phoneNumber": "…",
"organizationRole": "ADMIN",
"organizationMembershipStatus": "ACTIVE",
"createdAt": "2026-01-01T00:00:00.000Z"
}
]
}
}
}Errors
unknown_variableA variable the operation does not declare. A typo is refused rather than silently dropped.
unauthorizedNo bearer header, or the key is invalid or revoked.
insufficient_scopeThe key lacks the scope the operation requires.
forbiddenA referenced record does not exist, was deleted, or is outside your organization. The gateway cannot tell those apart.
Behaviour
A read. It rejects an Idempotency-Key header with 400 bad_request.