Teams
Endpoints under /teams/{teamId} are team-scoped. They act on the team that the teamId path parameter names. What a call can do depends on your membership of that team: what your role permits, and whether you hold a seat.
Roles
Each member holds one role, which carries a set of permissions. Six are standard and the same in every team; a team can also define its own. See Roles and permissions for what each one includes.
| Role | Code |
|---|---|
| Owner | owner (follows the account's billing contact and cannot be assigned) |
| Admin | admin |
| Deputy Admin | deputy_admin |
| Data Manager | data_manager |
| Editor | editor |
| Viewer | viewer |
Each endpoint states the team permission it needs, such as members.set_role or members.remove. A role either includes that permission or it does not. If you are not a member of the team, the call fails with 403 FORBIDDEN. If your role does not include the permission, it fails with 403 INSUFFICIENT_ROLE.
A seat is a separate check. See Seats.
viewer, editor and owner, in which owner meant "runs the team" rather than the account owner. That model is gone, and so is its vocabulary. See Update member role.Seats
A role says what a member is allowed to do; a seat says whether they can change anything at all. A member without a seat keeps every read their role allows and is refused every write, on this API as everywhere else. See Seats.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET | /teams | List teams you belong to |
GET | /teams/{teamId} | Get a team's details, plan, and usage |
PUT | /teams/{teamId}/name | Rename a team |
PUT | /teams/{teamId}/brand-color | Set the team's brand color |
PUT | /teams/{teamId}/timezone | Set the team's timezone |
POST | /teams/{teamId}/logo | Upload a team logo |
DELETE | /teams/{teamId}/logo | Remove a team logo |
GET | /teams/{teamId}/members | List a team's members |
PUT | /teams/{teamId}/members/{userId}/role | Change a member's role |
PUT | /teams/{teamId}/members/{userId}/seat | Assign or unassign a member's seat |
DELETE | /teams/{teamId}/members/{userId} | Remove a member |
The team object
{
"id": "0190f8b0-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
"name": "Acme Marketing",
"logoUrl": "https://cdn.twominutereports.com/tmr/team_logo/0190f8b0-1a2b-7c3d-8e4f-5a6b7c8d9e0f-9f2c4b7e1a3d5c8f.png",
"brandColor": "#2563eb",
"timezone": "Asia/Kolkata",
"createdAt": "2026-01-12T08:15:00.000Z",
"updatedAt": "2026-05-20T11:42:00.000Z",
"plan": {
"name": "Growth",
"status": "active",
"endsOn": null,
"currencyCode": "USD",
"frequency": "month",
"destinations": {
"core": "gs",
"additional": ["gds"]
},
"limits": {
"seats": { "base": 5, "addons": 3, "total": 8 },
"accountsPerConnector": { "base": 10, "addons": 5, "total": 15 },
"schedules": {
"total": 100,
"allowedFrequencies": ["Daily", "Weekly", "Monthly"]
}
}
},
"usage": {
"members": { "count": 6 },
"seats": { "used": 4, "entitled": 8, "available": 4, "unlimited": false, "status": "ok" },
"accountsPerConnector": {
"gadw": { "count": 4, "status": "ok" },
"fads": { "count": 15, "status": "reached" }
},
"schedules": {
"count": 42,
"byFrequency": { "Hourly": 0, "Daily": 30, "Weekly": 10, "Monthly": 2 },
"status": "ok",
"hasRestrictedFrequency": false
}
}
}
plan is null for teams without a subscription. The name field is null for unnamed teams, logoUrl is null for teams that have not uploaded one, brandColor is null until one is chosen, and timezone is null until the team has one. Read a null timezone as UTC. See Get team for a field-by-field breakdown.