Two Minute Reports Logo

Teams

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

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.

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, 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.

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 color
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": {
      "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.
Copyright © 2026