{"basePath":"/api/v1","definitions":{"AIKeyRequest":{"properties":{"api_key":{"type":"string"},"provider":{"description":"Workspace key: gemini or openai. Personal key: any of these.","enum":["claude","gemini","openai","cursor"],"type":"string"}},"required":["api_key","provider"],"type":"object"},"AILimits":{"properties":{"day":{"type":"integer"},"month":{"type":"integer"},"week":{"type":"integer"}},"required":["day","month","week"],"type":"object"},"AIPolicyRequest":{"properties":{"allow_personal_keys":{"type":"boolean"},"defaults":{"$ref":"#/definitions/AILimits"}},"required":["defaults"],"type":"object"},"AISettings":{"properties":{"allow_personal_keys":{"type":"boolean"},"defaults":{"$ref":"#/definitions/AILimits"},"key_hint":{"type":"string","x-nullable":true},"provider":{"enum":["claude","gemini","openai"],"type":"string","x-nullable":true},"users":{"items":{"$ref":"#/definitions/AIUserLimit"},"type":"array"}},"required":["allow_personal_keys","defaults","users"],"type":"object"},"AIUserLimit":{"properties":{"custom":{"allOf":[{"$ref":"#/definitions/AILimits"}],"description":"Custom limits; null = the workspace default.","x-nullable":true},"name":{"type":"string"},"used_today":{"type":"integer"},"user_id":{"type":"string"}},"required":["name","used_today","user_id"],"type":"object"},"AIUserLimitRequest":{"properties":{"custom":{"allOf":[{"$ref":"#/definitions/AILimits"}],"description":"Custom limits; null = back to the workspace default."}},"type":"object"},"AcceptInviteRequest":{"properties":{"name":{"type":"string"},"password":{"type":"string"},"token":{"type":"string"}},"required":["name","password","token"],"type":"object"},"AddPasskeyRequest":{"properties":{"credential":{"type":"object"},"name":{"type":"string"},"token":{"type":"string"}},"required":["credential","token"],"type":"object"},"ApproveJoinRequestBody":{"properties":{"role_id":{"description":"Omitted: the Member role. Never Owner, never more than your own access.","type":"string"}},"type":"object"},"Artifact":{"properties":{"can_edit":{"description":"The caller owns it: may prompt, rename, share and delete.","type":"boolean"},"created_at":{"type":"string"},"folder_id":{"description":"The folder it is filed in.","type":"string","x-nullable":true},"id":{"type":"string"},"messages":{"items":{"$ref":"#/definitions/ArtifactMessage"},"type":"array"},"owner_id":{"type":"string"},"owner_name":{"type":"string"},"sharing":{"allOf":[{"$ref":"#/definitions/ArtifactSharing"}],"description":"Owner only; null for everyone else.","x-nullable":true},"space_ids":{"description":"The live spaces it is linked to (only their members may open it).","items":{"type":"string"},"type":"array"},"title":{"type":"string"},"title_set":{"type":"boolean"},"updated_at":{"type":"string"},"versions":{"items":{"$ref":"#/definitions/ArtifactVersion"},"type":"array"},"visibility":{"allOf":[{"$ref":"#/definitions/ArtifactVisibility"}],"enum":["private","shared","public"]}},"required":["can_edit","created_at","id","messages","owner_id","owner_name","space_ids","title","title_set","updated_at","versions","visibility"],"type":"object"},"ArtifactCoverage":{"properties":{"missing_space_ids":{"items":{"type":"string"},"type":"array"}},"required":["missing_space_ids"],"type":"object"},"ArtifactFile":{"properties":{"changed_in":{"description":"The version this file last changed in (added, or its bytes differ\nfrom the version before).","type":"integer"},"content_type":{"description":"What it is served as, from its extension.","type":"string"},"path":{"description":"Its path, as the page references it (css/app.css, img/logo.png).","type":"string"},"size":{"type":"integer"}},"required":["changed_in","content_type","path","size"],"type":"object"},"ArtifactFileChange":{"properties":{"change":{"enum":["added","changed","removed"],"type":"string"},"path":{"type":"string"}},"required":["change","path"],"type":"object"},"ArtifactFolder":{"properties":{"can_edit":{"description":"The caller may rename, share and delete it (its owner, or an AI admin).","type":"boolean"},"created_at":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"owner_id":{"type":"string"},"owner_name":{"type":"string"},"shared":{"description":"Shared with anyone at all.","type":"boolean"},"sharing":{"allOf":[{"$ref":"#/definitions/ArtifactFolderSharing"}],"description":"Who it is shared with; null unless the caller may edit it.","x-nullable":true},"updated_at":{"type":"string"}},"required":["can_edit","created_at","id","name","owner_id","owner_name","shared","updated_at"],"type":"object"},"ArtifactFolderRequest":{"properties":{"name":{"example":"Release dashboards","type":"string"}},"required":["name"],"type":"object"},"ArtifactFolderSharing":{"properties":{"portfolio_ids":{"items":{"type":"string"},"type":"array"},"space_ids":{"items":{"type":"string"},"type":"array"},"user_ids":{"items":{"type":"string"},"type":"array"}},"required":["portfolio_ids","space_ids","user_ids"],"type":"object"},"ArtifactMessage":{"properties":{"created_at":{"type":"string"},"error":{"description":"Why the AI couldn't build it (a code the UI translates); no version then.","type":"string","x-nullable":true},"id":{"type":"string"},"role":{"enum":["user","ai"],"type":"string"},"text":{"type":"string"},"version_n":{"description":"The version this AI message made.","type":"integer","x-nullable":true}},"required":["created_at","id","role","text"],"type":"object"},"ArtifactMoveRequest":{"properties":{"folder_id":{"description":"The folder to file it in; null takes it out of its folder.","type":"string","x-nullable":true}},"type":"object"},"ArtifactPromptRequest":{"properties":{"from_version":{"description":"The version shown, which the change builds on; omitted = the latest.","type":"integer","x-nullable":true},"text":{"example":"An interactive burndown chart for a two-week sprint","type":"string"}},"required":["text"],"type":"object"},"ArtifactRenameRequest":{"properties":{"title":{"example":"Q4 release readiness","type":"string"}},"required":["title"],"type":"object"},"ArtifactShareRequest":{"properties":{"linked_space_ids":{"description":"Linked spaces: when any, only their members (and the owner) can open\nit, whoever else it is shared with.","items":{"type":"string"},"type":"array"},"public":{"description":"Anyone with the link can view it. Turning it off discards the link;\non again makes a new one.","type":"boolean"},"space_ids":{"description":"Spaces of any kind: everyone in them can open it.","items":{"type":"string"},"type":"array"},"user_ids":{"items":{"type":"string"},"type":"array"}},"type":"object"},"ArtifactSharing":{"properties":{"public_token":{"description":"The public link's token while the link is on.","type":"string","x-nullable":true},"space_ids":{"items":{"type":"string"},"type":"array"},"user_ids":{"items":{"type":"string"},"type":"array"}},"required":["space_ids","user_ids"],"type":"object"},"ArtifactSummary":{"properties":{"created_at":{"type":"string"},"folder_id":{"description":"The folder it is filed in.","type":"string","x-nullable":true},"id":{"type":"string"},"owner_id":{"type":"string"},"owner_name":{"type":"string"},"space_ids":{"description":"The live spaces it is linked to (only their members may open it).","items":{"type":"string"},"type":"array"},"thumbnail_html":{"description":"The latest version, for the live thumbnail (null without a version or\nwhen it is too big for a thumbnail).","type":"string","x-nullable":true},"thumbnail_url":{"description":"The latest version when it has files of its own: where its thumbnail\nloads from (a sandboxed address for the caller only; null otherwise).","type":"string","x-nullable":true},"title":{"type":"string"},"updated_at":{"type":"string"},"version_count":{"description":"Versions made so far.","type":"integer"},"visibility":{"allOf":[{"$ref":"#/definitions/ArtifactVisibility"}],"enum":["private","shared","public"]}},"required":["created_at","id","owner_id","owner_name","space_ids","title","updated_at","version_count","visibility"],"type":"object"},"ArtifactVersion":{"properties":{"changes":{"description":"What this version added, changed or removed, by path; empty when it\nchanged nothing (version 1 adds every file).","items":{"$ref":"#/definitions/ArtifactFileChange"},"type":"array"},"created_at":{"type":"string"},"entry":{"description":"The page's path among the files; null for a single-page version.","type":"string","x-nullable":true},"files":{"description":"The other files (stylesheets, scripts, images, fonts, pages); empty for\na single-page version.","items":{"$ref":"#/definitions/ArtifactFile"},"type":"array"},"html":{"description":"The page (with files: the one at Entry).","type":"string"},"n":{"type":"integer"},"page_changed_in":{"description":"The version the page last changed in.","type":"integer"},"view_url":{"description":"Where a version with files is shown: a sandboxed address on this host\nfor the caller only, valid for a day. Null for a single-page version\n(shown from html).","type":"string","x-nullable":true}},"required":["changes","created_at","files","html","n","page_changed_in"],"type":"object"},"ArtifactVersionRequest":{"properties":{"from_version":{"description":"The version the edit started from: its other files carry over (default the latest).","type":"integer","x-nullable":true},"html":{"description":"The file's new text: the page's whole HTML document, or (with path)\nanother file's text.","type":"string"},"path":{"description":"The file saved, by its path among the version's files (optional; the\npage by default).","type":"string"}},"type":"object"},"ArtifactVisibility":{"enum":["private","shared","public"],"type":"string","x-enum-varnames":["ArtifactPrivate","ArtifactShared","ArtifactPublic"]},"AssistantBlock":{"properties":{"chart":{"description":"chart: bar or line, a note beside the title, and the points in order.","enum":["bar","line",""],"type":"string"},"code":{"type":"string"},"columns":{"description":"table: the header, the rows (as many cells as columns) and which\ncolumns hold numbers (right-aligned).","items":{"type":"string"},"type":"array"},"file":{"type":"string"},"items":{"items":{"$ref":"#/definitions/AssistantListItem"},"type":"array"},"kind":{"enum":["list","table","chart","code"],"type":"string"},"language":{"description":"code: its language or file name, and the code.","type":"string"},"numeric":{"items":{"type":"boolean"},"type":"array"},"ordered":{"description":"list: numbered instead of bulleted.","type":"boolean"},"points":{"items":{"$ref":"#/definitions/AssistantPoint"},"type":"array"},"rows":{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},"subtitle":{"type":"string"},"title":{"description":"A heading above it; \"\" for none.","type":"string"}},"required":["chart","code","columns","file","items","kind","language","numeric","ordered","points","rows","subtitle","title"],"type":"object"},"AssistantDraft":{"properties":{"issue":{"allOf":[{"$ref":"#/definitions/AssistantIssueDraft"}],"x-nullable":true},"page":{"allOf":[{"$ref":"#/definitions/AssistantPageDraft"}],"x-nullable":true},"results":{"items":{"$ref":"#/definitions/AssistantResult"},"type":"array"}},"type":"object"},"AssistantIssueDraft":{"properties":{"description":{"type":"string"},"points":{"type":"integer","x-nullable":true},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"product_id":{"description":"The product it goes into.","type":"string"},"product_name":{"type":"string"},"title":{"type":"string"},"type":{"enum":["Bug","Story","Task"],"type":"string"}},"required":["description","priority","product_id","product_name","title","type"],"type":"object"},"AssistantListItem":{"properties":{"detail":{"type":"string"},"text":{"type":"string"}},"required":["detail","text"],"type":"object"},"AssistantMessage":{"properties":{"blocks":{"description":"The answer's rich parts, drawn under its text (none on questions).","items":{"$ref":"#/definitions/AssistantBlock"},"type":"array"},"body":{"type":"string"},"created_at":{"type":"string"},"created_issue_id":{"type":"string","x-nullable":true},"created_issue_key":{"type":"string","x-nullable":true},"created_page_id":{"type":"string","x-nullable":true},"draft":{"allOf":[{"$ref":"#/definitions/AssistantDraft"}],"x-nullable":true},"files":{"description":"Files the person sent with the message (none on answers).","items":{"$ref":"#/definitions/Attachment"},"type":"array"},"id":{"type":"string"},"role":{"enum":["user","assistant"],"type":"string"},"steps":{"description":"What the Assistant looked up for this answer (none on questions).","items":{"$ref":"#/definitions/AssistantStep"},"type":"array"},"thread_id":{"type":"string"}},"required":["blocks","body","created_at","files","id","role","steps","thread_id"],"type":"object"},"AssistantPageDraft":{"properties":{"sections":{"items":{"$ref":"#/definitions/AssistantPageSection"},"type":"array"},"title":{"type":"string"}},"required":["sections","title"],"type":"object"},"AssistantPageSection":{"properties":{"body":{"type":"string"},"heading":{"type":"string"}},"required":["body","heading"],"type":"object"},"AssistantPoint":{"properties":{"label":{"type":"string"},"value":{"type":"number"}},"required":["label","value"],"type":"object"},"AssistantResult":{"properties":{"id":{"type":"string"},"key":{"type":"string"},"space_key":{"type":"string"},"status":{"allOf":[{"$ref":"#/definitions/IssueStatus"}],"enum":["todo","progress","done","cancelled"]},"title":{"type":"string"},"type_color":{"type":"string"},"type_icon":{"type":"string"},"type_name":{"type":"string"}},"required":["id","key","space_key","status","title","type_color","type_icon","type_name"],"type":"object"},"AssistantSendRequest":{"properties":{"file_ids":{"description":"Uploads waiting on the thread (POST /assistant/files), at most 5.","items":{"type":"string"},"type":"array"},"space_id":{"description":"Scope of a new conversation; omit for the workspace.","type":"string"},"text":{"description":"May be empty when files are sent.","example":"CSV exports keep timing out for big lists","type":"string"},"thread_id":{"description":"Continue a conversation; omit to start one.","type":"string"}},"type":"object"},"AssistantStep":{"properties":{"ok":{"description":"False when the lookup failed (not found, not allowed).","type":"boolean"},"subject":{"description":"What it looked at: an issue key, the search words, a space key; \"\"\nwhen the call named nothing.","type":"string"},"tool":{"description":"The tool's name, e.g. get_issue or search.","type":"string"}},"required":["ok","subject","tool"],"type":"object"},"Attachment":{"properties":{"content_type":{"description":"Detected from the content: image/png, application/pdf, …","type":"string"},"created_at":{"type":"string"},"id":{"type":"string"},"is_image":{"description":"PNG, JPEG, GIF or WebP: safe to preview.","type":"boolean"},"issue_id":{"description":"Exactly one of issue_id, request_id, page_id, space_id, user_id and\nthread_id is set (none for the organisation avatar).","type":"string","x-nullable":true},"message_id":{"type":"string","x-nullable":true},"name":{"type":"string"},"page_id":{"type":"string","x-nullable":true},"request_id":{"type":"string","x-nullable":true},"size":{"type":"integer"},"space_id":{"type":"string","x-nullable":true},"thread_id":{"description":"An Assistant upload: its conversation, and the message that sent it\n(null while it waits in the composer).","type":"string","x-nullable":true},"uploaded_by":{"type":"string","x-nullable":true},"uploaded_by_name":{"type":"string","x-nullable":true},"user_id":{"type":"string","x-nullable":true}},"required":["content_type","created_at","id","is_image","name","size"],"type":"object"},"AuthResponse":{"properties":{"access_token":{"type":"string"},"expires_at":{"type":"string"},"recovery_codes":{"description":"After setting up two-step verification at sign-in: shown once.","items":{"type":"string"},"type":"array"},"user":{"$ref":"#/definitions/User"}},"required":["access_token","expires_at","user"],"type":"object"},"Backlog":{"properties":{"ancestors":{"description":"Account-level issues above this space's work (themes, initiatives), for context.","items":{"$ref":"#/definitions/Issue"},"type":"array"},"issues":{"items":{"$ref":"#/definitions/Issue"},"type":"array"},"scheme":{"$ref":"#/definitions/IssueScheme"},"space":{"$ref":"#/definitions/Space"}},"required":["ancestors","issues","scheme","space"],"type":"object"},"BacklogGroup":{"properties":{"closed_at":{"type":"string","x-nullable":true},"end_date":{"example":"2026-10-16","type":"string","x-nullable":true},"id":{"type":"string"},"is_default":{"description":"The kanban team's \"Selected for development\" group.","type":"boolean"},"name":{"type":"string"},"position":{"type":"integer"},"retro_note":{"type":"string","x-nullable":true},"start_date":{"description":"Required for sprints, always null for kanban groups.","example":"2026-10-05","type":"string","x-nullable":true},"started_at":{"type":"string","x-nullable":true},"status":{"allOf":[{"$ref":"#/definitions/GroupStatus"}],"enum":["planned","active","closed"]},"team_space_id":{"type":"string"},"type":{"enum":["sprint","kanban"],"type":"string"}},"required":["id","is_default","name","position","status","team_space_id","type"],"type":"object"},"BlockCommentRequest":{"properties":{"block_id":{"type":"string"},"body":{"type":"string"}},"required":["block_id","body"],"type":"object"},"BoardColumn":{"properties":{"color":{"example":"#3b6fe0","type":"string"},"id":{"type":"string"},"name":{"type":"string"},"position":{"type":"integer"},"status":{"allOf":[{"$ref":"#/definitions/IssueStatus"}],"enum":["todo","progress","done"]},"team_space_id":{"type":"string"},"wip_limit":{"description":"Max issues in the column at once; null = no limit.","type":"integer","x-nullable":true},"wip_mode":{"description":"warn: the column turns red above the limit. enforce: moves into a full column are refused.","enum":["warn","enforce"],"type":"string"}},"required":["color","id","name","position","status","team_space_id","wip_mode"],"type":"object"},"BoardColumnRequest":{"properties":{"color":{"description":"Defaults to the next palette colour when adding.","example":"#6550e6","type":"string"},"name":{"example":"QA","type":"string"},"wip_limit":{"description":"Max issues at once; omit or null for no limit.","type":"integer","x-nullable":true},"wip_mode":{"description":"What happens at the limit. Defaults to warn when adding.","enum":["warn","enforce"],"type":"string"}},"required":["name"],"type":"object"},"BoardMoveRequest":{"properties":{"column_id":{"type":"string"}},"required":["column_id"],"type":"object"},"BulkDeleteRequest":{"properties":{"issue_ids":{"description":"Up to 200; their sub-items go too.","items":{"type":"string"},"type":"array"}},"required":["issue_ids"],"type":"object"},"BulkDeleteResponse":{"properties":{"deleted_ids":{"description":"Every deleted issue, sub-items included.","items":{"type":"string"},"type":"array"}},"required":["deleted_ids"],"type":"object"},"BulkEditRequest":{"properties":{"add_labels":{"description":"Added to each issue's labels.","items":{"type":"string"},"type":"array"},"assignee_ids":{"description":"Replaces the assignees; [] clears them.","items":{"type":"string"},"type":"array","x-nullable":true},"due_date":{"example":"2026-10-31","type":"string","x-nullable":true},"issue_ids":{"description":"Up to 200.","items":{"type":"string"},"type":"array"},"points":{"type":"integer","x-nullable":true},"priority":{"enum":["low","medium","high","urgent"],"type":"string","x-nullable":true},"set_due_date":{"description":"With set_due_date: the new due date, null to clear it.","type":"boolean"},"set_points":{"description":"With set_points: the new estimate, null to clear it.","type":"boolean"},"status":{"allOf":[{"$ref":"#/definitions/IssueStatus"}],"description":"Each field below is optional; a missing one stays as it is.","enum":["todo","progress","done","cancelled"],"x-nullable":true}},"required":["issue_ids"],"type":"object"},"BulkInviteRequest":{"properties":{"emails":{"items":{"type":"string"},"type":"array"},"role_id":{"type":"string"}},"required":["emails","role_id"],"type":"object"},"BulkMoveRequest":{"properties":{"after_id":{"type":"string"},"bottom":{"description":"Without after_id: top of the section, or the bottom when true.","type":"boolean"},"issue_ids":{"description":"In backlog order; up to 200, all of one product.","items":{"type":"string"},"type":"array"},"section":{"enum":["backlog","ready"],"type":"string"}},"required":["issue_ids"],"type":"object"},"BulkPlaceRequest":{"properties":{"after_id":{"type":"string"},"backlog_group_id":{"description":"Target sprint or kanban group; omit for the team queue (then team_space_id is required).","type":"string"},"bottom":{"type":"boolean"},"issue_ids":{"description":"In display order; up to 200.","items":{"type":"string"},"type":"array"},"team_space_id":{"type":"string"}},"required":["issue_ids"],"type":"object"},"BulkTeamRequest":{"properties":{"issue_ids":{"items":{"type":"string"},"type":"array"},"team_space_id":{"description":"Null takes the issues off their team.","type":"string"}},"required":["issue_ids"],"type":"object"},"CardImage":{"properties":{"attachment_ids":{"items":{"type":"string"},"type":"array"},"count":{"description":"All images on the issue (the card shows \"+N\" past three).","type":"integer"},"issue_id":{"type":"string"}},"required":["attachment_ids","count","issue_id"],"type":"object"},"CarryOver":{"properties":{"issue_id":{"type":"string"},"sprint_ids":{"items":{"type":"string"},"type":"array"}},"required":["issue_id","sprint_ids"],"type":"object"},"Change":{"properties":{"action":{"enum":["created","updated","commented","archived","restored","deleted"],"type":"string"},"at":{"type":"string"},"by":{"allOf":[{"$ref":"#/definitions/ChangeActor"}],"x-nullable":true},"changes":{"description":"Old and new values, where the history keeps them (issues, requests).","items":{"$ref":"#/definitions/FieldChange"},"type":"array"},"comment_id":{"description":"The comment or reply (commented).","type":"string","x-nullable":true},"fields":{"description":"What changed (updated): e.g. status, assignees, title, description.","items":{"type":"string"},"type":"array"},"id":{"type":"string"},"key":{"description":"The issue or request key (UPM-142, SUP-7), or the space's key.","type":"string","x-nullable":true},"kind":{"description":"issue, request, doc (a documentation page), artifact, release,\ngroup (a sprint or kanban group), milestone or space.","enum":["issue","request","doc","artifact","release","group","milestone","space"],"type":"string"},"space":{"description":"The key of the space it belongs to; null for workspace-level items.","type":"string","x-nullable":true},"title":{"type":"string"},"via":{"description":"How it was made when not in the app: api, mcp, portal (a customer),\nauto (a timed job), jira or linear (an import).","type":"string","x-nullable":true}},"required":["action","at","changes","fields","id","kind","title"],"type":"object"},"ChangeActor":{"properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"type":"object"},"ChangePage":{"properties":{"changes":{"items":{"$ref":"#/definitions/Change"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"type":"string"}},"required":["changes","has_more","next_cursor"],"type":"object"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string"},"new_password":{"type":"string"}},"required":["current_password","new_password"],"type":"object"},"CodeConnection":{"properties":{"base_url":{"description":"BaseURL is a self-managed GitLab's address; null means gitlab.com (and\nalways for GitHub and Bitbucket).","type":"string","x-nullable":true},"created_at":{"type":"string"},"id":{"type":"string"},"last_delivery_at":{"type":"string","x-nullable":true},"linked_count":{"type":"integer"},"provider":{"enum":["github","gitlab","bitbucket"],"type":"string"},"repo_count":{"type":"integer"},"secret_hint":{"type":"string"},"token_hint":{"type":"string","x-nullable":true}},"required":["created_at","id","linked_count","provider","repo_count","secret_hint"],"type":"object"},"CodeRepo":{"properties":{"connection_id":{"type":"string"},"full_name":{"type":"string"},"id":{"type":"string"},"last_activity_at":{"type":"string","x-nullable":true},"product_space_id":{"type":"string","x-nullable":true},"url":{"type":"string"}},"required":["connection_id","full_name","id","url"],"type":"object"},"ColumnOrderRequest":{"properties":{"column_ids":{"description":"Every column of the board, in the new order.","items":{"type":"string"},"type":"array"}},"required":["column_ids"],"type":"object"},"Comment":{"properties":{"author_id":{"type":"string","x-nullable":true},"author_name":{"type":"string","x-nullable":true},"body":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string"},"via":{"description":"\"api\" or \"mcp\" when written through a client instead of the app.","type":"string","x-nullable":true}},"required":["body","created_at","id"],"type":"object"},"CommentRequest":{"properties":{"body":{"description":"Inline marks; mentions as [[user:Name]].","type":"string"}},"required":["body"],"type":"object"},"CompleteSignupRequest":{"properties":{"accept_terms":{"type":"boolean"},"company_size":{"enum":["1-49","50-249","250-999","1000+"],"type":"string"},"country_code":{"type":"string"},"org_name":{"type":"string"},"subdomain":{"type":"string"}},"required":["company_size","country_code","org_name","subdomain"],"type":"object"},"CompleteSignupResponse":{"properties":{"handoff_token":{"type":"string"},"workspace":{"$ref":"#/definitions/Workspace"},"workspace_url":{"type":"string"}},"required":["handoff_token","workspace","workspace_url"],"type":"object"},"CompleteSprintRequest":{"properties":{"end_date":{"example":"2026-10-16","type":"string"},"note":{"type":"string"},"start_date":{"example":"2026-10-05","type":"string"},"unfinished":{"description":"Where unfinished issues go: the next planned sprint (created if none) or the team queue.","enum":["next","queue"],"type":"string"}},"required":["end_date","start_date","unfinished"],"type":"object"},"ConnectCodeHostRequest":{"properties":{"access_token":{"description":"AccessToken is optional; it lets \"Load repositories\" list them.","type":"string"},"base_url":{"description":"BaseURL is a self-managed GitLab's address (GitLab only; empty = gitlab.com).","example":"https://gitlab.example.com","type":"string"},"provider":{"enum":["github","gitlab","bitbucket"],"type":"string"}},"required":["provider"],"type":"object"},"Connected":{"properties":{"account":{"type":"string"},"items":{"items":{"$ref":"#/definitions/SourceItem"},"type":"array"},"site":{"type":"string"}},"required":["account","items","site"],"type":"object"},"CreateDocPageRequest":{"properties":{"blocks":{"items":{"$ref":"#/definitions/DocBlock"},"type":"array"},"icon":{"type":"string"},"parent_id":{"type":"string"},"section_id":{"type":"string"},"space_id":{"type":"string"},"title":{"example":"On-call","type":"string"}},"required":["section_id"],"type":"object"},"CreateDocSectionRequest":{"properties":{"name":{"example":"Runbooks","type":"string"},"space_id":{"type":"string"}},"required":["name"],"type":"object"},"CreateRequestRequest":{"properties":{"channel":{"enum":["email","portal","web","api"],"type":"string"},"description":{"type":"string"},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"product_space_id":{"type":"string"},"requester_email":{"example":"m.bakker@zenith.io","type":"string"},"subject":{"type":"string"}},"required":["requester_email","subject"],"type":"object"},"CreateRoleRequest":{"properties":{"copy_from":{"description":"Duplicate this role; omitted = a fresh \"New role\".","type":"string"}},"type":"object"},"CreateSchemeRequest":{"properties":{"from_id":{"description":"Copy this scheme (\"Duplicate\"); omit for a new scheme with the lean structure.","type":"string"}},"type":"object"},"CreateSpaceRequest":{"properties":{"description":{"type":"string"},"kind":{"allOf":[{"$ref":"#/definitions/SpaceKind"}],"enum":["product","team","support"]},"name":{"type":"string"},"owner_id":{"description":"Defaults to the caller.","type":"string"},"portfolio_id":{"type":"string"}},"required":["kind","name"],"type":"object"},"CreateTokenRequest":{"properties":{"name":{"example":"Claude Desktop","type":"string"}},"required":["name"],"type":"object"},"CreateTopicRequest":{"properties":{"assignee_ids":{"items":{"type":"string"},"type":"array"},"board_column_id":{"description":"With status progress: which of the team's working statuses (a board\ncolumn). Omit for the team's first one, or to keep the current one.","type":"string","x-nullable":true},"description":{"type":"string"},"due_date":{"example":"2026-10-31","type":"string"},"labels":{"description":"Free-form; matched case-insensitively against the workspace's labels. Omit to keep them.","items":{"type":"string"},"type":"array"},"parent_id":{"type":"string"},"points":{"type":"integer"},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"product_space_id":{"type":"string"},"start_date":{"example":"2026-10-15","type":"string"},"status":{"allOf":[{"$ref":"#/definitions/IssueStatus"}],"enum":["todo","progress","done","cancelled"]},"team_space_id":{"type":"string"},"title":{"type":"string"},"type_id":{"type":"string"}},"required":["title","type_id"],"type":"object"},"Creds":{"properties":{"email":{"description":"Jira and Confluence: the Atlassian account email.","type":"string"},"key":{"description":"Trello: the API key.","type":"string"},"site_url":{"description":"Jira and Confluence: the site, e.g. https://acme.atlassian.net (Cloud)\nor a Data Center address (https only).","type":"string"},"token":{"description":"Atlassian API token, the Trello token or a Linear personal API key.","type":"string"}},"type":"object"},"Customer":{"properties":{"created_at":{"type":"string"},"email":{"type":"string"},"id":{"type":"string"},"name":{"type":"string","x-nullable":true},"organisation":{"type":"string","x-nullable":true}},"required":["created_at","email","id"],"type":"object"},"DeclineJoinRequestBody":{"properties":{"message":{"description":"Included in that email; at most 500 characters.","type":"string"},"notify":{"description":"Email the person that their request was declined.","type":"boolean"}},"type":"object"},"DeleteProfileRequest":{"properties":{"confirm":{"description":"Must be \"DELETE\".","type":"string"},"password":{"description":"Your current password.","type":"string"}},"required":["confirm","password"],"type":"object"},"Deletion":{"properties":{"issues":{"type":"integer"},"people":{"type":"integer"},"purge_at":{"description":"When the data is erased: ScheduledAt plus 30 days.","type":"string","x-nullable":true},"scheduled_at":{"type":"string","x-nullable":true},"spaces":{"type":"integer"},"tickets":{"type":"integer"}},"required":["issues","people","spaces","tickets"],"type":"object"},"DeletionRequest":{"properties":{"confirm_name":{"description":"The organisation name, typed to confirm.","type":"string"}},"required":["confirm_name"],"type":"object"},"Desk":{"properties":{"requests":{"items":{"$ref":"#/definitions/SupportRequest"},"type":"array"},"rules":{"items":{"$ref":"#/definitions/EscalationRule"},"type":"array"},"space":{"$ref":"#/definitions/Space"},"spaces":{"description":"Products linked to the support space (or the product itself), teams, and support spaces.","items":{"$ref":"#/definitions/DeskSpace"},"type":"array"}},"required":["requests","rules","space","spaces"],"type":"object"},"DeskSpace":{"properties":{"color":{"type":"string"},"id":{"type":"string"},"key":{"type":"string"},"kind":{"allOf":[{"$ref":"#/definitions/SpaceKind"}],"enum":["product","team","support"]},"name":{"type":"string"}},"required":["color","id","key","kind","name"],"type":"object"},"DevLink":{"properties":{"author_name":{"type":"string"},"external_id":{"description":"ExternalID is the branch name, the commit SHA or the pull request number.","type":"string"},"id":{"type":"string"},"kind":{"enum":["branch","commit","pull_request"],"type":"string"},"provider":{"enum":["github","gitlab","bitbucket"],"type":"string"},"repo":{"type":"string"},"sha":{"type":"string","x-nullable":true},"state":{"enum":["open","merged","closed","declined"],"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"},"url":{"description":"URL is https or empty.","type":"string"}},"required":["author_name","external_id","id","kind","provider","repo","state","title","updated_at","url"],"type":"object"},"DocBlock":{"properties":{"align":{"enum":["left","center","right"],"type":"string"},"artifact_id":{"description":"Artifact blocks: the artifact shown (a card; only those who can open it see it).","type":"string"},"caption":{"type":"string"},"cols":{"items":{"type":"string"},"type":"array"},"file_id":{"description":"Image blocks: an uploaded image (attachment id on this page) instead of a link.","type":"string"},"header":{"items":{"type":"string"},"type":"array"},"height":{"type":"integer"},"html":{"type":"string"},"id":{"type":"string"},"mode":{"enum":["url","html"],"type":"string"},"rows":{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},"size":{"enum":["small","medium","full"],"type":"string"},"text":{"type":"string"},"type":{"enum":["text","h1","h2","h3","bullet","numbered","todo","quote","callout","code","table","image","embed","divider","cols2","cols3","artifact"],"type":"string"},"url":{"type":"string"}},"required":["id","type"],"type":"object"},"DocHit":{"properties":{"icon":{"type":"string","x-nullable":true},"id":{"type":"string"},"is_draft":{"type":"boolean"},"snippet":{"type":"string"},"space_id":{"type":"string","x-nullable":true},"space_key":{"type":"string","x-nullable":true},"space_name":{"type":"string","x-nullable":true},"title":{"type":"string"}},"required":["id","is_draft","snippet","title"],"type":"object"},"DocPage":{"properties":{"archived_at":{"type":"string","x-nullable":true},"archived_by_name":{"type":"string","x-nullable":true},"blocks":{"items":{"$ref":"#/definitions/DocBlock"},"type":"array"},"content_version":{"description":"Up by one with every content save; send it back as base_version.","type":"integer"},"created_at":{"type":"string"},"icon":{"type":"string","x-nullable":true},"id":{"type":"string"},"is_draft":{"type":"boolean"},"is_overview":{"type":"boolean"},"link_url":{"type":"string","x-nullable":true},"parent_id":{"type":"string","x-nullable":true},"rank":{"type":"string"},"revision_count":{"type":"integer"},"section_id":{"type":"string","x-nullable":true},"snippet":{"description":"First text of the page, for cards and search.","type":"string"},"space_id":{"type":"string","x-nullable":true},"title":{"type":"string"},"updated_at":{"type":"string"},"updated_by_name":{"type":"string","x-nullable":true},"width":{"enum":["medium","full"],"type":"string"}},"required":["blocks","content_version","created_at","id","is_draft","is_overview","rank","revision_count","snippet","title","updated_at","width"],"type":"object"},"DocPageSummary":{"properties":{"archived_at":{"type":"string","x-nullable":true},"archived_by_name":{"type":"string","x-nullable":true},"created_at":{"type":"string"},"icon":{"type":"string","x-nullable":true},"id":{"type":"string"},"is_draft":{"type":"boolean"},"is_overview":{"type":"boolean"},"link_url":{"type":"string","x-nullable":true},"parent_id":{"type":"string","x-nullable":true},"rank":{"type":"string"},"section_id":{"type":"string","x-nullable":true},"snippet":{"description":"First text of the page, for cards and search.","type":"string"},"space_id":{"type":"string","x-nullable":true},"title":{"type":"string"},"updated_at":{"type":"string"},"updated_by_name":{"type":"string","x-nullable":true}},"required":["created_at","id","is_draft","is_overview","rank","snippet","title","updated_at"],"type":"object"},"DocRevision":{"properties":{"author_name":{"type":"string","x-nullable":true},"created_at":{"type":"string"},"number":{"type":"integer"},"summary":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"},"via":{"description":"Where the save came from: api or mcp; null in the app.","enum":["api","mcp"],"type":"string","x-nullable":true}},"required":["created_at","number","summary","title","updated_at"],"type":"object"},"DocSection":{"properties":{"id":{"type":"string"},"in_help_centre":{"description":"Support spaces: its published pages are help centre articles.","type":"boolean"},"name":{"type":"string"},"rank":{"type":"string"},"space_id":{"type":"string","x-nullable":true}},"required":["id","in_help_centre","name","rank"],"type":"object"},"DocThread":{"properties":{"block_id":{"type":"string"},"comments":{"items":{"$ref":"#/definitions/Comment"},"type":"array"},"resolved_at":{"type":"string","x-nullable":true},"resolved_by_name":{"type":"string","x-nullable":true}},"required":["block_id","comments"],"type":"object"},"DomainSettings":{"properties":{"domain":{"allOf":[{"$ref":"#/definitions/PortalDomain"}],"description":"The custom domain, or null when there is none.","x-nullable":true},"target":{"description":"Where the domain's CNAME must point.","type":"string"}},"required":["target"],"type":"object"},"EmailChangeRequest":{"properties":{"email":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"type":"object"},"EmailConfirmRequest":{"properties":{"code":{"type":"string"}},"required":["code"],"type":"object"},"EmailSetting":{"properties":{"enabled":{"type":"boolean"},"key":{"enum":["assign","mention","comment","status","due","sprint","release","release_date","ticket_assign","ticket_reply","ticket_sla","ticket_reopen","share","doc_comment","space","digest","join_requests"],"type":"string"}},"required":["enabled","key"],"type":"object"},"EmailSettings":{"properties":{"enabled":{"description":"Enabled is the master switch: off stops every email but security alerts.","type":"boolean"},"settings":{"description":"Settings lists every setting with its current value, in display order.","items":{"$ref":"#/definitions/EmailSetting"},"type":"array"}},"required":["enabled","settings"],"type":"object"},"EmailSettingsRequest":{"properties":{"enabled":{"description":"Omitted keeps the master switch as it is.","type":"boolean","x-nullable":true},"settings":{"description":"Only the settings listed change.","items":{"$ref":"#/definitions/EmailSetting"},"type":"array"}},"type":"object"},"ErrorBody":{"properties":{"error":{"$ref":"#/definitions/ErrorDetail"}},"required":["error"],"type":"object"},"ErrorDetail":{"properties":{"code":{"description":"Code is a stable reason the frontend translates.","type":"string"},"fields":{"additionalProperties":{"type":"string"},"description":"Fields maps an input field to a reason code (validation errors only).","type":"object"},"message":{"type":"string"}},"required":["code","message"],"type":"object"},"EscalationRule":{"properties":{"after_minutes":{"description":"Minutes an unresolved request stays at this line before moving to the\nnext; null on the last line.","type":"integer","x-nullable":true},"position":{"type":"integer"},"team_space_id":{"type":"string"}},"required":["position","team_space_id"],"type":"object"},"Export":{"properties":{"counts":{"additionalProperties":{"type":"integer"},"type":"object"},"exported_at":{"type":"string"},"issues":{"items":{"additionalProperties":{},"type":"object"},"type":"array"},"releases":{"items":{"additionalProperties":{},"type":"object"},"type":"array"},"spaces":{"items":{"additionalProperties":{},"type":"object"},"type":"array"},"support_requests":{"items":{"additionalProperties":{},"type":"object"},"type":"array"},"users":{"items":{"additionalProperties":{},"type":"object"},"type":"array"},"workspace":{"$ref":"#/definitions/Workspace"}},"required":["counts","exported_at","issues","releases","spaces","support_requests","users","workspace"],"type":"object"},"FeatureFlag":{"properties":{"enabled":{"type":"boolean"},"feature":{"enum":["ai","docs","mcp","portfolios","roadmap","support"],"type":"string"}},"required":["enabled","feature"],"type":"object"},"FieldChange":{"properties":{"field":{"type":"string"},"from":{"type":"string","x-nullable":true},"to":{"type":"string","x-nullable":true}},"required":["field"],"type":"object"},"FileSpaceRequest":{"properties":{"portfolio_id":{"description":"Null takes the space out of its portfolio.","type":"string"}},"type":"object"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string"}},"required":["email"],"type":"object"},"GroupStatus":{"enum":["planned","active","closed"],"type":"string","x-enum-varnames":["GroupPlanned","GroupActive","GroupClosed"]},"HandoffRequest":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"HealthResponse":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"HelpCentreSectionRequest":{"properties":{"on":{"type":"boolean"}},"type":"object"},"HookResult":{"properties":{"linked":{"description":"Linked counts the links added or changed.","type":"integer"},"status":{"description":"Status is ok, pong (a ping), duplicate (seen before) or ignored (an\nevent we don't use).","enum":["ok","pong","duplicate","ignored"],"type":"string"}},"required":["linked","status"],"type":"object"},"HostPortal":{"properties":{"space_key":{"type":"string"}},"required":["space_key"],"type":"object"},"ImportConnectRequest":{"properties":{"credentials":{"$ref":"#/definitions/Creds"},"source":{"enum":["jira","confluence","trello","linear"],"type":"string"}},"required":["source"],"type":"object"},"ImportFieldsRequest":{"properties":{"credentials":{"$ref":"#/definitions/Creds"},"ids":{"description":"The chosen projects or boards (ids from connect).","items":{"type":"string"},"type":"array"},"source":{"enum":["jira","confluence","trello","linear"],"type":"string"},"space_ids":{"description":"The product spaces they go to, for their issue types.","items":{"type":"string"},"type":"array"}},"required":["ids","source"],"type":"object"},"ImportOptions":{"properties":{"attachments":{"type":"boolean"},"comments":{"type":"boolean"},"history":{"description":"The change history: who changed what, and when.","type":"boolean"},"invite":{"description":"Bring the people along: invite those no user matches (by email) as\nviewers, and put everyone assigned in the item's team.","type":"boolean"},"sprints":{"description":"Sprints go to the item's team, which must work in sprints.","type":"boolean"}},"type":"object"},"ImportPreviewRequest":{"properties":{"data":{"description":"The CSV file's text (UTF-8, comma or semicolon separated, header row first).","type":"string"}},"required":["data"],"type":"object"},"InviteInfo":{"properties":{"email":{"type":"string"},"name":{"type":"string"},"workspace":{"type":"string"}},"required":["email","name","workspace"],"type":"object"},"InviteRequest":{"properties":{"email":{"example":"anna@acme.com","type":"string"},"role_id":{"type":"string"}},"required":["email","role_id"],"type":"object"},"InviteResult":{"properties":{"email":{"type":"string"},"outcome":{"description":"invited, or why not: email_invalid, user_exists, user_invited, or\ninvite_limit once the workspace's daily cap is reached.","enum":["invited","email_invalid","user_exists","user_invited","invite_limit"],"type":"string"},"user":{"allOf":[{"$ref":"#/definitions/WorkspaceUser"}],"x-nullable":true}},"required":["email","outcome"],"type":"object"},"InviteTokenRequest":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"Issue":{"properties":{"assignees":{"items":{"$ref":"#/definitions/IssueAssignee"},"type":"array"},"backlog_group_id":{"description":"The team's sprint or kanban group; null = the product backlog or the team queue.","type":"string","x-nullable":true},"backlog_section":{"enum":["backlog","ready"],"type":"string"},"board_column_id":{"description":"The team's working status (a board column) while status is progress;\nnull otherwise.","type":"string","x-nullable":true},"child_count":{"type":"integer"},"created_at":{"type":"string"},"created_by":{"type":"string","x-nullable":true},"description":{"type":"string","x-nullable":true},"due_date":{"example":"2026-10-31","type":"string","x-nullable":true},"id":{"type":"string"},"key":{"type":"string"},"labels":{"description":"Free-form labels in the workspace's spelling.","items":{"type":"string"},"type":"array"},"number":{"type":"integer"},"parent_id":{"type":"string","x-nullable":true},"points":{"type":"integer","x-nullable":true},"priority":{"enum":["low","medium","high","urgent"],"type":"string","x-nullable":true},"product_space_id":{"type":"string","x-nullable":true},"rank":{"type":"string"},"scope":{"allOf":[{"$ref":"#/definitions/LevelScope"}],"enum":["account","product"]},"start_date":{"example":"2026-10-15","type":"string","x-nullable":true},"status":{"allOf":[{"$ref":"#/definitions/IssueStatus"}],"enum":["todo","progress","done","cancelled"]},"status_name":{"description":"That working status's name; null for To do, Done and Closed.","type":"string","x-nullable":true},"team_rank":{"description":"Order within the team's queue and groups; null until a team picks it up.","type":"string","x-nullable":true},"team_space_id":{"type":"string","x-nullable":true},"title":{"type":"string"},"topic_rank":{"description":"Order among sibling topics on the Topics page; null = unranked.","type":"string","x-nullable":true},"type_id":{"type":"string"},"updated_at":{"type":"string"}},"required":["assignees","backlog_section","child_count","created_at","id","key","labels","number","rank","scope","status","title","type_id","updated_at"],"type":"object"},"IssueAssignee":{"properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"type":"object"},"IssueChange":{"properties":{"actor_id":{"type":"string","x-nullable":true},"actor_name":{"type":"string","x-nullable":true},"created_at":{"type":"string"},"field":{"type":"string"},"id":{"type":"string"},"new":{"type":"string","x-nullable":true},"old":{"description":"Null = empty. A description change only says it changed (new = \"\").","type":"string","x-nullable":true},"via":{"description":"\"api\" or \"mcp\" when made through a client, \"jira\" or \"linear\" when imported.","type":"string","x-nullable":true}},"required":["created_at","field","id"],"type":"object"},"IssueComments":{"properties":{"comments":{"items":{"$ref":"#/definitions/Comment"},"type":"array"},"last_seen_at":{"description":"When the caller last opened the thread; null = never.","type":"string","x-nullable":true}},"required":["comments"],"type":"object"},"IssueDevelopment":{"properties":{"connected":{"description":"Connected is true when the workspace has any code-hosting connection.","type":"boolean"},"links":{"items":{"$ref":"#/definitions/DevLink"},"type":"array"}},"required":["connected","links"],"type":"object"},"IssueFieldsRequest":{"properties":{"assignee_ids":{"items":{"type":"string"},"type":"array"},"board_column_id":{"description":"With status progress: which of the team's working statuses (a board\ncolumn). Omit for the team's first one, or to keep the current one.","type":"string","x-nullable":true},"description":{"type":"string"},"due_date":{"example":"2026-10-31","type":"string"},"labels":{"description":"Free-form; matched case-insensitively against the workspace's labels. Omit to keep them.","items":{"type":"string"},"type":"array"},"parent_id":{"type":"string"},"points":{"type":"integer"},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"start_date":{"example":"2026-10-15","type":"string"},"status":{"allOf":[{"$ref":"#/definitions/IssueStatus"}],"enum":["todo","progress","done","cancelled"]},"team_space_id":{"type":"string"},"title":{"type":"string"},"type_id":{"type":"string"}},"required":["title","type_id"],"type":"object"},"IssueHit":{"properties":{"id":{"type":"string"},"key":{"type":"string"},"product_color":{"type":"string","x-nullable":true},"product_name":{"type":"string","x-nullable":true},"product_space_id":{"type":"string","x-nullable":true},"scope":{"allOf":[{"$ref":"#/definitions/LevelScope"}],"enum":["account","product"]},"status":{"allOf":[{"$ref":"#/definitions/IssueStatus"}],"enum":["todo","progress","done","cancelled"]},"team_name":{"type":"string","x-nullable":true},"title":{"type":"string"},"type_color":{"type":"string"},"type_icon":{"type":"string"},"type_name":{"type":"string"}},"required":["id","key","scope","status","title","type_color","type_icon","type_name"],"type":"object"},"IssueLink":{"properties":{"from_id":{"type":"string"},"kind":{"allOf":[{"$ref":"#/definitions/LinkKind"}],"enum":["blocks","relates","duplicates"]},"to_id":{"type":"string"}},"required":["from_id","kind","to_id"],"type":"object"},"IssueReleaseRequest":{"properties":{"release_id":{"description":"An unreleased release of the issue's product; null = no release.","type":"string"}},"type":"object"},"IssueSaveRequest":{"properties":{"assignee_ids":{"items":{"type":"string"},"type":"array"},"base":{"allOf":[{"$ref":"#/definitions/IssueFieldsRequest"}],"x-nullable":true},"board_column_id":{"description":"With status progress: which of the team's working statuses (a board\ncolumn). Omit for the team's first one, or to keep the current one.","type":"string","x-nullable":true},"description":{"type":"string"},"due_date":{"example":"2026-10-31","type":"string"},"labels":{"description":"Free-form; matched case-insensitively against the workspace's labels. Omit to keep them.","items":{"type":"string"},"type":"array"},"parent_id":{"type":"string"},"points":{"type":"integer"},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"start_date":{"example":"2026-10-15","type":"string"},"status":{"allOf":[{"$ref":"#/definitions/IssueStatus"}],"enum":["todo","progress","done","cancelled"]},"team_space_id":{"type":"string"},"title":{"type":"string"},"type_id":{"type":"string"}},"required":["title","type_id"],"type":"object"},"IssueScheme":{"properties":{"description":{"type":"string","x-nullable":true},"id":{"type":"string"},"levels":{"items":{"$ref":"#/definitions/SchemeLevel"},"type":"array"},"name":{"type":"string"},"used_by":{"items":{"$ref":"#/definitions/SchemeSpace"},"type":"array"}},"required":["id","levels","name","used_by"],"type":"object"},"IssueStatus":{"enum":["todo","progress","done","cancelled"],"type":"string","x-enum-varnames":["StatusTodo","StatusProgress","StatusDone","StatusCancelled"]},"IssueStatusRequest":{"properties":{"board_column_id":{"description":"With progress: which of the team's working statuses (a board column).\nOmit for its first one.","type":"string","x-nullable":true},"status":{"allOf":[{"$ref":"#/definitions/IssueStatus"}],"enum":["todo","progress","done","cancelled"]}},"required":["status"],"type":"object"},"IssueType":{"properties":{"color":{"type":"string"},"icon":{"type":"string"},"id":{"type":"string"},"issue_count":{"description":"IssueCount is how many issues have this type (read-only; ignored on save).","type":"integer"},"name":{"type":"string"},"parent_ids":{"items":{"type":"string"},"type":"array"}},"required":["color","icon","id","issue_count","name","parent_ids"],"type":"object"},"Job":{"properties":{"created":{"type":"integer"},"created_at":{"type":"string"},"errors":{"items":{"$ref":"#/definitions/RowError"},"type":"array"},"existing":{"description":"Items an earlier run already imported (left alone, not in Skipped).","type":"integer"},"extras":{"allOf":[{"$ref":"#/definitions/JobExtras"}],"description":"Comments, files and sprints brought over too (Jira)."},"file_name":{"description":"The CSV file, or the site imported from (acme.atlassian.net, trello.com).","type":"string"},"finished_at":{"type":"string","x-nullable":true},"id":{"type":"string"},"items":{"description":"What an API import brings over, and where (empty for CSV).","items":{"$ref":"#/definitions/JobItem"},"type":"array"},"message":{"description":"Why the job failed, as an error code.","type":"string","x-nullable":true},"phase":{"description":"While running: reading the source, then creating items.","enum":["fetching","importing"],"type":"string","x-nullable":true},"skipped":{"type":"integer"},"source":{"enum":["csv","jira","confluence","trello","linear"],"type":"string"},"space_id":{"description":"The (first) target space; null for workspace documentation.","type":"string","x-nullable":true},"space_name":{"type":"string","x-nullable":true},"started_by":{"type":"string","x-nullable":true},"status":{"enum":["queued","running","done","failed","cancelled"],"type":"string"},"total":{"type":"integer"}},"required":["created","created_at","errors","existing","extras","file_name","id","items","skipped","source","status","total"],"type":"object"},"JobExtras":{"properties":{"changes":{"description":"History lines (changed fields).","type":"integer"},"comments":{"type":"integer"},"files":{"type":"integer"},"invited":{"description":"People invited as viewers because no user matched them.","type":"integer"},"members":{"description":"People added to the teams, because they had work assigned there.","type":"integer"},"sprints":{"type":"integer"}},"required":["changes","comments","files","invited","members","sprints"],"type":"object"},"JobItem":{"properties":{"key":{"type":"string"},"name":{"type":"string"},"space_id":{"description":"Target space; null = workspace documentation (Confluence).","type":"string","x-nullable":true},"space_name":{"type":"string","x-nullable":true},"team_id":{"description":"The team the issues go to.","type":"string","x-nullable":true},"team_name":{"type":"string","x-nullable":true}},"required":["key","name"],"type":"object"},"JoinDomain":{"properties":{"added_by":{"description":"Who added it; null once they are gone.","type":"string","x-nullable":true},"created_at":{"type":"string"},"domain":{"example":"acme.com","type":"string"}},"required":["created_at","domain"],"type":"object"},"JoinDomainRequest":{"properties":{"domain":{"example":"acme.com","type":"string"}},"required":["domain"],"type":"object"},"JoinOption":{"properties":{"members":{"type":"integer"},"name":{"type":"string"},"requested":{"description":"Requested: this address already asked (the request is waiting).","type":"boolean"},"workspace_id":{"type":"string"}},"required":["members","name","requested","workspace_id"],"type":"object"},"JoinRequest":{"properties":{"created_at":{"type":"string"},"email":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string"},"message":{"description":"The requester's note to the reviewers, if any.","type":"string","x-nullable":true},"name":{"type":"string"},"workspace_id":{"type":"string"}},"required":["created_at","email","expires_at","id","name","workspace_id"],"type":"object"},"JoinRequestBody":{"properties":{"message":{"description":"An optional note for the reviewers, at most 300 characters.","type":"string"},"workspace_id":{"type":"string"}},"required":["workspace_id"],"type":"object"},"JoinSettings":{"properties":{"any_domain":{"description":"The caller may add any domain (the Owner); everyone else only the\ndomain of their own email, MyDomain.","type":"boolean"},"domains":{"items":{"$ref":"#/definitions/JoinDomain"},"type":"array"},"enabled":{"type":"boolean"},"max_domains":{"description":"At most this many domains.","type":"integer"},"my_domain":{"type":"string"}},"required":["any_domain","domains","enabled","max_domains","my_domain"],"type":"object"},"JoinSwitchRequest":{"properties":{"enabled":{"type":"boolean"}},"type":"object"},"KanbanGroupRequest":{"properties":{"name":{"description":"Optional; \"Group N\" when empty.","type":"string"}},"type":"object"},"Label":{"properties":{"color":{"enum":["gray","red","orange","amber","green","teal","blue","indigo","violet","pink"],"type":"string"},"id":{"type":"string"},"issue_count":{"description":"How many issues carry it; only when asked for (counts=true).","type":"integer","x-nullable":true},"name":{"type":"string"}},"required":["color","id","name"],"type":"object"},"LabelRequest":{"properties":{"color":{"description":"One of gray, red, orange, amber, green, teal, blue, indigo, violet,\npink; empty picks one from the name.","enum":["gray","red","orange","amber","green","teal","blue","indigo","violet","pink"],"example":"teal","type":"string"},"name":{"example":"Customer request","type":"string"}},"required":["name"],"type":"object"},"Level":{"enum":["none","view","edit"],"type":"string","x-enum-varnames":["LevelNone","LevelView","LevelEdit"]},"LevelScope":{"enum":["account","product"],"type":"string","x-enum-varnames":["ScopeAccount","ScopeProduct"]},"LinkCodeRepoRequest":{"properties":{"product_space_id":{"type":"string","x-nullable":true}},"type":"object"},"LinkIssueRequest":{"properties":{"kind":{"description":"blocks: this issue blocks to_id; blocked_by: to_id blocks this issue;\nduplicates: this issue duplicates to_id; duplicated_by: to_id duplicates this issue.","enum":["blocks","blocked_by","relates","duplicates","duplicated_by"],"type":"string"},"to_id":{"type":"string"}},"required":["kind","to_id"],"type":"object"},"LinkKind":{"enum":["blocks","relates","duplicates"],"type":"string","x-enum-varnames":["LinkBlocks","LinkRelates","LinkDuplicates"]},"LinkedIssue":{"properties":{"issue":{"$ref":"#/definitions/Issue"},"kind":{"allOf":[{"$ref":"#/definitions/LinkKind"}],"enum":["blocks","relates","duplicates"]},"outgoing":{"type":"boolean"}},"required":["issue","kind","outgoing"],"type":"object"},"LiveHint":{"properties":{"ids":{"description":"The issues, requests, pages, groups or milestones it concerns; empty\nwhen the hint is about a whole list.","items":{"type":"string"},"type":"array"},"kind":{"enum":["ready","resync","expired","notification","issue","group","request","doc","release","roadmap","space","workspace","access","labels"],"type":"string"},"space_id":{"description":"The space it happened in, when there is one.","type":"string","x-nullable":true}},"required":["ids","kind"],"type":"object"},"LoginRequest":{"properties":{"email":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"type":"object"},"MFAChallengeResponse":{"properties":{"expires_at":{"type":"string"},"methods":{"items":{"enum":["totp","passkey"],"type":"string"},"type":"array"},"mfa_token":{"type":"string"},"purpose":{"description":"verify: prove a second step; setup: the workspace requires one, add it now.","enum":["verify","setup"],"type":"string"}},"required":["expires_at","methods","mfa_token","purpose"],"type":"object"},"MFACodeRequest":{"properties":{"code":{"description":"A 6-digit authenticator code or a recovery code.","type":"string"},"token":{"type":"string"}},"required":["code","token"],"type":"object"},"MFAMember":{"properties":{"enabled":{"type":"boolean"},"name":{"type":"string"},"reminded_at":{"description":"When the last reminder to set it up was emailed.","type":"string","x-nullable":true},"required":{"type":"boolean"},"role_name":{"type":"string"},"user_id":{"type":"string"}},"required":["enabled","name","required","role_name","user_id"],"type":"object"},"MFAPasskeyOptionsRequest":{"properties":{"purpose":{"enum":["verify","setup"],"type":"string"},"token":{"type":"string"}},"required":["purpose","token"],"type":"object"},"MFAPasskeyRequest":{"properties":{"credential":{"description":"The PublicKeyCredential as JSON (binary fields base64url).","type":"object"},"name":{"description":"Setting up: what to call the passkey.","type":"string"},"token":{"type":"string"}},"required":["credential","token"],"type":"object"},"MFAPolicy":{"properties":{"grace_days":{"description":"Days people without it can still sign in once it is required: 0, 7, 14 or 30.","type":"integer"},"methods":{"items":{"enum":["totp","passkey"],"type":"string"},"type":"array"},"policy":{"description":"optional: people choose; admins: the Owner and Admin roles must use it; all: everyone.","enum":["optional","admins","all"],"type":"string"},"required_since":{"description":"When it became required (null while optional); grace counts from here.","type":"string","x-nullable":true}},"required":["grace_days","methods","policy"],"type":"object"},"MFASecurity":{"properties":{"members":{"items":{"$ref":"#/definitions/MFAMember"},"type":"array"},"policy":{"$ref":"#/definitions/MFAPolicy"}},"required":["members","policy"],"type":"object"},"MFAStatus":{"properties":{"methods":{"description":"Methods the workspace allows.","items":{"enum":["totp","passkey"],"type":"string"},"type":"array"},"passkeys":{"items":{"$ref":"#/definitions/Passkey"},"type":"array"},"recovery_left":{"description":"Unused recovery codes left.","type":"integer"},"required":{"description":"The workspace requires it of this person.","type":"boolean"},"setup_by":{"description":"Required but not set up: the last day they can still sign in without it.","type":"string","x-nullable":true},"totp":{"type":"boolean"}},"required":["methods","passkeys","recovery_left","required","totp"],"type":"object"},"MFATokenRequest":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"MapOptions":{"properties":{"statuses":{"items":{"$ref":"#/definitions/SourceStatus"},"type":"array"},"target_types":{"items":{"$ref":"#/definitions/TargetType"},"type":"array"},"types":{"items":{"$ref":"#/definitions/SourceType"},"type":"array"}},"required":["statuses","target_types","types"],"type":"object"},"Mapping":{"properties":{"description":{"type":"integer"},"points":{"type":"integer"},"priority":{"type":"integer"},"status":{"type":"integer"},"title":{"type":"integer"},"type":{"type":"integer"}},"type":"object"},"Me":{"properties":{"permissions":{"additionalProperties":{"$ref":"#/definitions/Level"},"type":"object"},"role":{"$ref":"#/definitions/Role"},"show_welcome":{"description":"Show the first-login welcome (\"How do you want to start?\"): only to\nthe person who created the workspace through sign-up, until they close\nit once (POST /me/welcome).","type":"boolean"},"user":{"$ref":"#/definitions/User"},"workspace":{"$ref":"#/definitions/Workspace"}},"required":["permissions","role","show_welcome","user","workspace"],"type":"object"},"Milestone":{"properties":{"color":{"type":"string","x-nullable":true},"date":{"example":"2026-12-01","type":"string"},"id":{"type":"string"},"name":{"type":"string"},"space_id":{"type":"string","x-nullable":true}},"required":["date","id","name"],"type":"object"},"MilestoneRequest":{"properties":{"color":{"example":"#c0394b","type":"string"},"date":{"example":"2026-11-16","type":"string"},"name":{"example":"Beta launch","type":"string"},"space_id":{"description":"Only read on create; null = the workspace roadmap.","type":"string"}},"required":["date","name"],"type":"object"},"MoveAfterRequest":{"properties":{"after_id":{"description":"The item this one lands after; null = first.","type":"string"}},"type":"object"},"MoveDocPageRequest":{"properties":{"after_id":{"type":"string"},"parent_id":{"type":"string"},"section_id":{"type":"string"}},"required":["section_id"],"type":"object"},"MoveIssueRequest":{"properties":{"after_id":{"description":"Place directly after this issue (its section wins).","type":"string"},"bottom":{"description":"Without after_id: top of the section, or the bottom when true.","type":"boolean"},"section":{"enum":["backlog","ready"],"type":"string"}},"type":"object"},"MoveRequestRequest":{"properties":{"after_id":{"description":"Place after this request; omitted = the top.","type":"string"}},"type":"object"},"MyAI":{"properties":{"allow_personal_keys":{"type":"boolean"},"available":{"type":"boolean"},"daily_limit":{"type":"integer"},"personal_key_hint":{"type":"string","x-nullable":true},"personal_provider":{"enum":["claude","gemini","openai","cursor"],"type":"string","x-nullable":true},"used_today":{"type":"integer"},"workspace_provider":{"enum":["claude","gemini","openai"],"type":"string","x-nullable":true}},"required":["allow_personal_keys","available","daily_limit","used_today"],"type":"object"},"NestIssueRequest":{"properties":{"parent_id":{"type":"string"}},"required":["parent_id"],"type":"object"},"NewCodeConnection":{"properties":{"base_url":{"description":"BaseURL is a self-managed GitLab's address; null means gitlab.com (and\nalways for GitHub and Bitbucket).","type":"string","x-nullable":true},"created_at":{"type":"string"},"id":{"type":"string"},"last_delivery_at":{"type":"string","x-nullable":true},"linked_count":{"type":"integer"},"provider":{"enum":["github","gitlab","bitbucket"],"type":"string"},"repo_count":{"type":"integer"},"secret_hint":{"type":"string"},"token_hint":{"type":"string","x-nullable":true},"webhook_secret":{"type":"string"}},"required":["created_at","id","linked_count","provider","repo_count","secret_hint","webhook_secret"],"type":"object"},"NewPersonalToken":{"properties":{"created_at":{"type":"string"},"id":{"type":"string"},"kind":{"enum":["mcp","api"],"type":"string"},"last_used_at":{"type":"string","x-nullable":true},"name":{"type":"string"},"revoked_at":{"type":"string","x-nullable":true},"tail":{"type":"string"},"token":{"type":"string"},"user_id":{"type":"string"},"user_name":{"type":"string"}},"required":["created_at","id","kind","name","tail","token","user_id","user_name"],"type":"object"},"Notification":{"properties":{"actor_id":{"description":"Who did it; null when they were removed.","type":"string","x-nullable":true},"actor_name":{"type":"string","x-nullable":true},"created_at":{"type":"string"},"id":{"type":"string"},"issue_id":{"type":"string","x-nullable":true},"issue_key":{"type":"string","x-nullable":true},"issue_title":{"type":"string","x-nullable":true},"join_request_email":{"type":"string","x-nullable":true},"join_request_id":{"description":"A join request to review: who asked, with which address.","type":"string","x-nullable":true},"join_request_name":{"type":"string","x-nullable":true},"kind":{"enum":["mention","comment","assign","sprint","escalation","due","share","sla_soon","sla_breach","join_request"],"type":"string"},"page_id":{"type":"string","x-nullable":true},"page_title":{"type":"string","x-nullable":true},"read_at":{"type":"string","x-nullable":true},"request_id":{"type":"string","x-nullable":true},"request_key":{"type":"string","x-nullable":true},"request_subject":{"type":"string","x-nullable":true},"space_color":{"type":"string","x-nullable":true},"space_id":{"type":"string","x-nullable":true},"space_key":{"type":"string","x-nullable":true},"space_kind":{"allOf":[{"$ref":"#/definitions/SpaceKind"}],"enum":["product","team","support"],"x-nullable":true},"space_name":{"type":"string","x-nullable":true},"sprint_id":{"type":"string","x-nullable":true},"sprint_name":{"type":"string","x-nullable":true}},"required":["created_at","id","kind"],"type":"object"},"Notifications":{"properties":{"items":{"items":{"$ref":"#/definitions/Notification"},"type":"array"},"unread":{"type":"integer"}},"required":["items","unread"],"type":"object"},"OAuthAuthorizeRequest":{"properties":{"client_id":{"type":"string"},"code_challenge":{"type":"string"},"code_challenge_method":{"example":"S256","type":"string"},"redirect_uri":{"type":"string"},"resource":{"example":"https://backlog.pm/mcp","type":"string"},"response_type":{"example":"code","type":"string"},"scope":{"example":"mcp","type":"string"},"state":{"type":"string"}},"type":"object"},"OAuthClientResponse":{"properties":{"client_id":{"type":"string"},"client_id_issued_at":{"type":"integer"},"client_name":{"type":"string"},"grant_types":{"items":{"type":"string"},"type":"array"},"redirect_uris":{"items":{"type":"string"},"type":"array"},"response_types":{"items":{"type":"string"},"type":"array"},"token_endpoint_auth_method":{"type":"string"}},"required":["client_id","client_id_issued_at","client_name","grant_types","redirect_uris","response_types","token_endpoint_auth_method"],"type":"object"},"OAuthConsentResponse":{"properties":{"client_name":{"type":"string"},"expires_at":{"type":"string"},"redirect_host":{"type":"string"}},"required":["client_name","expires_at","redirect_host"],"type":"object"},"OAuthErrorBody":{"properties":{"error":{"example":"invalid_grant","type":"string"},"error_description":{"type":"string"}},"required":["error","error_description"],"type":"object"},"OAuthPendingResponse":{"properties":{"client_name":{"type":"string"},"expires_at":{"type":"string"},"id":{"type":"string"},"redirect_host":{"type":"string"},"workspace_url":{"description":"The client asked for this workspace's own MCP address: approve there.","type":"string","x-nullable":true}},"required":["client_name","expires_at","id","redirect_host"],"type":"object"},"OAuthRedirectResponse":{"properties":{"redirect":{"type":"string"}},"required":["redirect"],"type":"object"},"OAuthRegisterRequest":{"properties":{"client_name":{"example":"Claude Code","type":"string"},"grant_types":{"example":["authorization_code","refresh_token"],"items":{"type":"string"},"type":"array"},"redirect_uris":{"example":["http://localhost:33418/callback"],"items":{"type":"string"},"type":"array"},"response_types":{"example":["code"],"items":{"type":"string"},"type":"array"},"token_endpoint_auth_method":{"example":"none","type":"string"}},"type":"object"},"OAuthRevokeResponse":{"properties":{"done":{"description":"Always true: the answer doesn't say whether the token was known (RFC 7009 §2.2).","type":"boolean"}},"required":["done"],"type":"object"},"OAuthTokenResponse":{"properties":{"access_token":{"type":"string"},"expires_in":{"example":3600,"type":"integer"},"refresh_token":{"type":"string"},"scope":{"example":"mcp","type":"string"},"token_type":{"example":"Bearer","type":"string"}},"required":["access_token","expires_in","refresh_token","scope","token_type"],"type":"object"},"Organisation":{"properties":{"former_keys":{"items":{"type":"string"},"type":"array"},"workspace":{"$ref":"#/definitions/Workspace"}},"required":["former_keys","workspace"],"type":"object"},"OrganisationRequest":{"properties":{"billing_address":{"type":"string"},"company_size":{"enum":["1-49","50-249","250-999","1000+"],"type":"string"},"country":{"example":"NL","type":"string"},"name":{"type":"string"},"org_key":{"example":"ACME","type":"string"},"vat_number":{"type":"string"},"website":{"type":"string"}},"required":["name","org_key"],"type":"object"},"ParentRef":{"properties":{"id":{"type":"string"},"key":{"type":"string"},"title":{"type":"string"},"type_id":{"type":"string"}},"required":["id","key","title","type_id"],"type":"object"},"Passkey":{"properties":{"created_at":{"type":"string"},"id":{"type":"string"},"last_used_at":{"type":"string","x-nullable":true},"name":{"type":"string"}},"required":["created_at","id","name"],"type":"object"},"PasskeyAddedResponse":{"properties":{"passkey":{"$ref":"#/definitions/Passkey"},"recovery_codes":{"items":{"type":"string"},"type":"array","x-nullable":true}},"required":["passkey"],"type":"object"},"PasskeyOptionsResponse":{"properties":{"options":{"type":"object"},"token":{"type":"string"}},"required":["options"],"type":"object"},"PasswordRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"PersonalToken":{"properties":{"created_at":{"type":"string"},"id":{"type":"string"},"kind":{"enum":["mcp","api"],"type":"string"},"last_used_at":{"type":"string","x-nullable":true},"name":{"type":"string"},"revoked_at":{"type":"string","x-nullable":true},"tail":{"type":"string"},"user_id":{"type":"string"},"user_name":{"type":"string"}},"required":["created_at","id","kind","name","tail","user_id","user_name"],"type":"object"},"PlaceIssueRequest":{"properties":{"after_id":{"type":"string"},"backlog_group_id":{"description":"Target sprint or kanban group; omit for the team queue (then team_space_id is required).","type":"string"},"bottom":{"type":"boolean"},"team_space_id":{"type":"string"}},"type":"object"},"PlacePortfolioRequest":{"properties":{"order":{"items":{"type":"string"},"type":"array"},"parent_id":{"type":"string"}},"required":["order"],"type":"object"},"PlaceTopicRequest":{"properties":{"order":{"description":"Every sibling under that parent after the move, the topic included, in order.","items":{"type":"string"},"type":"array"},"parent_id":{"description":"The new parent; null = top level.","type":"string"}},"required":["order"],"type":"object"},"PlanSprintRequest":{"properties":{"end_date":{"example":"2026-10-16","type":"string"},"name":{"description":"Optional; \"Sprint N+1\" when empty.","type":"string"},"start_date":{"description":"Optional, with end_date; three days after the latest sprint when empty.","example":"2026-10-05","type":"string"}},"type":"object"},"PortalArticle":{"properties":{"featured":{"type":"boolean"},"icon":{"type":"string","x-nullable":true},"id":{"type":"string"},"section":{"type":"string"},"snippet":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"}},"required":["featured","id","section","snippet","title","updated_at"],"type":"object"},"PortalArticleDetail":{"properties":{"blocks":{"items":{"$ref":"#/definitions/DocBlock"},"type":"array"},"featured":{"type":"boolean"},"icon":{"type":"string","x-nullable":true},"id":{"type":"string"},"section":{"type":"string"},"snippet":{"type":"string"},"title":{"type":"string"},"updated_at":{"type":"string"}},"required":["blocks","featured","id","section","snippet","title","updated_at"],"type":"object"},"PortalBranding":{"properties":{"align":{"description":"Where the header's title, welcome and search sit.","enum":["left","center"],"type":"string"},"articles":{"description":"Featured help centre articles (\"Popular articles\"), in order.","items":{"type":"string"},"type":"array"},"brand_color":{"type":"string"},"button_style":{"enum":["soft","solid","outline"],"type":"string"},"gradient_angle":{"description":"Degrees, 0–360.","type":"integer"},"gradient_color":{"type":"string"},"header_height":{"enum":["compact","regular","tall"],"type":"string"},"header_mode":{"description":"Header background: the brand colour, a gradient from it to\nGradientColor, or the uploaded header image (the colour until there is one).","enum":["solid","gradient","image"],"type":"string"},"overlay":{"description":"How much the header image is darkened, 0–80 (%).","type":"integer"},"page_bg":{"description":"Hex colour behind the page content.","type":"string"},"radius":{"type":"integer"},"request_types":{"items":{"$ref":"#/definitions/PortalRequestType"},"type":"array"},"show_search":{"type":"boolean"},"title":{"type":"string"},"welcome":{"type":"string"}},"required":["align","articles","brand_color","button_style","gradient_angle","gradient_color","header_height","header_mode","overlay","page_bg","radius","request_types","show_search","title","welcome"],"type":"object"},"PortalCustomerRequest":{"properties":{"email":{"type":"string"}},"required":["email"],"type":"object"},"PortalDefaultSenderRequest":{"properties":{"sender_id":{"description":"\"builtin\" or a verified sender's id.","type":"string"}},"required":["sender_id"],"type":"object"},"PortalDomain":{"properties":{"checked_at":{"type":"string","x-nullable":true},"created_at":{"type":"string"},"domain":{"description":"ASCII (IDNA) host name, lowercase, e.g. support.example.com.","type":"string"},"reason":{"description":"Why the last check failed, or null.","enum":["txt_missing","txt_mismatch","cname_missing","cname_mismatch","dns_unavailable","domain_taken"],"type":"string","x-nullable":true},"status":{"enum":["pending","verified","failed"],"type":"string"},"token":{"description":"TXT record value.","type":"string"},"txt_name":{"description":"TXT record name proving ownership: _backlog-challenge.\u003cdomain\u003e.","type":"string"},"verified_at":{"type":"string","x-nullable":true}},"required":["created_at","domain","status","token","txt_name"],"type":"object"},"PortalDomainRequest":{"properties":{"domain":{"description":"Host name, e.g. support.example.com (a scheme, port or path is dropped).","type":"string"}},"required":["domain"],"type":"object"},"PortalEmailBranding":{"properties":{"brand_color":{"type":"string"},"brand_text_color":{"type":"string"},"logo_id":{"description":"The public logo's id (served at /portal/{key}/images/logo), or null.","type":"string","x-nullable":true},"radius":{"type":"integer"},"title":{"type":"string"}},"required":["brand_color","brand_text_color","radius","title"],"type":"object"},"PortalEmailSettings":{"properties":{"branding":{"$ref":"#/definitions/PortalEmailBranding"},"default_sender_id":{"description":"\"builtin\" or the default custom sender's id.","type":"string"},"senders":{"description":"The built-in sender first, then the custom ones, oldest first.","items":{"$ref":"#/definitions/PortalSender"},"type":"array"},"tem":{"description":"Whether verified domains are registered with Scaleway TEM.","type":"boolean"},"templates":{"items":{"$ref":"#/definitions/PortalEmailTemplate"},"type":"array"}},"required":["branding","default_sender_id","senders","tem","templates"],"type":"object"},"PortalEmailTemplate":{"properties":{"customised":{"type":"boolean"},"default_html":{"type":"string"},"default_subject":{"description":"The default design in the asked language, placeholders unfilled.","type":"string"},"from_name":{"description":"Null fields use their default.","type":"string","x-nullable":true},"html":{"type":"string","x-nullable":true},"kind":{"enum":["received","reply","resolved","register"],"type":"string"},"placeholders":{"description":"The placeholder names the email fills in; Required ones a version must keep.","items":{"type":"string"},"type":"array"},"required":{"items":{"type":"string"},"type":"array"},"sender_id":{"description":"\"builtin\", a sender's id, or null for the default sender.","type":"string","x-nullable":true},"subject":{"type":"string","x-nullable":true},"updated_at":{"type":"string","x-nullable":true}},"required":["customised","default_html","default_subject","kind","placeholders","required"],"type":"object"},"PortalEmailTemplateRequest":{"properties":{"from_name":{"description":"Null or empty fields use their default.","type":"string","x-nullable":true},"html":{"description":"The whole email; scripts and event handlers are removed. At most 256 KB.","type":"string","x-nullable":true},"sender_id":{"description":"\"builtin\", a verified sender's id, or null for the default sender.","type":"string","x-nullable":true},"subject":{"description":"May use the key and subject placeholders.","type":"string","x-nullable":true}},"type":"object"},"PortalFeaturedPage":{"properties":{"icon":{"type":"string","x-nullable":true},"id":{"type":"string"},"section":{"type":"string"},"space_id":{"description":"The page's docs scope: a space, or null for workspace documentation.","type":"string","x-nullable":true},"title":{"type":"string"}},"required":["id","section","title"],"type":"object"},"PortalLoginRequest":{"properties":{"email":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"type":"object"},"PortalMessage":{"properties":{"body":{"type":"string"},"created_at":{"type":"string"},"from":{"description":"\"agent\" (a reply from support) or \"customer\".","enum":["agent","customer"],"type":"string"},"name":{"type":"string"}},"required":["body","created_at","from","name"],"type":"object"},"PortalPending":{"properties":{"id":{"type":"string"}},"required":["id"],"type":"object"},"PortalPublic":{"properties":{"access":{"enum":["public","signup","invite"],"type":"string"},"align":{"description":"Where the header's title, welcome and search sit.","enum":["left","center"],"type":"string"},"brand_color":{"description":"Hex colour for buttons and the header.","type":"string"},"button_style":{"enum":["soft","solid","outline"],"type":"string"},"customer":{"allOf":[{"$ref":"#/definitions/Customer"}],"description":"Signed-in customer, or null.","x-nullable":true},"gradient_angle":{"description":"Degrees, 0–360.","type":"integer"},"gradient_color":{"type":"string"},"header_height":{"enum":["compact","regular","tall"],"type":"string"},"header_image_id":{"type":"string","x-nullable":true},"header_mode":{"description":"Header background: the brand colour, a gradient from it to\nGradientColor, or the uploaded header image (the colour until there is one).","enum":["solid","gradient","image"],"type":"string"},"logo_id":{"description":"The logo and header image, served at /portal/{key}/images/{logo|header};\nthe id changes with every upload. Null when there is none.","type":"string","x-nullable":true},"overlay":{"description":"How much the header image is darkened, 0–80 (%).","type":"integer"},"page_bg":{"description":"Hex colour behind the page content.","type":"string"},"radius":{"type":"integer"},"request_types":{"items":{"$ref":"#/definitions/PortalRequestType"},"type":"array"},"show_search":{"type":"boolean"},"space_key":{"type":"string"},"title":{"type":"string"},"welcome":{"type":"string"}},"required":["access","align","brand_color","button_style","gradient_angle","gradient_color","header_height","header_mode","overlay","page_bg","radius","request_types","show_search","space_key","title","welcome"],"type":"object"},"PortalRegisterRequest":{"properties":{"email":{"type":"string"},"name":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"type":"object"},"PortalReplyRequest":{"properties":{"body":{"type":"string"}},"required":["body"],"type":"object"},"PortalRequest":{"properties":{"access":{"enum":["public","signup","invite"],"type":"string"},"allowed_domains":{"items":{"type":"string"},"type":"array"},"branding":{"$ref":"#/definitions/PortalBranding"},"sharing":{"enum":["none","organisation","anyone"],"type":"string"}},"required":["access","branding","sharing"],"type":"object"},"PortalRequestType":{"properties":{"description":{"type":"string"},"name":{"type":"string"}},"required":["description","name"],"type":"object"},"PortalSender":{"properties":{"builtin":{"type":"boolean"},"checked_at":{"type":"string","x-nullable":true},"email":{"type":"string"},"id":{"description":"\"builtin\" for the built-in sender, else the sender's id.","type":"string"},"is_default":{"type":"boolean"},"name":{"type":"string"},"records":{"description":"The records to add (none for the built-in sender).","items":{"$ref":"#/definitions/PortalSenderRecord"},"type":"array"},"status":{"description":"pending: waiting for DNS (or TEM); failed: a check found records\nmissing; verified: mail may come from it.","enum":["pending","failed","verified"],"type":"string"},"tem_registered":{"description":"Whether Scaleway TEM verified the domain (always false without TEM).","type":"boolean"},"verified_at":{"type":"string","x-nullable":true}},"required":["builtin","email","id","is_default","name","records","status","tem_registered"],"type":"object"},"PortalSenderRecord":{"properties":{"found":{"description":"What the last check found; null before the first check.","type":"boolean","x-nullable":true},"host":{"type":"string"},"kind":{"enum":["spf","dkim","dmarc","ownership"],"type":"string"},"type":{"enum":["TXT"],"type":"string"},"value":{"description":"What to put in the record.","type":"string"}},"required":["host","kind","type","value"],"type":"object"},"PortalSenderRequest":{"properties":{"email":{"type":"string"},"name":{"description":"Shown as the sender; the help centre's title when empty.","type":"string"}},"required":["email"],"type":"object"},"PortalShareRequest":{"properties":{"add":{"description":"A customer's email to share with (portals that allow sharing with anyone).","type":"string"},"org":{"description":"Share with your organisation (same email domain), or stop.","type":"boolean"},"remove":{"description":"An email to stop sharing with.","type":"string"}},"type":"object"},"PortalSharing":{"properties":{"can_share_org":{"description":"What the portal allows this viewer to change.","type":"boolean"},"can_share_people":{"type":"boolean"},"emails":{"description":"Named customers it is shared with (owner only; empty for others).","items":{"type":"string"},"type":"array"},"org":{"description":"Shared with everyone at the requester's email domain.","type":"boolean"},"owner":{"description":"You raised it (you can share it and mark it resolved).","type":"boolean"}},"required":["can_share_org","can_share_people","emails","org","owner"],"type":"object"},"PortalSubmitRequest":{"properties":{"description":{"type":"string"},"request_type":{"description":"One of the portal's request types, or empty.","type":"string"},"subject":{"type":"string"}},"required":["subject"],"type":"object"},"PortalTicket":{"properties":{"created_at":{"type":"string"},"description":{"type":"string","x-nullable":true},"key":{"type":"string"},"number":{"type":"integer"},"raised_by":{"description":"Shared requests: the requester's email; null on your own.","type":"string","x-nullable":true},"status":{"allOf":[{"$ref":"#/definitions/RequestStatus"}],"enum":["open","progress","waiting","resolved","cancelled"]},"subject":{"type":"string"},"updated_at":{"type":"string"}},"required":["created_at","key","number","status","subject","updated_at"],"type":"object"},"PortalTicketDetail":{"properties":{"messages":{"items":{"$ref":"#/definitions/PortalMessage"},"type":"array"},"request":{"$ref":"#/definitions/PortalTicket"},"sharing":{"$ref":"#/definitions/PortalSharing"}},"required":["messages","request","sharing"],"type":"object"},"PortalVerifyRequest":{"properties":{"code":{"type":"string"},"pending_id":{"type":"string"}},"required":["code","pending_id"],"type":"object"},"Portfolio":{"properties":{"delegate_ids":{"description":"People besides the lead who may manage this unit and everything inside it.","items":{"type":"string"},"type":"array"},"description":{"type":"string","x-nullable":true},"icon":{"type":"string","x-nullable":true},"id":{"type":"string"},"lead_id":{"type":"string","x-nullable":true},"name":{"type":"string"},"parent_id":{"type":"string","x-nullable":true},"position":{"type":"integer"}},"required":["delegate_ids","id","name","position"],"type":"object"},"PortfolioRequest":{"properties":{"delegate_ids":{"items":{"type":"string"},"type":"array"},"description":{"type":"string"},"icon":{"example":"folder","type":"string"},"lead_id":{"type":"string"},"name":{"example":"Infrastructure","type":"string"},"parent_id":{"type":"string"}},"required":["name"],"type":"object"},"Preview":{"properties":{"columns":{"items":{"type":"string"},"type":"array"},"rows":{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},"total":{"type":"integer"}},"required":["columns","rows","total"],"type":"object"},"ProductRef":{"properties":{"color":{"type":"string"},"id":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"scheme_id":{"type":"string","x-nullable":true}},"required":["color","id","key","name"],"type":"object"},"PublicWorkspace":{"properties":{"name":{"type":"string"},"subdomain":{"type":"string"}},"required":["name","subdomain"],"type":"object"},"RPCError":{"properties":{"code":{"type":"integer"},"message":{"type":"string"}},"type":"object"},"RecoveryCodesResponse":{"properties":{"recovery_codes":{"items":{"type":"string"},"type":"array","x-nullable":true}},"type":"object"},"Release":{"properties":{"created_at":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"issues":{"items":{"$ref":"#/definitions/ReleaseIssue"},"type":"array"},"name":{"type":"string"},"product_space_id":{"type":"string"},"released_at":{"type":"string","x-nullable":true},"status":{"allOf":[{"$ref":"#/definitions/ReleaseStatus"}],"enum":["planned","progress","released"]},"target_date":{"type":"string","x-nullable":true}},"required":["created_at","description","id","issues","name","product_space_id","status"],"type":"object"},"ReleaseIssue":{"properties":{"id":{"type":"string"},"key":{"type":"string"},"status":{"allOf":[{"$ref":"#/definitions/IssueStatus"}],"enum":["todo","progress","done","cancelled"]},"title":{"type":"string"},"type_id":{"type":"string"}},"required":["id","key","status","title","type_id"],"type":"object"},"ReleaseRequest":{"properties":{"description":{"type":"string"},"issue_ids":{"items":{"type":"string"},"type":"array"},"name":{"example":"v2.14","type":"string"},"status":{"allOf":[{"$ref":"#/definitions/ReleaseStatus"}],"enum":["planned","progress"]},"target_date":{"description":"YYYY-MM-DD; empty = no target yet.","example":"2026-11-20","type":"string"}},"required":["name"],"type":"object"},"ReleaseStatus":{"enum":["planned","progress","released"],"type":"string","x-enum-varnames":["ReleasePlanned","ReleaseProgress","ReleaseReleased"]},"RenameAssistantThreadRequest":{"properties":{"title":{"type":"string"}},"type":"object"},"RenameDocSectionRequest":{"properties":{"name":{"type":"string"}},"required":["name"],"type":"object"},"RenameGroupRequest":{"properties":{"end_date":{"example":"2026-10-16","type":"string"},"name":{"type":"string"},"start_date":{"description":"Optional, with end_date: new dates for a sprint that isn't completed.","example":"2026-10-05","type":"string"}},"required":["name"],"type":"object"},"RenameRoleRequest":{"properties":{"name":{"example":"Support agent","type":"string"}},"required":["name"],"type":"object"},"Request":{"properties":{"id":{"items":{"type":"integer"},"type":"array"},"jsonrpc":{"type":"string"},"method":{"type":"string"},"params":{"items":{"type":"integer"},"type":"array"}},"type":"object"},"RequestComment":{"properties":{"author_email":{"type":"string","x-nullable":true},"author_id":{"type":"string","x-nullable":true},"author_name":{"type":"string","x-nullable":true},"body":{"type":"string"},"created_at":{"type":"string"},"id":{"type":"string"},"kind":{"enum":["reply","note","customer"],"type":"string"}},"required":["body","created_at","id","kind"],"type":"object"},"RequestCommentRequest":{"properties":{"body":{"type":"string"},"kind":{"enum":["reply","note"],"type":"string"}},"required":["body","kind"],"type":"object"},"RequestDetail":{"properties":{"comments":{"items":{"$ref":"#/definitions/RequestComment"},"type":"array"},"issues":{"items":{"$ref":"#/definitions/Issue"},"type":"array"},"request":{"$ref":"#/definitions/SupportRequest"}},"required":["comments","issues","request"],"type":"object"},"RequestHit":{"properties":{"id":{"type":"string"},"key":{"type":"string"},"space_color":{"type":"string"},"space_key":{"type":"string"},"space_name":{"type":"string"},"status":{"allOf":[{"$ref":"#/definitions/RequestStatus"}],"enum":["open","progress","waiting","resolved","cancelled"]},"subject":{"type":"string"}},"required":["id","key","space_color","space_key","space_name","status","subject"],"type":"object"},"RequestSLA":{"properties":{"first_response_at":{"description":"The first reply to the requester (internal notes don't count).","type":"string","x-nullable":true},"first_response_due":{"type":"string","x-nullable":true},"paused":{"description":"Waiting on the customer: the resolution clock is stopped.","type":"boolean"},"resolution_due":{"description":"Pushed back by the time spent waiting on the customer so far.","type":"string","x-nullable":true}},"required":["paused"],"type":"object"},"RequestStatus":{"enum":["open","progress","waiting","resolved","cancelled"],"type":"string","x-enum-varnames":["RequestOpen","RequestProgress","RequestWaiting","RequestResolved","RequestCancelled"]},"ResetPasswordRequest":{"properties":{"password":{"type":"string"},"token":{"type":"string"}},"required":["password","token"],"type":"object"},"ResourceMetadata":{"properties":{"authorization_servers":{"items":{"type":"string"},"type":"array"},"bearer_methods_supported":{"items":{"type":"string"},"type":"array"},"resource":{"type":"string"},"resource_name":{"type":"string"},"scopes_supported":{"items":{"type":"string"},"type":"array"}},"required":["authorization_servers","bearer_methods_supported","resource","resource_name","scopes_supported"],"type":"object"},"Response":{"properties":{"error":{"$ref":"#/definitions/RPCError"},"id":{"items":{"type":"integer"},"type":"array"},"jsonrpc":{"type":"string"},"result":{}},"type":"object"},"Roadmap":{"properties":{"issues":{"items":{"$ref":"#/definitions/Issue"},"type":"array"},"links":{"items":{"$ref":"#/definitions/IssueLink"},"type":"array"},"milestones":{"items":{"$ref":"#/definitions/Milestone"},"type":"array"},"portfolios":{"items":{"$ref":"#/definitions/Portfolio"},"type":"array"},"schemes":{"items":{"$ref":"#/definitions/IssueScheme"},"type":"array"},"space":{"allOf":[{"$ref":"#/definitions/Space"}],"description":"The space this roadmap belongs to; null on the workspace roadmap.","x-nullable":true},"spaces":{"items":{"$ref":"#/definitions/SpaceRef"},"type":"array"},"sprints":{"items":{"$ref":"#/definitions/BacklogGroup"},"type":"array"}},"required":["issues","links","milestones","portfolios","schemes","spaces","sprints"],"type":"object"},"Role":{"properties":{"description":{"type":"string","x-nullable":true},"id":{"type":"string"},"is_modified":{"type":"boolean"},"name":{"type":"string"},"system_key":{"enum":["owner","admin","member","viewer"],"type":"string","x-nullable":true},"workspace_id":{"type":"string"}},"required":["id","is_modified","name","workspace_id"],"type":"object"},"RoleDetail":{"properties":{"description":{"type":"string","x-nullable":true},"id":{"type":"string"},"is_modified":{"type":"boolean"},"name":{"type":"string"},"permissions":{"additionalProperties":{"$ref":"#/definitions/Level"},"type":"object"},"system_key":{"enum":["owner","admin","member","viewer"],"type":"string","x-nullable":true},"user_count":{"type":"integer"},"workspace_id":{"type":"string"}},"required":["id","is_modified","name","permissions","user_count","workspace_id"],"type":"object"},"RoleLevelsRequest":{"properties":{"levels":{"additionalProperties":{"$ref":"#/definitions/Level"},"description":"Area → none, view or edit. One area (a cell) or several (a group row).","type":"object"}},"required":["levels"],"type":"object"},"RoutingRequest":{"properties":{"rules":{"items":{"$ref":"#/definitions/EscalationRule"},"type":"array"}},"required":["rules"],"type":"object"},"RowError":{"properties":{"code":{"type":"string"},"ref":{"type":"string","x-nullable":true},"row":{"type":"integer"}},"required":["code","row"],"type":"object"},"RunImportRequest":{"properties":{"data":{"type":"string"},"file_name":{"type":"string"},"mapping":{"$ref":"#/definitions/Mapping"},"space_id":{"type":"string"}},"required":["data","space_id"],"type":"object"},"SLARequest":{"properties":{"targets":{"items":{"$ref":"#/definitions/SLATarget"},"type":"array"}},"required":["targets"],"type":"object"},"SLATarget":{"properties":{"first_response_minutes":{"type":"integer","x-nullable":true},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"resolution_minutes":{"type":"integer","x-nullable":true}},"required":["priority"],"type":"object"},"SSOChoicesRequest":{"properties":{"ticket":{"type":"string"}},"required":["ticket"],"type":"object"},"SSOProvidersRequest":{"properties":{"providers":{"items":{"enum":["microsoft","google"],"type":"string"},"type":"array"}},"required":["providers"],"type":"object"},"SSOProvidersResponse":{"properties":{"providers":{"items":{"enum":["microsoft","google"],"type":"string"},"type":"array"}},"required":["providers"],"type":"object"},"SSOSettings":{"properties":{"available":{"items":{"enum":["microsoft","google"],"type":"string"},"type":"array"},"enabled":{"items":{"enum":["microsoft","google"],"type":"string"},"type":"array"}},"required":["available","enabled"],"type":"object"},"SaveDocPageRequest":{"properties":{"base_version":{"description":"The page's content_version the editor started from: a newer one is\n409 page_changed. Omit to save over whatever is there.","type":"integer","x-nullable":true},"blocks":{"items":{"$ref":"#/definitions/DocBlock"},"type":"array"},"icon":{"type":"string"},"is_draft":{"type":"boolean"},"link_url":{"type":"string"},"title":{"type":"string"},"width":{"enum":["medium","full"],"type":"string"}},"type":"object"},"SchemeLevel":{"properties":{"id":{"type":"string"},"is_required":{"type":"boolean"},"scope":{"allOf":[{"$ref":"#/definitions/LevelScope"}],"enum":["account","product"]},"types":{"items":{"$ref":"#/definitions/IssueType"},"type":"array"}},"required":["id","is_required","scope","types"],"type":"object"},"SchemeSpace":{"properties":{"color":{"type":"string"},"id":{"type":"string"},"key":{"type":"string"},"kind":{"allOf":[{"$ref":"#/definitions/SpaceKind"}],"enum":["product","team","support"]},"name":{"type":"string"}},"required":["color","id","key","kind","name"],"type":"object"},"SearchResults":{"properties":{"docs":{"items":{"$ref":"#/definitions/DocHit"},"type":"array"},"issues":{"items":{"$ref":"#/definitions/IssueHit"},"type":"array"},"requests":{"items":{"$ref":"#/definitions/RequestHit"},"type":"array"},"spaces":{"items":{"$ref":"#/definitions/SpaceHit"},"type":"array"}},"required":["docs","issues","requests","spaces"],"type":"object"},"SecurityPolicyRequest":{"properties":{"grace_days":{"type":"integer"},"methods":{"items":{"enum":["totp","passkey"],"type":"string"},"type":"array"},"policy":{"enum":["optional","admins","all"],"type":"string"}},"required":["methods","policy"],"type":"object"},"ServerMetadata":{"properties":{"authorization_endpoint":{"type":"string"},"authorization_response_iss_parameter_supported":{"type":"boolean"},"code_challenge_methods_supported":{"items":{"type":"string"},"type":"array"},"grant_types_supported":{"items":{"type":"string"},"type":"array"},"issuer":{"type":"string"},"registration_endpoint":{"type":"string"},"response_types_supported":{"items":{"type":"string"},"type":"array"},"revocation_endpoint":{"type":"string"},"revocation_endpoint_auth_methods_supported":{"items":{"type":"string"},"type":"array"},"scopes_supported":{"items":{"type":"string"},"type":"array"},"token_endpoint":{"type":"string"},"token_endpoint_auth_methods_supported":{"items":{"type":"string"},"type":"array"}},"required":["authorization_endpoint","authorization_response_iss_parameter_supported","code_challenge_methods_supported","grant_types_supported","issuer","registration_endpoint","response_types_supported","revocation_endpoint","revocation_endpoint_auth_methods_supported","scopes_supported","token_endpoint","token_endpoint_auth_methods_supported"],"type":"object"},"SetCodeHostTokenRequest":{"properties":{"access_token":{"description":"AccessToken replaces the stored token; empty removes it.","type":"string"},"base_url":{"description":"BaseURL (GitLab only) — changing it without a new token removes the old one.","type":"string"}},"type":"object"},"SetFeatureRequest":{"properties":{"enabled":{"type":"boolean"}},"type":"object"},"ShareDocPageRequest":{"properties":{"user_ids":{"items":{"type":"string"},"type":"array"}},"required":["user_ids"],"type":"object"},"SignupState":{"properties":{"email":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"resend_available_at":{"type":"string"},"verified":{"type":"boolean"}},"required":["email","id","name","resend_available_at","verified"],"type":"object"},"SourceItem":{"properties":{"count":{"description":"Issues, pages or cards in it, when the source says.","type":"integer","x-nullable":true},"id":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"}},"required":["id","key","name"],"type":"object"},"SourceStatus":{"properties":{"category":{"enum":["todo","progress","done"],"type":"string"},"name":{"type":"string"}},"required":["category","name"],"type":"object"},"SourceType":{"properties":{"level":{"type":"integer"},"name":{"type":"string"}},"required":["level","name"],"type":"object"},"Space":{"properties":{"archived_at":{"type":"string","x-nullable":true},"avatar_file_id":{"description":"Uploaded images (attachment ids): the square avatar and the wide card image.","type":"string","x-nullable":true},"avatar_url":{"type":"string","x-nullable":true},"board_labels":{"description":"Team spaces: the board opens showing issues with any of these labels.","items":{"type":"string"},"type":"array"},"color":{"type":"string"},"cover_file_id":{"type":"string","x-nullable":true},"cover_url":{"type":"string","x-nullable":true},"created_at":{"type":"string"},"description":{"type":"string","x-nullable":true},"domain":{"type":"string","x-nullable":true},"id":{"type":"string"},"key":{"type":"string"},"kind":{"allOf":[{"$ref":"#/definitions/SpaceKind"}],"enum":["product","team","support"]},"name":{"type":"string"},"owner_id":{"type":"string","x-nullable":true},"portfolio_id":{"type":"string","x-nullable":true},"scheme_id":{"description":"The issue scheme of a product space; null for team and support spaces\n(team boards use the schemes of their issues' products).","type":"string","x-nullable":true},"visibility":{"enum":["open","members","private"],"type":"string"},"work_mode":{"description":"How a team plans work: time-boxed sprints or one continuous Kanban board. \"sprints\" for other kinds.","enum":["sprints","kanban"],"type":"string"},"workspace_id":{"type":"string"}},"required":["board_labels","color","created_at","id","key","kind","name","visibility","work_mode","workspace_id"],"type":"object"},"SpaceHit":{"properties":{"color":{"type":"string"},"id":{"type":"string"},"key":{"type":"string"},"kind":{"allOf":[{"$ref":"#/definitions/SpaceKind"}],"enum":["product","team","support"]},"name":{"type":"string"}},"required":["color","id","key","kind","name"],"type":"object"},"SpaceIssueCount":{"properties":{"open":{"type":"integer"},"space_id":{"type":"string"}},"required":["open","space_id"],"type":"object"},"SpaceKind":{"enum":["product","team","support"],"type":"string","x-enum-varnames":["SpaceProduct","SpaceTeam","SpaceSupport"]},"SpaceMember":{"properties":{"email":{"type":"string"},"name":{"type":"string"},"role":{"allOf":[{"$ref":"#/definitions/TeamRole"}],"description":"admin, member or viewer. Decides rights in team spaces; elsewhere it\nonly marks who runs the space.","enum":["admin","member","viewer"]},"user_id":{"type":"string"}},"required":["email","name","role","user_id"],"type":"object"},"SpaceMemberRequest":{"properties":{"role":{"allOf":[{"$ref":"#/definitions/TeamRole"}],"enum":["admin","member","viewer"]}},"required":["role"],"type":"object"},"SpaceRef":{"properties":{"color":{"type":"string"},"id":{"type":"string"},"key":{"type":"string"},"kind":{"allOf":[{"$ref":"#/definitions/SpaceKind"}],"enum":["product","team","support"]},"name":{"type":"string"},"portfolio_id":{"type":"string","x-nullable":true},"scheme_id":{"type":"string","x-nullable":true},"work_mode":{"description":"How a team plans work (sprints or kanban); \"sprints\" for products.","enum":["sprints","kanban"],"type":"string"}},"required":["color","id","key","kind","name","work_mode"],"type":"object"},"SpaceSettings":{"properties":{"former_keys":{"description":"Keys the space had before a rename; they keep resolving.","items":{"type":"string"},"type":"array"},"linked_space_ids":{"description":"Support spaces linked to a product, or products a support space serves.","items":{"type":"string"},"type":"array"},"next_number":{"description":"The number the next issue gets, for the key preview.","type":"integer"},"space":{"$ref":"#/definitions/Space"}},"required":["former_keys","linked_space_ids","next_number","space"],"type":"object"},"SpaceSettingsRequest":{"properties":{"board_labels":{"description":"Team spaces: the board opens filtered on these labels. Omit to leave them.","items":{"type":"string"},"type":"array"},"color":{"example":"#e51578","type":"string"},"description":{"type":"string"},"key":{"example":"UPM","type":"string"},"name":{"type":"string"},"owner_id":{"type":"string"},"product_id":{"description":"Support spaces: the product it handles tickets for, or null for none.\nOmit to leave the link as it is. Needs a live product without another\nsupport space (409 product_has_support).","format":"uuid","type":"string","x-nullable":true},"scheme_id":{"description":"Required for product spaces; ignored for team and support spaces.","type":"string"},"visibility":{"enum":["open","private"],"type":"string"}},"required":["color","key","name","visibility"],"type":"object"},"SpaceSummary":{"properties":{"archived_at":{"type":"string","x-nullable":true},"avatar_file_id":{"description":"Uploaded images (attachment ids): the square avatar and the wide card image.","type":"string","x-nullable":true},"avatar_url":{"type":"string","x-nullable":true},"board_labels":{"description":"Team spaces: the board opens showing issues with any of these labels.","items":{"type":"string"},"type":"array"},"color":{"type":"string"},"cover_file_id":{"type":"string","x-nullable":true},"cover_url":{"type":"string","x-nullable":true},"created_at":{"type":"string"},"description":{"type":"string","x-nullable":true},"domain":{"type":"string","x-nullable":true},"id":{"type":"string"},"is_member":{"type":"boolean"},"key":{"type":"string"},"kind":{"allOf":[{"$ref":"#/definitions/SpaceKind"}],"enum":["product","team","support"]},"linked_space_ids":{"description":"For support spaces: the product they serve (none or one). For product\nspaces: their support space (none or one). Archived ones are left out.","items":{"type":"string"},"type":"array"},"member_count":{"type":"integer"},"my_role":{"allOf":[{"$ref":"#/definitions/TeamRole"}],"description":"The caller's role here (see TeamRole); enforced in team spaces only.","enum":["admin","member","viewer"]},"name":{"type":"string"},"owner_id":{"type":"string","x-nullable":true},"owner_name":{"type":"string","x-nullable":true},"portfolio_id":{"type":"string","x-nullable":true},"portfolio_name":{"type":"string","x-nullable":true},"scheme_id":{"description":"The issue scheme of a product space; null for team and support spaces\n(team boards use the schemes of their issues' products).","type":"string","x-nullable":true},"visibility":{"enum":["open","members","private"],"type":"string"},"work_mode":{"description":"How a team plans work: time-boxed sprints or one continuous Kanban board. \"sprints\" for other kinds.","enum":["sprints","kanban"],"type":"string"},"workspace_id":{"type":"string"}},"required":["board_labels","color","created_at","id","is_member","key","kind","linked_space_ids","member_count","my_role","name","visibility","work_mode","workspace_id"],"type":"object"},"SprintDatesRequest":{"properties":{"end_date":{"example":"2026-10-16","type":"string"},"start_date":{"example":"2026-10-05","type":"string"}},"required":["end_date","start_date"],"type":"object"},"StartInput":{"properties":{"credentials":{"$ref":"#/definitions/Creds"},"items":{"items":{"$ref":"#/definitions/StartItem"},"type":"array"},"options":{"allOf":[{"$ref":"#/definitions/ImportOptions"}],"description":"What else comes along (all off when left out). Trello: only invite."},"source":{"type":"string"},"statuses":{"additionalProperties":{"type":"string"},"description":"Jira statuses or Trello lists -\u003e todo, progress, done, cancelled.","type":"object"},"types":{"additionalProperties":{"type":"string"},"description":"Jira: source issue type name -\u003e our type name.","type":"object"}},"required":["source"],"type":"object"},"StartItem":{"properties":{"id":{"type":"string"},"new_space":{"description":"Jira, Trello and Linear: a new product space, named after the item, instead.","type":"boolean"},"space_id":{"description":"Jira and Trello: the product space. Confluence: the space whose docs\nreceive the pages; null = workspace documentation.","type":"string"},"team_id":{"description":"Jira, Trello and Linear: the team the issues go to; its sprints come\nalong into it. Null = the team named after the item, created if there\nis none.","type":"string"}},"required":["id"],"type":"object"},"StartSignupRequest":{"properties":{"email":{"type":"string"},"language":{"type":"string"},"name":{"type":"string"},"password":{"type":"string"}},"required":["email","name","password"],"type":"object"},"SubdomainAvailability":{"properties":{"available":{"type":"boolean"},"reason":{"enum":["subdomain_required","subdomain_invalid_chars","subdomain_too_short","subdomain_too_long","subdomain_edge_hyphen","subdomain_double_hyphen","subdomain_reserved","subdomain_taken"],"type":"string"},"subdomain":{"type":"string"},"suggestions":{"items":{"type":"string"},"type":"array"}},"required":["available","subdomain","suggestions"],"type":"object"},"SupportPortal":{"properties":{"access":{"enum":["public","signup","invite"],"type":"string"},"allowed_domains":{"items":{"type":"string"},"type":"array"},"branding":{"$ref":"#/definitions/PortalBranding"},"customers":{"items":{"$ref":"#/definitions/Customer"},"type":"array"},"featured_pages":{"description":"The featured articles the help centre can show now (published, not\narchived, Documentation on), in order: what Branding.Articles names,\nminus pages that no longer qualify. Read-only.","items":{"$ref":"#/definitions/PortalFeaturedPage"},"type":"array"},"header_file_id":{"type":"string","x-nullable":true},"logo_file_id":{"description":"The help centre's logo and header image: files on the support space.","type":"string","x-nullable":true},"sharing":{"enum":["none","organisation","anyone"],"type":"string"},"space_id":{"type":"string"}},"required":["access","allowed_domains","branding","customers","featured_pages","sharing","space_id"],"type":"object"},"SupportRequest":{"properties":{"assignees":{"items":{"$ref":"#/definitions/IssueAssignee"},"type":"array"},"channel":{"enum":["email","portal","web","api"],"type":"string"},"comment_count":{"type":"integer"},"created_at":{"type":"string"},"customer_id":{"type":"string","x-nullable":true},"description":{"type":"string","x-nullable":true},"escalation_level":{"description":"Line of the routing chain the request is at (0 = first line).","type":"integer"},"id":{"type":"string"},"issue_ids":{"items":{"type":"string"},"type":"array"},"issue_keys":{"description":"IssueKeys are the keys of the linked product issues the reader can\nsee (desk chips), in IssueIDs order.","items":{"type":"string"},"type":"array"},"key":{"type":"string"},"number":{"type":"integer"},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"product_space_id":{"type":"string","x-nullable":true},"rank":{"type":"string"},"requester_email":{"type":"string"},"resolved_at":{"type":"string","x-nullable":true},"routed_at":{"type":"string"},"sla":{"$ref":"#/definitions/RequestSLA"},"space_id":{"type":"string"},"status":{"allOf":[{"$ref":"#/definitions/RequestStatus"}],"enum":["open","progress","waiting","resolved","cancelled"]},"subject":{"type":"string"},"team_space_id":{"type":"string","x-nullable":true},"updated_at":{"type":"string"}},"required":["assignees","channel","comment_count","created_at","escalation_level","id","issue_ids","issue_keys","key","number","priority","rank","requester_email","routed_at","sla","space_id","status","subject","updated_at"],"type":"object"},"TLSAllowedResponse":{"properties":{"domain":{"type":"string"}},"required":["domain"],"type":"object"},"TargetType":{"properties":{"level":{"enum":["higher","above","work","sub"],"type":"string"},"name":{"type":"string"}},"required":["level","name"],"type":"object"},"TeamBoard":{"properties":{"card_images":{"description":"Image attachments shown on cards (first three per issue); empty\nwithout view on comments \u0026 attachments.","items":{"$ref":"#/definitions/CardImage"},"type":"array"},"carry_overs":{"items":{"$ref":"#/definitions/CarryOver"},"type":"array"},"columns":{"description":"Board columns, left to right.","items":{"$ref":"#/definitions/BoardColumn"},"type":"array"},"groups":{"description":"Sprints and kanban groups (ListGroups order).","items":{"$ref":"#/definitions/BacklogGroup"},"type":"array"},"issues":{"items":{"$ref":"#/definitions/Issue"},"type":"array"},"parents":{"description":"Parents of the board's issues (only in products the caller can see).","items":{"$ref":"#/definitions/ParentRef"},"type":"array"},"products":{"items":{"$ref":"#/definitions/ProductRef"},"type":"array"},"schemes":{"items":{"$ref":"#/definitions/IssueScheme"},"type":"array"},"space":{"$ref":"#/definitions/Space"}},"required":["card_images","carry_overs","columns","groups","issues","parents","products","schemes","space"],"type":"object"},"TeamRole":{"enum":["admin","member","viewer"],"type":"string","x-enum-varnames":["TeamAdmin","TeamMember","TeamViewer"]},"Thread":{"properties":{"id":{"type":"string"},"messages":{"items":{"$ref":"#/definitions/AssistantMessage"},"type":"array"},"space_id":{"type":"string","x-nullable":true},"title":{"description":"Its name, else the first question on one line; \"\" when it only sent files.","type":"string"}},"required":["id","messages","title"],"type":"object"},"ThreadSummary":{"properties":{"id":{"type":"string"},"space_id":{"type":"string","x-nullable":true},"title":{"description":"Its name, else the first question, cut to fit a row; \"\" when it only\nsent files.","type":"string"},"updated_at":{"type":"string"}},"required":["id","title","updated_at"],"type":"object"},"ThreadUpload":{"properties":{"file":{"$ref":"#/definitions/Attachment"},"thread_id":{"type":"string"}},"required":["file","thread_id"],"type":"object"},"TotpConfirmRequest":{"properties":{"code":{"type":"string"}},"required":["code"],"type":"object"},"TotpSetupResponse":{"properties":{"qr":{"items":{"type":"string"},"type":"array"},"secret":{"type":"string"},"uri":{"type":"string"}},"required":["qr","secret","uri"],"type":"object"},"Tree":{"properties":{"archive":{"items":{"$ref":"#/definitions/DocPageSummary"},"type":"array"},"can_edit":{"type":"boolean"},"overview":{"$ref":"#/definitions/DocPage"},"pages":{"items":{"$ref":"#/definitions/DocPageSummary"},"type":"array"},"sections":{"items":{"$ref":"#/definitions/DocSection"},"type":"array"}},"required":["archive","can_edit","overview","pages","sections"],"type":"object"},"UnassignedCount":{"properties":{"count":{"description":"Open requests nobody is assigned to, in the live support spaces the caller can see.","type":"integer"}},"required":["count"],"type":"object"},"UnreadCount":{"properties":{"unread":{"type":"integer"}},"required":["unread"],"type":"object"},"Unsubscribe":{"properties":{"enabled":{"type":"boolean"},"settings":{"items":{"enum":["assign","mention","comment","status","due","sprint","release","release_date","ticket_assign","ticket_reply","ticket_sla","ticket_reopen","share","doc_comment","space","digest","join_requests"],"type":"string"},"type":"array"}},"required":["enabled","settings"],"type":"object"},"UpdateProfileRequest":{"properties":{"job_title":{"type":"string"},"language":{"enum":["en","nl","de","fr","es"],"type":"string"},"name":{"type":"string"},"theme":{"enum":["light","dark","system"],"type":"string"},"time_zone":{"example":"Europe/Amsterdam","type":"string"}},"required":["language","name","theme"],"type":"object"},"UpdateRequestRequest":{"properties":{"assignee_ids":{"items":{"type":"string"},"type":"array"},"description":{"type":"string"},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"product_space_id":{"type":"string"},"status":{"allOf":[{"$ref":"#/definitions/RequestStatus"}],"enum":["open","progress","waiting","resolved","cancelled"]},"subject":{"type":"string"},"team_space_id":{"type":"string"}},"required":["priority","status","subject"],"type":"object"},"UpdateSchemeRequest":{"properties":{"description":{"type":"string"},"levels":{"description":"The whole structure, top level first. Keep existing ids; give new levels\nand types fresh UUIDs. is_required is computed and ignored here.","items":{"$ref":"#/definitions/SchemeLevel"},"type":"array"},"name":{"type":"string"}},"required":["levels"],"type":"object"},"User":{"properties":{"avatar_file_id":{"description":"Profile picture (an attachment); null = initials.","type":"string","x-nullable":true},"created_at":{"type":"string"},"email":{"type":"string"},"id":{"type":"string"},"job_title":{"type":"string","x-nullable":true},"language":{"type":"string"},"last_seen_at":{"type":"string","x-nullable":true},"name":{"type":"string"},"role_id":{"type":"string"},"status":{"allOf":[{"$ref":"#/definitions/UserStatus"}],"enum":["active","invited","deactivated"]},"theme":{"enum":["light","dark","system"],"type":"string"},"time_zone":{"description":"IANA time zone; null = the browser's.","type":"string","x-nullable":true},"workspace_id":{"type":"string"}},"required":["created_at","email","id","language","name","role_id","status","theme","workspace_id"],"type":"object"},"UserRoleRequest":{"properties":{"role_id":{"type":"string"}},"required":["role_id"],"type":"object"},"UserStatus":{"enum":["active","invited","deactivated"],"type":"string","x-enum-varnames":["UserActive","UserInvited","UserDeactivated"]},"VerifySignupRequest":{"properties":{"code":{"type":"string"}},"required":["code"],"type":"object"},"Webhook":{"properties":{"created_at":{"type":"string"},"created_by":{"allOf":[{"$ref":"#/definitions/ChangeActor"}],"description":"Whose permissions decide what it sends."},"enabled":{"type":"boolean"},"failures":{"description":"Failed deliveries in a row; at MaxFailures it turns itself off.","type":"integer"},"id":{"type":"string"},"kinds":{"description":"Only these kinds of item (empty: every kind).","items":{"type":"string"},"type":"array"},"last_attempt_at":{"type":"string","x-nullable":true},"last_delivered_at":{"type":"string","x-nullable":true},"last_error":{"description":"Why the last attempt failed: url_refused, secret_unreadable,\naddress_private, timeout, unreachable, http_status (see last_status),\ncreator_inactive, creator_no_access or changes_skipped.","type":"string","x-nullable":true},"last_status":{"type":"integer","x-nullable":true},"name":{"type":"string"},"secret_hint":{"type":"string"},"url":{"type":"string"}},"required":["created_at","created_by","enabled","failures","id","kinds","name","secret_hint","url"],"type":"object"},"WebhookRequest":{"properties":{"enabled":{"description":"Left out on create: on. Switched back on, it starts from now.","type":"boolean","x-nullable":true},"kinds":{"description":"Only these kinds (issue, request, doc, artifact, release, group,\nmilestone, space); empty or left out: every kind.","items":{"type":"string"},"type":"array"},"name":{"type":"string"},"url":{"description":"https in production; not an address on a private network.","type":"string"}},"required":["name","url"],"type":"object"},"WebhookSecret":{"properties":{"secret":{"type":"string"},"webhook":{"$ref":"#/definitions/Webhook"}},"required":["secret","webhook"],"type":"object"},"WebhookTestResult":{"properties":{"error":{"description":"Why it failed, as Webhook.last_error.","type":"string","x-nullable":true},"ok":{"type":"boolean"},"status":{"type":"integer","x-nullable":true}},"required":["ok"],"type":"object"},"WorkModeRequest":{"properties":{"work_mode":{"enum":["sprints","kanban"],"type":"string"}},"required":["work_mode"],"type":"object"},"Workspace":{"properties":{"billing_address":{"type":"string","x-nullable":true},"company_size":{"type":"string","x-nullable":true},"country":{"type":"string","x-nullable":true},"created_at":{"type":"string"},"deletion_scheduled_at":{"description":"Set while the Owner has deleted the workspace; it is erased 30 days later.","type":"string","x-nullable":true},"id":{"type":"string"},"logo_file_id":{"description":"The organisation avatar shown in the sidebar brand.","type":"string","x-nullable":true},"name":{"type":"string"},"org_key":{"type":"string"},"subdomain":{"type":"string"},"vat_number":{"type":"string","x-nullable":true},"website":{"type":"string","x-nullable":true}},"required":["created_at","id","name","org_key","subdomain"],"type":"object"},"WorkspaceChoiceResponse":{"properties":{"handoff_token":{"type":"string"},"role_name":{"type":"string"},"workspace":{"$ref":"#/definitions/PublicWorkspace"},"workspace_url":{"type":"string"}},"required":["handoff_token","role_name","workspace","workspace_url"],"type":"object"},"WorkspaceHostResponse":{"properties":{"name":{"type":"string"},"sso_providers":{"items":{"enum":["microsoft","google"],"type":"string"},"type":"array"},"subdomain":{"type":"string"}},"required":["name","sso_providers","subdomain"],"type":"object"},"WorkspaceUser":{"properties":{"created_at":{"type":"string"},"email":{"type":"string"},"id":{"type":"string"},"invite_expires_at":{"type":"string","x-nullable":true},"is_owner":{"type":"boolean"},"last_seen_at":{"type":"string","x-nullable":true},"name":{"type":"string"},"role_id":{"type":"string"},"role_name":{"type":"string"},"space_ids":{"items":{"type":"string"},"type":"array"},"status":{"allOf":[{"$ref":"#/definitions/UserStatus"}],"enum":["active","invited","deactivated"]}},"required":["created_at","email","id","is_owner","name","role_id","role_name","space_ids","status"],"type":"object"}},"host":"","info":{"contact":{},"description":"Multi-tenant work management. The workspace is taken from the request host ({subdomain}.backlog.pm).","title":"Backlog.pm API","version":"1.0"},"paths":{"/.well-known/oauth-authorization-server":{"get":{"description":"RFC 8414, for MCP clients: where to register, send the browser and get tokens. The root address is the authorization server for every workspace.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ServerMetadata"}}},"summary":"OAuth authorization server metadata","tags":["oauth"]}},"/.well-known/oauth-protected-resource":{"get":{"description":"RFC 9728: the MCP address on this host and its authorization server. On a workspace's host the resource is that workspace's MCP address; on the root address, the one for every workspace. Also served at /.well-known/oauth-protected-resource/mcp.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ResourceMetadata"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"MCP server's protected resource metadata","tags":["oauth"]}},"/a/{token}":{"get":{"description":"Served on the workspace host at /a/{token}, outside /api/v1 and without sign-in: an HTML page with the artifact's latest version in a sandboxed frame. The page carries a CSP sandbox (opaque origin) that blocks every network request. Unknown tokens, links turned off, deleted artifacts and AI turned off answer 404 with an \"Artifact unavailable\" page.","parameters":[{"description":"Public link token","in":"path","name":"token","required":true,"type":"string"}],"produces":["text/html"],"responses":{"200":{"description":"HTML page","schema":{"type":"string"}},"404":{"description":"Artifact unavailable page","schema":{"type":"string"}}},"summary":"Public artifact viewer","tags":["artifacts"]}},"/a/{token}/{path}":{"get":{"description":"Served on the workspace host at /a/{token}/{path}, outside /api/v1 and without sign-in: one file of an artifact version that has files (its page, stylesheets, scripts, images, fonts, other pages). The token is a view address's grant from the API (for the person it was made for, while they may still open the artifact, for a day) or a public link's token (the latest version). Every response carries a CSP sandbox (opaque origin: no cookies or storage of this site) that lets a page load the version's own files only. Unknown, expired or withdrawn tokens, missing files, deleted artifacts and AI turned off answer 404.","parameters":[{"description":"View grant or public link token","in":"path","name":"token","required":true,"type":"string"},{"description":"File path within the version (empty: its page)","in":"path","name":"path","required":true,"type":"string"}],"produces":["application/octet-stream"],"responses":{"200":{"description":"The file","schema":{"type":"file"}},"404":{"description":"Not found","schema":{"type":"string"}}},"summary":"Artifact file","tags":["artifacts"]}},"/ai/me":{"get":{"description":"Whether the Assistant is available, which keys exist (hints only) and today's usage against the daily limit.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/MyAI"}}},"security":[{"BearerAuth":[]}],"summary":"The caller's AI","tags":["ai"]}},"/ai/me/key":{"delete":{"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/MyAI"}}},"security":[{"BearerAuth":[]}],"summary":"Disconnect the personal AI key","tags":["ai"]},"put":{"consumes":["application/json"],"description":"Only while the workspace allows personal agents. Usage is billed to the person's own account and not counted against workspace limits.","parameters":[{"description":"Provider and key","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/AIKeyRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/MyAI"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Connect a personal AI key","tags":["ai"]}},"/ai/settings":{"get":{"description":"Workspace provider and key hint (never the key), whether personal agents are allowed, default token limits and each active person's custom limits and usage today. Needs view on AI keys \u0026 limits.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AISettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"AI agents settings","tags":["ai"]}},"/ai/settings/key":{"delete":{"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AISettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove the workspace AI key","tags":["ai"]},"put":{"consumes":["application/json"],"description":"Stored encrypted; only a masked hint is ever returned. Needs edit on AI keys \u0026 limits.","parameters":[{"description":"Provider and key","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/AIKeyRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AISettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Set the workspace AI key","tags":["ai"]}},"/ai/settings/policy":{"put":{"consumes":["application/json"],"parameters":[{"description":"Policy","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/AIPolicyRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AISettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Personal agents and default token limits","tags":["ai"]}},"/ai/settings/users/{id}":{"put":{"consumes":["application/json"],"parameters":[{"description":"User id","in":"path","name":"id","required":true,"type":"string"},{"description":"Limits","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/AIUserLimitRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AISettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Custom token limits for one person","tags":["ai"]}},"/api-credentials":{"get":{"description":"Personal tokens for the REST API (Authorization: Bearer). Needs view on Integrations \u0026 MCP.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/PersonalToken"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"API credentials","tags":["integrations"]},"post":{"consumes":["application/json"],"description":"A token acting with the creator's permissions, shown once. Needs edit on Integrations \u0026 MCP and a signed-in session.","parameters":[{"description":"Name","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CreateTokenRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/NewPersonalToken"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Generate API credentials","tags":["integrations"]}},"/api-credentials/{id}":{"delete":{"parameters":[{"description":"Token id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Revoke API credentials","tags":["integrations"]}},"/artifact-folders":{"get":{"description":"The folders the caller sees: their own, shared with them (directly, a space they're in, or a portfolio holding one), or holding an artifact they can open; the Owner and people with edit on AI settings see every folder. Sharing only on folders the caller may change.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ArtifactFolder"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Artifact folders","tags":["artifacts"]},"post":{"consumes":["application/json"],"description":"An unshared folder of the caller's. Needs edit on the Assistant.","parameters":[{"description":"Name","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ArtifactFolderRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/ArtifactFolder"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"New artifact folder","tags":["artifacts"]}},"/artifact-folders/{id}":{"delete":{"description":"Its owner, the Owner or edit on AI settings. Its artifacts stay, in no folder, and are no longer shared through it.","parameters":[{"description":"Folder id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete an artifact folder","tags":["artifacts"]},"patch":{"consumes":["application/json"],"description":"Its owner, the Owner or edit on AI settings.","parameters":[{"description":"Folder id","in":"path","name":"id","required":true,"type":"string"},{"description":"Name","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ArtifactFolderRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ArtifactFolder"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Rename an artifact folder","tags":["artifacts"]}},"/artifact-folders/{id}/share":{"put":{"consumes":["application/json"],"description":"Its owner, the Owner or edit on AI settings. Replaces the spaces, portfolios (every space in their subtree) and people it's shared with; they can open every artifact in it, also ones added later, within each artifact's linked spaces.","parameters":[{"description":"Folder id","in":"path","name":"id","required":true,"type":"string"},{"description":"Sharing","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ArtifactFolderSharing"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ArtifactFolder"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Share an artifact folder","tags":["artifacts"]}},"/artifacts":{"get":{"description":"The caller's own artifacts and those shared with them, a space they're a member of or through a folder, last updated first, each with its latest version for the thumbnail. Needs view on the Assistant. Hidden while AI is off.","parameters":[{"description":"Only items changed at or after this: RFC 3339 time or YYYY-MM-DD. To follow every change, use GET /changes.","in":"query","name":"updated_since","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ArtifactSummary"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Artifacts","tags":["artifacts"]},"post":{"description":"An empty, private \"Untitled artifact\" of the caller's; the first prompt builds it. Needs edit on the Assistant and a usable AI key.","produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Artifact"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Start an artifact","tags":["artifacts"]}},"/artifacts/{id}":{"delete":{"description":"Owner only. Removes it for everyone it was shared with; the public link stops working.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete an artifact","tags":["artifacts"]},"get":{"description":"Every version and the prompt history. Who it is shared with (and the public link's token) only for its owner.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Artifact"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Artifact","tags":["artifacts"]},"patch":{"consumes":["application/json"],"description":"Owner only. A title set by hand is kept: the HTML's \u003ctitle\u003e no longer renames it.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"},{"description":"Title","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ArtifactRenameRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Artifact"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Rename an artifact","tags":["artifacts"]}},"/artifacts/{id}/coverage":{"get":{"description":"Of the given spaces (and, with everyone, every live team space), the ones whose members can't open the artifact: not shared with them directly or through its folder, or outside its linked spaces. Embeds use it to offer sharing with the people who see where it is embedded. A public artifact covers everyone.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"},{"description":"Comma-separated space ids","in":"query","name":"space_ids","type":"string"},{"description":"Also every live team space","in":"query","name":"everyone","type":"boolean"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ArtifactCoverage"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Who can't open an artifact","tags":["artifacts"]}},"/artifacts/{id}/duplicate":{"post":{"description":"Anyone who can open it: a private copy of the caller's titled \"{title} (copy)\", with every version and the prompt history. Needs edit on the Assistant.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Artifact"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Duplicate an artifact","tags":["artifacts"]}},"/artifacts/{id}/folder":{"put":{"consumes":["application/json"],"description":"Owner only, into a folder the caller may change: their own, or any for an admin (null: no folder). Everyone the folder is shared with can then open it.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"},{"description":"Folder","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ArtifactMoveRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Artifact"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"File an artifact in a folder","tags":["artifacts"]}},"/artifacts/{id}/prompt":{"post":{"consumes":["application/json"],"description":"Owner only. The AI builds the artifact (or changes the version shown) through the workspace or personal key, metered like the Assistant. A new version is added with the AI's summary; an answer without an HTML document adds an AI message with its reason (error) and no version. A first version names an untitled artifact after the HTML's \u003ctitle\u003e.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"},{"description":"Prompt","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ArtifactPromptRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Artifact"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Prompt an artifact","tags":["artifacts"]}},"/artifacts/{id}/share":{"put":{"consumes":["application/json"],"description":"Owner only. Replaces the spaces (everyone in them can open it) and people it's shared with and its linked spaces (when any, only their members can open it), and turns the public link on or off.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"},{"description":"Sharing","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ArtifactShareRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Artifact"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Share an artifact","tags":["artifacts"]}},"/artifacts/{id}/summary":{"get":{"description":"One artifact the caller can open as the overview lists it: what an embedded artifact card shows. 404 when it is gone or the caller can't open it.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ArtifactSummary"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Artifact card","tags":["artifacts"]}},"/artifacts/{id}/versions":{"post":{"consumes":["application/json"],"description":"Owner only. Stores the edited page (at most 2 MB) or, with path, another file of the version (at most 10 MB) as the newest version, with a line in the chat; every other file of the version it started from carries over. No AI call, so no key or budget is needed.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"},{"description":"Document","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ArtifactVersionRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Artifact"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save code as a new version","tags":["artifacts"]}},"/artifacts/{id}/versions/{n}/files/{path}":{"get":{"description":"One file of a version of an artifact the caller can open, exactly as stored (the page at its entry path, or index.html for a single page): what the code editor shows and saves. Always sent as a download (application/octet-stream), never run; the file's own type is in X-Artifact-Content-Type.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"},{"description":"Version number","in":"path","name":"n","required":true,"type":"integer"},{"description":"File path within the version","in":"path","name":"path","required":true,"type":"string"}],"produces":["application/octet-stream"],"responses":{"200":{"description":"The file","schema":{"type":"file"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Read a file of a version","tags":["artifacts"]}},"/artifacts/{id}/versions/{n}/restore":{"post":{"description":"Owner only. Makes version n the newest again: a new version with all of its files, and a line in the chat. Nothing is lost: the versions after it stay. No AI call.","parameters":[{"description":"Artifact id","in":"path","name":"id","required":true,"type":"string"},{"description":"Version number","in":"path","name":"n","required":true,"type":"integer"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Artifact"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Restore a version","tags":["artifacts"]}},"/assistant/files":{"post":{"consumes":["multipart/form-data"],"description":"multipart/form-data with one \"file\" part, up to 10 MB: PNG, JPEG, GIF or WebP, PDF, or a UTF-8 text file (text, Markdown, CSV, JSON, code; the model reads its first 200 KB). The type is detected from the content. The file waits on the conversation until a message sends it (file_ids); unsent files are removed after a day. Without thread_id a conversation is started (in space_id, or the workspace). At most 5 files and 14 MB per message, 50 per conversation. Only the conversation's owner sees its files; needs edit on the Assistant.","parameters":[{"description":"The file","in":"formData","name":"file","required":true,"type":"file"},{"description":"Conversation to add it to","in":"formData","name":"thread_id","type":"string"},{"description":"Scope of a new conversation","in":"formData","name":"space_id","type":"string"}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/ThreadUpload"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Attach a file in the Assistant","tags":["assistant"]}},"/assistant/messages":{"post":{"consumes":["application/json"],"description":"Adds the message and the Assistant's answer (a metered model call). Answers may carry an issue or page draft, created only through confirm, and issues it points at. file_ids send uploads waiting on the thread to the model with the message; the text may then be empty. When the call fails the message is taken back and its files wait again.","parameters":[{"description":"Message","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/AssistantSendRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Thread"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Ask the Assistant","tags":["assistant"]}},"/assistant/messages/{id}/confirm":{"post":{"description":"Once per answer (409 draft_used after). Needs Assistant edit plus the usual issue or docs permissions. The issue is assigned to the caller; in a team space it goes to that team.","parameters":[{"description":"Assistant message id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AssistantMessage"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Create the issue or page an answer drafted","tags":["assistant"]}},"/assistant/threads":{"get":{"description":"Most recent first, at most 50. Without space_id: the workspace's conversations; with all=true: every scope's (space_id ignored; those in spaces the caller can no longer open left out).","parameters":[{"description":"Space id","in":"query","name":"space_id","type":"string"},{"description":"Every scope","in":"query","name":"all","type":"boolean"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/ThreadSummary"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"The caller's Assistant conversations","tags":["assistant"]}},"/assistant/threads/{id}":{"delete":{"description":"Its messages and files go with it; issues and pages it created stay.","parameters":[{"description":"Thread id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete one of the caller's Assistant conversations","tags":["assistant"]},"get":{"parameters":[{"description":"Thread id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Thread"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"One of the caller's Assistant conversations","tags":["assistant"]},"patch":{"consumes":["application/json"],"description":"At most 120 characters; an empty title names it after its first question again. Its place in the list doesn't change.","parameters":[{"description":"Thread id","in":"path","name":"id","required":true,"type":"string"},{"description":"New name","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/RenameAssistantThreadRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ThreadSummary"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Rename one of the caller's Assistant conversations","tags":["assistant"]}},"/attachments/{id}":{"delete":{"description":"The uploader can remove their own files; people who edit issues can remove any.","parameters":[{"description":"Attachment id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a file","tags":["attachments"]},"get":{"description":"The bytes, with the detected type. Only PNG, JPEG, GIF and WebP are sent inline; everything else downloads. Never sniffed, never framed.","parameters":[{"description":"Attachment id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/octet-stream"],"responses":{"200":{"description":"OK","schema":{"type":"file"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Download a file","tags":["attachments"]}},"/auth/handoff":{"post":{"consumes":["application/json"],"description":"Exchanges the one-time handoff_token from sign-up for a session on the workspace's own address.","parameters":[{"description":"Token","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/HandoffRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AuthResponse"}},"202":{"description":"Accepted","schema":{"$ref":"#/definitions/MFAChallengeResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Finish signing in after sign-up","tags":["auth"]}},"/auth/invite/accept":{"post":{"consumes":["application/json"],"description":"Uses the invite link: sets the invitee's name and password and signs them in (body: access token + Set-Cookie: bpm_refresh).","parameters":[{"description":"Invite","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/AcceptInviteRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AuthResponse"}},"202":{"description":"Accepted","schema":{"$ref":"#/definitions/MFAChallengeResponse"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Join from an invite","tags":["auth"]}},"/auth/invite/lookup":{"post":{"consumes":["application/json"],"description":"Who the invite is for and which workspace, without using the link up.","parameters":[{"description":"Token","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/InviteTokenRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/InviteInfo"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Check an invite link","tags":["auth"]}},"/auth/login":{"post":{"consumes":["application/json"],"description":"Signs in to the workspace of the request host. Returns the access token in the body and sets the bpm_refresh cookie, or 202 with a second step to finish first (/auth/mfa/*).","parameters":[{"description":"Credentials","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/LoginRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AuthResponse"}},"202":{"description":"Accepted","schema":{"$ref":"#/definitions/MFAChallengeResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Sign in","tags":["auth"]}},"/auth/login/lookup":{"post":{"consumes":["application/json"],"description":"For login.backlog.pm, where the workspace is unknown. Returns every workspace the credentials open, each with a one-time handoff_token to exchange at its own address via POST /auth/handoff.","parameters":[{"description":"Credentials","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/LoginRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/WorkspaceChoiceResponse"},"type":"array"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Sign in at the root address","tags":["auth"]}},"/auth/logout":{"post":{"description":"Ends the refresh session, clears the cookie and invalidates outstanding access tokens.","responses":{"204":{"description":"No Content"}},"summary":"Sign out","tags":["auth"]}},"/auth/mfa/code":{"post":{"consumes":["application/json"],"description":"For a sign-in that answered 202 with purpose \"verify\": a code from the authenticator app, or a recovery code (each works once). Five wrong tries end the sign-in.","parameters":[{"description":"Code","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MFACodeRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AuthResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Finish signing in with a code","tags":["auth"]}},"/auth/mfa/passkey":{"post":{"consumes":["application/json"],"description":"The assertion navigator.credentials.get returned, for a sign-in with purpose \"verify\".","parameters":[{"description":"Assertion","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MFAPasskeyRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AuthResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Finish signing in with a passkey","tags":["auth"]}},"/auth/mfa/passkey/options":{"post":{"consumes":["application/json"],"description":"Options for navigator.credentials.get (purpose \"verify\") or .create (purpose \"setup\", when the workspace requires two-step verification and passkeys are allowed).","parameters":[{"description":"Challenge","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MFAPasskeyOptionsRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PasskeyOptionsResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Start a passkey step at sign-in","tags":["auth"]}},"/auth/mfa/setup/passkey":{"post":{"consumes":["application/json"],"description":"The credential navigator.credentials.create returned (options from /auth/mfa/passkey/options with purpose \"setup\"). Signs in; the response carries the recovery codes, shown once.","parameters":[{"description":"Credential","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MFAPasskeyRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AuthResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Add a passkey and sign in","tags":["auth"]}},"/auth/mfa/setup/totp":{"post":{"consumes":["application/json"],"description":"For a sign-in with purpose \"setup\": a new secret to scan. Confirm it with a code at /auth/mfa/setup/totp/confirm.","parameters":[{"description":"Challenge","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MFATokenRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/TotpSetupResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Set up an authenticator app at sign-in","tags":["auth"]}},"/auth/mfa/setup/totp/confirm":{"post":{"consumes":["application/json"],"description":"The first code from the new authenticator app. Signs in; the response carries the recovery codes, shown once.","parameters":[{"description":"Code","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MFACodeRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AuthResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Turn on the authenticator app and sign in","tags":["auth"]}},"/auth/password/forgot":{"post":{"consumes":["application/json"],"description":"Always answers 202 so it never reveals which addresses have an account.","parameters":[{"description":"Email","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ForgotPasswordRequest"}}],"responses":{"202":{"description":"Accepted"},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Email a password reset link","tags":["auth"]}},"/auth/password/reset":{"post":{"consumes":["application/json"],"description":"Uses the token from the reset email. Signs the user out everywhere.","parameters":[{"description":"Token and new password","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ResetPasswordRequest"}}],"responses":{"204":{"description":"No Content"},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Choose a new password","tags":["auth"]}},"/auth/refresh":{"post":{"description":"Cookie only: reads and rotates bpm_refresh. Any Authorization header is ignored.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AuthResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Refresh the access token","tags":["auth"]}},"/auth/signup":{"post":{"consumes":["application/json"],"description":"Records name, email and password and emails a 6-digit verification code.","parameters":[{"description":"Account details","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/StartSignupRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/SignupState"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Start a sign-up","tags":["auth"]}},"/auth/signup/{id}/complete":{"post":{"consumes":["application/json"],"description":"Creates the organisation's workspace, default roles and the owner account. Exchange handoff_token at the workspace's own address via POST /auth/handoff.","parameters":[{"description":"Sign-up id","in":"path","name":"id","required":true,"type":"string"},{"description":"Organisation","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CompleteSignupRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/CompleteSignupResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Create the workspace","tags":["auth"]}},"/auth/signup/{id}/join":{"post":{"consumes":["application/json"],"description":"For a verified sign-up whose address matches the workspace's allowed domains (see join-options; 404 join_unavailable otherwise). Stores the sign-up's name and password for 14 days; the workspace's user managers are notified. One request per address per workspace (409 join_already_requested), at most 5 per address per day (429 join_limit).","parameters":[{"description":"Sign-up id","in":"path","name":"id","required":true,"type":"string"},{"description":"Workspace","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/JoinRequestBody"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/JoinOption"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Ask to join a workspace","tags":["auth"]}},"/auth/signup/{id}/join-options":{"get":{"description":"Only after the email is verified (409 signup_not_verified before): the switched-on workspaces whose allowed domains include the address's domain, with name and active member count. Workspaces the address already belongs to (or was removed from) are left out.","parameters":[{"description":"Sign-up id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/JoinOption"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Workspaces this sign-up may ask to join","tags":["auth"]}},"/auth/signup/{id}/resend":{"post":{"parameters":[{"description":"Sign-up id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SignupState"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Send a new verification code","tags":["auth"]}},"/auth/signup/{id}/verify":{"post":{"consumes":["application/json"],"parameters":[{"description":"Sign-up id","in":"path","name":"id","required":true,"type":"string"},{"description":"Code","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/VerifySignupRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SignupState"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Confirm the emailed code","tags":["auth"]}},"/auth/sso":{"get":{"description":"The providers the root address's sign-in page can offer (microsoft, google). A workspace's own page reads its accepted ones from GET /auth/workspace.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SSOProvidersResponse"}}},"summary":"Single sign-on providers on this server","tags":["auth"]}},"/auth/sso/callback":{"get":{"description":"Where the provider sends the browser back. A workspace sign-in redirects to that workspace's /continue#handoff=…; a root one to /login#sso=… (exchange it at POST /auth/sso/choices). Failures redirect to the sign-in page with ?sso_error=.","parameters":[{"description":"From the start","in":"query","name":"state","required":true,"type":"string"},{"description":"From the provider","in":"query","name":"code","type":"string"}],"responses":{"302":{"description":"To the workspace or the sign-in page","schema":{"type":"string"}}},"summary":"Single sign-on callback","tags":["auth"]}},"/auth/sso/choices":{"post":{"consumes":["application/json"],"description":"Root address only, once per ticket (2 minutes), from the browser that started the sign-in. Like POST /auth/login/lookup: each workspace with a one-time handoff_token.","parameters":[{"description":"Ticket","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SSOChoicesRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/WorkspaceChoiceResponse"},"type":"array"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Workspaces a root single sign-on opens","tags":["auth"]}},"/auth/sso/start/{provider}":{"get":{"description":"Root address only, as a page navigation. Redirects to the provider's sign-in; with workspace (a subdomain) the sign-in is for that workspace, which must accept the provider. Failures redirect to the sign-in page with ?sso_error=.","parameters":[{"description":"microsoft or google","in":"path","name":"provider","required":true,"type":"string"},{"description":"Workspace subdomain","in":"query","name":"workspace","type":"string"}],"responses":{"302":{"description":"To the provider","schema":{"type":"string"}}},"summary":"Start a single sign-on","tags":["auth"]}},"/auth/subdomains/{subdomain}":{"get":{"description":"Validates the format and reports whether {subdomain}.backlog.pm is free, with alternatives when it isn't.","parameters":[{"description":"Proposed subdomain","in":"path","name":"subdomain","required":true,"type":"string"},{"description":"ISO 3166-1 alpha-2, used for suggestions","in":"query","name":"country_code","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SubdomainAvailability"}}},"summary":"Check a sign-in address","tags":["auth"]}},"/auth/workspace":{"get":{"description":"Name and address shown on a workspace's sign-in page. 404 when the host is not a workspace.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/WorkspaceHostResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Workspace behind the request host","tags":["auth"]}},"/backlog-groups/{id}":{"delete":{"description":"Deletes an open sprint or a kanban group; its issues move to the end of the team's next group of the same kind, or the previous one. A team keeps at least one group, a kanban team its \"Selected for development\", and completed sprints stay.","parameters":[{"description":"Backlog group id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a backlog group","tags":["sprints"]},"patch":{"consumes":["application/json"],"description":"Renames a sprint or a kanban group; a sprint that isn't completed can also get new dates.","parameters":[{"description":"Backlog group id","in":"path","name":"id","required":true,"type":"string"},{"description":"Name","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/RenameGroupRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/BacklogGroup"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Edit a backlog group","tags":["sprints"]}},"/board-columns/{id}":{"delete":{"description":"Removes a working status; its issues, wherever they are, move to move_to (another column, required when there are any), taking its status. To do and Done can't be deleted. Needs edit on sprints.","parameters":[{"description":"Column id","in":"path","name":"id","required":true,"type":"string"},{"description":"Column id its issues move to","in":"query","name":"move_to","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/BoardColumn"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete a board column","tags":["sprints"]},"put":{"consumes":["application/json"],"description":"Saves the whole column: name, colour and WIP limit (its status is fixed). Names are unique on a board. Needs edit on sprints.","parameters":[{"description":"Column id","in":"path","name":"id","required":true,"type":"string"},{"description":"Column","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/BoardColumnRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/BoardColumn"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Update a board column","tags":["sprints"]}},"/changes":{"get":{"description":"The workspace's change feed, oldest first: every work item, support request, documentation page, artifact, release, sprint or group, milestone and space that was created, changed, commented on, archived, restored or deleted, with who did it and which fields changed (old and new values for work items and requests). Only what you can see. It says what changed, not the content: fetch the item for that.\n\nKeep the next_cursor and pass it as cursor on the next call to get only what changed since; while has_more is true there is more right away (a page can hold fewer than limit entries, since items you can't see are skipped). Without cursor the feed starts at since, or 24 hours ago. A cursor works for 30 days; an older one answers 410 cursor_expired: read the items again and start from a new cursor.","parameters":[{"description":"Where the last call ended (its next_cursor)","in":"query","name":"cursor","type":"string"},{"description":"Start here when there is no cursor: RFC 3339 time or YYYY-MM-DD (at most 30 days ago)","in":"query","name":"since","type":"string"},{"description":"Only these kinds, comma-separated: issue, request, doc, artifact, release, group, milestone, space","in":"query","name":"kinds","type":"string"},{"description":"Only this space (key or id); a team also holds the work items it does","in":"query","name":"space","type":"string"},{"description":"At most this many rows (default 50, max 200)","in":"query","name":"limit","type":"integer"},{"description":"While nothing is new, wait up to this many seconds (at most 30) and answer as soon as something is","in":"query","name":"wait","type":"integer"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/ChangePage"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"410":{"description":"Gone","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"What changed","tags":["changes"]}},"/code-hosting":{"get":{"description":"GitHub, GitLab and Bitbucket connections with secret and token hints (never the secrets) and repository counts. Needs view on Integrations \u0026 MCP.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/CodeConnection"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Code-hosting connections","tags":["integrations"]},"post":{"consumes":["application/json"],"description":"Creates the provider's connection with a new webhook secret, returned in this response only. The access token is optional and sealed at rest. Needs edit on Integrations \u0026 MCP and a signed-in session.","parameters":[{"description":"Provider","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ConnectCodeHostRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/NewCodeConnection"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Connect a code host","tags":["integrations"]}},"/code-hosting/{id}":{"delete":{"description":"Deletes the connection: webhooks stop at once, and its repositories and branch, commit and pull request links are removed. Needs edit on Integrations \u0026 MCP and a signed-in session.","parameters":[{"description":"Connection id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Disconnect a code host","tags":["integrations"]}},"/code-hosting/{id}/repos":{"get":{"description":"Repositories seen in webhooks or loaded with the access token, with the product each is linked to. Needs view on Integrations \u0026 MCP.","parameters":[{"description":"Connection id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/CodeRepo"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"A connection's repositories","tags":["integrations"]}},"/code-hosting/{id}/repos/load":{"post":{"description":"Reads the repositories the access token can see (at most 1000) from the provider's API and records them. Needs edit on Integrations \u0026 MCP.","parameters":[{"description":"Connection id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/CodeRepo"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Load repositories","tags":["integrations"]}},"/code-hosting/{id}/rotate-secret":{"post":{"description":"A new secret, returned in this response only; deliveries signed with the old one fail from now on. Needs edit on Integrations \u0026 MCP and a signed-in session.","parameters":[{"description":"Connection id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/NewCodeConnection"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Rotate the webhook secret","tags":["integrations"]}},"/code-hosting/{id}/token":{"put":{"consumes":["application/json"],"description":"Replaces (or with an empty value removes) the access token used to load repositories, and a self-managed GitLab's base URL. Needs edit on Integrations \u0026 MCP and a signed-in session.","parameters":[{"description":"Connection id","in":"path","name":"id","required":true,"type":"string"},{"description":"Token","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SetCodeHostTokenRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/CodeConnection"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Set the access token","tags":["integrations"]}},"/code-repos/{id}":{"put":{"consumes":["application/json"],"description":"Links the repository to a live product space, or unlinks it with null. Needs edit on Integrations \u0026 MCP.","parameters":[{"description":"Repository id","in":"path","name":"id","required":true,"type":"string"},{"description":"Product","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/LinkCodeRepoRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/CodeRepo"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Link a repository to a product","tags":["integrations"]}},"/comments/{id}":{"delete":{"parameters":[{"description":"Comment id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete your comment on an issue","tags":["comments"]}},"/docs/comments/{id}":{"delete":{"parameters":[{"description":"Comment id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete your comment on a doc block","tags":["comments"]}},"/docs/pages":{"post":{"consumes":["application/json"],"description":"At the end of its section, or under parent (same section). Starts with one empty text block unless blocks are given. Saved as version 1.","parameters":[{"description":"Page","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CreateDocPageRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/DocPage"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a docs page","tags":["docs"]}},"/docs/pages/{id}":{"get":{"parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DocPage"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"A docs page with its content","tags":["docs"]},"put":{"consumes":["application/json"],"description":"Replaces title, icon, width, draft flag, link and blocks. Each save keeps a version; saves by the same person within 45 seconds update their latest version. With base_version, 409 page_changed when someone else saved newer content first. Links and image/embed URLs must be http(s).","parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"},{"description":"Content","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SaveDocPageRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DocPage"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save a docs page (autosave)","tags":["docs"]}},"/docs/pages/{id}/archive":{"post":{"description":"Its sub-pages go along.","parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Move a docs page to the archive","tags":["docs"]}},"/docs/pages/{id}/comments":{"get":{"description":"One thread per block, with whether it is resolved.","parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/DocThread"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Comment threads on a docs page","tags":["comments"]},"post":{"consumes":["application/json"],"description":"Adds to the block's thread and reopens it if it was resolved.","parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"},{"description":"Comment","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/BlockCommentRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/DocThread"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Comment on a doc block","tags":["comments"]}},"/docs/pages/{id}/images":{"post":{"consumes":["multipart/form-data"],"description":"multipart/form-data with one \"file\" part: PNG, JPEG, GIF or WebP up to 10 MB. Put the returned id in an image block's file_id. Needs edit on the page's docs.","parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"},{"description":"The image","in":"formData","name":"file","required":true,"type":"file"}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Attachment"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Upload an image into a docs page","tags":["attachments"]}},"/docs/pages/{id}/move":{"post":{"consumes":["application/json"],"description":"Into a section, under a parent (never itself or a page below it), after a sibling (null = first). Sub-pages move along.","parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"},{"description":"Placement","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MoveDocPageRequest"}}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Move a docs page","tags":["docs"]}},"/docs/pages/{id}/restore":{"post":{"description":"With the sub-pages archived along with it. If its parent is still archived it returns to the top of its section.","parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Restore a docs page from the archive","tags":["docs"]}},"/docs/pages/{id}/revisions":{"get":{"description":"Newest first. Summary codes: created, renamed:\u003ctitle\u003e, blocks:\u003cadded\u003e:\u003cedited\u003e:\u003cremoved\u003e, width:\u003cwidth\u003e, restored:\u003cn\u003e.","parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/DocRevision"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Saved versions of a docs page","tags":["docs"]}},"/docs/pages/{id}/revisions/{number}/restore":{"post":{"description":"The version's title, icon, width and blocks become the page's content, saved as a new version.","parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"},{"description":"Version number","in":"path","name":"number","required":true,"type":"integer"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DocPage"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Restore an older version of a docs page","tags":["docs"]}},"/docs/pages/{id}/share":{"post":{"consumes":["application/json"],"description":"Up to 20 workspace members get a notification (and its email) with a link; only those who may open the page see it.","parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"},{"description":"Recipients","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ShareDocPageRequest"}}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Send a doc page to people","tags":["docs"]}},"/docs/pages/{id}/threads/{block}/reopen":{"post":{"parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"},{"description":"Block id","in":"path","name":"block","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/DocThread"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Reopen a block's thread","tags":["comments"]}},"/docs/pages/{id}/threads/{block}/resolve":{"post":{"parameters":[{"description":"Page id","in":"path","name":"id","required":true,"type":"string"},{"description":"Block id","in":"path","name":"block","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/DocThread"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Resolve a block's thread","tags":["comments"]}},"/docs/sections":{"post":{"consumes":["application/json"],"description":"Added at the end of the tree. Needs edit on space or workspace documentation.","parameters":[{"description":"Section","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CreateDocSectionRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/DocSection"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a docs section","tags":["docs"]}},"/docs/sections/{id}":{"delete":{"description":"Its pages (live and archived) move to the section before it (the next one for the first). The last section can't be deleted (409 section_last).","parameters":[{"description":"Section id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete a docs section","tags":["docs"]},"patch":{"consumes":["application/json"],"parameters":[{"description":"Section id","in":"path","name":"id","required":true,"type":"string"},{"description":"Name","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/RenameDocSectionRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DocSection"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Rename a docs section","tags":["docs"]}},"/docs/sections/{id}/help-centre":{"put":{"consumes":["application/json"],"description":"Support spaces only: the section's published pages become help centre articles customers can read and search.","parameters":[{"description":"Section id","in":"path","name":"id","required":true,"type":"string"},{"description":"On or off","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/HelpCentreSectionRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DocSection"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Show a section in the help centre","tags":["docs"]}},"/docs/sections/{id}/move":{"post":{"consumes":["application/json"],"parameters":[{"description":"Section id","in":"path","name":"id","required":true,"type":"string"},{"description":"Position","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MoveAfterRequest"}}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Reorder a docs section","tags":["docs"]}},"/docs/tree":{"get":{"description":"Overview page, sections, live pages and the archive (pages without content). Without space_id: the workspace's own docs. A scope opened for the first time gets an overview, a \"General\" section and a welcome page.","parameters":[{"description":"Space id; omit for workspace docs","in":"query","name":"space_id","type":"string"},{"description":"Only pages (live and archived) changed at or after this: RFC 3339 time or YYYY-MM-DD. To follow every change, use GET /changes.","in":"query","name":"updated_since","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Tree"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Documentation of a space or the workspace","tags":["docs"]}},"/email/unsubscribe":{"get":{"description":"Public, on the workspace host. `t` is the token from an email's \"Turn off\" link; it names one person's one setting.","parameters":[{"description":"Token from the email","in":"query","name":"t","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Unsubscribe"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"What an unsubscribe link turns off","tags":["users"]},"post":{"description":"Public, on the workspace host. The one-click unsubscribe of RFC 8058: mail clients POST here with the form body `List-Unsubscribe=One-Click`, which is ignored (the token in `t` says everything), so this route takes any body. Repeating it is harmless.","parameters":[{"description":"Token from the email","in":"query","name":"t","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Unsubscribe"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Turn off one email setting by link","tags":["users"]}},"/features":{"get":{"description":"Every feature and whether it is on, alphabetical. Readable by every signed-in user.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/FeatureFlag"},"type":"array"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Feature toggles","tags":["features"]}},"/features/{feature}":{"put":{"consumes":["application/json"],"description":"Owner only. Turning a feature off hides it for everyone; its data is kept.","parameters":[{"description":"Feature","enum":["ai","docs","mcp","portfolios","roadmap","support"],"in":"path","name":"feature","required":true,"type":"string"},{"description":"State","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SetFeatureRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/FeatureFlag"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Turn a feature on or off","tags":["features"]}},"/health":{"get":{"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/HealthResponse"}}},"summary":"Liveness probe","tags":["system"]}},"/hooks/{provider}/{id}":{"post":{"consumes":["application/json"],"description":"Where GitHub, GitLab and Bitbucket post events, on the workspace host. No sign-in: the delivery must carry the connection's signature (GitHub X-Hub-Signature-256, Bitbucket X-Hub-Signature, GitLab X-Gitlab-Token), checked before the body is read; a wrong one answers 401 and stores nothing. Pushes, branch create/delete and pull/merge requests link to the issues whose keys they mention. At most 1 MB.","parameters":[{"description":"github, gitlab or bitbucket","in":"path","name":"provider","required":true,"type":"string"},{"description":"Connection id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/HookResult"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Code-hosting webhook","tags":["integrations"]}},"/imports":{"get":{"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/Job"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Import history","tags":["imports"]},"post":{"consumes":["application/json"],"description":"Every row with a title becomes a work item in the product space (type, status, priority and points mapped by name where columns are given). Keeps a record in the history. Needs edit on Imports and on issues.","parameters":[{"description":"Import","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/RunImportRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Job"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Import a CSV file of issues","tags":["imports"]}},"/imports/connect":{"post":{"consumes":["application/json"],"description":"Checks the credentials with a cheap call and lists the projects, spaces or boards (with counts where the source gives them). Nothing is stored; credentials are never logged or returned. Jira and Confluence: https site URL, email and API token. Trello: API key and token. Needs edit on Imports and a session (not a personal token).","parameters":[{"description":"Source and credentials","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ImportConnectRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Connected"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Connect to Jira, Confluence or Trello","tags":["imports"]}},"/imports/fields":{"post":{"consumes":["application/json"],"description":"Jira: the issue types and statuses of the chosen projects. Trello: the lists of the chosen boards. Plus the issue types of the target product spaces. Needs edit on Imports and a session.","parameters":[{"description":"Chosen items","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ImportFieldsRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/MapOptions"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"What the map step offers","tags":["imports"]}},"/imports/preview":{"post":{"consumes":["application/json"],"description":"Header and the first 5 rows; nothing is created. Up to 2 MB and 5000 rows. Needs edit on Imports.","parameters":[{"description":"File","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ImportPreviewRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Preview"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Read a CSV file before importing","tags":["imports"]}},"/imports/start":{"post":{"consumes":["application/json"],"description":"Queues a background import (poll GET /imports/{id}). Jira projects and Trello boards go into product spaces (Trello optionally with a team), keeping the hierarchy where the scheme allows; Confluence spaces become sections of workspace or space documentation. Items imported before into the same target are skipped. At most 20,000 items. The credentials are sealed on the job and wiped when it ends. One import at a time per workspace (409 import_running). Needs edit on Imports, edit on the targets' issues or docs, and a session.","parameters":[{"description":"Import","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/StartInput"}}],"produces":["application/json"],"responses":{"202":{"description":"Accepted","schema":{"$ref":"#/definitions/Job"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Start an import from Jira, Confluence or Trello","tags":["imports"]}},"/imports/{id}":{"get":{"parameters":[{"description":"Import id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Job"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"One import with its progress","tags":["imports"]}},"/imports/{id}/cancel":{"post":{"description":"A queued import stops at once, a running one after its current batch; what was imported stays. Needs edit on Imports and a session.","parameters":[{"description":"Import id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Job"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Cancel an import","tags":["imports"]}},"/invites":{"post":{"consumes":["application/json"],"description":"Adds an invited user with a role and emails them a link that works for 7 days. Anyone but Owner can be given. A removed user is invited again.","parameters":[{"description":"Invite","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/InviteRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/WorkspaceUser"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Invite someone","tags":["users"]}},"/invites/bulk":{"post":{"consumes":["application/json"],"description":"Up to 50 addresses with one role; each is invited as with POST /invites. One that is malformed, already in the workspace or already invited is reported and skipped; the rest still go out.","parameters":[{"description":"Invites","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/BulkInviteRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/InviteResult"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Invite several people","tags":["users"]}},"/issues/bulk/delete":{"post":{"consumes":["application/json"],"description":"Deletes issues and every issue below them, with their comments, files and history. Each must be one the caller can edit. All or nothing.","parameters":[{"description":"Issues","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/BulkDeleteRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/BulkDeleteResponse"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete issues","tags":["issues"]}},"/issues/bulk/edit":{"post":{"consumes":["application/json"],"description":"Sets the same status, priority, assignees, points, due date or extra labels on each issue, with the checks of a single update. All or nothing.","parameters":[{"description":"Issues and changes","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/BulkEditRequest"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Edit several issues at once","tags":["issues"]}},"/issues/bulk/move":{"post":{"consumes":["application/json"],"description":"Moves product-level issues as one block, in the given order: after another issue, or to the top or bottom of a section. All or nothing.","parameters":[{"description":"Issues and position","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/BulkMoveRequest"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Re-rank several issues","tags":["issues"]}},"/issues/bulk/place":{"post":{"consumes":["application/json"],"description":"Places issues (with their sub-issues) as one block, in the given order. Same rules as placing one issue; all or nothing.","parameters":[{"description":"Issues and target","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/BulkPlaceRequest"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Move several issues into a backlog group or the team queue","tags":["sprints"]}},"/issues/bulk/team":{"post":{"consumes":["application/json"],"description":"Sets the team of product-level issues. Moving to another team drops the old team's sprint and queue position. All or nothing.","parameters":[{"description":"Issues and team","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/BulkTeamRequest"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Hand several issues to a team","tags":["issues"]}},"/issues/by-key/{key}":{"get":{"parameters":[{"description":"Issue key, e.g. UPM-142 or ACME-12","in":"path","name":"key","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Issue"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Issue by key","tags":["issues"]}},"/issues/{id}":{"put":{"consumes":["application/json"],"description":"Saves every editable field, or with base only the fields changed since base (409 issue_changed when someone else changed one of them differently). The type can change within its scope if the parent and children still fit.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"Fields","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/IssueSaveRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Issue"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save an issue","tags":["issues"]}},"/issues/{id}/attachments":{"get":{"parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/Attachment"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Files on an issue","tags":["attachments"]},"post":{"consumes":["multipart/form-data"],"description":"multipart/form-data with one \"file\" part, up to 10 MB; at most 50 files per issue. The type is detected from the content. Needs edit on comments.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"The file","in":"formData","name":"file","required":true,"type":"file"}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Attachment"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Attach a file to an issue","tags":["attachments"]}},"/issues/{id}/board-move":{"post":{"consumes":["application/json"],"description":"Drops an issue on its board (sprint or Kanban board) in a column; it takes the column's status. Refused (409 wip_limit_reached) when the column enforces a WIP limit it has reached. Needs edit on issues.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"Column","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/BoardMoveRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Issue"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Move an issue to a board column","tags":["sprints"]}},"/issues/{id}/comments":{"get":{"description":"Oldest first, with when the caller last read the thread (for \"new\" marks). Needs view on comments.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"Only comments written at or after this: RFC 3339 time or YYYY-MM-DD","in":"query","name":"since","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/IssueComments"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Comments on an issue","tags":["comments"]},"post":{"consumes":["application/json"],"description":"Saves immediately. Needs edit on comments (viewers can comment by default).","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"Comment","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CommentRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/IssueComments"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Comment on an issue","tags":["comments"]}},"/issues/{id}/comments/seen":{"post":{"parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Mark an issue's comments read","tags":["comments"]}},"/issues/{id}/development":{"get":{"description":"Branches, pull requests and the latest commits that mention the issue's key. Readable by anyone who can read the issue.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/IssueDevelopment"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"An issue's development","tags":["issues"]}},"/issues/{id}/history":{"get":{"description":"Who changed what, and when, newest first (at most 500). Values read as they did then; imported lines keep the source's wording.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/IssueChange"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Issue history","tags":["issues"]}},"/issues/{id}/links":{"get":{"description":"Dependencies (blocks / is blocked by) and related items, seen from this issue.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/LinkedIssue"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"An issue's links","tags":["issues"]},"post":{"consumes":["application/json"],"description":"Adds a dependency or related item; replaces an existing link between the same two issues.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"Link","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/LinkIssueRequest"}}],"responses":{"204":{"description":"No Content"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Link two issues","tags":["issues"]}},"/issues/{id}/links/{other}":{"delete":{"parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"The linked issue's id","in":"path","name":"other","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a link","tags":["issues"]}},"/issues/{id}/move":{"post":{"consumes":["application/json"],"description":"Moves a product-level issue after another one, or to the top or bottom of its section.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"Position","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MoveIssueRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Issue"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Re-rank an issue","tags":["issues"]}},"/issues/{id}/nest":{"post":{"consumes":["application/json"],"description":"As when dropping a row onto another: a sub-task changes parent; any other work item becomes a sub-task (its sub-tasks move along). It takes the parent's team, sprint and board placement.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"New parent","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/NestIssueRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Issue"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Put an issue under a work item","tags":["issues"]}},"/issues/{id}/place":{"post":{"consumes":["application/json"],"description":"Places the issue (and its sub-issues) after another one, or at the top/bottom. Into a sprint or kanban group: its team becomes the issue's team. Into the queue: the status resets to To do unless done.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"Target","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PlaceIssueRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Issue"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Move an issue into a backlog group or the team queue","tags":["sprints"]}},"/issues/{id}/release":{"put":{"consumes":["application/json"],"description":"Moves the issue out of every other unreleased release; shipped releases keep their history.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"Release","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/IssueReleaseRequest"}}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Set an issue's release","tags":["releases"]}},"/issues/{id}/status":{"put":{"consumes":["application/json"],"description":"Status only, as when dragging a card between board columns.","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"Status","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/IssueStatusRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Issue"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Change an issue's status","tags":["issues"]}},"/issues/{id}/topic-place":{"post":{"consumes":["application/json"],"description":"The Topics page drag: re-ranks the siblings in the given order and, when parent_id changes, moves the topic under it (parent rules apply).","parameters":[{"description":"Issue id","in":"path","name":"id","required":true,"type":"string"},{"description":"Placement","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PlaceTopicRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Issue"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/ErrorBody"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Reorder or move a topic","tags":["roadmap"]}},"/join-requests":{"get":{"description":"People at an allowed domain who asked to join, newest first; expired ones (14 days) are left out. Needs edit on users.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/JoinRequest"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Open join requests","tags":["users"]}},"/join-requests/{id}/approve":{"post":{"consumes":["application/json"],"description":"Adds the person with the role (default Member; no stronger than yours, 403 level_above_yours) and the password they chose; they are emailed the sign-in link. Needs edit on users and a signed-in session. 409 user_exists when the address joined meanwhile.","parameters":[{"description":"Join request id","in":"path","name":"id","required":true,"type":"string"},{"description":"Role","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ApproveJoinRequestBody"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/WorkspaceUser"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Approve a join request","tags":["users"]}},"/join-requests/{id}/decline":{"post":{"consumes":["application/json"],"description":"Removes it from the list; the address can't ask again until the request would have expired. With notify, the person gets an email (with the message). Needs edit on users and a signed-in session.","parameters":[{"description":"Join request id","in":"path","name":"id","required":true,"type":"string"},{"description":"Decline","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/DeclineJoinRequestBody"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Decline a join request","tags":["users"]}},"/labels":{"get":{"description":"Every label in the workspace with its colour, alphabetically, for pickers, filters and the label list. Saving an issue with a new name adds it. counts=true adds how many issues carry each. Needs view on issues.","parameters":[{"description":"Include issue counts","in":"query","name":"counts","type":"boolean"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/Label"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Workspace labels","tags":["issues"]},"post":{"consumes":["application/json"],"description":"Adds a label to the list. Names are unique ignoring case (409 label_name_taken). Needs edit on types.","parameters":[{"description":"Label","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/LabelRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Label"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a label","tags":["issues"]}},"/labels/{id}":{"delete":{"description":"Removes it from the list and from every issue and board filter (not recorded in issue history). Needs edit on types.","parameters":[{"description":"Label id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete a label","tags":["issues"]},"put":{"consumes":["application/json"],"description":"A new name replaces the old one on every issue and board filter (not recorded in issue history). Names are unique ignoring case (409 label_name_taken). Needs edit on types.","parameters":[{"description":"Label id","in":"path","name":"id","required":true,"type":"string"},{"description":"Label","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/LabelRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Label"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Rename or recolour a label","tags":["issues"]}},"/live":{"get":{"description":"A text/event-stream of server-sent events. Each event is named after its kind (\"event: issue\") and its data line is a LiveHint: a signal to refetch through the normal endpoints, never content. Only hints about things you can see are sent; notifications only to their recipient. A \": ping\" comment comes every 25 s. The stream ends when the access token expires (event \"expired\": refresh, then reconnect), the session ends, the workspace is held for deletion or the server stops. Needs a signed-in session: personal tokens get 403 session_required. At most 5 streams per person.","produces":["text/event-stream"],"responses":{"200":{"description":"One event's data","schema":{"$ref":"#/definitions/LiveHint"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Real-time hints","tags":["live"]}},"/mcp":{"post":{"consumes":["application/json"],"description":"JSON-RPC 2.0 over POST: initialize, ping, tools/list, tools/call, resources/list, resources/templates/list, resources/read, prompts/list, prompts/get. Authenticate with an MCP token (Authorization: Bearer bpm_pat_…): one made in the MCP settings, or one an OAuth sign-in gave the client (a 401 names the metadata, RFC 9728). On a workspace's host the host names the workspace; on the root address the token does. Tools act as the token's owner, in every space they can see, with their role. Write tools take an idempotency_key: a retry with the same key answers with the first result. Hidden (404) while MCP is off.","parameters":[{"description":"JSON-RPC request","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/Request"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Response"}},"202":{"description":"Accepted"},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/Response"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/Response"}}},"summary":"MCP server (Streamable HTTP)","tags":["mcp"]}},"/mcp-clients":{"get":{"description":"The caller's MCP tokens; everyone's with edit on Integrations \u0026 MCP. Tokens are never returned after creation.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/PersonalToken"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"MCP clients","tags":["mcp"]},"post":{"consumes":["application/json"],"description":"Creates a personal token for an assistant (Claude, Cursor, VS Code…). The token is in this response only. Needs a signed-in session, not a token.","parameters":[{"description":"Client name","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CreateTokenRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/NewPersonalToken"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Connect an MCP client","tags":["mcp"]}},"/mcp-clients/{id}":{"delete":{"description":"Signs the client out immediately. Own tokens, or anyone's with edit on Integrations \u0026 MCP.","parameters":[{"description":"Token id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Revoke an MCP client","tags":["mcp"]}},"/me":{"get":{"description":"User, role, effective permission level per area and the workspace.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Me"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"The signed-in user","tags":["users"]}},"/me/avatar":{"delete":{"responses":{"204":{"description":"No Content"}},"security":[{"BearerAuth":[]}],"summary":"Remove your profile picture","tags":["attachments"]},"post":{"consumes":["multipart/form-data"],"description":"multipart/form-data with one \"file\" part: PNG, JPEG, GIF or WebP up to 10 MB. Replaces the current one. Everyone in the workspace sees it.","parameters":[{"description":"The image","in":"formData","name":"file","required":true,"type":"file"}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Attachment"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Upload your profile picture","tags":["attachments"]}},"/me/delete":{"post":{"consumes":["application/json"],"description":"Deletes your own login (not the workspace): your name and email are wiped and what you made shows as \"Deleted user\". Signs you out everywhere. Asks for your current password. 409 last_owner for the workspace's only Owner. Needs a signed-in session.","parameters":[{"description":"Confirmation","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/DeleteProfileRequest"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete your profile","tags":["me"]}},"/me/email":{"post":{"consumes":["application/json"],"description":"Checks your password and emails a 6-digit code to the new address (valid 15 minutes). Nothing changes until the code is confirmed.","parameters":[{"description":"New email and current password","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/EmailChangeRequest"}}],"responses":{"202":{"description":"Accepted"},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Start changing your sign-in email","tags":["users"]}},"/me/email-settings":{"get":{"description":"The master switch and every email setting (Profile → Notifications), defaults filled in, in display order. Security alerts have no setting: they always go out.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/EmailSettings"}}},"security":[{"BearerAuth":[]}],"summary":"Your email settings","tags":["users"]},"put":{"consumes":["application/json"],"description":"Turns the master switch (off stops every email but security alerts) and the settings listed on or off; the others keep their value. The in-app inbox is not affected.","parameters":[{"description":"Changes","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/EmailSettingsRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/EmailSettings"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Change your email settings","tags":["users"]}},"/me/email/confirm":{"post":{"consumes":["application/json"],"description":"The code emailed to the new address. Your old address gets a notice.","parameters":[{"description":"The code","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/EmailConfirmRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/User"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Confirm your new sign-in email","tags":["users"]}},"/me/mfa":{"get":{"description":"Your authenticator app, passkeys and recovery codes left, and whether the workspace requires it of you (setup_by: until when you can sign in without it). Needs a signed-in session.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/MFAStatus"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Your two-step verification","tags":["me"]}},"/me/mfa/passkeys":{"post":{"consumes":["application/json"],"description":"The credential navigator.credentials.create returned. When it's your first second step, the response carries recovery codes (shown once).","parameters":[{"description":"Credential","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/AddPasskeyRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/PasskeyAddedResponse"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a passkey","tags":["me"]}},"/me/mfa/passkeys/options":{"post":{"consumes":["application/json"],"description":"Options for navigator.credentials.create and the token to send back with its result (POST /me/mfa/passkeys). Asks for your current password.","parameters":[{"description":"Current password","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PasswordRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PasskeyOptionsResponse"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Start adding a passkey","tags":["me"]}},"/me/mfa/passkeys/{id}":{"delete":{"consumes":["application/json"],"description":"Asks for your current password. 409 mfa_required when it's your last second step and the workspace requires one.","parameters":[{"description":"Passkey id","in":"path","name":"id","required":true,"type":"string"},{"description":"Current password","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PasswordRequest"}}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a passkey","tags":["me"]}},"/me/mfa/recovery-codes":{"post":{"consumes":["application/json"],"description":"Replaces your recovery codes (the old ones stop working); shown once. Needs two-step verification on and your current password.","parameters":[{"description":"Current password","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PasswordRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RecoveryCodesResponse"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"New recovery codes","tags":["me"]}},"/me/mfa/totp":{"delete":{"consumes":["application/json"],"description":"Asks for your current password. 409 mfa_required when it's your last second step and the workspace requires one.","parameters":[{"description":"Current password","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PasswordRequest"}}],"responses":{"204":{"description":"No Content"},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Turn off the authenticator app","tags":["me"]},"post":{"consumes":["application/json"],"description":"A new secret to scan; it turns on with its first code (POST /me/mfa/totp/confirm). Asks for your current password. 409 totp_exists while one is on.","parameters":[{"description":"Current password","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PasswordRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/TotpSetupResponse"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Start adding an authenticator app","tags":["me"]}},"/me/mfa/totp/confirm":{"post":{"consumes":["application/json"],"description":"The first code from the app. When it's your first second step, the response carries recovery codes (shown once).","parameters":[{"description":"Code","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/TotpConfirmRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RecoveryCodesResponse"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Turn on the authenticator app","tags":["me"]}},"/me/password":{"post":{"consumes":["application/json"],"description":"Checks the current password. Every session and personal token of yours ends; this response carries a new session (and refresh cookie). Needs a signed-in session, not a token.","parameters":[{"description":"Passwords","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ChangePasswordRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/AuthResponse"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Change your password","tags":["auth"]}},"/me/password/reset-link":{"post":{"description":"Sends a one-time link (30 minutes) to your sign-in email to choose a new password. Needs a signed-in session.","responses":{"202":{"description":"Accepted"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Email yourself a password reset link","tags":["me"]}},"/me/profile":{"put":{"consumes":["application/json"],"description":"Name, job title, language, theme, and time zone (IANA name; empty = the browser's). Email settings: PUT /me/email-settings. The email can't be changed here.","parameters":[{"description":"Profile","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/UpdateProfileRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/User"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Update your profile","tags":["users"]}},"/me/welcome":{"post":{"description":"Records that you closed the welcome shown after sign-up (skipped, created spaces or went to import), so GET /me answers show_welcome false from now on, on every device. Safe to repeat. Needs a signed-in session (403 session_required for personal tokens).","responses":{"204":{"description":"No Content"},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Close the first-login welcome","tags":["users"]}},"/milestones":{"post":{"consumes":["application/json"],"description":"Adds a milestone to a space roadmap, or to the workspace roadmap when space_id is null.","parameters":[{"description":"Milestone","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MilestoneRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Milestone"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/ErrorBody"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a milestone","tags":["roadmap"]}},"/milestones/{id}":{"delete":{"parameters":[{"description":"Milestone id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete a milestone","tags":["roadmap"]},"put":{"consumes":["application/json"],"parameters":[{"description":"Milestone id","in":"path","name":"id","required":true,"type":"string"},{"description":"Milestone","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MilestoneRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Milestone"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Edit a milestone","tags":["roadmap"]}},"/notifications":{"get":{"description":"Newest first, with the unread total. Only notifications about things you can still see (live spaces you have access to, areas you can view).","parameters":[{"description":"Only unread ones","in":"query","name":"unread","type":"boolean"},{"description":"At most this many (default 50, max 100)","in":"query","name":"limit","type":"integer"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Notifications"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Your notifications","tags":["notifications"]}},"/notifications/read-all":{"post":{"responses":{"204":{"description":"No Content"},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Mark all your notifications read","tags":["notifications"]}},"/notifications/unread-count":{"get":{"description":"What the header bell polls.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/UnreadCount"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Count your unread notifications","tags":["notifications"]}},"/notifications/{id}/read":{"post":{"parameters":[{"description":"Notification id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Mark a notification read","tags":["notifications"]}},"/oauth/register":{"post":{"consumes":["application/json"],"description":"Dynamic client registration (RFC 7591). Public clients only: no secret, PKCE on every authorization. Redirects must be https, http on localhost, or an app's own scheme.","parameters":[{"description":"Client metadata","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/OAuthRegisterRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/OAuthClientResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/OAuthErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Register an MCP client","tags":["oauth"]}},"/oauth/requests":{"post":{"consumes":["application/json"],"description":"The authorize page hands over its query string. Checks the client, its redirect, PKCE and the MCP address asked for, and keeps the request for 10 minutes while the person signs in.","parameters":[{"description":"Authorization request","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/OAuthAuthorizeRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/OAuthPendingResponse"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Start connecting an MCP client","tags":["oauth"]}},"/oauth/requests/{id}":{"get":{"description":"For the consent screen on the workspace's host: the client and where it sends you back. The client acts as you, in every space you can see. Session only.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/OAuthConsentResponse"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"What an MCP client asks to do","tags":["oauth"]}},"/oauth/requests/{id}/approve":{"post":{"description":"Approves the request for this workspace and the signed-in person (session only) and returns the client's redirect with a one-time code.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/OAuthRedirectResponse"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Connect the MCP client","tags":["oauth"]}},"/oauth/requests/{id}/deny":{"post":{"description":"Answers the request with access_denied, signed in or not, and returns the client's redirect.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/OAuthRedirectResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Don't connect the MCP client","tags":["oauth"]}},"/oauth/revoke":{"post":{"consumes":["application/x-www-form-urlencoded"],"description":"RFC 7009: signs out the connection the token belongs to. Answers 200 whether or not the token was known.","parameters":[{"description":"Access or refresh token","in":"formData","name":"token","required":true,"type":"string"},{"description":"Registered client id","in":"formData","name":"client_id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/OAuthRevokeResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/OAuthErrorBody"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/OAuthErrorBody"}}},"summary":"Revoke an access or refresh token","tags":["oauth"]}},"/oauth/token":{"post":{"consumes":["application/x-www-form-urlencoded"],"description":"RFC 6749 token endpoint. grant_type authorization_code (code, redirect_uri, code_verifier, client_id) answers an approval with a one-hour access token and a refresh token; refresh_token (refresh_token, client_id) rotates both. A refresh token works once; an old one coming back signs the connection out. Form body (or JSON).","parameters":[{"description":"authorization_code or refresh_token","in":"formData","name":"grant_type","required":true,"type":"string"},{"description":"Registered client id","in":"formData","name":"client_id","required":true,"type":"string"},{"description":"The approval's code","in":"formData","name":"code","type":"string"},{"description":"The redirect the code was sent to","in":"formData","name":"redirect_uri","type":"string"},{"description":"PKCE verifier","in":"formData","name":"code_verifier","type":"string"},{"description":"Refresh token","in":"formData","name":"refresh_token","type":"string"},{"description":"MCP address (RFC 8707)","in":"formData","name":"resource","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/OAuthTokenResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/OAuthErrorBody"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/OAuthErrorBody"}}},"summary":"Get or renew an access token","tags":["oauth"]}},"/portal-host":{"get":{"description":"Public. On a help centre's verified custom domain, the support space key its portal API calls use (/portal/{key}/…, with only that key accepted on this host). 404 on any other host.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/HostPortal"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"The help centre this custom domain serves","tags":["portal"]}},"/portal/{key}":{"get":{"description":"Public. Title, welcome text, colours and request types, plus the signed-in customer (if any). 404 when Support is off or the space isn't a support space.","parameters":[{"description":"Support space key, e.g. SUP","in":"path","name":"key","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalPublic"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"A support space's help centre","tags":["portal"]}},"/portal/{key}/articles":{"get":{"description":"Published pages of the support space's help centre sections; featured ones first, or those matching q. Public help centres are open to everyone, others need a signed-in customer.","parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"},{"description":"Search text","in":"query","name":"q","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/PortalArticle"},"type":"array"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Help centre articles","tags":["portal"]}},"/portal/{key}/articles/{id}":{"get":{"parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"},{"description":"Article (page) id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalArticleDetail"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"One help centre article","tags":["portal"]}},"/portal/{key}/images/{kind}":{"get":{"description":"Public, whatever the portal's access rule (the sign-in page shows them too). The URL carries the image's id from GET /portal/{key} (logo_id, header_image_id), so it can be cached.","parameters":[{"description":"Support space key, e.g. SUP","in":"path","name":"key","required":true,"type":"string"},{"description":"logo or header","enum":["logo","header"],"in":"path","name":"kind","required":true,"type":"string"}],"produces":["image/png"],"responses":{"200":{"description":"OK","schema":{"type":"file"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"A help centre's logo or header image","tags":["portal"]}},"/portal/{key}/login":{"post":{"consumes":["application/json"],"parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"},{"description":"Credentials","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalLoginRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalPublic"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Customer sign-in","tags":["portal"]}},"/portal/{key}/logout":{"post":{"parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"}},"summary":"Customer sign-out","tags":["portal"]}},"/portal/{key}/register":{"post":{"consumes":["application/json"],"description":"Emails a 6-digit code; the password takes effect once the code is entered (POST /portal/{key}/verify). The answer is the same whether or not the email has an account. Follows the portal's access setting.","parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"},{"description":"Account","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalRegisterRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalPending"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Create a customer account (or set a new password)","tags":["portal"]}},"/portal/{key}/requests":{"get":{"parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/PortalTicket"},"type":"array"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"The signed-in customer's requests","tags":["portal"]},"post":{"consumes":["application/json"],"parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"},{"description":"Request","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalSubmitRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalTicketDetail"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Raise a request","tags":["portal"]}},"/portal/{key}/requests/{number}":{"get":{"description":"Replies from support and the customer's own messages; internal notes are never included.","parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"},{"description":"Request number or key, e.g. 101 or SUP-101","in":"path","name":"number","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalTicketDetail"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"One of the customer's requests, with the conversation","tags":["portal"]}},"/portal/{key}/requests/{number}/reply":{"post":{"consumes":["application/json"],"description":"A request waiting on the customer, or resolved, opens again.","parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"},{"description":"Request number","in":"path","name":"number","required":true,"type":"string"},{"description":"Message","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalReplyRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalTicketDetail"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Reply on a request","tags":["portal"]}},"/portal/{key}/requests/{number}/resolve":{"post":{"parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"},{"description":"Request number","in":"path","name":"number","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalTicketDetail"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Mark a request resolved","tags":["portal"]}},"/portal/{key}/requests/{number}/share":{"post":{"consumes":["application/json"],"description":"Only its requester. Organisation sharing is off for public mail domains.","parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"},{"description":"Request number","in":"path","name":"number","required":true,"type":"string"},{"description":"Sharing change","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalShareRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalTicketDetail"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Change who may follow a request","tags":["portal"]}},"/portal/{key}/shared":{"get":{"description":"Requests raised by others and shared with this customer's organisation or email, as the portal's sharing setting allows.","parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/PortalTicket"},"type":"array"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Requests shared with the signed-in customer","tags":["portal"]}},"/portal/{key}/verify":{"post":{"consumes":["application/json"],"description":"Sets the password from the registration, ends other sessions and sets the portal session cookie.","parameters":[{"description":"Support space key","in":"path","name":"key","required":true,"type":"string"},{"description":"Code","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalVerifyRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalPublic"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"summary":"Confirm the emailed code and sign in","tags":["portal"]}},"/portfolios":{"get":{"description":"The whole portfolio tree, flat; build the tree from parent_id. 404 while Portfolios is off.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/Portfolio"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Portfolios","tags":["portfolios"]},"post":{"consumes":["application/json"],"description":"Top-level units need an admin; inside a unit, its lead or a delegate (or one of an ancestor) may add one.","parameters":[{"description":"Portfolio","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortfolioRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Portfolio"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a portfolio","tags":["portfolios"]}},"/portfolios/{id}":{"delete":{"description":"Sub-portfolios move up to its parent and its spaces become unfiled.","parameters":[{"description":"Portfolio id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete a portfolio","tags":["portfolios"]},"put":{"consumes":["application/json"],"description":"Name, description, icon, lead and delegates. parent_id is ignored; use the place endpoint to move.","parameters":[{"description":"Portfolio id","in":"path","name":"id","required":true,"type":"string"},{"description":"Portfolio","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortfolioRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Portfolio"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Edit a portfolio","tags":["portfolios"]}},"/portfolios/{id}/place":{"post":{"consumes":["application/json"],"description":"Puts the unit under parent_id (null = top level) and orders that level as given. Refused when the target is the unit itself or below it.","parameters":[{"description":"Portfolio id","in":"path","name":"id","required":true,"type":"string"},{"description":"Placement","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PlacePortfolioRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/Portfolio"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Move or reorder a portfolio","tags":["portfolios"]}},"/releases/{id}":{"delete":{"description":"Its issues stay in the backlog.","parameters":[{"description":"Release id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete a release","tags":["releases"]},"put":{"consumes":["application/json"],"description":"A shipped release keeps its status and issues; only its name, notes and date change.","parameters":[{"description":"Release id","in":"path","name":"id","required":true,"type":"string"},{"description":"Release","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ReleaseRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Release"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Edit a release","tags":["releases"]}},"/releases/{id}/ship":{"post":{"description":"Only when it has issues and all are done or cancelled (409 otherwise). A missing target date becomes today.","parameters":[{"description":"Release id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Release"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Ship a release","tags":["releases"]}},"/releases/{id}/unrelease":{"post":{"description":"Puts it back in progress.","parameters":[{"description":"Release id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Release"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Undo shipping a release","tags":["releases"]}},"/requests/by-key/{key}":{"get":{"parameters":[{"description":"Request key, e.g. SUP-101","in":"path","name":"key","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RequestDetail"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"A support request by key","tags":["support"]}},"/requests/unassigned-count":{"get":{"description":"How many open requests nobody is assigned to sit in the live support spaces the caller can see: the count beside Support in the sidebar. Needs the Support feature and view on tickets.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/UnassignedCount"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Open, unassigned support requests","tags":["support"]}},"/requests/{id}":{"get":{"description":"The request with its replies, internal notes and related issues.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RequestDetail"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"A support request","tags":["support"]},"put":{"consumes":["application/json"],"description":"Saves the whole draft. Closing sets resolved_at; reopening clears it. Choosing a team by hand restarts its escalation clock.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"},{"description":"Fields","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/UpdateRequestRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RequestDetail"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save a support request","tags":["support"]}},"/requests/{id}/attachments":{"get":{"parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/Attachment"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Files on a support request","tags":["attachments"]},"post":{"consumes":["multipart/form-data"],"description":"multipart/form-data with one \"file\" part, up to 10 MB; at most 50 files per request. Needs edit on tickets.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"},{"description":"The file","in":"formData","name":"file","required":true,"type":"file"}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Attachment"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Attach a file to a support request","tags":["attachments"]}},"/requests/{id}/comments":{"post":{"consumes":["application/json"],"description":"A reply is emailed to the requestor; a note is internal and never shown to customers.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"},{"description":"Comment","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/RequestCommentRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RequestDetail"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Reply or add a note","tags":["support"]}},"/requests/{id}/create-issue":{"post":{"description":"Files a bug (or the first work-item type) in the request's product backlog and relates it.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RequestDetail"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Create a backlog issue from a request","tags":["support"]}},"/requests/{id}/escalate":{"post":{"description":"Moves the request to the next team of the routing chain, clears its assignees and adds an internal note.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RequestDetail"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Escalate to the next line","tags":["support"]}},"/requests/{id}/history":{"get":{"description":"Who changed what, and when, newest first (at most 500): staff, the customer (by email, via \"portal\") or the escalation job (via \"auto\"). Values read as they did then.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/IssueChange"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Request history","tags":["support"]}},"/requests/{id}/issues/{issueId}":{"delete":{"parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"},{"description":"Issue id","in":"path","name":"issueId","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RequestDetail"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a related issue","tags":["support"]},"put":{"description":"The issue must belong to a product linked to the request's support space.","parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"},{"description":"Issue id","in":"path","name":"issueId","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RequestDetail"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Relate a backlog issue","tags":["support"]}},"/requests/{id}/move":{"post":{"consumes":["application/json"],"parameters":[{"description":"Request id","in":"path","name":"id","required":true,"type":"string"},{"description":"Placement","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/MoveRequestRequest"}}],"responses":{"204":{"description":"No Content"},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Reorder a request","tags":["support"]}},"/roadmap":{"get":{"description":"Every hierarchy issue and work item in live product and team spaces the caller can see, with sprints, workspace milestones, links, schemes, spaces and portfolios. Also feeds the workspace Topics page.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Roadmap"}}},"security":[{"BearerAuth":[]}],"summary":"Workspace roadmap","tags":["roadmap"]}},"/roles":{"get":{"description":"Every role (system roles first) with its level per area and how many people hold it.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/RoleDetail"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"User roles","tags":["roles"]},"post":{"consumes":["application/json"],"description":"A fresh \"New role\" with read access, or a copy of another role (\"{name} copy\").","parameters":[{"description":"Role","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CreateRoleRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/RoleDetail"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a role","tags":["roles"]}},"/roles/{id}":{"delete":{"description":"Refused while anyone holds it.","parameters":[{"description":"Role id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete a custom role","tags":["roles"]},"put":{"consumes":["application/json"],"parameters":[{"description":"Role id","in":"path","name":"id","required":true,"type":"string"},{"description":"Name","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/RenameRoleRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RoleDetail"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Rename a custom role","tags":["roles"]}},"/roles/{id}/permissions":{"put":{"consumes":["application/json"],"description":"Sets the level of one or more areas. The Owner role is locked.","parameters":[{"description":"Role id","in":"path","name":"id","required":true,"type":"string"},{"description":"Levels","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/RoleLevelsRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RoleDetail"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Change a role's access","tags":["roles"]}},"/roles/{id}/reset":{"post":{"parameters":[{"description":"Role id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/RoleDetail"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Restore a system role's defaults","tags":["roles"]}},"/schemes":{"get":{"description":"Every scheme with its levels (top first), types, parent rules and the live spaces using it.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/IssueScheme"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Issue schemes","tags":["schemes"]},"post":{"consumes":["application/json"],"description":"\"New scheme\" starts as Epic → Feature → Story/Task/Bug → Sub-task; with from_id it duplicates that scheme as \"\u003cname\u003e (copy)\".","parameters":[{"description":"Source","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CreateSchemeRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/IssueScheme"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Create a scheme","tags":["schemes"]}},"/schemes/{id}":{"delete":{"description":"Refused while any space uses it, or when it is the last scheme.","parameters":[{"description":"Scheme id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete a scheme","tags":["schemes"]},"get":{"parameters":[{"description":"Scheme id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/IssueScheme"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"One issue scheme","tags":["schemes"]},"put":{"consumes":["application/json"],"description":"Replaces name, description and structure. Rules: account levels on top; at least two product levels, each with a type; the bottom two levels stay; types never change between account and product scope; parents come from the allowed level above; type names unique.","parameters":[{"description":"Scheme id","in":"path","name":"id","required":true,"type":"string"},{"description":"Scheme","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/UpdateSchemeRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/IssueScheme"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save a scheme","tags":["schemes"]}},"/search":{"get":{"description":"Spaces (name, key, description, domain) and issues (key, title) containing q, case-insensitive, up to 200 of each. Archived spaces, spaces the caller can't see and areas without view access are left out. An exact key match comes first, then issues of the space given as `space`.","parameters":[{"description":"Search text","in":"query","name":"q","required":true,"type":"string"},{"description":"Id of the space the caller is in","in":"query","name":"space","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SearchResults"}}},"security":[{"BearerAuth":[]}],"summary":"Search the workspace","tags":["search"]}},"/spaces":{"get":{"description":"Spaces the caller can see, with owner, portfolio and membership flags. Private spaces appear only to members and workspace admins. Support spaces are left out while Support is off.","parameters":[{"default":"active","description":"Which spaces","enum":["active","archived","all"],"in":"query","name":"status","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/SpaceSummary"},"type":"array"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Spaces","tags":["spaces"]},"post":{"consumes":["application/json"],"description":"The key is derived from the name (first three letters, then alternatives) and the colour from the kind. The owner becomes the lead member. A support space needs the Support feature and starts without a product (link one in its settings).","parameters":[{"description":"Space","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CreateSpaceRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Space"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Create a space","tags":["spaces"]}},"/spaces/by-key/{key}":{"get":{"parameters":[{"description":"Space key, e.g. UPM","in":"path","name":"key","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SpaceSummary"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Space by key","tags":["spaces"]}},"/spaces/open-issues":{"get":{"description":"How many issues are to do or in progress in each live product space the caller can see (the Products overview). Products without open issues are left out; empty without view on issues.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/SpaceIssueCount"},"type":"array"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Open issues per product","tags":["spaces"]}},"/spaces/{id}/archive":{"post":{"description":"Soft delete: hidden from navigation, search and the workspace roadmap. Restore brings it back.","parameters":[{"description":"Space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Space"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Archive a space","tags":["spaces"]}},"/spaces/{id}/backlog":{"get":{"description":"A product space's issues in backlog order (section, then rank), the account-level issues above them, and the space's scheme. Done and cancelled issues are included; the page splits backlog from history.","parameters":[{"description":"Product space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Only items changed at or after this: RFC 3339 time or YYYY-MM-DD. To follow every change, use GET /changes.","in":"query","name":"updated_since","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Backlog"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Product backlog","tags":["issues"]}},"/spaces/{id}/board-columns":{"get":{"description":"The team's board columns, left to right, which are its statuses: To do first, Done last (it holds Done and Closed), the team's working statuses between them.","parameters":[{"description":"Team space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/BoardColumn"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"A team's statuses","tags":["sprints"]},"post":{"consumes":["application/json"],"description":"Adds a working status to a team: a column just before Done. Names are unique on a board. Needs edit on sprints.","parameters":[{"description":"Team space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Column","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/BoardColumnRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"items":{"$ref":"#/definitions/BoardColumn"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a board column","tags":["sprints"]}},"/spaces/{id}/board-columns/order":{"put":{"consumes":["application/json"],"description":"Puts a team's columns in the given order (drag a column header): every column once, To do first and Done last. Needs edit on sprints.","parameters":[{"description":"Team space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Order","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ColumnOrderRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/BoardColumn"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Reorder board columns","tags":["sprints"]}},"/spaces/{id}/images/{purpose}":{"delete":{"parameters":[{"description":"Space id","in":"path","name":"id","required":true,"type":"string"},{"description":"avatar or cover","enum":["avatar","cover"],"in":"path","name":"purpose","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a space's avatar or card image","tags":["attachments"]},"post":{"consumes":["multipart/form-data"],"description":"multipart/form-data with one \"file\" part: PNG, JPEG, GIF or WebP up to 10 MB. Replaces the current one. Needs edit on space configuration.","parameters":[{"description":"Space id","in":"path","name":"id","required":true,"type":"string"},{"description":"avatar or cover","enum":["avatar","cover"],"in":"path","name":"purpose","required":true,"type":"string"},{"description":"The image","in":"formData","name":"file","required":true,"type":"file"}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Attachment"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Upload a space's avatar or card image","tags":["attachments"]}},"/spaces/{id}/issues":{"post":{"consumes":["application/json"],"description":"Adds a product-level issue at the bottom of the space's backlog. Its key is {space key}-{n}. Sub-tasks need a parent; parents must fit the scheme's levels and parent rules.","parameters":[{"description":"Product space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Issue","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/IssueFieldsRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Issue"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Create an issue","tags":["issues"]}},"/spaces/{id}/kanban-groups":{"post":{"consumes":["application/json"],"description":"Adds a kanban group to a kanban team, after its other groups. Without a name it is \"Group N\".","parameters":[{"description":"Team space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Group","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/KanbanGroupRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/BacklogGroup"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a kanban group","tags":["sprints"]}},"/spaces/{id}/members":{"get":{"description":"People in a space with their roles, admins first. Needs view on space members, or the team admin role in a team space.","parameters":[{"description":"Space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/SpaceMember"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Space members","tags":["spaces"]}},"/spaces/{id}/members/{userId}":{"delete":{"description":"Same rights as changing a member. The last admin can't be removed (409 last_team_admin).","parameters":[{"description":"Space id","in":"path","name":"id","required":true,"type":"string"},{"description":"User id","in":"path","name":"userId","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/SpaceMember"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a space member","tags":["spaces"]},"put":{"consumes":["application/json"],"description":"Adds an active user to the space with a role, or changes their role. In a team space this needs the team admin role (workspace admins have it); elsewhere edit on space members. The last admin can't be demoted (409 last_team_admin).","parameters":[{"description":"Space id","in":"path","name":"id","required":true,"type":"string"},{"description":"User id","in":"path","name":"userId","required":true,"type":"string"},{"description":"Role","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SpaceMemberRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/SpaceMember"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add or update a space member","tags":["spaces"]}},"/spaces/{id}/portal":{"get":{"parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SupportPortal"}}},"security":[{"BearerAuth":[]}],"summary":"Support portal settings","tags":["support"]},"put":{"consumes":["application/json"],"parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Portal","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SupportPortal"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save support portal settings","tags":["support"]}},"/spaces/{id}/portal/customers":{"post":{"consumes":["application/json"],"parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Customer","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalCustomerRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SupportPortal"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Give a customer portal access","tags":["support"]}},"/spaces/{id}/portal/customers/remove":{"post":{"consumes":["application/json"],"parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Customer","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalCustomerRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SupportPortal"}}},"security":[{"BearerAuth":[]}],"summary":"Take away a customer's portal access","tags":["support"]}},"/spaces/{id}/portal/domain":{"delete":{"description":"The domain stops serving the help centre at once; the default address keeps working. Needs edit on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DomainSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a help centre's custom domain","tags":["support"]},"get":{"description":"The domain with its verification status, the DNS records to add (CNAME to target, TXT token) and the last check. Needs view on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DomainSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"A help centre's custom domain","tags":["support"]},"put":{"consumes":["application/json"],"description":"Saves the domain as pending with a new verification token; saving the domain it already has changes nothing. The domain may not sit under the app's own domain. Needs edit on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Domain","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalDomainRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DomainSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Set a help centre's custom domain","tags":["support"]}},"/spaces/{id}/portal/domain/check":{"post":{"description":"Looks up the TXT token and the CNAME and records the result: verified, still pending (with the reason) or failed. A domain another help centre verified first fails as domain_taken. Needs edit on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/DomainSettings"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Check a custom domain's DNS now","tags":["support"]}},"/spaces/{id}/portal/emails":{"get":{"description":"Sender addresses (the built-in one first, then custom ones with their DNS records and last check), the default sender, the four customer emails (received, reply, resolved, register) with any customised fields and the default design in lang, and the branding they are drawn in. Needs view on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Language of the default designs (en, nl, de, fr, es)","in":"query","name":"lang","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalEmailSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"A help centre's emails","tags":["support"]}},"/spaces/{id}/portal/emails/default-sender":{"put":{"consumes":["application/json"],"description":"The address customer emails come from unless a template names another: \"builtin\" or a verified sender (sender_not_verified otherwise). Needs edit on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Language of the default designs","in":"query","name":"lang","type":"string"},{"description":"Sender","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalDefaultSenderRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalEmailSettings"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Pick the default sender","tags":["support"]}},"/spaces/{id}/portal/emails/senders":{"post":{"consumes":["application/json"],"description":"Adds an address on the customer's own domain, pending until its SPF, DKIM, DMARC and ownership TXT records are found (and, with Scaleway TEM, TEM verified the domain). Refuses invalid addresses (email_invalid), free mail providers (sender_free_mail), our own domains (sender_domain_ours), an address the help centre has (sender_duplicate) and an 11th sender (sender_limit). Needs edit on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Language of the default designs","in":"query","name":"lang","type":"string"},{"description":"Sender","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalSenderRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalEmailSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a sender address","tags":["support"]}},"/spaces/{id}/portal/emails/senders/{sender}":{"delete":{"description":"Emails that used it go from the default sender; a removed default leaves the built-in sender. Needs edit on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Sender id","in":"path","name":"sender","required":true,"type":"string"},{"description":"Language of the default designs","in":"query","name":"lang","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalEmailSettings"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a sender address","tags":["support"]}},"/spaces/{id}/portal/emails/senders/{sender}/check":{"post":{"description":"Looks up the four TXT records and records what was found; once all are there TEM checks the domain too. Verified when every check passes, otherwise \"failed\" (action needed). Needs edit on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Sender id","in":"path","name":"sender","required":true,"type":"string"},{"description":"Language of the default designs","in":"query","name":"lang","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalEmailSettings"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"429":{"description":"Too Many Requests","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Check a sender's DNS records now","tags":["support"]}},"/spaces/{id}/portal/emails/templates/{kind}":{"delete":{"description":"Drops the help centre's version of one email: the default design goes out again, in each customer's language. Needs edit on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"received, reply, resolved or register","in":"path","name":"kind","required":true,"type":"string"},{"description":"Language of the default designs","in":"query","name":"lang","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalEmailSettings"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Reset an email to its default","tags":["support"]},"put":{"consumes":["application/json"],"description":"Stores the sender, From name, subject and HTML of one email (received, reply, resolved or register); all empty resets it. The HTML is kept as written less scripts, event handlers and similar, sent in every language as written, and the register email must keep its code placeholder (template_code_missing). Needs edit on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"received, reply, resolved or register","in":"path","name":"kind","required":true,"type":"string"},{"description":"Language of the default designs","in":"query","name":"lang","type":"string"},{"description":"Template","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/PortalEmailTemplateRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/PortalEmailSettings"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save a help centre's version of an email","tags":["support"]}},"/spaces/{id}/portal/images/{kind}":{"delete":{"parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"logo or header","enum":["logo","header"],"in":"path","name":"kind","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a help centre's logo or header image","tags":["portal"]},"post":{"consumes":["multipart/form-data"],"description":"multipart/form-data with one \"file\" part: PNG, JPEG, GIF or WebP up to 10 MB. Replaces the current one. Support spaces only; needs edit on the portal.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"logo or header","enum":["logo","header"],"in":"path","name":"kind","required":true,"type":"string"},{"description":"The image","in":"formData","name":"file","required":true,"type":"file"}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Attachment"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Upload a help centre's logo or header image","tags":["portal"]}},"/spaces/{id}/portfolio":{"put":{"consumes":["application/json"],"parameters":[{"description":"Space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Portfolio","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/FileSpaceRequest"}}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"File a space under a portfolio","tags":["portfolios"]}},"/spaces/{id}/releases":{"get":{"description":"Unreleased by target date, then shipped ones newest first, each with its issues. Needs view on issues.","parameters":[{"description":"Product space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/Release"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Releases of a product","tags":["releases"]},"post":{"consumes":["application/json"],"description":"Issues given move out of any other unreleased release of the product. Needs edit on issues.","parameters":[{"description":"Product space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Release","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/ReleaseRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Release"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Create a release","tags":["releases"]}},"/spaces/{id}/requests":{"post":{"consumes":["application/json"],"description":"Numbered {support space key}-{n}; goes to the first line of the routing chain. The product must be linked to the support space.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Request","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CreateRequestRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/RequestDetail"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a support request","tags":["support"]}},"/spaces/{id}/restore":{"post":{"parameters":[{"description":"Space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Space"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Restore an archived space","tags":["spaces"]}},"/spaces/{id}/roadmap":{"get":{"description":"A product or team space's roadmap: every hierarchy issue, the space's work items (by product, or by team), their sprints, the space's milestones and links. Topics without work of this space underneath are filtered by the page.","parameters":[{"description":"Product or team space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Roadmap"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Space roadmap","tags":["roadmap"]}},"/spaces/{id}/routing":{"get":{"parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/EscalationRule"},"type":"array"}}},"security":[{"BearerAuth":[]}],"summary":"Support routing chain","tags":["support"]},"put":{"consumes":["application/json"],"description":"Line 1 gets new requests; each line but the last says after how many minutes (30, 60, 120, 240, 480, 1440, 2880 or 10080) an unresolved request moves on.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Rules","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/RoutingRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/EscalationRule"},"type":"array"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save the routing chain","tags":["support"]}},"/spaces/{id}/settings":{"get":{"description":"A live space's editable settings, linked support spaces or products, the next issue number and former keys. Needs view on space configuration, or the team admin role in a team space.","parameters":[{"description":"Space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SpaceSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Space configuration","tags":["spaces"]},"put":{"consumes":["application/json"],"description":"Saves the whole draft. A new key changes the prefix of every issue in the space; the old key keeps resolving. A new scheme moves issues to the same-named types and is refused (409) when a type has no match or a parent link would break. On a support space, product_id links it to a product or (null) to none.","parameters":[{"description":"Space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Settings","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SpaceSettingsRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SpaceSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save space configuration","tags":["spaces"]}},"/spaces/{id}/sla":{"get":{"description":"Per priority, the first-response and resolution targets in minutes (null = no target), most urgent first.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/SLATarget"},"type":"array"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Support service levels","tags":["support"]},"put":{"consumes":["application/json"],"description":"First response: 15, 30, 60, 120, 240, 480, 1440 or 2880 minutes. Resolution: 240, 480, 1440, 2880, 4320, 7200, 10080 or 20160 minutes. Time waiting on the customer doesn't count towards resolution.","parameters":[{"description":"Support space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Targets","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SLARequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/SLATarget"},"type":"array"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save the service levels","tags":["support"]}},"/spaces/{id}/sprints":{"post":{"consumes":["application/json"],"description":"Adds a planned sprint. Without a name it is \"Sprint N+1\"; without dates it starts three days after the team's latest sprint and runs twelve days.","parameters":[{"description":"Team space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Name and dates","in":"body","name":"body","schema":{"$ref":"#/definitions/PlanSprintRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/BacklogGroup"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Plan a sprint","tags":["sprints"]}},"/spaces/{id}/support":{"get":{"description":"For a support space: its requests (rank order) and routing chain. For a product space: requests about it from its service desk, or 404 service_desk_off while the desk is disabled or was never set up. Includes the spaces requests point at.","parameters":[{"description":"Support or product space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Only items changed at or after this: RFC 3339 time or YYYY-MM-DD. To follow every change, use GET /changes.","in":"query","name":"updated_since","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Desk"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Support requests of a space","tags":["support"]}},"/spaces/{id}/team-board":{"get":{"description":"A team space's backlog groups (kanban groups, then the active, planned and closed sprints), the issues it works on, carry-overs, and the products and schemes those issues come from.","parameters":[{"description":"Team space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Only the issues changed at or after this: RFC 3339 time or YYYY-MM-DD. To follow every change, use GET /changes.","in":"query","name":"updated_since","type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/TeamBoard"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Team board data","tags":["sprints"]}},"/spaces/{id}/work-mode":{"put":{"consumes":["application/json"],"description":"Sprints or one continuous Kanban board. To Kanban: unfinished issues in the active sprint (which closes, history kept) and issues in planned sprints move onto the board. Back to sprints: board issues move into the active sprint, else the next planned one, else the team queue. Needs edit on space configuration.","parameters":[{"description":"Team space id","in":"path","name":"id","required":true,"type":"string"},{"description":"Way of working","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/WorkModeRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Space"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Set a team's way of working","tags":["sprints"]}},"/sprints/{id}/complete":{"post":{"consumes":["application/json"],"description":"Closes the sprint with its dates and note. Unfinished issues carry over to the next sprint (keeping their status) or return to the team queue as To do.","parameters":[{"description":"Sprint id","in":"path","name":"id","required":true,"type":"string"},{"description":"Completion","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CompleteSprintRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/BacklogGroup"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Complete the active sprint","tags":["sprints"]}},"/sprints/{id}/start":{"post":{"consumes":["application/json"],"description":"Makes a planned sprint the team's active one. A team has at most one active sprint.","parameters":[{"description":"Sprint id","in":"path","name":"id","required":true,"type":"string"},{"description":"Confirmed dates","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SprintDatesRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/BacklogGroup"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Start a sprint","tags":["sprints"]}},"/topics":{"post":{"consumes":["application/json"],"description":"Adds a hierarchy issue (theme, initiative, epic, feature) from the Topics page; needs edit on the roadmap and on the issue's scope. Account-level types get an {org_key}-{n} key; product-level types need product_space_id and get {space key}-{n}.","parameters":[{"description":"Topic","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/CreateTopicRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Issue"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/ErrorBody"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Create a topic","tags":["roadmap"]}},"/users":{"get":{"description":"Active users of the workspace, by name.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/User"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Users","tags":["users"]}},"/users/directory":{"get":{"description":"Active and invited users with their role, spaces, last seen and open invite expiry. Removed users are left out.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/WorkspaceUser"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Users page","tags":["users"]}},"/users/{id}":{"delete":{"description":"Withdraws an invite, or deactivates a user and signs them out (their work keeps their name). Not the Owner, not yourself.","parameters":[{"description":"User id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove someone from the workspace","tags":["users"]}},"/users/{id}/resend-invite":{"post":{"description":"Replaces the invitee's link with a new one (7 days) and emails it.","parameters":[{"description":"User id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/WorkspaceUser"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Resend an invite","tags":["users"]}},"/users/{id}/role":{"put":{"consumes":["application/json"],"description":"The Owner's role is locked and nobody can be made Owner here.","parameters":[{"description":"User id","in":"path","name":"id","required":true,"type":"string"},{"description":"Role","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/UserRoleRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/WorkspaceUser"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Change someone's role","tags":["users"]}},"/webhooks":{"get":{"description":"The workspace's outgoing webhooks with their last delivery (never the secrets). Needs view on Integrations \u0026 MCP.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"items":{"$ref":"#/definitions/Webhook"},"type":"array"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Webhooks","tags":["integrations"]},"post":{"consumes":["application/json"],"description":"Every few seconds Backlog.pm POSTs what changed since the last delivery to the URL, as JSON (models.WebhookDelivery: the same entries as GET /changes), read with your permissions. Each delivery carries X-Backlog-Signature: t=\u003cunix time\u003e,v1=\u003chex HMAC-SHA256 of \"\u003ct\u003e.\u003cbody\u003e\" with the secret\u003e, X-Backlog-Delivery (its id) and X-Backlog-Event (changes, or ping for a test). Answer 2xx; failures are retried with backoff up to an hour and after 30 in a row it turns itself off. It sends what changes from now on. The secret is in this response only. At most 10 per workspace. Needs edit on Integrations \u0026 MCP and a signed-in session.","parameters":[{"description":"Settings","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/WebhookRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/WebhookSecret"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Add a webhook","tags":["integrations"]}},"/webhooks/{id}":{"delete":{"description":"Stops the deliveries. Needs edit on Integrations \u0026 MCP and a signed-in session.","parameters":[{"description":"Webhook id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove a webhook","tags":["integrations"]},"put":{"consumes":["application/json"],"description":"Saves name, URL, kinds and on / off. Switched back on, it clears the failures and starts from now: what changed while it was off isn't sent. Needs edit on Integrations \u0026 MCP and a signed-in session.","parameters":[{"description":"Webhook id","in":"path","name":"id","required":true,"type":"string"},{"description":"Settings","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/WebhookRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Webhook"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Change a webhook","tags":["integrations"]}},"/webhooks/{id}/secret":{"post":{"description":"A new signing secret, returned in this response only; deliveries are signed with it from now on. Needs edit on Integrations \u0026 MCP and a signed-in session.","parameters":[{"description":"Webhook id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/WebhookSecret"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"New webhook secret","tags":["integrations"]}},"/webhooks/{id}/test":{"post":{"description":"POSTs a ping (type ping, no changes), signed like every delivery, and says how the URL answered. Doesn't count as a failure. Needs edit on Integrations \u0026 MCP and a signed-in session.","parameters":[{"description":"Webhook id","in":"path","name":"id","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/WebhookTestResult"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Send a test delivery","tags":["integrations"]}},"/workspace":{"get":{"description":"Company details and former organisation keys. Needs view on organisation \u0026 billing.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Organisation"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Organisation details","tags":["workspace"]},"put":{"consumes":["application/json"],"description":"A new organisation key changes the prefix of every account-level issue; the old key keeps resolving and stays reserved.","parameters":[{"description":"Details","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/OrganisationRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Organisation"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Save organisation details","tags":["workspace"]}},"/workspace/deletion":{"delete":{"description":"Cancels a scheduled deletion. Owner only.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Workspace"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Restore the workspace","tags":["workspace"]},"get":{"description":"What deleting the workspace removes, and when a scheduled deletion erases it. Owner only.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Deletion"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete account status","tags":["workspace"]},"post":{"consumes":["application/json"],"description":"Members lose access at once; the Owner can restore it for 30 days, then all data is erased. Owner only.","parameters":[{"description":"Confirmation","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/DeletionRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Workspace"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/ErrorBody"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Delete the workspace","tags":["workspace"]}},"/workspace/export":{"get":{"description":"A JSON copy of the organisation, spaces, issues, releases, support requests and users (no secrets). Owner only.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/Export"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Export the workspace","tags":["workspace"]}},"/workspace/join-domains":{"post":{"consumes":["application/json"],"description":"Normalised (\"@Acme.com\" → acme.com). Public mail providers are refused (422 domain_public); anyone but the Owner can only add the domain of their own email (403 domain_not_yours). At most 10 (409 domain_limit). Needs edit on organisation \u0026 billing and a signed-in session.","parameters":[{"description":"Domain","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/JoinDomainRequest"}}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/JoinSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Allow an email domain","tags":["workspace"]}},"/workspace/join-domains/{domain}":{"delete":{"description":"Open requests from it stay until reviewed. Needs edit on organisation \u0026 billing and a signed-in session.","parameters":[{"description":"Domain","in":"path","name":"domain","required":true,"type":"string"}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/JoinSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Stop allowing an email domain","tags":["workspace"]}},"/workspace/join-settings":{"get":{"description":"Whether people at the allowed email domains may ask to join, the domains, and which domain the caller may add. Needs view on organisation \u0026 billing.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/JoinSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Ask to join: switch and allowed domains","tags":["workspace"]},"put":{"consumes":["application/json"],"description":"Needs edit on organisation \u0026 billing and a signed-in session (403 session_required for personal tokens). Open requests stay.","parameters":[{"description":"Switch","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/JoinSwitchRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/JoinSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Turn asking to join on or off","tags":["workspace"]}},"/workspace/logo":{"delete":{"responses":{"204":{"description":"No Content"},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remove the organisation avatar","tags":["attachments"]},"post":{"consumes":["multipart/form-data"],"description":"multipart/form-data with one \"file\" part: PNG, JPEG or GIF up to 10 MB. Cropped to a square and stored as a 160×160 PNG; replaces the current one. Needs edit on the organisation.","parameters":[{"description":"The image","in":"formData","name":"file","required":true,"type":"file"}],"produces":["application/json"],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/Attachment"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Upload the organisation avatar","tags":["attachments"]}},"/workspace/security":{"get":{"description":"The account's policy and who in the workspace uses two-step verification. Needs view on organisation.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/MFASecurity"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Two-step verification policy","tags":["workspace"]},"put":{"consumes":["application/json"],"description":"optional, admins (Owner and Admin roles) or all; the methods allowed; the grace period (0, 7, 14 or 30 days) people without it can still sign in, after which they set it up at sign-in. Needs edit on organisation and a signed-in session.","parameters":[{"description":"Policy","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SecurityPolicyRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/MFAPolicy"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Change the two-step verification policy","tags":["workspace"]}},"/workspace/security/remind/{id}":{"post":{"description":"Emails them a link to their profile's Security tab. At most once an hour per person (409 reminded_recently). Needs edit on organisation.","parameters":[{"description":"User id","in":"path","name":"id","required":true,"type":"string"}],"responses":{"202":{"description":"Accepted"},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/ErrorBody"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Remind someone to set up two-step verification","tags":["workspace"]}},"/workspace/sso":{"get":{"description":"The providers this server offers and the ones the workspace accepts. Needs view on organisation.","produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SSOSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Single sign-on","tags":["workspace"]},"put":{"consumes":["application/json"],"description":"Which providers people may sign in with, besides their password. A provider this server has no app for can only be turned off. Needs edit on organisation and a signed-in session.","parameters":[{"description":"Providers","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/SSOProvidersRequest"}}],"produces":["application/json"],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/SSOSettings"}},"403":{"description":"Forbidden","schema":{"$ref":"#/definitions/ErrorBody"}},"422":{"description":"Unprocessable Entity","schema":{"$ref":"#/definitions/ErrorBody"}}},"security":[{"BearerAuth":[]}],"summary":"Choose the single sign-on providers","tags":["workspace"]}}},"schemes":[],"securityDefinitions":{"BearerAuth":{"description":"\"Bearer {access_token}\"","in":"header","name":"Authorization","type":"apiKey"}},"swagger":"2.0"}