Teams
Endpoints under /teams are team-scoped — they act on a specific team identified by the teamId path parameter. Access is governed by 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 & 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 — members.set_role, members.remove and so on — and a role either holds that permission or it does not. Endpoints also still carry a minimum-role check inherited from the old ladder, which is being removed; while both apply, a call has to satisfy each. If you are not a member of the team, or you lack the permission, the call fails with 403 FORBIDDEN.
A seat is checked separately again — see below.
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 colour |
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": {
"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" },
"fb": { "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 that as UTC. See Get team for a field-by-field breakdown.