Team
The team
Everyone with a seat on the account, their role, and which sites they reach.
curl --request GET \
--url 'https://truestat.io/api/v1/team' \
--header 'Authorization: Bearer <token>'{
"data": [
{
"role": "owner",
"sites": null,
"pending": false,
"user_id": "734c7de3-58f1-46e6-83d1-2be85466ee70",
"created_at": "2026-09-03T17:55:11Z",
"accepted_at": "2026-09-03T17:55:11Z",
"invited_email": null
},
{
"role": "admin",
"sites": [
"6fed8980-a119-4a9c-a4d4-53e448ef9f9e"
],
"pending": false,
"user_id": "9c9df94f-59f2-4080-bc3c-21b80ebdfe9c",
"created_at": "2026-09-14T08:12:40Z",
"accepted_at": "2026-09-14T08:59:25Z",
"invited_email": null
}
],
"meta": {}
}Everyone who holds a seat, whether or not they have accepted yet.
A pending invitation is still a seat
The row exists from the moment the invitation is sent — before the person has an account, before they have clicked anything. That is deliberate, because the plan's seat limit counts rows: an invitation you have forgotten about is occupying a seat you are paying for.
pending separates them. A caller counting "people who can sign in" wants the
accepted ones; a caller checking "how close am I to the limit" wants all of
them.
pending | invited_email | |
| Accepted member | false | null |
| Outstanding invitation | true | the address it went to |
sites: null means every site
This is the field most likely to be misread, and reading it wrong has real consequences on the site scope endpoint.
A member with no restriction reaches the whole organisation. That is the
default, and it is what null reports. An array means they are confined to
those sites and nothing else.
An empty array is never returned, because "restricted to nothing" is not a
state that exists. If you see [] anywhere, it is a request body meaning
remove the restriction, not a response.
No email addresses for people who joined
invited_email disappears once somebody accepts. From then on they are a
user_id.
An API key is not a person, and an endpoint that lists a company's staff addresses is a disclosure with no purpose here — every other endpoint identifies a member by their id, and the one place an address is genuinely needed is the invitation itself, where you supplied it.
Roles
| Role | What it means |
owner | The account. Billing, the team, and everything below. |
admin | Everything a member can do, plus deleting sites and managing API keys. |
member | Create and edit sites, goals and integrations. |
viewer | Exists in the data model; today it is not distinguished from member. |
Only admin and member can be invited or
assigned. Ownership is transferred deliberately
from the dashboard, and viewer is not offered while the permission rules do
not actually enforce it.
Authorizations
AuthorizationstringheaderrequiredAn API key from Settings → API keys. Scopes available: analytics:read, sites:read, sites:write, settings:read, settings:write, goals:read, goals:write, funnels:read, funnels:write, notes:read, notes:write, alerts:read, alerts:write, team:read, team:write, revenue:read, revenue:write.
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Response
The answer.
dataunknownmetaobjecterrorobjecterrorobjecterrorobjecterrorobject