{"openapi":"3.0.0","info":{"title":"Kollabe Public API","version":"1.2.0","description":"API for accessing and managing your organization's Kollabe data.\n\n## Token types\n\nTwo kinds of API tokens are supported:\n\n- **Organization API tokens** — created in organization settings by an admin. Represent the organization itself and can act on behalf of any user by passing `userId` in the request body. Use these for admin automations and backend integrations.\n- **Personal access tokens (PATs)** — created by an individual user for their own account. Requests are automatically attributed to the token owner. PATs **cannot** impersonate another user — any `userId` in the request body must match the token owner. Required for user-voice endpoints such as submitting a standup update.\n\nEach endpoint below documents which token type it accepts via its `security` attribute. Write operations require a READ_WRITE key.\n\nPersonal access tokens require the organization to be on a paid plan and to have personal access tokens enabled in settings.\n\n## Formatted text\n\nEndpoints that accept user-written content (standup answers, standup comments, retro items, round descriptions, action item name and description) accept a conservative markdown subset:\n\n- `**bold**`, `*italic*`, `~~strikethrough~~`\n- bullet lists (`- item`) and numbered lists (`1. item`)\n- links `[label](https://example.com)` (`http://`, `https://`, `mailto:`, `/`, `#` only)\n- paragraph breaks (blank line) and hard breaks (trailing two spaces)\n\nEverything else — headings, blockquotes, code, tables, images, iframes, scripts, task lists — is stripped. Raw HTML is escaped and renders as literal text. Underline is not supported (markdown has no syntax for it) — use italic instead. Plain text is valid markdown — send it as-is when no formatting is needed.\n\nIf you have specific workflows or integrations in mind that are not covered by the API, please reach out to us at support@kollabe.com.","contact":{"name":"Support","email":"support@kolabe.com"}},"servers":[{"url":"/"}],"security":[{"BearerAuth":[]}],"tags":[{"name":"Spaces","description":"Organization spaces that contain rooms, retros, and standups."},{"name":"Planning Poker","description":"Estimation rooms with rounds, votes, and participant data."},{"name":"Retrospectives","description":"Retrospective boards with columns, items, action items, and polls."},{"name":"Standups","description":"Standup meetings with questions, submissions, and daily reports."},{"name":"Users","description":"Organization and space members."},{"name":"Groups","description":"Space groups with member assignments."},{"name":"Action Items","description":"Retrospective action items with status tracking and assignments."},{"name":"Search","description":"Natural-language semantic search across a space's retros, retro items and comments, retro action items and comments, standup answers and comments, planning poker rounds, retro notes, ice-breaker answers, and polls."}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"Any API token — either an organization token or a personal access token. Used for endpoints that behave the same regardless of token type, such as read endpoints."},"OrgBearerAuth":{"type":"http","scheme":"bearer","description":"Organization API token created in organization settings. Can act on behalf of any user by providing userId in the request body. Required for admin and automation endpoints."},"PersonalBearerAuth":{"type":"http","scheme":"bearer","description":"Personal access token created by a user in their organization settings. Actions are attributed to the token's owner — PATs cannot impersonate other users. Required for user-voice endpoints such as submitting standup updates or retro items. Requires the organization to have personal access tokens enabled and be on a paid plan."}},"schemas":{"Pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]},"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]},"SpaceItem":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"active":{"type":"boolean"},"createdAt":{"type":"string"}},"required":["id","name","description","active","createdAt"]},"RoomItem":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string"},"spaceId":{"type":"string","nullable":true}},"required":["id","name","createdAt","spaceId"]},"RoomDetail":{"nullable":true},"CreateRoomBody":{"type":"object","properties":{"name":{"type":"string","description":"Room name shown in the meeting UI."},"spaceId":{"type":"string","description":"Space (UUID) to create the room in."},"userId":{"type":"string","description":"User id (UUID) to act on behalf of. Required when using an organization API token. Ignored for personal access tokens — the PAT owner is always the acting user; passing a different userId is rejected."},"description":{"type":"string","description":"Optional room description shown in the meeting UI alongside the room title."},"duplicateId":{"type":"string","description":"ID (UUID) of an existing room or template to copy settings, columns, and rounds from. Must belong to the same organization. When provided, the deck and settings are copied from the source room and `votingSystem` / `cardOptions` / `settings` are ignored."},"votingSystem":{"type":"string","enum":["FIBONACCI","MODIFIED_FIBONACCI","TSHIRT_SIZES","POWER_OF_TWO","CUSTOM","HEALTH","TRAFFIC_LIGHTS"],"description":"Card deck preset. One of FIBONACCI, MODIFIED_FIBONACCI, TSHIRT_SIZES, POWER_OF_TWO, HEALTH, TRAFFIC_LIGHTS, or CUSTOM. Defaults to FIBONACCI. When CUSTOM, also provide `cardOptions`."},"cardOptions":{"type":"array","items":{"type":"string","maxLength":3},"minItems":2,"maxItems":30,"description":"Custom card values, 2–30 entries, max 3 characters each (e.g. [\"XS\", \"S\", \"M\"]). Required when `votingSystem` is CUSTOM, ignored otherwise."},"cardLabels":{"type":"array","items":{"type":"string"},"description":"Optional labels per card, parallel to `cardOptions`. Only meaningful when `votingSystem` is CUSTOM."},"allowSkip":{"type":"boolean","description":"Include a skip card so voters can opt out of a round. Defaults to false."},"settings":{"type":"object","properties":{"anonymousVoting":{"type":"boolean","description":"Hide who voted what until after the round is revealed."},"asyncVoting":{"type":"boolean","description":"Let votes trickle in over time instead of one shared round."},"autoReveal":{"type":"boolean","description":"Reveal the round automatically once everyone has voted."},"creatorControl":{"type":"boolean","description":"Only the room creator can reveal, reset, and skip rounds."},"allowObservers":{"type":"boolean","description":"Let participants join as non-voting observers."},"allowEmotes":{"type":"boolean","description":"Let participants send emoji reactions during a round."},"allowComments":{"type":"boolean","description":"Let participants leave comments on rounds."},"changeVote":{"type":"boolean","description":"Allow users to change their vote after the round is revealed."}},"description":"Optional room settings. Any field omitted falls back to the same default the in-app create-room form uses."}},"required":["name","spaceId"]},"CreatedRoom":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"spaceId":{"type":"string","nullable":true},"url":{"type":"string","description":"Full URL to the meeting"},"createdAt":{"type":"string"}},"required":["id","name","spaceId","url","createdAt"]},"RoundExtraField":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."},"RoundItem":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"externalId":{"type":"string","nullable":true},"externalLink":{"type":"string","nullable":true},"createdAt":{"type":"string"},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."}}},"required":["id","name","description","externalId","externalLink","createdAt"]},"CreateRoundBody":{"type":"object","properties":{"name":{"type":"string","description":"Round title shown in the room UI."},"description":{"type":"string","description":"Round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"externalId":{"type":"string","description":"External tracker reference (e.g. a Jira issue key like `JIRA-123`). Free-form — not validated."},"externalLink":{"type":"string","description":"URL to the external tracker item. Rendered as a link beside the round name."},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."},"maxItems":30,"description":"Up to 30 extra fields rendered in the round's ticket details panel (types: text, number, date, datetime, labels, markdown). Only allowed on rounds not linked to an integration."},"userId":{"type":"string","description":"User id (UUID) to act on behalf of. Required when using an organization API token. Ignored for personal access tokens — the PAT owner is always the acting user; passing a different userId is rejected."}},"required":["name"]},"BulkCreateRoundsBody":{"type":"object","properties":{"rounds":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Round title shown in the room UI."},"description":{"type":"string","description":"Round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"externalId":{"type":"string","description":"External tracker reference (e.g. a Jira issue key). Free-form."},"externalLink":{"type":"string","description":"URL to the external tracker item."},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."},"maxItems":30,"description":"Up to 30 extra fields rendered in the round's ticket details panel (types: text, number, date, datetime, labels, markdown). Only allowed on rounds not linked to an integration."}},"required":["name"]},"minItems":1,"maxItems":100,"description":"Rounds to create, in order. Appended to the end of the room's existing round list. 1–100 entries per request."},"userId":{"type":"string","description":"User id (UUID) to act on behalf of. Required when using an organization API token. Ignored for personal access tokens — the PAT owner is always the acting user; passing a different userId is rejected."}},"required":["rounds"]},"RetroItem":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string"},"completedAt":{"type":"string","nullable":true},"spaceId":{"type":"string","nullable":true}},"required":["id","name","createdAt","completedAt","spaceId"]},"RetroDetail":{"nullable":true},"CreateRetroBody":{"type":"object","properties":{"name":{"type":"string","description":"Retro name."},"spaceId":{"type":"string","description":"Space (UUID) to create the retro in."},"userId":{"type":"string","description":"User id (UUID) to act on behalf of. Required when using an organization API token. Ignored for personal access tokens — the PAT owner is always the acting user; passing a different userId is rejected."},"columns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Column header text."},"color":{"type":"string","description":"Column accent colour as a hex string (e.g. `#7B51D1`). Defaults to neutral grey if omitted."}},"required":["name"]},"description":"Custom columns to use for the board. Omit to use the default themed template (Start / Stop / Continue or similar)."},"duplicateId":{"type":"string","description":"ID (UUID) of an existing retro or template to copy columns and settings from. Items are not copied. Must belong to the same organization."}},"required":["name","spaceId"]},"CreatedRetro":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"spaceId":{"type":"string","nullable":true},"url":{"type":"string","description":"Full URL to the meeting"},"createdAt":{"type":"string"}},"required":["id","name","spaceId","url","createdAt"]},"StandupItem":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string"},"spaceId":{"type":"string","nullable":true}},"required":["id","name","createdAt","spaceId"]},"StandupDetail":{"nullable":true},"StandupSummaryDetail":{"type":"object","properties":{"id":{"type":"string"},"standupId":{"type":"string"},"spaceId":{"type":"string","nullable":true},"type":{"type":"string","description":"Summary type: daily, 7day, or 14day"},"date":{"type":"string","description":"Date in YYYY-MM-DD format"},"summary":{"nullable":true,"description":"AI-generated summary content. Predefined daily summaries include: tldr, overview, keyAccomplishments, currentFocus, blockers. Predefined multi-day summaries include: tldr, overview, keyAccomplishments, challengesAndBlockers, participation. Custom summaries include: output (markdown string)."},"groupId":{"type":"string","nullable":true,"description":"Space group ID this summary is for, or null for the all-team summary"},"generatedAt":{"type":"string","description":"ISO 8601 timestamp when the summary was generated"}},"required":["id","standupId","spaceId","type","date","groupId","generatedAt"]},"StandupSubmissionItem":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"userName":{"type":"string"},"date":{"type":"string","description":"Date in YYYY-MM-DD format"},"submittedAt":{"type":"string"},"updatedAt":{"type":"string"},"answers":{"type":"array","items":{"type":"object","properties":{"questionId":{"type":"string"},"question":{"type":"string"},"color":{"type":"string"},"position":{"type":"number"},"answer":{"type":"string"}},"required":["questionId","question","color","position","answer"]}}},"required":["id","userId","userName","date","submittedAt","updatedAt","answers"]},"StandupQuestionItem":{"type":"object","properties":{"id":{"type":"string"},"question":{"type":"string"},"position":{"type":"integer"},"color":{"type":"string","description":"Hex color for visual distinction (e.g., #FF0000)"},"required":{"type":"boolean"}},"required":["id","question","position","color","required"]},"UserItem":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","name","email","role","createdAt"]},"SpaceUserItem":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string"},"spaceId":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","name","email","role","spaceId","createdAt"]},"GroupItem":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"spaceId":{"type":"string"},"createdAt":{"type":"string"},"memberUserIds":{"type":"array","items":{"type":"string"}}},"required":["id","name","spaceId","createdAt","memberUserIds"]},"ActionItemList":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"status":{"type":"string"},"priority":{"type":"string","nullable":true},"assigneeId":{"type":"string","nullable":true},"assigneeName":{"type":"string","nullable":true},"dueAt":{"type":"string","nullable":true},"retroId":{"type":"string","nullable":true},"retroName":{"type":"string","nullable":true},"spaceId":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","description","status","priority","assigneeId","assigneeName","dueAt","retroId","retroName","spaceId","createdAt","updatedAt"]},"ActionItemDetail":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"status":{"type":"string"},"priority":{"type":"string","nullable":true},"assigneeId":{"type":"string","nullable":true},"assigneeName":{"type":"string","nullable":true},"dueAt":{"type":"string","nullable":true},"retroId":{"type":"string","nullable":true},"retroName":{"type":"string","nullable":true},"spaceId":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","text","createdAt"]}},"linkedRetroItemIds":{"type":"array","items":{"type":"string"}}},"required":["id","name","description","status","priority","assigneeId","assigneeName","dueAt","retroId","retroName","spaceId","createdAt","updatedAt","comments","linkedRetroItemIds"]},"ActionItemCreateBody":{"type":"object","properties":{"name":{"type":"string","description":"Action item name. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"spaceId":{"type":"string","description":"Create a space-only action item. Space id (UUID). Provide either spaceId or retroId."},"retroId":{"type":"string","description":"Create a retro-linked action item. Retro id (UUID). Provide either spaceId or retroId."},"description":{"type":"string","description":"Action item description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"assigneeId":{"type":"string","description":"User id (UUID) to assign the action item to. Use `organization_list_users` (supports a search filter) to look up by name."},"priority":{"type":"string","description":"Priority. One of: `VERY_LOW`, `LOW`, `MEDIUM` (default), `HIGH`, `CRITICAL`. On create, unknown values silently fall back to `MEDIUM`; on update, unknown values are rejected with 400."},"dueAt":{"type":"string","description":"Due date. ISO-8601 timestamp (e.g. 2026-04-25T09:30:00.000Z)."},"userId":{"type":"string","description":"User id (UUID) to act on behalf of. Required when using an organization API token. Ignored for personal access tokens — the PAT owner is always the acting user; passing a different userId is rejected."}}},"ActionItemUpdateBody":{"type":"object","properties":{"name":{"type":"string","description":"New name. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"description":{"type":"string","description":"New description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"status":{"type":"string","description":"Status. One of: `PENDING`, `IN_PROGRESS`, `COMPLETED`, `ARCHIVED`, `WONT_DO`. `DELETED` is not settable via the API."},"assigneeId":{"type":"string","nullable":true,"description":"User id (UUID) to reassign to. Pass `null` to unassign. Omit to leave unchanged. Use `organization_list_users` (supports a search filter) to look up by name."},"priority":{"type":"string","description":"Priority. One of: `VERY_LOW`, `LOW`, `MEDIUM` (default), `HIGH`, `CRITICAL`. On create, unknown values silently fall back to `MEDIUM`; on update, unknown values are rejected with 400."},"dueAt":{"type":"string","nullable":true,"description":"New due date. ISO-8601 timestamp (e.g. 2026-04-25T09:30:00.000Z). Pass `null` to clear. Omit to leave unchanged."}}},"SubmitStandupBody":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Date in YYYY-MM-DD format (e.g. 2026-04-25)."},"timezone":{"type":"string","description":"IANA timezone identifier (e.g. America/New_York). Used to determine today / past / future relative to the caller's wall-clock day for edit-window checks. Defaults to UTC if omitted."},"answers":{"type":"array","items":{"type":"object","properties":{"questionId":{"type":"string","description":"The id (UUID) of the standup question being answered."},"answer":{"type":"string","maxLength":30000,"description":"Answer content. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["questionId","answer"]},"minItems":1,"description":"One entry per question being answered. Existing answers for the same questionId on this date are replaced; questions you omit keep their previous values."}},"required":["date","answers"]},"SubmittedStandup":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"userName":{"type":"string"},"date":{"type":"string"},"submittedAt":{"type":"string"},"updatedAt":{"type":"string"},"answers":{"type":"array","items":{"type":"object","properties":{"questionId":{"type":"string"},"question":{"type":"string"},"color":{"type":"string"},"position":{"type":"number"},"answer":{"type":"string"}},"required":["questionId","question","color","position","answer"]}}},"required":["id","userId","userName","date","submittedAt","updatedAt","answers"]},"StandupCommentBody":{"type":"object","properties":{"comment":{"type":"string","minLength":1,"maxLength":30000,"description":"Comment body. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"standupSubmissionId":{"type":"string","description":"Comment on a standup submission (UUID). Provide exactly one of standupSubmissionId or standupPollId."},"standupPollId":{"type":"string","description":"Comment on a standup poll (UUID). Provide exactly one of standupSubmissionId or standupPollId."}},"required":["comment"]},"StandupCommentPutBody":{"type":"object","properties":{"comment":{"type":"string","minLength":1,"maxLength":30000,"description":"New comment body. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["comment"]},"StandupReactionBody":{"type":"object","properties":{"reaction":{"type":"string","minLength":1,"maxLength":16,"description":"The reaction itself — typically a single emoji (e.g. \"👍\", \"🚀\"). Reactions are deduped per (target, user, reaction): adding the same emoji twice on the same target returns 409."},"standupSubmissionId":{"type":"string","description":"React to a standup submission (UUID). Provide exactly one of standupSubmissionId, standupCommentId, or standupPollId."},"standupCommentId":{"type":"string","description":"React to a standup comment (UUID). Provide exactly one of standupSubmissionId, standupCommentId, or standupPollId."},"standupPollId":{"type":"string","description":"React to a standup poll (UUID). Provide exactly one of standupSubmissionId, standupCommentId, or standupPollId."}},"required":["reaction"]},"CreateRetroItemBody":{"type":"object","properties":{"columnId":{"type":"string","description":"The id (UUID) of the retro column the item belongs in (one of the columns returned by `get_retro`)."},"name":{"type":"string","minLength":1,"maxLength":30000,"description":"Item content. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"anonymous":{"type":"boolean","description":"When true, the item is shown without the author's name in the retro UI. Defaults to false."}},"required":["columnId","name"]},"UpdateRetroItemBody":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":30000,"description":"New item content. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"columnId":{"type":"string","description":"Move the item into a different column (UUID). Must belong to the same retro."},"position":{"type":"integer","description":"Position within the column (lower = earlier). Sets the raw integer; does not shift other items."},"anonymous":{"type":"boolean","description":"Toggle whether the author's name is hidden in the retro UI."},"groupName":{"type":"string","nullable":true,"description":"Set or clear the group label shown above the item. Pass `null` to clear, omit to leave unchanged."},"discussed":{"type":"boolean","description":"Mark whether the item has been discussed in the retro."}}},"RetroBoardItem":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"retroId":{"type":"string"},"columnId":{"type":"string"},"position":{"type":"number"},"anonymous":{"type":"boolean"},"creatorId":{"type":"string"},"groupName":{"type":"string","nullable":true},"parentId":{"type":"string","nullable":true},"discussed":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","retroId","columnId","position","anonymous","creatorId","groupName","parentId","discussed","createdAt","updatedAt"]},"Me":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","description":"Primary email for the user. Empty string if no email is on file."},"timezone":{"type":"string","description":"IANA timezone (e.g. Europe/London). Use this when calling date-keyed endpoints such as standup submissions."},"language":{"type":"string","description":"BCP-47 language tag (e.g. en)."}},"required":["id","name","email","timezone","language"]},"organization":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"logo":{"type":"string","nullable":true},"role":{"type":"string","description":"Caller's role in the organization: OWNER, SUPER_ADMIN, ORG_ADMIN, ADMIN, or MEMBER."}},"required":["id","name","logo","role"]},"spaces":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"active":{"type":"boolean"},"role":{"type":"string","description":"Caller's role in the space: PLAYER, FACILITATOR, ADMIN, or CREATOR."}},"required":["id","name","description","active","role"]}}},"required":["user","organization","spaces"]},"UpdateRoomBody":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"New room name (1-100 chars)."},"description":{"type":"string","nullable":true,"maxLength":250,"description":"New room description (max 250 chars). Pass `null` to clear."}}},"RoundListItem":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["PENDING","FLIPPED","COMPLETED","SKIPPED"]},"winningVote":{"type":"string","nullable":true},"externalId":{"type":"string"},"externalLink":{"type":"string"},"createdAt":{"type":"string"},"revealedAt":{"type":"string","nullable":true},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."}}},"required":["id","name","description","status","winningVote","externalId","externalLink","createdAt","revealedAt"]},"UpdatedRound":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["PENDING","FLIPPED","COMPLETED","SKIPPED"]},"winningVote":{"type":"string","nullable":true},"externalId":{"type":"string"},"externalLink":{"type":"string"},"revealedAt":{"type":"string","nullable":true},"updatedAt":{"type":"string"},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."}},"replacementRoundId":{"type":"string","nullable":true,"description":"Set when this update moved the round to COMPLETED / SKIPPED and a fresh PENDING round had to be auto-created so the room always has somewhere to vote next. Null otherwise."}},"required":["id","name","description","status","winningVote","externalId","externalLink","revealedAt","updatedAt","replacementRoundId"]},"UpdateRoundBody":{"type":"object","properties":{"status":{"type":"string","enum":["PENDING","FLIPPED","COMPLETED","SKIPPED"],"description":"New round status. `PENDING` (open for votes), `FLIPPED` (votes revealed for discussion), `COMPLETED` (final), `SKIPPED` (out of scope). Setting `FLIPPED` also sets the reveal timestamp; resetting back to `PENDING` opens a fresh voting bucket so prior votes do not bleed into the new round."},"winningVote":{"type":"string","nullable":true,"maxLength":50,"description":"The agreed estimate for the round. Pass `null` to clear, omit to leave unchanged. Typically set when transitioning to `COMPLETED`."},"name":{"type":"string","description":"Round title shown in the room UI."},"description":{"type":"string","description":"Round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"externalId":{"type":"string","nullable":true,"description":"External tracker reference (e.g. `JIRA-123`). Pass `null` to clear."},"externalLink":{"type":"string","nullable":true,"description":"URL to the external tracker item. Pass `null` to clear."},"extraFields":{"type":"array","nullable":true,"items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."},"maxItems":30,"description":"Up to 30 extra fields rendered in the round's ticket details panel (types: text, number, date, datetime, labels, markdown). Only allowed on rounds not linked to an integration. Replaces the round's entire extra-fields list. Pass `null` to clear, omit to leave unchanged. Returns 409 if the round is linked to an integration (e.g. imported from Jira)."}}},"DeleteRoundsBody":{"type":"object","properties":{"roundIds":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":100,"description":"Round ids (UUIDs) to delete, 1–100 per request. Every id must be an existing, non-deleted round in this room — if any id is unknown, already deleted, or belongs to a different room, nothing is deleted and a 404 is returned."}},"required":["roundIds"]},"DeletedRounds":{"type":"object","properties":{"deletedIds":{"type":"array","items":{"type":"string"}},"replacementRoundId":{"type":"string","nullable":true}},"required":["deletedIds","replacementRoundId"]},"CastRoundVoteBody":{"type":"object","properties":{"vote":{"type":"string","minLength":1,"maxLength":50,"description":"The card value being voted (e.g. `5`, `XL`, `?`). Must match one of the room's configured cards — call `planning_poker_get_room` to discover the deck, or read `roomCards.options` in the response. Submitting again replaces the caller's previous vote on this round. There is no separate delete tool for poker votes — re-cast to change."}},"required":["vote"]},"CastRoundVote":{"type":"object","properties":{"userId":{"type":"string"},"roundId":{"type":"string"},"vote":{"type":"string"},"version":{"type":"number"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["userId","roundId","vote","version","createdAt","updatedAt"]},"UpdatedRetro":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"spaceId":{"type":"string","nullable":true},"completedAt":{"type":"string","nullable":true},"updatedAt":{"type":"string"}},"required":["id","name","description","spaceId","completedAt","updatedAt"]},"UpdateRetroBody":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":150,"description":"New retro name (1-150 chars)."},"description":{"type":"string","nullable":true,"maxLength":5050,"description":"New retro description (max 5050 chars). Pass `null` to clear, omit to leave unchanged."},"completedAt":{"type":"string","nullable":true,"description":"Mark retro complete. Pass an ISO 8601 timestamp to set (typically `now`), `null` to unmark complete, omit to leave unchanged. ISO-8601 timestamp (e.g. 2026-04-25T09:30:00.000Z)."},"columns":{"type":"object","properties":{"create":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":500,"description":"Column header text (1-500 chars)."},"color":{"type":"string","maxLength":10,"description":"Column accent colour as a hex string (e.g. `#7B51D1`). Defaults to empty (neutral) if omitted."},"description":{"type":"string","nullable":true,"maxLength":1000,"description":"Optional column description (max 1000 chars)."},"position":{"type":"integer","description":"Position within the board (lower = earlier). Defaults to the end of the column list if omitted."}},"required":["name"]},"description":"Columns to add to the retro."},"update":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Existing column id (UUID) to update."},"name":{"type":"string","minLength":1,"maxLength":500,"description":"New column header text. Omit to leave unchanged."},"color":{"type":"string","maxLength":10,"description":"New accent colour. Omit to leave unchanged."},"description":{"type":"string","nullable":true,"maxLength":1000,"description":"New description. Pass `null` to clear, omit to leave unchanged."},"position":{"type":"integer","description":"New position. Reorder columns by sending updates with new positions. Omit to leave unchanged."}},"required":["id"]},"description":"Columns to edit. Each entry must reference an existing column by id; only fields you include are changed."},"delete":{"type":"array","items":{"type":"string"},"description":"Column ids to delete. **Deleting a column also deletes every item in it. This cannot be undone — only include ids the user explicitly wants removed.** A retro must keep at least one column after the operation."}},"description":"Edit the retro's columns. Omit entirely to leave columns unchanged. Provide any combination of `create`, `update`, and `delete`. Operations are applied atomically in a single transaction."}}},"RetroItemVote":{"type":"object","properties":{"id":{"type":"string"},"retroId":{"type":"string"},"itemId":{"type":"string"},"userId":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","retroId","itemId","userId","createdAt"]},"CastRetroItemVoteBody":{"type":"object","properties":{"itemId":{"type":"string","description":"Retro item id (UUID) to vote on. Must belong to this retro and not be deleted."}},"required":["itemId"]},"RetroItemComment":{"type":"object","properties":{"id":{"type":"string"},"comment":{"type":"string"},"retroId":{"type":"string"},"itemId":{"type":"string","nullable":true},"pollId":{"type":"string","nullable":true},"userId":{"type":"string","nullable":true,"description":"Author user id. Null when comment is anonymous."},"anonymous":{"type":"boolean"},"createdAt":{"type":"string"}},"required":["id","comment","retroId","itemId","pollId","userId","anonymous","createdAt"]},"CreateRetroItemCommentBody":{"type":"object","properties":{"comment":{"type":"string","minLength":1,"maxLength":30000,"description":"Comment body. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"itemId":{"type":"string","description":"Comment on a retro item (UUID). Provide exactly one of itemId or pollId."},"pollId":{"type":"string","description":"Comment on a retro poll (UUID). Provide exactly one of itemId or pollId."},"anonymous":{"type":"boolean","description":"When true, the comment is shown without the author's name in the retro UI. Defaults to false."}},"required":["comment"]},"RetroItemKudos":{"type":"object","properties":{"id":{"type":"string"},"retroId":{"type":"string"},"retroItemId":{"type":"string"},"creatorId":{"type":"string"},"receiverId":{"type":"string"},"kudoType":{"type":"string","enum":["ACHIEVEMENT","TEAMWORK","INNOVATION","SUPPORT"]},"createdAt":{"type":"string"}},"required":["id","retroId","retroItemId","creatorId","receiverId","kudoType","createdAt"]},"CreateRetroItemKudosBody":{"type":"object","properties":{"receiverId":{"type":"string","description":"User id (UUID) receiving the kudos. Must be a member of the retro's space. Look up by name with `organization_list_users` (supports a search filter)."},"kudoType":{"type":"string","enum":["ACHIEVEMENT","TEAMWORK","INNOVATION","SUPPORT"],"description":"Kind of kudos. One of: ACHIEVEMENT, TEAMWORK, INNOVATION, SUPPORT."}},"required":["receiverId","kudoType"]},"ActionItemComment":{"type":"object","properties":{"id":{"type":"string"},"comment":{"type":"string"},"userId":{"type":"string"},"actionItemId":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","comment","userId","actionItemId","createdAt","updatedAt"]},"CreateActionItemCommentBody":{"type":"object","properties":{"comment":{"type":"string","minLength":1,"maxLength":30000,"description":"Comment body. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["comment"]},"SearchResultMetadata":{"type":"object","properties":{"sourceName":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"sprintName":{"type":"string","nullable":true},"agreeCount":{"type":"number","nullable":true},"status":{"type":"string","nullable":true}},"required":["sourceName","date","sprintName","agreeCount","status"]},"SearchResult":{"type":"object","properties":{"entityId":{"type":"string"},"entityType":{"type":"string","enum":["RETRO_ITEM","RETRO_ITEM_COMMENT","RETRO_ACTION_ITEM","RETRO_ACTION_ITEM_COMMENT","STANDUP_ANSWER","STANDUP_COMMENT","ROUND","NOTES","ICE_BREAKER_ANSWER","POLL","POLL_ITEM"]},"similarity":{"type":"number"},"preview":{"type":"string"},"url":{"type":"string","nullable":true},"metadata":{"type":"object","properties":{"sourceName":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"sprintName":{"type":"string","nullable":true},"agreeCount":{"type":"number","nullable":true},"status":{"type":"string","nullable":true}},"required":["sourceName","date","sprintName","agreeCount","status"]}},"required":["entityId","entityType","similarity","preview","url","metadata"]},"SearchTypeBucket":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"entityId":{"type":"string"},"entityType":{"type":"string","enum":["RETRO_ITEM","RETRO_ITEM_COMMENT","RETRO_ACTION_ITEM","RETRO_ACTION_ITEM_COMMENT","STANDUP_ANSWER","STANDUP_COMMENT","ROUND","NOTES","ICE_BREAKER_ANSWER","POLL","POLL_ITEM"]},"similarity":{"type":"number"},"preview":{"type":"string"},"url":{"type":"string","nullable":true},"metadata":{"type":"object","properties":{"sourceName":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"sprintName":{"type":"string","nullable":true},"agreeCount":{"type":"number","nullable":true},"status":{"type":"string","nullable":true}},"required":["sourceName","date","sprintName","agreeCount","status"]}},"required":["entityId","entityType","similarity","preview","url","metadata"]}},"hasMore":{"type":"boolean"}},"required":["results","hasMore"]},"SearchResponse":{"type":"object","properties":{"resultsByType":{"type":"object","additionalProperties":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"entityId":{"type":"string"},"entityType":{"type":"string","enum":["RETRO_ITEM","RETRO_ITEM_COMMENT","RETRO_ACTION_ITEM","RETRO_ACTION_ITEM_COMMENT","STANDUP_ANSWER","STANDUP_COMMENT","ROUND","NOTES","ICE_BREAKER_ANSWER","POLL","POLL_ITEM"]},"similarity":{"type":"number"},"preview":{"type":"string"},"url":{"type":"string","nullable":true},"metadata":{"type":"object","properties":{"sourceName":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"sprintName":{"type":"string","nullable":true},"agreeCount":{"type":"number","nullable":true},"status":{"type":"string","nullable":true}},"required":["sourceName","date","sprintName","agreeCount","status"]}},"required":["entityId","entityType","similarity","preview","url","metadata"]}},"hasMore":{"type":"boolean"}},"required":["results","hasMore"]}}},"required":["resultsByType"]}},"parameters":{}},"paths":{"/api/v1/spaces":{"get":{"tags":["Spaces"],"summary":"List spaces","description":"List all spaces in the organization.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Cursor for pagination"},"required":false,"description":"Cursor for pagination","name":"cursor","in":"query"},{"schema":{"type":"number","description":"Number of items (default 20, max 100)"},"required":false,"description":"Number of items (default 20, max 100)","name":"limit","in":"query"},{"schema":{"type":"string","enum":["createdAt","name"],"description":"Field to sort by (default: createdAt)"},"required":false,"description":"Field to sort by (default: createdAt)","name":"sortBy","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction (default: desc)"},"required":false,"description":"Sort direction (default: desc)","name":"sortDirection","in":"query"}],"responses":{"200":{"description":"List of spaces","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"active":{"type":"boolean"},"createdAt":{"type":"string"}},"required":["id","name","description","active","createdAt"]}},"pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]}},"required":["data","pagination"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/rooms":{"get":{"tags":["Planning Poker"],"summary":"List rooms","description":"List planning poker rooms in the organization.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Filter by space ID"},"required":false,"description":"Filter by space ID","name":"spaceId","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"number"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","enum":["createdAt","name"],"description":"Field to sort by (default: createdAt)"},"required":false,"description":"Field to sort by (default: createdAt)","name":"sortBy","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction (default: desc)"},"required":false,"description":"Sort direction (default: desc)","name":"sortDirection","in":"query"}],"responses":{"200":{"description":"List of rooms","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string"},"spaceId":{"type":"string","nullable":true}},"required":["id","name","createdAt","spaceId"]}},"pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]}},"required":["data","pagination"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"post":{"tags":["Planning Poker"],"summary":"Create room","description":"Create a new planning poker room. Optionally duplicate from an existing room or template by providing duplicateId. Returns the meeting URL. Requires a READ_WRITE API key.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Room name shown in the meeting UI."},"spaceId":{"type":"string","description":"Space (UUID) to create the room in."},"userId":{"type":"string","description":"User id (UUID) to act on behalf of. Required when using an organization API token. Ignored for personal access tokens — the PAT owner is always the acting user; passing a different userId is rejected."},"description":{"type":"string","description":"Optional room description shown in the meeting UI alongside the room title."},"duplicateId":{"type":"string","description":"ID (UUID) of an existing room or template to copy settings, columns, and rounds from. Must belong to the same organization. When provided, the deck and settings are copied from the source room and `votingSystem` / `cardOptions` / `settings` are ignored."},"votingSystem":{"type":"string","enum":["FIBONACCI","MODIFIED_FIBONACCI","TSHIRT_SIZES","POWER_OF_TWO","CUSTOM","HEALTH","TRAFFIC_LIGHTS"],"description":"Card deck preset. One of FIBONACCI, MODIFIED_FIBONACCI, TSHIRT_SIZES, POWER_OF_TWO, HEALTH, TRAFFIC_LIGHTS, or CUSTOM. Defaults to FIBONACCI. When CUSTOM, also provide `cardOptions`."},"cardOptions":{"type":"array","items":{"type":"string","maxLength":3},"minItems":2,"maxItems":30,"description":"Custom card values, 2–30 entries, max 3 characters each (e.g. [\"XS\", \"S\", \"M\"]). Required when `votingSystem` is CUSTOM, ignored otherwise."},"cardLabels":{"type":"array","items":{"type":"string"},"description":"Optional labels per card, parallel to `cardOptions`. Only meaningful when `votingSystem` is CUSTOM."},"allowSkip":{"type":"boolean","description":"Include a skip card so voters can opt out of a round. Defaults to false."},"settings":{"type":"object","properties":{"anonymousVoting":{"type":"boolean","description":"Hide who voted what until after the round is revealed."},"asyncVoting":{"type":"boolean","description":"Let votes trickle in over time instead of one shared round."},"autoReveal":{"type":"boolean","description":"Reveal the round automatically once everyone has voted."},"creatorControl":{"type":"boolean","description":"Only the room creator can reveal, reset, and skip rounds."},"allowObservers":{"type":"boolean","description":"Let participants join as non-voting observers."},"allowEmotes":{"type":"boolean","description":"Let participants send emoji reactions during a round."},"allowComments":{"type":"boolean","description":"Let participants leave comments on rounds."},"changeVote":{"type":"boolean","description":"Allow users to change their vote after the round is revealed."}},"description":"Optional room settings. Any field omitted falls back to the same default the in-app create-room form uses."}},"required":["name","spaceId"]}}}},"responses":{"201":{"description":"Created room","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"spaceId":{"type":"string","nullable":true},"url":{"type":"string","description":"Full URL to the meeting"},"createdAt":{"type":"string"}},"required":["id","name","spaceId","url","createdAt"]}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden - requires write scope or source room in different org","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Space, user, or source room not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/rooms/{roomId}":{"get":{"tags":["Planning Poker"],"summary":"Get room details","description":"Get full planning poker room data including rounds and votes.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"roomId","in":"path"}],"responses":{"200":{"description":"Room details","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true}}}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"put":{"tags":["Planning Poker"],"summary":"Update room","description":"Update a planning-poker room's name or description. Other settings (cards, voting rules) remain unchanged. Requires room admin access and a READ_WRITE API key.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"roomId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"New room name (1-100 chars)."},"description":{"type":"string","nullable":true,"maxLength":250,"description":"New room description (max 250 chars). Pass `null` to clear."}}}}}},"responses":{"200":{"description":"Updated room","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"spaceId":{"type":"string","nullable":true},"updatedAt":{"type":"string"}},"required":["id","name","description","spaceId","updatedAt"]}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden — requires admin access","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Room not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/rooms/{roomId}/rounds":{"post":{"tags":["Planning Poker"],"summary":"Add round","description":"Add a single round to a planning poker room. Requires a READ_WRITE API key.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"roomId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Round title shown in the room UI."},"description":{"type":"string","description":"Round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"externalId":{"type":"string","description":"External tracker reference (e.g. a Jira issue key like `JIRA-123`). Free-form — not validated."},"externalLink":{"type":"string","description":"URL to the external tracker item. Rendered as a link beside the round name."},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."},"maxItems":30,"description":"Up to 30 extra fields rendered in the round's ticket details panel (types: text, number, date, datetime, labels, markdown). Only allowed on rounds not linked to an integration."},"userId":{"type":"string","description":"User id (UUID) to act on behalf of. Required when using an organization API token. Ignored for personal access tokens — the PAT owner is always the acting user; passing a different userId is rejected."}},"required":["name"]}}}},"responses":{"201":{"description":"Created round","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"externalId":{"type":"string","nullable":true},"externalLink":{"type":"string","nullable":true},"createdAt":{"type":"string"},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."}}},"required":["id","name","description","externalId","externalLink","createdAt"]}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden - requires write scope","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Room not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"get":{"tags":["Planning Poker"],"summary":"List rounds","description":"List rounds in a planning-poker room, ordered by creation time. Optional `status` filter (comma-separated, e.g. `PENDING,FLIPPED`). Defaults to all non-deleted statuses.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"roomId","in":"path"},{"schema":{"type":"string"},"required":false,"name":"status","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"number"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"List of rounds","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["PENDING","FLIPPED","COMPLETED","SKIPPED"]},"winningVote":{"type":"string","nullable":true},"externalId":{"type":"string"},"externalLink":{"type":"string"},"createdAt":{"type":"string"},"revealedAt":{"type":"string","nullable":true},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."}}},"required":["id","name","description","status","winningVote","externalId","externalLink","createdAt","revealedAt"]}},"pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]}},"required":["data","pagination"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Room not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"delete":{"tags":["Planning Poker"],"summary":"Delete rounds (bulk)","description":"Remove one or more rounds (1–100) from a planning-poker room in a single call. All-or-nothing: every id must be an existing, non-deleted round in this room, otherwise nothing is deleted and a 404 lists the offending ids. If no PENDING round survives the delete, a fresh empty round is created so voting can continue — its id is returned as `replacementRoundId`. Requires room admin access and a READ_WRITE API key.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"roomId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"roundIds":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":100,"description":"Round ids (UUIDs) to delete, 1–100 per request. Every id must be an existing, non-deleted round in this room — if any id is unknown, already deleted, or belongs to a different room, nothing is deleted and a 404 is returned."}},"required":["roundIds"]}}}},"responses":{"200":{"description":"Deleted round ids (with optional replacement id)","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deletedIds":{"type":"array","items":{"type":"string"}},"replacementRoundId":{"type":"string","nullable":true}},"required":["deletedIds","replacementRoundId"]}},"required":["data"]}}}},"400":{"description":"Invalid body — `roundIds` must contain 1–100 ids","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden — requires admin access","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"One or more rounds not found in this room — nothing was deleted","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/rooms/{roomId}/rounds/bulk":{"post":{"tags":["Planning Poker"],"summary":"Bulk add rounds","description":"Add multiple rounds to a planning poker room in a single request. Rounds are appended in order. Requires a READ_WRITE API key.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"roomId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"rounds":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Round title shown in the room UI."},"description":{"type":"string","description":"Round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"externalId":{"type":"string","description":"External tracker reference (e.g. a Jira issue key). Free-form."},"externalLink":{"type":"string","description":"URL to the external tracker item."},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."},"maxItems":30,"description":"Up to 30 extra fields rendered in the round's ticket details panel (types: text, number, date, datetime, labels, markdown). Only allowed on rounds not linked to an integration."}},"required":["name"]},"minItems":1,"maxItems":100,"description":"Rounds to create, in order. Appended to the end of the room's existing round list. 1–100 entries per request."},"userId":{"type":"string","description":"User id (UUID) to act on behalf of. Required when using an organization API token. Ignored for personal access tokens — the PAT owner is always the acting user; passing a different userId is rejected."}},"required":["rounds"]}}}},"responses":{"201":{"description":"Created rounds","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"externalId":{"type":"string","nullable":true},"externalLink":{"type":"string","nullable":true},"createdAt":{"type":"string"},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."}}},"required":["id","name","description","externalId","externalLink","createdAt"]}}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden - requires write scope","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Room not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/retros":{"get":{"tags":["Retrospectives"],"summary":"List retros","description":"List retrospectives in the organization.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Filter by space ID"},"required":false,"description":"Filter by space ID","name":"spaceId","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"number"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","enum":["createdAt","name"],"description":"Field to sort by (default: createdAt)"},"required":false,"description":"Field to sort by (default: createdAt)","name":"sortBy","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction (default: desc)"},"required":false,"description":"Sort direction (default: desc)","name":"sortDirection","in":"query"}],"responses":{"200":{"description":"List of retros","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string"},"completedAt":{"type":"string","nullable":true},"spaceId":{"type":"string","nullable":true}},"required":["id","name","createdAt","completedAt","spaceId"]}},"pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]}},"required":["data","pagination"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"post":{"tags":["Retrospectives"],"summary":"Create retro","description":"Create a new retrospective. Optionally duplicate from an existing retro or template by providing duplicateId. Returns the meeting URL. Requires a READ_WRITE API key.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Retro name."},"spaceId":{"type":"string","description":"Space (UUID) to create the retro in."},"userId":{"type":"string","description":"User id (UUID) to act on behalf of. Required when using an organization API token. Ignored for personal access tokens — the PAT owner is always the acting user; passing a different userId is rejected."},"columns":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Column header text."},"color":{"type":"string","description":"Column accent colour as a hex string (e.g. `#7B51D1`). Defaults to neutral grey if omitted."}},"required":["name"]},"description":"Custom columns to use for the board. Omit to use the default themed template (Start / Stop / Continue or similar)."},"duplicateId":{"type":"string","description":"ID (UUID) of an existing retro or template to copy columns and settings from. Items are not copied. Must belong to the same organization."}},"required":["name","spaceId"]}}}},"responses":{"201":{"description":"Created retro","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"spaceId":{"type":"string","nullable":true},"url":{"type":"string","description":"Full URL to the meeting"},"createdAt":{"type":"string"}},"required":["id","name","spaceId","url","createdAt"]}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden - requires write scope or source retro in different org","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Space, user, or source retro not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/retros/{retroId}":{"get":{"tags":["Retrospectives"],"summary":"Get retro details","description":"Get full retrospective report data. Anonymous retros strip user IDs.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"retroId","in":"path"}],"responses":{"200":{"description":"Retro report data","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true}}}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"put":{"tags":["Retrospectives"],"summary":"Update retro","description":"Update a retro's name, description, or completion state. Pass `completedAt` as an ISO timestamp to mark complete, or `null` to unmark. Requires retro admin access and a READ_WRITE API key.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"retroId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":150,"description":"New retro name (1-150 chars)."},"description":{"type":"string","nullable":true,"maxLength":5050,"description":"New retro description (max 5050 chars). Pass `null` to clear, omit to leave unchanged."},"completedAt":{"type":"string","nullable":true,"description":"Mark retro complete. Pass an ISO 8601 timestamp to set (typically `now`), `null` to unmark complete, omit to leave unchanged. ISO-8601 timestamp (e.g. 2026-04-25T09:30:00.000Z)."},"columns":{"type":"object","properties":{"create":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":500,"description":"Column header text (1-500 chars)."},"color":{"type":"string","maxLength":10,"description":"Column accent colour as a hex string (e.g. `#7B51D1`). Defaults to empty (neutral) if omitted."},"description":{"type":"string","nullable":true,"maxLength":1000,"description":"Optional column description (max 1000 chars)."},"position":{"type":"integer","description":"Position within the board (lower = earlier). Defaults to the end of the column list if omitted."}},"required":["name"]},"description":"Columns to add to the retro."},"update":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Existing column id (UUID) to update."},"name":{"type":"string","minLength":1,"maxLength":500,"description":"New column header text. Omit to leave unchanged."},"color":{"type":"string","maxLength":10,"description":"New accent colour. Omit to leave unchanged."},"description":{"type":"string","nullable":true,"maxLength":1000,"description":"New description. Pass `null` to clear, omit to leave unchanged."},"position":{"type":"integer","description":"New position. Reorder columns by sending updates with new positions. Omit to leave unchanged."}},"required":["id"]},"description":"Columns to edit. Each entry must reference an existing column by id; only fields you include are changed."},"delete":{"type":"array","items":{"type":"string"},"description":"Column ids to delete. **Deleting a column also deletes every item in it. This cannot be undone — only include ids the user explicitly wants removed.** A retro must keep at least one column after the operation."}},"description":"Edit the retro's columns. Omit entirely to leave columns unchanged. Provide any combination of `create`, `update`, and `delete`. Operations are applied atomically in a single transaction."}}}}}},"responses":{"200":{"description":"Updated retro","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"spaceId":{"type":"string","nullable":true},"completedAt":{"type":"string","nullable":true},"updatedAt":{"type":"string"}},"required":["id","name","description","spaceId","completedAt","updatedAt"]}},"required":["data"]}}}},"403":{"description":"Forbidden — requires admin access","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Retro not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/standups":{"get":{"tags":["Standups"],"summary":"List standups","description":"List standup meetings in the organization.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Filter by space ID"},"required":false,"description":"Filter by space ID","name":"spaceId","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"number"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","enum":["createdAt","name"],"description":"Field to sort by (default: createdAt)"},"required":false,"description":"Field to sort by (default: createdAt)","name":"sortBy","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction (default: desc)"},"required":false,"description":"Sort direction (default: desc)","name":"sortDirection","in":"query"}],"responses":{"200":{"description":"List of standups","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string"},"spaceId":{"type":"string","nullable":true}},"required":["id","name","createdAt","spaceId"]}},"pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]}},"required":["data","pagination"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/standups/{standupId}":{"get":{"tags":["Standups"],"summary":"Get standup details","description":"Get standup submissions for a specific date. Defaults to today.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"},{"schema":{"type":"number","description":"Year (defaults to current year)"},"required":false,"description":"Year (defaults to current year)","name":"year","in":"query"},{"schema":{"type":"number","description":"Month 1-12 (defaults to current month)"},"required":false,"description":"Month 1-12 (defaults to current month)","name":"month","in":"query"},{"schema":{"type":"number","description":"Day 1-31 (defaults to current day)"},"required":false,"description":"Day 1-31 (defaults to current day)","name":"day","in":"query"}],"responses":{"200":{"description":"Standup export data","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"nullable":true}}}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/standups/{standupId}/summary":{"get":{"tags":["Standups"],"summary":"Get AI summary","description":"Get the AI-generated summary for a standup on a specific date. Optionally filter by group.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"},{"schema":{"type":"number","description":"Year (required)"},"required":true,"description":"Year (required)","name":"year","in":"query"},{"schema":{"type":"number","description":"Month 1-12 (required)"},"required":true,"description":"Month 1-12 (required)","name":"month","in":"query"},{"schema":{"type":"number","description":"Day 1-31 (required)"},"required":true,"description":"Day 1-31 (required)","name":"day","in":"query"},{"schema":{"type":"string","description":"Space group ID to get group-specific summary. Omit for the all-team summary."},"required":false,"description":"Space group ID to get group-specific summary. Omit for the all-team summary.","name":"groupId","in":"query"}],"responses":{"200":{"description":"Standup AI summary","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"standupId":{"type":"string"},"spaceId":{"type":"string","nullable":true},"type":{"type":"string","description":"Summary type: daily, 7day, or 14day"},"date":{"type":"string","description":"Date in YYYY-MM-DD format"},"summary":{"nullable":true,"description":"AI-generated summary content. Predefined daily summaries include: tldr, overview, keyAccomplishments, currentFocus, blockers. Predefined multi-day summaries include: tldr, overview, keyAccomplishments, challengesAndBlockers, participation. Custom summaries include: output (markdown string)."},"groupId":{"type":"string","nullable":true,"description":"Space group ID this summary is for, or null for the all-team summary"},"generatedAt":{"type":"string","description":"ISO 8601 timestamp when the summary was generated"}},"required":["id","standupId","spaceId","type","date","groupId","generatedAt"]}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Standup or summary not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/standups/{standupId}/submissions":{"get":{"tags":["Standups"],"summary":"List submissions","description":"List standup submissions for a date range. Optionally filter by user or group.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"},{"schema":{"type":"string","description":"Start date YYYY-MM-DD (required)"},"required":true,"description":"Start date YYYY-MM-DD (required)","name":"startDate","in":"query"},{"schema":{"type":"string","description":"End date YYYY-MM-DD (required)"},"required":true,"description":"End date YYYY-MM-DD (required)","name":"endDate","in":"query"},{"schema":{"type":"string","description":"Filter by user ID"},"required":false,"description":"Filter by user ID","name":"userId","in":"query"},{"schema":{"type":"string","description":"Filter by space group ID"},"required":false,"description":"Filter by space group ID","name":"groupId","in":"query"}],"responses":{"200":{"description":"List of submissions","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"userName":{"type":"string"},"date":{"type":"string","description":"Date in YYYY-MM-DD format"},"submittedAt":{"type":"string"},"updatedAt":{"type":"string"},"answers":{"type":"array","items":{"type":"object","properties":{"questionId":{"type":"string"},"question":{"type":"string"},"color":{"type":"string"},"position":{"type":"number"},"answer":{"type":"string"}},"required":["questionId","question","color","position","answer"]}}},"required":["id","userId","userName","date","submittedAt","updatedAt","answers"]}}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Standup not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"post":{"tags":["Standups"],"summary":"Submit standup update","description":"Create or update the token owner's submission for a given date. Requires a personal access token (user-voice action). The token owner must be a member of the standup or an admin of its space. Respects the standup's allowEditPast / allowEditFuture settings. Requires READ_WRITE scope.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Date in YYYY-MM-DD format (e.g. 2026-04-25)."},"timezone":{"type":"string","description":"IANA timezone identifier (e.g. America/New_York). Used to determine today / past / future relative to the caller's wall-clock day for edit-window checks. Defaults to UTC if omitted."},"answers":{"type":"array","items":{"type":"object","properties":{"questionId":{"type":"string","description":"The id (UUID) of the standup question being answered."},"answer":{"type":"string","maxLength":30000,"description":"Answer content. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["questionId","answer"]},"minItems":1,"description":"One entry per question being answered. Existing answers for the same questionId on this date are replaced; questions you omit keep their previous values."}},"required":["date","answers"]}}}},"responses":{"200":{"description":"Submission updated","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"userName":{"type":"string"},"date":{"type":"string"},"submittedAt":{"type":"string"},"updatedAt":{"type":"string"},"answers":{"type":"array","items":{"type":"object","properties":{"questionId":{"type":"string"},"question":{"type":"string"},"color":{"type":"string"},"position":{"type":"number"},"answer":{"type":"string"}},"required":["questionId","question","color","position","answer"]}}},"required":["id","userId","userName","date","submittedAt","updatedAt","answers"]}},"required":["data"]}}}},"201":{"description":"Submission created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"userName":{"type":"string"},"date":{"type":"string"},"submittedAt":{"type":"string"},"updatedAt":{"type":"string"},"answers":{"type":"array","items":{"type":"object","properties":{"questionId":{"type":"string"},"question":{"type":"string"},"color":{"type":"string"},"position":{"type":"number"},"answer":{"type":"string"}},"required":["questionId","question","color","position","answer"]}}},"required":["id","userId","userName","date","submittedAt","updatedAt","answers"]}},"required":["data"]}}}},"403":{"description":"Forbidden - wrong token type, insufficient scope, no standup access, or past/future edits disabled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Standup not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/standups/{standupId}/questions":{"get":{"tags":["Standups"],"summary":"List questions","description":"List the questions configured for a standup. Use the returned `id` values as `questionId` when submitting a standup update.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"}],"responses":{"200":{"description":"List of questions, ordered by position ascending","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"question":{"type":"string"},"position":{"type":"integer"},"color":{"type":"string","description":"Hex color for visual distinction (e.g., #FF0000)"},"required":{"type":"boolean"}},"required":["id","question","position","color","required"]}}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Standup not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/standups/{standupId}/days":{"get":{"tags":["Standups"],"summary":"Submission days","description":"Get submission counts per day for a given month. Useful for rendering a calendar indicator.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"},{"schema":{"type":"integer","description":"Year (required)"},"required":true,"description":"Year (required)","name":"year","in":"query"},{"schema":{"type":"integer","description":"Month 1-12 (required)"},"required":true,"description":"Month 1-12 (required)","name":"month","in":"query"}],"responses":{"200":{"description":"Day counts","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"counts":{"type":"object","additionalProperties":{"type":"integer"},"description":"Map of day number to submission count"}},"required":["counts"]}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Standup not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/users":{"get":{"tags":["Users"],"summary":"List organization members","description":"List all members of the organization with their organization roles.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Comma-separated user IDs to filter by"},"required":false,"description":"Comma-separated user IDs to filter by","name":"userIds","in":"query"},{"schema":{"type":"string","description":"Search by user name or email"},"required":false,"description":"Search by user name or email","name":"search","in":"query"},{"schema":{"type":"string","description":"Cursor for pagination (user ID)"},"required":false,"description":"Cursor for pagination (user ID)","name":"cursor","in":"query"},{"schema":{"type":"number","description":"Number of items (default 20, max 100)"},"required":false,"description":"Number of items (default 20, max 100)","name":"limit","in":"query"},{"schema":{"type":"string","enum":["createdAt","name"],"description":"Field to sort by (default: createdAt)"},"required":false,"description":"Field to sort by (default: createdAt)","name":"sortBy","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction (default: desc)"},"required":false,"description":"Sort direction (default: desc)","name":"sortDirection","in":"query"}],"responses":{"200":{"description":"List of organization members","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","name","email","role","createdAt"]}},"pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]}},"required":["data","pagination"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/space-users":{"get":{"tags":["Users"],"summary":"List space members","description":"List members of a space with their space roles.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Space ID (required)"},"required":true,"description":"Space ID (required)","name":"spaceId","in":"query"},{"schema":{"type":"string","description":"Comma-separated user IDs to filter by"},"required":false,"description":"Comma-separated user IDs to filter by","name":"userIds","in":"query"},{"schema":{"type":"string","description":"Search by user name or email"},"required":false,"description":"Search by user name or email","name":"search","in":"query"},{"schema":{"type":"string","description":"Cursor for pagination (user ID)"},"required":false,"description":"Cursor for pagination (user ID)","name":"cursor","in":"query"},{"schema":{"type":"number","description":"Number of items (default 20, max 100)"},"required":false,"description":"Number of items (default 20, max 100)","name":"limit","in":"query"}],"responses":{"200":{"description":"List of space members","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string"},"spaceId":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","name","email","role","spaceId","createdAt"]}},"pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]}},"required":["data","pagination"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/groups":{"get":{"tags":["Groups"],"summary":"List groups","description":"List groups in the organization. Optionally filter by space. Each group includes the user IDs of its members.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Filter by space ID"},"required":false,"description":"Filter by space ID","name":"spaceId","in":"query"},{"schema":{"type":"string","description":"Cursor for pagination"},"required":false,"description":"Cursor for pagination","name":"cursor","in":"query"},{"schema":{"type":"number","description":"Number of items (default 20, max 100)"},"required":false,"description":"Number of items (default 20, max 100)","name":"limit","in":"query"},{"schema":{"type":"string","enum":["createdAt","name"],"description":"Field to sort by (default: createdAt)"},"required":false,"description":"Field to sort by (default: createdAt)","name":"sortBy","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction (default: desc)"},"required":false,"description":"Sort direction (default: desc)","name":"sortDirection","in":"query"}],"responses":{"200":{"description":"List of groups","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"spaceId":{"type":"string"},"createdAt":{"type":"string"},"memberUserIds":{"type":"array","items":{"type":"string"}}},"required":["id","name","spaceId","createdAt","memberUserIds"]}},"pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]}},"required":["data","pagination"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/action-items":{"get":{"tags":["Action Items"],"summary":"List action items","description":"List action items in the organization. Supports filtering by space, retro, status, and assignee.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Filter by space ID"},"required":false,"description":"Filter by space ID","name":"spaceId","in":"query"},{"schema":{"type":"string","description":"Filter by retrospective ID"},"required":false,"description":"Filter by retrospective ID","name":"retroId","in":"query"},{"schema":{"type":"string","description":"Comma-separated statuses to filter by (e.g. PENDING,IN_PROGRESS)"},"required":false,"description":"Comma-separated statuses to filter by (e.g. PENDING,IN_PROGRESS)","name":"status","in":"query"},{"schema":{"type":"string","description":"Filter by assignee user ID"},"required":false,"description":"Filter by assignee user ID","name":"assigneeId","in":"query"},{"schema":{"type":"string","description":"Cursor for pagination"},"required":false,"description":"Cursor for pagination","name":"cursor","in":"query"},{"schema":{"type":"number","description":"Number of items (default 20, max 100)"},"required":false,"description":"Number of items (default 20, max 100)","name":"limit","in":"query"},{"schema":{"type":"string","enum":["createdAt","updatedAt","name","dueAt","priority"],"description":"Field to sort by (default: createdAt)"},"required":false,"description":"Field to sort by (default: createdAt)","name":"sortBy","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction (default: desc)"},"required":false,"description":"Sort direction (default: desc)","name":"sortDirection","in":"query"}],"responses":{"200":{"description":"List of action items","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"status":{"type":"string"},"priority":{"type":"string","nullable":true},"assigneeId":{"type":"string","nullable":true},"assigneeName":{"type":"string","nullable":true},"dueAt":{"type":"string","nullable":true},"retroId":{"type":"string","nullable":true},"retroName":{"type":"string","nullable":true},"spaceId":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","description","status","priority","assigneeId","assigneeName","dueAt","retroId","retroName","spaceId","createdAt","updatedAt"]}},"pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]}},"required":["data","pagination"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"post":{"tags":["Action Items"],"summary":"Create action item","description":"Create a new action item. Requires a READ_WRITE API key.","security":[{"BearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Action item name. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"spaceId":{"type":"string","description":"Create a space-only action item. Space id (UUID). Provide either spaceId or retroId."},"retroId":{"type":"string","description":"Create a retro-linked action item. Retro id (UUID). Provide either spaceId or retroId."},"description":{"type":"string","description":"Action item description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"assigneeId":{"type":"string","description":"User id (UUID) to assign the action item to. Use `organization_list_users` (supports a search filter) to look up by name."},"priority":{"type":"string","description":"Priority. One of: `VERY_LOW`, `LOW`, `MEDIUM` (default), `HIGH`, `CRITICAL`. On create, unknown values silently fall back to `MEDIUM`; on update, unknown values are rejected with 400."},"dueAt":{"type":"string","description":"Due date. ISO-8601 timestamp (e.g. 2026-04-25T09:30:00.000Z)."},"userId":{"type":"string","description":"User id (UUID) to act on behalf of. Required when using an organization API token. Ignored for personal access tokens — the PAT owner is always the acting user; passing a different userId is rejected."}}}}}},"responses":{"201":{"description":"Created action item","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"status":{"type":"string"},"priority":{"type":"string","nullable":true},"assigneeId":{"type":"string","nullable":true},"assigneeName":{"type":"string","nullable":true},"dueAt":{"type":"string","nullable":true},"retroId":{"type":"string","nullable":true},"retroName":{"type":"string","nullable":true},"spaceId":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","description","status","priority","assigneeId","assigneeName","dueAt","retroId","retroName","spaceId","createdAt","updatedAt"]}},"required":["data"]}}}},"400":{"description":"Invalid request body","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden - requires READ_WRITE key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/action-items/{actionItemId}":{"get":{"tags":["Action Items"],"summary":"Get action item details","description":"Get a single action item with comments and linked retro items.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"actionItemId","in":"path"}],"responses":{"200":{"description":"Action item details","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"status":{"type":"string"},"priority":{"type":"string","nullable":true},"assigneeId":{"type":"string","nullable":true},"assigneeName":{"type":"string","nullable":true},"dueAt":{"type":"string","nullable":true},"retroId":{"type":"string","nullable":true},"retroName":{"type":"string","nullable":true},"spaceId":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","text","createdAt"]}},"linkedRetroItemIds":{"type":"array","items":{"type":"string"}}},"required":["id","name","description","status","priority","assigneeId","assigneeName","dueAt","retroId","retroName","spaceId","createdAt","updatedAt","comments","linkedRetroItemIds"]}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"put":{"tags":["Action Items"],"summary":"Update action item","description":"Update an action item's fields. Requires a READ_WRITE API key.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"actionItemId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"New name. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"description":{"type":"string","description":"New description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"status":{"type":"string","description":"Status. One of: `PENDING`, `IN_PROGRESS`, `COMPLETED`, `ARCHIVED`, `WONT_DO`. `DELETED` is not settable via the API."},"assigneeId":{"type":"string","nullable":true,"description":"User id (UUID) to reassign to. Pass `null` to unassign. Omit to leave unchanged. Use `organization_list_users` (supports a search filter) to look up by name."},"priority":{"type":"string","description":"Priority. One of: `VERY_LOW`, `LOW`, `MEDIUM` (default), `HIGH`, `CRITICAL`. On create, unknown values silently fall back to `MEDIUM`; on update, unknown values are rejected with 400."},"dueAt":{"type":"string","nullable":true,"description":"New due date. ISO-8601 timestamp (e.g. 2026-04-25T09:30:00.000Z). Pass `null` to clear. Omit to leave unchanged."}}}}}},"responses":{"200":{"description":"Updated action item","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"status":{"type":"string"},"priority":{"type":"string","nullable":true},"assigneeId":{"type":"string","nullable":true},"assigneeName":{"type":"string","nullable":true},"dueAt":{"type":"string","nullable":true},"retroId":{"type":"string","nullable":true},"retroName":{"type":"string","nullable":true},"spaceId":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","text","createdAt"]}},"linkedRetroItemIds":{"type":"array","items":{"type":"string"}}},"required":["id","name","description","status","priority","assigneeId","assigneeName","dueAt","retroId","retroName","spaceId","createdAt","updatedAt","comments","linkedRetroItemIds"]}},"required":["data"]}}}},"400":{"description":"Invalid request body","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden - requires READ_WRITE key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"delete":{"tags":["Action Items"],"summary":"Delete action item","description":"Soft-delete an action item by id (sets status to DELETED). Requires the same admin access as updates.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"actionItemId","in":"path"}],"responses":{"200":{"description":"Deleted action item","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}},"required":["data"]}}}},"403":{"description":"Forbidden — requires admin access","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Action item not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/standups/{standupId}/comments":{"post":{"tags":["Standups"],"summary":"Comment on a standup submission or poll","description":"Post a comment as the token owner. Requires a personal access token. The token owner must be a member of the standup or an admin of its space. Requires READ_WRITE scope.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","minLength":1,"maxLength":30000,"description":"Comment body. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"standupSubmissionId":{"type":"string","description":"Comment on a standup submission (UUID). Provide exactly one of standupSubmissionId or standupPollId."},"standupPollId":{"type":"string","description":"Comment on a standup poll (UUID). Provide exactly one of standupSubmissionId or standupPollId."}},"required":["comment"]}}}},"responses":{"201":{"description":"Comment created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"comment":{"type":"string"},"userId":{"type":"string"},"standupId":{"type":"string"},"standupSubmissionId":{"type":"string","nullable":true},"standupPollId":{"type":"string","nullable":true},"createdAt":{"type":"string"}},"required":["id","comment","userId","standupId","standupSubmissionId","standupPollId","createdAt"]}},"required":["data"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Standup, submission, or poll not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/standups/{standupId}/comments/{commentId}":{"put":{"tags":["Standups"],"summary":"Edit a standup comment","description":"Edit the body of an existing standup comment. Requires a personal access token. Only the comment author or a standup admin can edit. Requires READ_WRITE scope.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"commentId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","minLength":1,"maxLength":30000,"description":"New comment body. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["comment"]}}}},"responses":{"200":{"description":"Comment updated","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"comment":{"type":"string"},"userId":{"type":"string"},"standupId":{"type":"string"},"standupSubmissionId":{"type":"string","nullable":true},"standupPollId":{"type":"string","nullable":true},"updatedAt":{"type":"string"}},"required":["id","comment","userId","standupId","standupSubmissionId","standupPollId","updatedAt"]}},"required":["data"]}}}},"403":{"description":"Only the comment author or a standup admin can edit","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Comment not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"delete":{"tags":["Standups"],"summary":"Delete a standup comment","description":"Soft-delete a standup comment. Requires a personal access token. Only the comment author or a standup admin can delete. Requires READ_WRITE scope.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"commentId","in":"path"}],"responses":{"200":{"description":"Comment deleted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}},"required":["data"]}}}},"403":{"description":"Only the comment author or a standup admin can delete","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Comment not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/standups/{standupId}/reactions":{"post":{"tags":["Standups"],"summary":"React to a standup item","description":"Add an emoji reaction to a submission, comment, or poll as the token owner. Provide exactly one of standupSubmissionId, standupCommentId, or standupPollId. Requires a personal access token with READ_WRITE scope.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"reaction":{"type":"string","minLength":1,"maxLength":16,"description":"The reaction itself — typically a single emoji (e.g. \"👍\", \"🚀\"). Reactions are deduped per (target, user, reaction): adding the same emoji twice on the same target returns 409."},"standupSubmissionId":{"type":"string","description":"React to a standup submission (UUID). Provide exactly one of standupSubmissionId, standupCommentId, or standupPollId."},"standupCommentId":{"type":"string","description":"React to a standup comment (UUID). Provide exactly one of standupSubmissionId, standupCommentId, or standupPollId."},"standupPollId":{"type":"string","description":"React to a standup poll (UUID). Provide exactly one of standupSubmissionId, standupCommentId, or standupPollId."}},"required":["reaction"]}}}},"responses":{"201":{"description":"Reaction created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"reaction":{"type":"string"},"userId":{"type":"string"},"standupId":{"type":"string"},"standupSubmissionId":{"type":"string","nullable":true},"standupCommentId":{"type":"string","nullable":true},"standupPollId":{"type":"string","nullable":true},"createdAt":{"type":"string"}},"required":["id","reaction","userId","standupId","standupSubmissionId","standupCommentId","standupPollId","createdAt"]}},"required":["data"]}}}},"409":{"description":"Reaction already exists","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/standups/{standupId}/reactions/{reactionId}":{"delete":{"tags":["Standups"],"summary":"Remove own reaction","description":"Remove a reaction. Only the reaction's owner can remove it. Requires a personal access token with READ_WRITE scope.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"standupId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"reactionId","in":"path"}],"responses":{"204":{"description":"Reaction removed"},"403":{"description":"Not the reaction owner","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Reaction not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/retros/{retroId}/items":{"get":{"tags":["Retrospectives"],"summary":"List retro items","description":"List all items on a retro board, ordered by position (left-to-right within each column).","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"retroId","in":"path"}],"responses":{"200":{"description":"List of retro items","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"retroId":{"type":"string"},"columnId":{"type":"string"},"position":{"type":"number"},"anonymous":{"type":"boolean"},"creatorId":{"type":"string"},"groupName":{"type":"string","nullable":true},"parentId":{"type":"string","nullable":true},"discussed":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","retroId","columnId","position","anonymous","creatorId","groupName","parentId","discussed","createdAt","updatedAt"]}}},"required":["data"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Retro not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"post":{"tags":["Retrospectives"],"summary":"Add a retro item","description":"Add a retro item as the token owner. Requires a personal access token. The token owner must be a member of the retro or have space admin access. Requires READ_WRITE scope.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"retroId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"columnId":{"type":"string","description":"The id (UUID) of the retro column the item belongs in (one of the columns returned by `get_retro`)."},"name":{"type":"string","minLength":1,"maxLength":30000,"description":"Item content. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"anonymous":{"type":"boolean","description":"When true, the item is shown without the author's name in the retro UI. Defaults to false."}},"required":["columnId","name"]}}}},"responses":{"201":{"description":"Created retro item","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"retroId":{"type":"string"},"columnId":{"type":"string"},"position":{"type":"number"},"anonymous":{"type":"boolean"},"creatorId":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","name","retroId","columnId","position","anonymous","creatorId","createdAt"]}},"required":["data"]}}}},"403":{"description":"Forbidden - wrong token type or no retro access","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Retro or column not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/retros/{retroId}/items/{itemId}":{"put":{"tags":["Retrospectives"],"summary":"Edit a retro item","description":"Edit a retro item's content, column, position, anonymous flag, group label, or discussed flag. Requires a personal access token. Only the item author or a retro admin can edit. Requires READ_WRITE scope.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"retroId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"itemId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":30000,"description":"New item content. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"columnId":{"type":"string","description":"Move the item into a different column (UUID). Must belong to the same retro."},"position":{"type":"integer","description":"Position within the column (lower = earlier). Sets the raw integer; does not shift other items."},"anonymous":{"type":"boolean","description":"Toggle whether the author's name is hidden in the retro UI."},"groupName":{"type":"string","nullable":true,"description":"Set or clear the group label shown above the item. Pass `null` to clear, omit to leave unchanged."},"discussed":{"type":"boolean","description":"Mark whether the item has been discussed in the retro."}}}}}},"responses":{"200":{"description":"Updated retro item","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"retroId":{"type":"string"},"columnId":{"type":"string"},"position":{"type":"number"},"anonymous":{"type":"boolean"},"creatorId":{"type":"string"},"groupName":{"type":"string","nullable":true},"parentId":{"type":"string","nullable":true},"discussed":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","retroId","columnId","position","anonymous","creatorId","groupName","parentId","discussed","createdAt","updatedAt"]}},"required":["data"]}}}},"403":{"description":"Only the item author or a retro admin can edit","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Item or column not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"delete":{"tags":["Retrospectives"],"summary":"Delete a retro item","description":"Soft-delete a retro item. Any poll attached to the item is also soft-deleted. Requires a personal access token. Only the item author or a retro admin can delete. Requires READ_WRITE scope.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"retroId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"itemId","in":"path"}],"responses":{"200":{"description":"Item deleted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}},"required":["data"]}}}},"403":{"description":"Only the item author or a retro admin can delete","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Item not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/me":{"get":{"tags":["Users"],"summary":"Who am I","description":"Returns the connected user's profile, organization role, and the spaces they belong to (with their role per space). Capped at 100 spaces — fall back to GET /api/v1/spaces if more are needed. Requires a personal access token (or MCP token); organization API tokens are not user-bound and will be rejected.","security":[{"PersonalBearerAuth":[]}],"responses":{"200":{"description":"Caller identity, organization, and spaces","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","description":"Primary email for the user. Empty string if no email is on file."},"timezone":{"type":"string","description":"IANA timezone (e.g. Europe/London). Use this when calling date-keyed endpoints such as standup submissions."},"language":{"type":"string","description":"BCP-47 language tag (e.g. en)."}},"required":["id","name","email","timezone","language"]},"organization":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"logo":{"type":"string","nullable":true},"role":{"type":"string","description":"Caller's role in the organization: OWNER, SUPER_ADMIN, ORG_ADMIN, ADMIN, or MEMBER."}},"required":["id","name","logo","role"]},"spaces":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"active":{"type":"boolean"},"role":{"type":"string","description":"Caller's role in the space: PLAYER, FACILITATOR, ADMIN, or CREATOR."}},"required":["id","name","description","active","role"]}}},"required":["user","organization","spaces"]}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden — endpoint requires a personal access token","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/rooms/{roomId}/rounds/{roundId}":{"put":{"tags":["Planning Poker"],"summary":"Update round","description":"Update a round's status (PENDING / FLIPPED / COMPLETED / SKIPPED), winning vote, name, description, or external links. Setting status to FLIPPED reveals votes; resetting back to PENDING opens a fresh voting bucket; COMPLETED finalises with a `winningVote`. Marking the only remaining PENDING round as COMPLETED or SKIPPED auto-creates a fresh PENDING round (returned as `replacementRoundId`). Requires room admin access and a READ_WRITE API key.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"roomId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"roundId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["PENDING","FLIPPED","COMPLETED","SKIPPED"],"description":"New round status. `PENDING` (open for votes), `FLIPPED` (votes revealed for discussion), `COMPLETED` (final), `SKIPPED` (out of scope). Setting `FLIPPED` also sets the reveal timestamp; resetting back to `PENDING` opens a fresh voting bucket so prior votes do not bleed into the new round."},"winningVote":{"type":"string","nullable":true,"maxLength":50,"description":"The agreed estimate for the round. Pass `null` to clear, omit to leave unchanged. Typically set when transitioning to `COMPLETED`."},"name":{"type":"string","description":"Round title shown in the room UI."},"description":{"type":"string","description":"Round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"externalId":{"type":"string","nullable":true,"description":"External tracker reference (e.g. `JIRA-123`). Pass `null` to clear."},"externalLink":{"type":"string","nullable":true,"description":"URL to the external tracker item. Pass `null` to clear."},"extraFields":{"type":"array","nullable":true,"items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."},"maxItems":30,"description":"Up to 30 extra fields rendered in the round's ticket details panel (types: text, number, date, datetime, labels, markdown). Only allowed on rounds not linked to an integration. Replaces the round's entire extra-fields list. Pass `null` to clear, omit to leave unchanged. Returns 409 if the round is linked to an integration (e.g. imported from Jira)."}}}}}},"responses":{"200":{"description":"Updated round","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["PENDING","FLIPPED","COMPLETED","SKIPPED"]},"winningVote":{"type":"string","nullable":true},"externalId":{"type":"string"},"externalLink":{"type":"string"},"revealedAt":{"type":"string","nullable":true},"updatedAt":{"type":"string"},"extraFields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["text"]},"value":{"type":"string","maxLength":2000,"description":"Plain text, shown as a table row."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["number"]},"value":{"type":"number"}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["date"]},"value":{"type":"string","format":"date","description":"Calendar date, `YYYY-MM-DD`."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["datetime"]},"value":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with offset."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["labels"]},"value":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"minItems":1,"maxItems":30,"description":"Rendered as chips."}},"required":["name","type","value"]},{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display label for the field (unique within the round)."},"type":{"type":"string","enum":["markdown"]},"value":{"type":"string","maxLength":10000,"description":"Rich text rendered below the round description. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["name","type","value"]}],"description":"A single extra field shown in the round's ticket details."}},"replacementRoundId":{"type":"string","nullable":true,"description":"Set when this update moved the round to COMPLETED / SKIPPED and a fresh PENDING round had to be auto-created so the room always has somewhere to vote next. Null otherwise."}},"required":["id","name","description","status","winningVote","externalId","externalLink","revealedAt","updatedAt","replacementRoundId"]}},"required":["data"]}}}},"400":{"description":"Invalid body","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden — requires admin access","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Round not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"409":{"description":"Round is linked to an integration — extra fields not allowed","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/rooms/{roomId}/rounds/{roundId}/votes":{"post":{"tags":["Planning Poker"],"summary":"Cast round vote","description":"Cast or update the calling user's vote on a planning-poker round. The `vote` must match one of the room's configured cards. Submitting again replaces the previous vote on the same round. There is no separate delete endpoint — re-cast to change.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"roomId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"roundId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"vote":{"type":"string","minLength":1,"maxLength":50,"description":"The card value being voted (e.g. `5`, `XL`, `?`). Must match one of the room's configured cards — call `planning_poker_get_room` to discover the deck, or read `roomCards.options` in the response. Submitting again replaces the caller's previous vote on this round. There is no separate delete tool for poker votes — re-cast to change."}},"required":["vote"]}}}},"responses":{"201":{"description":"Cast vote","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"userId":{"type":"string"},"roundId":{"type":"string"},"vote":{"type":"string"},"version":{"type":"number"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["userId","roundId","vote","version","createdAt","updatedAt"]}},"required":["data"]}}}},"400":{"description":"Invalid vote (not in room deck) or round closed","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden — endpoint requires a personal access token","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Room or round not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/retros/{retroId}/votes":{"post":{"tags":["Retrospectives"],"summary":"Cast retro item vote","description":"Add one of the calling user's votes to a retro item. Subject to the retro's `voteCount` setting (PER_BOARD or PER_COLUMN). Returns the new vote id.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"retroId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","description":"Retro item id (UUID) to vote on. Must belong to this retro and not be deleted."}},"required":["itemId"]}}}},"responses":{"201":{"description":"Cast vote","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"retroId":{"type":"string"},"itemId":{"type":"string"},"userId":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","retroId","itemId","userId","createdAt"]}},"required":["data"]}}}},"400":{"description":"Vote count exceeded for this retro / column","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Voting disabled for this retro","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Retro or item not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/retros/{retroId}/votes/{voteId}":{"delete":{"tags":["Retrospectives"],"summary":"Delete retro item vote","description":"Remove one of the calling user's previous votes by vote id. Only the vote owner can remove it.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"retroId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"voteId","in":"path"}],"responses":{"200":{"description":"Deleted vote","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}},"required":["data"]}}}},"403":{"description":"Not the vote owner","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Vote not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/retros/{retroId}/comments":{"post":{"tags":["Retrospectives"],"summary":"Add retro item comment","description":"Add a comment to a retro item or item poll. Provide exactly one of `itemId` or `pollId`. When `anonymous: true`, the response omits the author `userId`.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"retroId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","minLength":1,"maxLength":30000,"description":"Comment body. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."},"itemId":{"type":"string","description":"Comment on a retro item (UUID). Provide exactly one of itemId or pollId."},"pollId":{"type":"string","description":"Comment on a retro poll (UUID). Provide exactly one of itemId or pollId."},"anonymous":{"type":"boolean","description":"When true, the comment is shown without the author's name in the retro UI. Defaults to false."}},"required":["comment"]}}}},"responses":{"201":{"description":"Created comment","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"comment":{"type":"string"},"retroId":{"type":"string"},"itemId":{"type":"string","nullable":true},"pollId":{"type":"string","nullable":true},"userId":{"type":"string","nullable":true,"description":"Author user id. Null when comment is anonymous."},"anonymous":{"type":"boolean"},"createdAt":{"type":"string"}},"required":["id","comment","retroId","itemId","pollId","userId","anonymous","createdAt"]}},"required":["data"]}}}},"400":{"description":"Must provide exactly one of itemId / pollId","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Comments disabled for this retro","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Retro / item / poll not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/retros/{retroId}/items/{itemId}/kudos":{"post":{"tags":["Retrospectives"],"summary":"Give retro kudos","description":"Give kudos to another user on a retro item. The receiver must be a member of the retro's space.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"retroId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"itemId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"receiverId":{"type":"string","description":"User id (UUID) receiving the kudos. Must be a member of the retro's space. Look up by name with `organization_list_users` (supports a search filter)."},"kudoType":{"type":"string","enum":["ACHIEVEMENT","TEAMWORK","INNOVATION","SUPPORT"],"description":"Kind of kudos. One of: ACHIEVEMENT, TEAMWORK, INNOVATION, SUPPORT."}},"required":["receiverId","kudoType"]}}}},"responses":{"201":{"description":"Kudos given","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"retroId":{"type":"string"},"retroItemId":{"type":"string"},"creatorId":{"type":"string"},"receiverId":{"type":"string"},"kudoType":{"type":"string","enum":["ACHIEVEMENT","TEAMWORK","INNOVATION","SUPPORT"]},"createdAt":{"type":"string"}},"required":["id","retroId","retroItemId","creatorId","receiverId","kudoType","createdAt"]}},"required":["data"]}}}},"404":{"description":"Retro item or receiver not in the retro's space","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/action-items/{actionItemId}/comments":{"get":{"tags":["Action Items"],"summary":"List action item comments","description":"List comments on an action item, oldest first. Paginated. Visible to anyone with access to the action item's retro or space.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"actionItemId","in":"path"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"number"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"List of comments","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"comment":{"type":"string"},"userId":{"type":"string"},"actionItemId":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","comment","userId","actionItemId","createdAt","updatedAt"]}},"pagination":{"type":"object","properties":{"hasMore":{"type":"boolean"},"nextCursor":{"type":"string","nullable":true}},"required":["hasMore","nextCursor"]}},"required":["data","pagination"]}}}},"404":{"description":"Action item not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"post":{"tags":["Action Items"],"summary":"Comment on action item","description":"Add a comment to an action item — useful for posting progress updates or context.","security":[{"PersonalBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"actionItemId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"string","minLength":1,"maxLength":30000,"description":"Comment body. Accepts markdown. Only this subset is preserved; everything else is stripped. Raw HTML is escaped and renders as literal text — do not send HTML tags.\n\nSupported:\n- **Bold**: `**bold**` or `__bold__`\n- *Italic*: `*italic*` or `_italic_`\n- ~~Strikethrough~~: `~~text~~`\n- Bullet list: lines starting with `- ` or `* `\n- Numbered list: lines starting with `1. `, `2. `, …\n- Links: `[label](https://example.com)` (only `http://`, `https://`, `mailto:`, `/`, or `#` URLs are kept; links always open in a new tab with `rel=noopener noreferrer nofollow`)\n- Paragraph breaks: blank line between paragraphs\n- Hard line break: end a line with two spaces\n\nNot supported and silently stripped: headings (`#`), blockquotes (`>`), code (inline `` ` `` and fenced ```), tables, images, HTML iframes/scripts, task lists, footnotes, underline (use italic instead). Plain text without any markdown syntax is valid markdown — send it as-is when no formatting is needed."}},"required":["comment"]}}}},"responses":{"201":{"description":"Created comment","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"comment":{"type":"string"},"userId":{"type":"string"},"actionItemId":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","comment","userId","actionItemId","createdAt","updatedAt"]}},"required":["data"]}}}},"403":{"description":"Forbidden — endpoint requires a personal access token","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Action item not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/search":{"get":{"tags":["Search"],"summary":"Semantic search within a space","description":"Natural-language semantic search across a space's retros, standups, planning poker rounds, action items, retro notes, ice-breaker answers, and polls. Results are ranked by cosine similarity against the indexed content and returned grouped by entity type. Set `entityType` to narrow to a single type and paginate that type with `limit`+`offset`; omit `entityType` to fan out across every type with `limit` as the per-type cap.","security":[{"BearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Space (UUID) to search within."},"required":true,"description":"Space (UUID) to search within.","name":"spaceId","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":2000,"description":"Natural-language search query. Embeddings are generated server-side and compared with cosine similarity against retro items, retro comments, retro action items and their comments, standup answers and comments, planning poker rounds, retro notes, ice-breaker answers, and polls in the space."},"required":true,"description":"Natural-language search query. Embeddings are generated server-side and compared with cosine similarity against retro items, retro comments, retro action items and their comments, standup answers and comments, planning poker rounds, retro notes, ice-breaker answers, and polls in the space.","name":"query","in":"query"},{"schema":{"type":"string","enum":["RETRO_ITEM","RETRO_ITEM_COMMENT","RETRO_ACTION_ITEM","RETRO_ACTION_ITEM_COMMENT","STANDUP_ANSWER","STANDUP_COMMENT","ROUND","NOTES","ICE_BREAKER_ANSWER","POLL","POLL_ITEM"],"description":"Optionally narrow the search to a single entity type. One of `RETRO_ITEM`, `RETRO_ITEM_COMMENT`, `RETRO_ACTION_ITEM`, `RETRO_ACTION_ITEM_COMMENT`, `STANDUP_ANSWER`, `STANDUP_COMMENT`, `ROUND`, `NOTES`, `ICE_BREAKER_ANSWER`, `POLL`, `POLL_ITEM`. Omit to search across all types and receive results grouped by type."},"required":false,"description":"Optionally narrow the search to a single entity type. One of `RETRO_ITEM`, `RETRO_ITEM_COMMENT`, `RETRO_ACTION_ITEM`, `RETRO_ACTION_ITEM_COMMENT`, `STANDUP_ANSWER`, `STANDUP_COMMENT`, `ROUND`, `NOTES`, `ICE_BREAKER_ANSWER`, `POLL`, `POLL_ITEM`. Omit to search across all types and receive results grouped by type.","name":"entityType","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":50,"description":"Maximum results per entity type. Defaults to 20. When `entityType` is set, this is the page size for that single type alongside `offset`. When `entityType` is omitted, this caps the number of results returned per type."},"required":false,"description":"Maximum results per entity type. Defaults to 20. When `entityType` is set, this is the page size for that single type alongside `offset`. When `entityType` is omitted, this caps the number of results returned per type.","name":"limit","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"maximum":500,"description":"Pagination offset, used only when `entityType` is set. Defaults to 0. Use `hasMore` on the response to know when to stop."},"required":false,"description":"Pagination offset, used only when `entityType` is set. Defaults to 0. Use `hasMore` on the response to know when to stop.","name":"offset","in":"query"}],"responses":{"200":{"description":"Search results grouped by entity type","content":{"application/json":{"schema":{"type":"object","properties":{"resultsByType":{"type":"object","additionalProperties":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"entityId":{"type":"string"},"entityType":{"type":"string","enum":["RETRO_ITEM","RETRO_ITEM_COMMENT","RETRO_ACTION_ITEM","RETRO_ACTION_ITEM_COMMENT","STANDUP_ANSWER","STANDUP_COMMENT","ROUND","NOTES","ICE_BREAKER_ANSWER","POLL","POLL_ITEM"]},"similarity":{"type":"number"},"preview":{"type":"string"},"url":{"type":"string","nullable":true},"metadata":{"type":"object","properties":{"sourceName":{"type":"string","nullable":true},"date":{"type":"string","nullable":true},"sprintName":{"type":"string","nullable":true},"agreeCount":{"type":"number","nullable":true},"status":{"type":"string","nullable":true}},"required":["sourceName","date","sprintName","agreeCount","status"]}},"required":["entityId","entityType","similarity","preview","url","metadata"]}},"hasMore":{"type":"boolean"}},"required":["results","hasMore"]}}},"required":["resultsByType"]}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Space not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}}}}