Skip to content

Teams

Teams organize members within or outside organizations. Teams can be standalone or linked to an organization.

Model

Team
├── name, slug, description
├── organizationId? (optional — null for standalone teams)
├── members (with roles: OWNER, ADMIN, MANAGER, MEMBER)
└── tasks (team-scoped convenience endpoint)

API Endpoints

MethodPathDescription
GET/api/teamsList user's teams
POST/api/teamsCreate team
GET/api/teams/:teamIdGet team details
PATCH/api/teams/:teamIdUpdate team
DELETE/api/teams/:teamIdDelete team
GET/api/teams/:teamId/membersList members
POST/api/teams/:teamId/membersAdd member
PATCH/api/teams/:teamId/members/:userIdUpdate member role
DELETE/api/teams/:teamId/members/:userIdRemove member
GET/api/teams/by-slug/:teamSlug/tasksTeam task board

Frontend Routes

RouteViewDescription
/teamsTeamListViewList all user teams
/organizations/:orgId/teamsOrgTeamListViewOrg's teams
/teams/:teamIdTeamDetailViewTeam overview
/teams/:teamId/tasksTeamTasksViewTeam task board
/teams/:teamId/settingsTeamSettingsViewTeam settings

Frontend Store

typescript
const store = useTeamsStore()
const { teams, currentTeam } = storeToRefs(store)

await store.fetchTeams()
await store.fetchTeam(teamId)

await store.createTeam({ name, slug, description, organizationId })
await store.updateTeam(teamId, { name, description })

// Members
await store.addMember(teamId, email, role)
await store.removeMember(teamId, userId)

Key Implementation Details

  • Teams linked to an organization inherit organization-level permission constraints
  • Standalone teams operate independently with their own permission scope
  • The /teams/by-slug/:teamSlug/tasks endpoint provides a convenient task board view
  • Team settings control name, description, and member management