Two Minute Reports Logo

Teams

Manage teams — details, plan and usage, members, roles, and seats.

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.

RoleCode
Ownerowner — follows the account's billing contact and cannot be assigned
Adminadmin
Deputy Admindeputy_admin
Data Managerdata_manager
Editoreditor
Viewerviewer

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.

Breaking change, September 2026. Access used to be a three-rung ladder of 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

MethodEndpointDescription
GET/teamsList teams you belong to
GET/teams/{teamId}Get a team's details, plan, and usage
PUT/teams/{teamId}/nameRename a team
PUT/teams/{teamId}/brand-colorSet the team's brand colour
PUT/teams/{teamId}/timezoneSet the team's timezone
POST/teams/{teamId}/logoUpload a team logo
DELETE/teams/{teamId}/logoRemove a team logo
GET/teams/{teamId}/membersList a team's members
PUT/teams/{teamId}/members/{userId}/roleChange a member's role
PUT/teams/{teamId}/members/{userId}/seatAssign 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.
Copyright © 2026