{"openapi":"3.1.1","info":{"title":"Teams","description":"Productboard API v2 for managing teams and their member assignments. Use these endpoints to create, list, update, and delete teams, and to manage which members belong to each team.","version":"2.0.0","contact":{"name":"Productboard Support","url":"https://support.productboard.com","email":"support@productboard.com"},"license":{"name":"Productboard Proprietary","url":"https://www.productboard.com/"}},"servers":[{"url":"https://api.productboard.com/v2","description":"Production server"}],"security":[{"BearerAuth":[]},{"OAuth2":["entities:read","write:entities","entities:delete"]}],"tags":[{"name":"teams","description":"Operations related to teams and their member assignments."}],"paths":{"/teams":{"get":{"tags":["teams"],"summary":"List teams","description":"Retrieves a paginated list of teams from your workspace.\nTeams represent groups of members that can be used for organizing work and assigning ownership.\n\n- Teams are sorted by creation date, newest first.\n- Use the `name` parameter to filter by name (case-insensitive exact match).\n- Use the `handle` parameter to filter by handle (case-insensitive exact match).\n- Use the `query` parameter to search by partial name or handle (case-insensitive). For example, `query=product` will match \"Product Team\", \"My Product\", \"production\", etc.\n- Use the `pageCursor` parameter to paginate through results.\n","operationId":"listTeams","security":[{"BearerAuth":["teams:read"]}],"parameters":[{"name":"pageCursor","in":"query","description":"Cursor for pagination.","required":false,"schema":{"type":"string"}},{"name":"name","in":"query","description":"Filter teams by name (case-insensitive exact match).\n","required":false,"schema":{"type":"string","minLength":1,"maxLength":255},"example":"Product Team"},{"name":"handle","in":"query","description":"Filter teams by handle (case-insensitive exact match).\n","required":false,"schema":{"type":"string","minLength":1,"maxLength":255},"example":"productteam"},{"name":"query","in":"query","description":"Full-text search query. Performs case-insensitive partial match on team name and handle.\n","required":false,"schema":{"type":"string","minLength":1,"maxLength":255},"example":"Product"}],"responses":{"200":{"$ref":"#/components/responses/TeamListResponse"},"400":{"$ref":"#/components/responses/BadRequestResponse"},"401":{"$ref":"#/components/responses/UnauthorizedResponse"},"403":{"$ref":"#/components/responses/ForbiddenResponse"},"408":{"$ref":"#/components/responses/RequestTimeoutResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}},"post":{"tags":["teams"],"summary":"Create team","description":"Creates a new team in your workspace.\nYou must provide the team `name` and a unique `handle` for @mentions.\n\n## Required Fields\n\n- `name`: The name of the team (1-255 characters, must be unique per workspace)\n- `handle`: Unique handle for @mentions (lowercase alphanumeric only, 1-255 characters, must be unique per workspace)\n\n## Response\n\nReturns a reference to the created team with its ID and self link.\nUse the GET endpoint to retrieve the full team details.\n","operationId":"createTeam","security":[{"BearerAuth":["teams:write"]}],"requestBody":{"$ref":"#/components/requestBodies/TeamCreateRequestBody"},"responses":{"201":{"$ref":"#/components/responses/TeamReferenceResponse"},"400":{"$ref":"#/components/responses/BadRequestResponse"},"401":{"$ref":"#/components/responses/UnauthorizedResponse"},"403":{"$ref":"#/components/responses/ForbiddenResponse"},"408":{"$ref":"#/components/responses/RequestTimeoutResponse"},"409":{"$ref":"#/components/responses/ConflictResponse"},"422":{"$ref":"#/components/responses/UnprocessableEntityResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}},"/teams/search":{"post":{"tags":["teams"],"summary":"Search teams","description":"## Purpose\nPerforms a filtered search over teams using a POST request.\nUse this endpoint for batch lookups by IDs, names, or handles when query string filters are insufficient.\n\n## Request Format\n\nUses structured `filter` and `search` objects.\n\n## Key Features\n- `filter.id`: Filter by team UUIDs (OR logic, max 100)\n- `filter.fields.name`: Filter by team name, case-insensitive (single string or array, OR logic)\n- `filter.fields.handle`: Filter by team handle, case-insensitive (single string or array, OR logic)\n- `search.query`: Full-text search on team name and handle (case-insensitive partial match)\n- Returns the same response format as `GET /v2/teams`\n\n## Filter Logic\n- Multiple values within a single filter use **OR** logic (e.g., `filter.fields.name: [\"A\", \"B\"]` returns teams named A or B)\n- Different filter types and search use **AND** logic (e.g., `filter` AND `search` = intersection)\n- Empty request returns all teams (same as `GET /v2/teams`)\n\n## Important Notes\n- Each filter array accepts at most 100 items; exceeding this returns a 400 error\n- Pagination uses cursor-based navigation via `pageCursor` query parameter\n","operationId":"performTeamsSearch","security":[{"BearerAuth":["teams:read"]}],"parameters":[{"name":"pageCursor","in":"query","description":"Cursor for pagination.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamSearchRequest"},"examples":{"filter_by_ids":{"summary":"Filter by IDs","value":{"data":{"filter":{"id":["123e4567-e89b-12d3-a456-426614174000","223e4567-e89b-12d3-a456-426614174001"]}}}},"filter_by_fields":{"summary":"Filter by name and handle","value":{"data":{"filter":{"fields":{"name":["Product Team","Engineering Team"],"handle":"product"}}}}},"fulltext_search":{"summary":"Full-text search","value":{"data":{"search":{"query":"product"}}}},"combined_filter_and_search":{"summary":"Combined filter and search (AND logic)","value":{"data":{"filter":{"fields":{"name":["Product Team"]}},"search":{"query":"product"}}}}}}}},"responses":{"200":{"$ref":"#/components/responses/TeamListResponse"},"400":{"$ref":"#/components/responses/BadRequestResponse"},"401":{"$ref":"#/components/responses/UnauthorizedResponse"},"403":{"$ref":"#/components/responses/ForbiddenResponse"},"408":{"$ref":"#/components/responses/RequestTimeoutResponse"},"422":{"$ref":"#/components/responses/UnprocessableEntityResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}},"/teams/{id}":{"get":{"tags":["teams"],"summary":"Get team","description":"Retrieves the full details of a specific team by its unique identifier (UUID).\nReturns the team's name, handle, description, avatar URL, and metadata such as creation and update timestamps.\n\nUse this endpoint to load complete data for a single team.\n","operationId":"getTeam","security":[{"BearerAuth":["teams:read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Team identifier.","schema":{"type":"string","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000"}}],"responses":{"200":{"$ref":"#/components/responses/TeamResponse"},"400":{"$ref":"#/components/responses/BadRequestResponse"},"401":{"$ref":"#/components/responses/UnauthorizedResponse"},"403":{"$ref":"#/components/responses/ForbiddenResponse"},"404":{"$ref":"#/components/responses/NotFoundResponse"},"408":{"$ref":"#/components/responses/RequestTimeoutResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}},"patch":{"tags":["teams"],"summary":"Update team","description":"Updates the fields and/or members of an existing team.\nSupports both field updates via `fields` and member management via `patch` operations.\nBoth can be combined in a single request.\n\n## Updatable Fields\n\n- `name`: The name of the team (1-255 characters)\n- `handle`: Unique handle for @mentions (lowercase alphanumeric only)\n- `description`: Optional description of the team (max 10,000 characters)\n\n## Patch Operations on Members\n\nUse `patch` array to manage team members with these operations:\n\n- `addItems`: Add members to the team (idempotent, skips already-present members)\n- `removeItems`: Remove members from the team (idempotent, skips already-absent members)\n- `set`: Replace entire member list atomically\n- `clear`: Remove all members from the team\n\nMaximum 100 member references per operation.\n\n## Response\n\nReturns a reference to the updated team.\nUse the GET endpoint to retrieve the full updated team details.\n","operationId":"updateTeam","security":[{"BearerAuth":["teams:write"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Team identifier.","schema":{"type":"string","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000"}}],"requestBody":{"$ref":"#/components/requestBodies/TeamUpdateRequestBody"},"responses":{"200":{"$ref":"#/components/responses/TeamUpdateResponse"},"400":{"$ref":"#/components/responses/BadRequestResponse"},"401":{"$ref":"#/components/responses/UnauthorizedResponse"},"403":{"$ref":"#/components/responses/ForbiddenResponse"},"404":{"$ref":"#/components/responses/NotFoundResponse"},"408":{"$ref":"#/components/responses/RequestTimeoutResponse"},"409":{"$ref":"#/components/responses/ConflictResponse"},"422":{"$ref":"#/components/responses/UnprocessableEntityResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}},"delete":{"tags":["teams"],"summary":"Delete team","description":"Permanently deletes a team from your workspace.\nThis operation removes the team and all its membership associations.\n\n**Use this endpoint with caution — deletion is irreversible.**\n","operationId":"deleteTeam","security":[{"BearerAuth":["teams:delete"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Team identifier.","schema":{"type":"string","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000"}}],"responses":{"204":{"$ref":"#/components/responses/NoContentResponse"},"401":{"$ref":"#/components/responses/UnauthorizedResponse"},"403":{"$ref":"#/components/responses/ForbiddenResponse"},"404":{"$ref":"#/components/responses/NotFoundResponse"},"408":{"$ref":"#/components/responses/RequestTimeoutResponse"},"422":{"$ref":"#/components/responses/UnprocessableEntityResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}},"/teams/{id}/members":{"get":{"tags":["teams"],"summary":"List team members","description":"Returns a paginated list of members belonging to a specific team.\nMembers are sorted by membership creation date, newest first.\n\nMember name and email are redacted to `[redacted]` without the `members:pii:read` scope.\n","operationId":"listTeamMembers","security":[{"BearerAuth":["teams:read"]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Team identifier.","schema":{"type":"string","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000"}},{"name":"pageCursor","in":"query","description":"Cursor for pagination.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"$ref":"#/components/responses/TeamMembersListResponse"},"400":{"$ref":"#/components/responses/BadRequestResponse"},"401":{"$ref":"#/components/responses/UnauthorizedResponse"},"403":{"$ref":"#/components/responses/ForbiddenResponse"},"404":{"$ref":"#/components/responses/NotFoundResponse"},"408":{"$ref":"#/components/responses/RequestTimeoutResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}}},"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"API token authentication. Use your API token as the value of the Authorization header"},"OAuth2":{"type":"oauth2","description":"OAuth 2.0 authentication. Use this for user-authorized access to Productboard API.","flows":{"authorizationCode":{"authorizationUrl":"https://app.productboard.com/oauth/authorize","tokenUrl":"https://app.productboard.com/oauth/token","scopes":{"entities:read":"Read access to entities (features, components, initiatives, etc.)","write:entities":"Write access to create and modify entities","entities:delete":"Delete entities"}}}}},"schemas":{"TeamReference":{"type":"object","description":"Minimal reference to a team resource containing only identifying information.\n","required":["id","type","links"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the team","example":"123e4567-e89b-12d3-a456-426614174000"},"type":{"type":"string","const":"team","description":"Resource type identifier","example":"team"},"links":{"$ref":"#/components/schemas/TeamLinks"}}},"TeamLinks":{"type":"object","description":"Links for navigating team resources.","required":["self","members","html"],"properties":{"self":{"type":"string","format":"uri","description":"URL of the team resource.","example":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000"},"members":{"type":"string","format":"uri","description":"URL of the paginated team members sub-resource.","example":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000/members"},"html":{"type":"string","format":"uri","description":"URL of the team page in the Productboard UI.","example":"https://example.productboard.com/settings/teams/12"}}},"TeamReferenceResponse":{"type":"object","description":"Response wrapper containing a team reference.\n","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/TeamReference"}}},"Team":{"description":"Full team resource with all fields and metadata.\n","allOf":[{"$ref":"#/components/schemas/TeamReference"},{"type":"object","required":["fields","createdAt","updatedAt"],"properties":{"fields":{"$ref":"#/components/schemas/TeamFields"},"createdAt":{"type":"string","format":"date-time","description":"ISO 8601 timestamp when the team was created","example":"2025-01-01T10:00:00Z"},"updatedAt":{"type":"string","format":"date-time","description":"ISO 8601 timestamp when the team was last updated","example":"2025-01-15T14:30:00Z"}}}]},"TeamFields":{"type":"object","description":"Fields of a team resource.\n","required":["name","handle"],"properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"The name of the team.\n","example":"Product Team"},"handle":{"type":"string","description":"Unique handle for @mentions. Lowercase alphanumeric only.\n","example":"productteam"},"description":{"type":"string","description":"Optional description of the team.\n","example":"Team responsible for product development"},"avatarUrl":{"type":["string","null"],"format":"uri","readOnly":true,"description":"URL of the team's avatar image. Read-only.\nReturns `null` if no avatar is set.\n","example":"https://cdn.productboard.com/teams/avatars/123/medium.png"}}},"TeamMemberResource":{"type":"object","description":"A team member with fields and links.\nName and email are redacted to [redacted] without the members:pii:read scope.\n","required":["id","type","fields","links"],"properties":{"id":{"type":"string","format":"uuid","description":"UUID of the member (space membership)","example":"123e4567-e89b-12d3-a456-426614174000"},"type":{"type":"string","const":"member","description":"Resource type identifier"},"fields":{"type":"object","properties":{"name":{"anyOf":[{"type":"string","description":"Display name of the member.","example":"John Doe"},{"$ref":"#/components/schemas/ObfuscatedValue"}]},"email":{"anyOf":[{"type":"string","format":"email","description":"Email address of the member.","example":"john@example.com"},{"$ref":"#/components/schemas/ObfuscatedValue"}]}}},"links":{"$ref":"#/components/schemas/ResourceLinks"}}},"TeamCreateOrUpdateFields":{"type":"object","description":"Fields for creating or updating a team.\nFor creation, `name` and `handle` are required.\nFor updates, the `fields` object is required but all individual field properties within it are optional.\n\n**Note:** `avatarUrl` is read-only and cannot be set via API. Avatar management is only available through the UI.\n","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"The name of the team.\n\n# Validation\n- Required for creation\n- Must be between 1 and 255 characters\n- Must be unique per workspace\n\n# Filtering\nSupports exact match via `name` parameter and partial match via `query` parameter on GET /v2/teams.\n","example":"Product Team"},"handle":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[a-z0-9]+$","description":"Unique handle for @mentions.\n\n# Validation\n- Required for creation\n- Lowercase letters and numbers only (no uppercase, spaces, or special characters)\n- Must be unique per workspace\n","example":"productteam"},"description":{"type":"string","maxLength":10000,"description":"Optional description of the team.\n\n# Validation\n- Optional field\n- Maximum length: 10000 characters\n","example":"Team responsible for product development"}}},"TeamPatchOperation":{"type":"object","description":"A patch operation for managing list-type fields on a team.\n","oneOf":[{"type":"object","description":"Operation with a value (addItems, removeItems, set)","required":["op","path","value"],"additionalProperties":false,"properties":{"op":{"type":"string","enum":["addItems","removeItems","set"],"description":"The operation type."},"path":{"type":"string","enum":["members"],"description":"The field to operate on."},"value":{"type":"array","maxItems":100,"description":"Member references for the operation.\nEach item must include either `id` (space membership UUID) or `email`.\n","items":{"type":"object","oneOf":[{"required":["id"],"properties":{"id":{"type":"string","format":"uuid","description":"UUID of the member (space membership)"}}},{"required":["email"],"properties":{"email":{"type":"string","format":"email","description":"Email address of the member"}}}]}}}},{"type":"object","description":"Clear operation (no value needed)","required":["op","path"],"additionalProperties":false,"properties":{"op":{"type":"string","const":"clear","description":"Clear all items from the field."},"path":{"type":"string","enum":["members"],"description":"The field to clear."}}}]},"TeamSearchRequest":{"type":"object","description":"Request body for searching teams with filters.\n","properties":{"data":{"$ref":"#/components/schemas/TeamSearchData"}}},"TeamSearchData":{"type":"object","additionalProperties":false,"description":"Search data with structured filter and search objects.\n","properties":{"filter":{"$ref":"#/components/schemas/TeamSearchFilter"},"search":{"$ref":"#/components/schemas/TeamSearchSearch"}}},"TeamSearchFilter":{"type":"object","description":"Structured filters for team search. Different filter groups use AND logic.\nAll filters are optional.\n","properties":{"id":{"description":"Filter by team UUIDs (OR logic).","oneOf":[{"$ref":"#/components/schemas/UUID"},{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/UUID"}}]},"fields":{"$ref":"#/components/schemas/TeamSearchFilterFields"}}},"TeamSearchFilterFields":{"type":"object","description":"Field-level filters. Multiple values within a field use OR logic.\nString matching is case-insensitive.\n","properties":{"name":{"description":"Filter by team name. Single string or array (OR logic), case-insensitive.","oneOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"array","maxItems":100,"items":{"type":"string","minLength":1,"maxLength":255}}]},"handle":{"description":"Filter by team handle. Single string or array (OR logic), case-insensitive.","oneOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"array","maxItems":100,"items":{"type":"string","minLength":1,"maxLength":255}}]}}},"TeamSearchSearch":{"type":"object","description":"Full-text search options. Combined with filters using AND logic.\n","properties":{"query":{"type":"string","description":"Full-text search query. Performs case-insensitive partial match on team name and handle.\n","minLength":1,"maxLength":255}}},"ListLinks":{"type":"object","required":["next"],"properties":{"next":{"type":["string","null"]}}},"ErrorSource":{"type":"object","description":"An object containing references to the source of the error. It helps with location of the problematic field or parameter.\n","properties":{"pointer":{"type":"string","description":"JSON Pointer [RFC6901] to the associated entity in the request document.\n","example":"/data/fields/status"},"parameter":{"type":"string","description":"Query parameter causing the error.\nUsed when the error is related to a query parameter rather than request body.\n","example":"pageCursor"}}},"Error":{"type":"object","description":"Individual error object containing the details and context.\n","required":["code","title","detail"],"properties":{"code":{"type":"string","description":"A unique, machine-readable and stable code that identifies this error.\nMust be consistent across all services and provide clear categorization.\nFormat: `category.subcategory.specificError`\n","examples":["auth.accessDenied","resource.notFound"]},"title":{"type":"string","description":"A short, human-readable summary of the problem that doesn't change\nfrom occurrence to occurrence of the problem. Should provide immediate\nunderstanding of the error type.\n","maxLength":255,"example":"Missing required field"},"detail":{"type":"string","description":"A human-readable explanation specific to this occurrence of the problem.\nMay include suggestions for resolution but should not expose sensitive information.\n","maxLength":1000,"example":"Field 'status' is required."},"source":{"$ref":"#/components/schemas/ErrorSource"}}},"ErrorResponse":{"type":"object","description":"Standard error response structure.\n","required":["id","errors"],"properties":{"id":{"type":"string","description":"A unique identifier for this specific occurrence of the problem.\nIt carries unique request/response ID which allows client\nand server to reference the exact instance of the error\nin logs or support communication.\n"},"errors":{"type":"array","description":"Array of error objects, multiple errors can be returned.","items":{"$ref":"#/components/schemas/Error"},"minItems":1}}},"UUID":{"type":"string","format":"uuid","description":"A universally unique identifier (UUID).\n","example":"123e4567-e89b-12d3-a456-426614174000"},"ObfuscatedValue":{"type":"string","enum":["[redacted]"],"description":"The value `[redacted]`. Used to hide personally identifiable information in cases the request doesn't have the required `members:pii:read` OAuth2 scope.\n","example":"[redacted]"},"ResourceLinks":{"type":"object","required":["self"],"properties":{"self":{"type":"string"}}}},"requestBodies":{"TeamCreateRequestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["fields"],"properties":{"fields":{"$ref":"#/components/schemas/TeamCreateOrUpdateFields"}}}}},"examples":{"createTeam":{"summary":"Create a new team","value":{"data":{"fields":{"name":"Product Team","handle":"productteam","description":"Team responsible for product development"}}}},"createTeamMinimal":{"summary":"Create a team with only required fields","value":{"data":{"fields":{"name":"Engineering Team","handle":"engineering"}}}}}}}},"TeamUpdateRequestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","anyOf":[{"required":["fields"]},{"required":["patch"]}],"properties":{"fields":{"$ref":"#/components/schemas/TeamCreateOrUpdateFields"},"patch":{"type":"array","description":"Array of patch operations for managing list-type fields (currently: `members`).\n","items":{"$ref":"#/components/schemas/TeamPatchOperation"}}}}}},"examples":{"updateName":{"summary":"Update team name","value":{"data":{"fields":{"name":"Updated Product Team"}}}},"addMembers":{"summary":"Add members to team","value":{"data":{"patch":[{"op":"addItems","path":"members","value":[{"id":"550e8400-e29b-41d4-a716-446655440001"},{"id":"550e8400-e29b-41d4-a716-446655440002"}]}]}}},"removeMembers":{"summary":"Remove members from team","value":{"data":{"patch":[{"op":"removeItems","path":"members","value":[{"id":"550e8400-e29b-41d4-a716-446655440003"}]}]}}},"replaceMembers":{"summary":"Replace all members","value":{"data":{"patch":[{"op":"set","path":"members","value":[{"id":"550e8400-e29b-41d4-a716-446655440001"},{"id":"550e8400-e29b-41d4-a716-446655440002"}]}]}}},"clearMembers":{"summary":"Remove all members","value":{"data":{"patch":[{"op":"clear","path":"members"}]}}},"mixedUpdate":{"summary":"Update fields and members in one request","value":{"data":{"fields":{"name":"Updated Team Name"},"patch":[{"op":"addItems","path":"members","value":[{"id":"550e8400-e29b-41d4-a716-446655440001"}]}]}}}}}}}},"responses":{"TeamListResponse":{"description":"A paginated list of teams","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Team"}},"links":{"$ref":"#/components/schemas/ListLinks"}}},"examples":{"teamsList":{"summary":"List of teams","value":{"data":[{"id":"123e4567-e89b-12d3-a456-426614174000","type":"team","fields":{"name":"Product Team","handle":"productteam","description":"Team responsible for product development","avatarUrl":"https://cdn.productboard.com/teams/avatars/123/medium.png"},"createdAt":"2025-01-01T10:00:00Z","updatedAt":"2025-01-15T14:30:00Z","links":{"self":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000","members":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000/members","html":"https://example.productboard.com/settings/teams/12"}},{"id":"223e4567-e89b-12d3-a456-426614174001","type":"team","fields":{"name":"Engineering Team","handle":"engineering","description":"","avatarUrl":null},"createdAt":"2025-01-02T11:00:00Z","updatedAt":"2025-01-16T15:30:00Z","links":{"self":"https://api.productboard.com/v2/teams/223e4567-e89b-12d3-a456-426614174001","members":"https://api.productboard.com/v2/teams/223e4567-e89b-12d3-a456-426614174001/members","html":"https://example.productboard.com/settings/teams/13"}}],"links":{"next":"https://api.productboard.com/v2/teams?pageCursor=next_cursor_value"}}},"filteredByName":{"summary":"Teams filtered by exact name","description":"Example: GET /v2/teams?name=Product Team","value":{"data":[{"id":"123e4567-e89b-12d3-a456-426614174000","type":"team","fields":{"name":"Product Team","handle":"productteam","description":"Team responsible for product development","avatarUrl":"https://cdn.productboard.com/teams/avatars/123/medium.png"},"createdAt":"2025-01-01T10:00:00Z","updatedAt":"2025-01-15T14:30:00Z","links":{"self":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000","members":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000/members","html":"https://example.productboard.com/settings/teams/12"}}],"links":{"next":null}}},"searchByQuery":{"summary":"Teams searched by query","description":"Example: GET /v2/teams?query=Product","value":{"data":[{"id":"123e4567-e89b-12d3-a456-426614174000","type":"team","fields":{"name":"Product Team","handle":"productteam","description":"Team responsible for product development","avatarUrl":"https://cdn.productboard.com/teams/avatars/123/medium.png"},"createdAt":"2025-01-01T10:00:00Z","updatedAt":"2025-01-15T14:30:00Z","links":{"self":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000","members":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000/members","html":"https://example.productboard.com/settings/teams/12"}},{"id":"323e4567-e89b-12d3-a456-426614174002","type":"team","fields":{"name":"Product Marketing","handle":"productmarketing","description":"Marketing team for product launches","avatarUrl":null},"createdAt":"2025-01-03T09:00:00Z","updatedAt":"2025-01-17T12:00:00Z","links":{"self":"https://api.productboard.com/v2/teams/323e4567-e89b-12d3-a456-426614174002","members":"https://api.productboard.com/v2/teams/323e4567-e89b-12d3-a456-426614174002/members","html":"https://example.productboard.com/settings/teams/14"}}],"links":{"next":null}}},"emptyList":{"summary":"Empty teams list","value":{"data":[],"links":{"next":null}}}}}}},"TeamResponse":{"description":"Team details","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Team"}}},"examples":{"team":{"summary":"Team response","value":{"data":{"id":"123e4567-e89b-12d3-a456-426614174000","type":"team","fields":{"name":"Product Team","handle":"productteam","description":"Team responsible for product development","avatarUrl":"https://cdn.productboard.com/teams/avatars/123/medium.png"},"createdAt":"2025-01-01T10:00:00Z","updatedAt":"2025-01-15T14:30:00Z","links":{"self":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000","members":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000/members","html":"https://example.productboard.com/settings/teams/12"}}}}}}}},"TeamMembersListResponse":{"description":"Paginated list of team members","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TeamMemberResource"}},"links":{"$ref":"#/components/schemas/ListLinks"}}},"examples":{"membersList":{"summary":"List of team members","value":{"data":[{"id":"123e4567-e89b-12d3-a456-426614174000","type":"member","fields":{"name":"John Doe","email":"john@example.com"},"links":{"self":"https://api.productboard.com/v2/members/123e4567-e89b-12d3-a456-426614174000"}}],"links":{"next":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000/members?pageCursor=abc123"}}},"emptyList":{"summary":"Team with no members","value":{"data":[],"links":{"next":null}}}}}}},"TeamReferenceResponse":{"description":"Team created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamReferenceResponse"},"examples":{"reference":{"summary":"Team reference","value":{"data":{"id":"123e4567-e89b-12d3-a456-426614174000","type":"team","links":{"self":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000","members":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000/members","html":"https://example.productboard.com/settings/teams/12"}}}}}}}},"TeamUpdateResponse":{"description":"Team updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamReferenceResponse"},"examples":{"reference":{"summary":"Team reference","value":{"data":{"id":"123e4567-e89b-12d3-a456-426614174000","type":"team","links":{"self":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000","members":"https://api.productboard.com/v2/teams/123e4567-e89b-12d3-a456-426614174000/members","html":"https://example.productboard.com/settings/teams/12"}}}}}}}},"BadRequestResponse":{"description":"Bad Request - Invalid input format or malformed request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"schemaInvalid":{"summary":"Request does not satisfy schema","value":{"id":"req-1234567890","errors":[{"code":"request.invalid","title":"Request schema invalid","detail":"The request does not satisfy the required schema. Field 'type' is required but was not provided.","source":{"pointer":"/data/type"}}]}},"fieldInvalid":{"summary":"Invalid field value type","value":{"id":"req-1234567891","errors":[{"code":"request.invalid","title":"Request schema invalid","detail":"Field 'fields/name' must be a string with maximum length of 255 characters, but received a number.","source":{"pointer":"/data/fields/name"}}]}},"malformedJson":{"summary":"Malformed JSON syntax","value":{"id":"req-1234567892","errors":[{"code":"request.malformed","title":"Request malformed","detail":"The request body contains invalid JSON syntax. Expected ',' or '}' at line 5, column 12."}]}},"invalidContentType":{"summary":"Invalid content type","value":{"id":"req-1234567893","errors":[{"code":"request.malformed","title":"Request malformed","detail":"The Content-Type header must be 'application/json'. Received 'text/plain'."}]}}}}}},"UnauthorizedResponse":{"description":"Unauthorized - Missing or invalid authentication credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingCredentials":{"summary":"Missing authentication credentials","value":{"id":"req-2234567890","errors":[{"code":"auth.invalid","title":"Invalid authentication","detail":"Authentication credentials are missing."}]}},"invalidToken":{"summary":"Invalid or expired token","value":{"id":"req-2234567891","errors":[{"code":"auth.invalid","title":"Invalid authentication","detail":"The provided authentication credentials are invalid or have expired. Please obtain new credentials and try again."}]}},"revokedCredentials":{"summary":"Revoked credentials","value":{"id":"req-2234567892","errors":[{"code":"auth.invalid","title":"Invalid authentication","detail":"The authentication credentials have been revoked. Please contact your workspace administrator."}]}}}}}},"ForbiddenResponse":{"description":"Forbidden - Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"permissionDenied":{"summary":"Permission denied for resource","value":{"id":"req-3234567890","errors":[{"code":"auth.accessDenied","title":"Access denied","detail":"You do not have permission to perform this operation on the specified resource. Contact your workspace administrator to request access."}]}},"insufficientScope":{"summary":"Insufficient OAuth scopes","value":{"id":"req-3234567891","errors":[{"code":"auth.accessDenied","title":"Access denied","detail":"Your authentication token lacks the required OAuth scopes to perform this operation. Please re-authenticate with the necessary scopes."}]}},"readOnlyRole":{"summary":"Read-only role restriction","value":{"id":"req-3234567892","errors":[{"code":"auth.accessDenied","title":"Access denied","detail":"Your user role does not permit this operation. Please contact your workspace administrator."}]}}}}}},"RequestTimeoutResponse":{"description":"Request Timeout - The server did not receive a complete request within the allowed time","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"requestTimeout":{"summary":"Request timeout","value":{"id":"req-5234567890","errors":[{"code":"request.timeout","title":"Request timeout","detail":"The request took too long to process and was terminated. Try simplifying your request or try again later."}]}}}}}},"TooManyRequestsResponse":{"description":"Too Many Requests - API rate limit exceeded, reduce request frequency and retry after the indicated time","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"rateLimitExceeded":{"summary":"Rate limit exceeded","value":{"id":"req-7234567890","errors":[{"code":"rate.limitExceeded","title":"Rate limit exceeded","detail":"You have exceeded the allowed number of API requests. Please wait before making additional requests."}]}}}}}},"InternalServerErrorResponse":{"description":"Internal Server Error - An unexpected error occurred on the server, please retry or contact support","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"internalServerError":{"summary":"Unexpected server error","value":{"id":"req-8234567890","errors":[{"code":"internal.serverError","title":"Internal server error","detail":"An unexpected error occurred while processing your request. Please try again later. If the problem persists, contact support with the correlation ID."}]}}}}}},"ConflictResponse":{"description":"Conflict - Action cannot be performed due to current state or constraint violation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"uniqueConstraintViolation":{"summary":"Unique constraint violation","value":{"id":"req-9234567890","errors":[{"code":"conflict.uniqueViolation","title":"Unique constraint violation","detail":"A resource with this value already exists.","source":{"pointer":"/data/fields/name"}}]}}}}}},"UnprocessableEntityResponse":{"description":"Unprocessable Entity - Validation failed (e.g., missing required fields, unknown fields)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"validationFailed":{"summary":"Validation failed","value":{"id":"req-6234567890","errors":[{"code":"validation.failed","title":"Validation failed","detail":"One or more fields failed validation.","source":{"pointer":"/data/type"}}]}},"validationMultipleFields":{"summary":"Multiple validation errors","value":{"id":"req-6234567891","errors":[{"code":"validation.failed","title":"Validation failed","detail":"The field 'name' cannot be empty.","source":{"pointer":"/data/fields/name"}},{"code":"validation.failed","title":"Validation failed","detail":"The field 'type' has an unsupported value.","source":{"pointer":"/data/fields/type"}}]}},"referenceNotFound":{"summary":"Referenced resource not found","value":{"id":"req-6234567892","errors":[{"code":"validation.referenceNotFound","title":"Referenced resource not found","detail":"The referenced resource could not be found or you do not have access to it.","source":{"pointer":"/data/fields/id"}}]}}}}}},"NotFoundResponse":{"description":"Not Found - The requested resource does not exist or is not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"resourceNotFoundById":{"summary":"Resource not found by ID","value":{"id":"req-4234567890","errors":[{"code":"resource.notFound","title":"Resource not found","detail":"The requested resource could not be found or you do not have permission to access it."}]}},"routeNotFound":{"summary":"API route not found","value":{"id":"req-4234567893","errors":[{"code":"route.notFound","title":"Route not found","detail":"The requested URL path does not match any defined API route. Please check the API documentation for valid endpoints."}]}}}}}},"NoContentResponse":{"description":"The request was successful and no content is returned."}}},"x-readme":{"samples-languages":["shell","javascript","ruby"]}}