---
title: "List user team affiliations"
method: GET
path: "/users/{identifier}/teams"
tags: ["Players"]
---

# List user team affiliations

`GET /users/{identifier}/teams`

Returns the user's active team memberships as a non-paginated list with a count and response timestamp - there is no cursor, limit, or sort parameter, and rows come back in storage order. Each row is an API-safe team summary plus the membership role, joinedAt, and the team's parent organization (null when the team has no organization). Only active memberships are included. Requires the target profile to be public or limited (a private profile returns 403); the requester always sees their own affiliations regardless of visibility. For any profile other than your own, only teams that belong to an organization with a public profile are returned - teams in a non-public-profile or organization-less context are omitted. Banned or unknown identifiers return 404. The identifier may be a username or a Convex user ID. Requires the users.profile:read scope.

## Path parameters

- `identifier` string, required — Username or Convex user ID.

## Response `200`

User team affiliations.

- object — Envelope containing teams, count, and a response timestamp.
  - `teams` ApiUserTeamMembership[], required
    - `id` string, required — Team ID.
    - `slug` string, nullable
    - `name` string, required — Team name.
    - `tag` string, nullable
    - `avatarUrl` string, nullable
    - `visibility` 'public' | 'limited' | 'private' — Public profile visibility setting.
    - `role` string, required
    - `joinedAt` string, nullable, required — ISO 8601 timestamp.
    - `organization` ApiOrganizationSummary — Small API-safe organization summary.
      - `id` string, required — Organization ID.
      - `slug` string, nullable
      - `name` string, required — Organization name.
      - `tag` string, nullable
      - `avatarUrl` string, nullable
      - `visibility` 'public' | 'limited' | 'private' — Public profile visibility setting.
  - `count` integer, required
  - `timestamp` string, required — ISO 8601 timestamp.

## Other responses

- `401` — Missing or invalid API key.
- `403` — API key lacks the required permission.
- `404` — Resource not found.
- `429` — Rate limited.
- `500` — Internal server error.

---

[API](https://skmtc.net/teambattles/apis/teambattles-api.md) · [All operations](https://skmtc.net/teambattles/apis/teambattles-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/teambattles/teambattles-api/versions/2ffe8fb53b7d/schema)
