List teams
Every team in a company, for administrative reads.
Every team in a company. This is an administrative view for tooling that manages an organization, not an account picker: the accounts you can act under are on Get identity, which already returns them.
Reading it requires the MANAGE_TEAMS permission on the company, because
listing a company's teams exposes its structure and
Get a team then exposes every member's email address.
That permission comes from the caller's company role, which is a separate
grant from their team role. Get identity returns it under
company_permissions, not in the permissions map beside it. See
Two roles, two maps.
https://api2.rundiffusion.com/api/v2/teamsRequest
Headers
AuthorizationstringRequired- Bearer token. This endpoint accepts an OAuth device flow token or a Company API Access Token. A Personal API Access Token is refused, because it reaches only its owner's own resources and is not scoped to a company. See Authentication.
Authorization: Bearer eyJhbGciOi…
Query
cursorstringoptional- Opaque pagination token. When a response has has_more true, pass its next_cursor here to get the following page. Do not construct or parse one.
https://api2.rundiffusion.com/api/v2/teams?cursor=2D8NEx… limitintegeroptionaldefault24- Page size, from 1 to 100.
https://api2.rundiffusion.com/api/v2/teams?limit=10 company_idstringoptional- The company to read. Required with OAuth, which names a person rather than a company. A Company API Access Token already names its company, so it does not need this. Get identity returns it on every TEAM account.
https://api2.rundiffusion.com/api/v2/teams?company_id=Cm4pQ7… is_activebooleanoptional- Filter by activation state. true returns activated teams, false returns deactivated ones. Omit it to get both, which is the default.
https://api2.rundiffusion.com/api/v2/teams?is_active=true
Naming the company
A Company API Access Token already names the company it acts on, so it needs no parameter:
curl "https://api2.rundiffusion.com/api/v2/teams" \
-H "Authorization: Bearer $RUNDIFFUSION_COMPANY_TOKEN"OAuth is a user credential with no company of its own, and a user can belong
to teams in more than one company, so there is nothing to infer. Name the company
with company_id, which Get identity returns on every
TEAM account:
curl "https://api2.rundiffusion.com/api/v2/teams?company_id=Cm4pQ7…" \
-H "Authorization: Bearer $RUNDIFFUSION_TOKEN"Note that company_id is not the account selection team_id performs
everywhere else: this endpoint answers for a company, never for one team inside
it.
A Personal API Access Token is refused.
Response
200 OK with one page of the company's teams, newest first.
{
"data": [
{
"id": "2D8NEx…",
"created": "2026-03-14T09:02:11+00:00",
"name": "Design Studio",
"is_active": true
}
],
"has_more": false,
"next_cursor": null
}dataarray- The teams on this page, newest first. Empty when the company has none, which is not an error.
has_moreboolean- Whether more pages exist beyond this one. This is the flag to branch on when paging.
next_cursorstring | null- Pass this back as cursor to fetch the next page. Null on the last page.
Team object
idstring- The team ID. This is the value you send as team_id on the endpoints that take an account selection.
createdstring (ISO 8601) | null- When the team was created, in UTC.
namestring | null- The team's display name.
is_activeboolean- Whether the team is activated. A deactivated team still appears here unless you filter it out.
Paging
Cursor paginated, the same way as every other listing. Read has_more, and when
it is true send next_cursor back as cursor.
The cursor is tied to the filter it was issued under. Changing is_active
partway through a walk invalidates it and returns 400 INVALID_CURSOR rather
than quietly resuming somewhere else in a different result set, so keep the
filter constant for the length of a walk.
Errors
Status codes
403PERMISSION_DENIED- The caller lacks MANAGE_TEAMS on the company, or presented a Personal API Access Token, or presented a user credential without naming a company. The message says which.
404TEAM_NOT_FOUND- The company named does not exist, or has no teams the caller may read.
400INVALID_CURSOR- The cursor no longer matches this listing, which happens if you change is_active partway through a walk. Restart the walk without a cursor.
401UNAUTHENTICATED- Missing, malformed, or expired token. Refresh it and retry.
429RATE_LIMITED- Too many requests. See Rate limits.
