{"openapi":"3.0.3","info":{"title":"Organarium API","version":"1.0.0","description":"Projects, tasks, subtasks, links and progress updates, for agents that don't use MCP. See the docs for how to get an access token."},"externalDocs":{"url":"https://app.organarium.com/docs/api"},"servers":[{"url":"https://api.organarium.com"}],"security":[{"oauthAccessToken":[]}],"paths":{"/v1/projects":{"get":{"operationId":"listProjects","tags":["Projects"],"summary":"List the projects you belong to, with your role in each.","parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectWithRole"}}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createProject","tags":["Projects"],"summary":"Create a project. You become its owner.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string","nullable":true,"description":"Free-text description. Pass null to clear it."},"extraData":{"type":"object","additionalProperties":{},"nullable":true,"description":"Application-specific JSON object. Not for ordinary task or project information. Pass null to clear it."}},"required":["name"],"additionalProperties":false}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectId}":{"get":{"operationId":"getProject","tags":["Projects"],"summary":"Get a project, including its pinned links.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDetail"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateProject","tags":["Projects"],"summary":"Update a project. Omitted fields are left unchanged.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string","nullable":true,"description":"Free-text description. Pass null to clear it."},"extraData":{"type":"object","additionalProperties":{},"nullable":true,"description":"Application-specific JSON object. Not for ordinary task or project information. Pass null to clear it."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectId}/links":{"post":{"operationId":"addProjectLink","tags":["Projects"],"summary":"Pin a useful link (docs, repo, dashboard) to a project.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"An http(s) URL."},"label":{"type":"string","nullable":true,"description":"Optional display label."}},"required":["url"],"additionalProperties":false}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectLink"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectId}/members":{"get":{"operationId":"listProjectMembers","tags":["Projects"],"summary":"List a project's members. Use userId as an assigneeId.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Member"}}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectId}/invites":{"post":{"operationId":"createInvite","tags":["Invites"],"summary":"Create a single-use invite code that expires after 24 hours.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invite"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/invites/accept":{"post":{"operationId":"acceptInvite","tags":["Invites"],"summary":"Join a project with an invite code. Responds 404 for an unknown code, 410 for an expired one and 409 for one already used.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":1}},"required":["code"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAcceptance"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectId}/tasks":{"get":{"operationId":"listTasks","tags":["Tasks"],"summary":"List a project's tasks, most recently updated first.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"bucket","in":"query","required":false,"schema":{"type":"string","enum":["backlog","up_next","in_progress","done"]}},{"name":"priority","in":"query","required":false,"schema":{"type":"string","enum":["low","mid","high"]}},{"name":"tags","in":"query","required":false,"description":"Only tasks with at least one of these tags. Repeat to pass several.","schema":{"type":"array","items":{"type":"string"}}},{"name":"createdAfter","in":"query","required":false,"description":"ISO 8601 UTC timestamp. Only tasks created after this time.","schema":{"type":"string","format":"date-time"}},{"name":"createdBefore","in":"query","required":false,"description":"ISO 8601 UTC timestamp. Only tasks created before this time.","schema":{"type":"string","format":"date-time"}},{"name":"updatedAfter","in":"query","required":false,"description":"ISO 8601 UTC timestamp. Only tasks updated after this time.","schema":{"type":"string","format":"date-time"}},{"name":"updatedBefore","in":"query","required":false,"description":"ISO 8601 UTC timestamp. Only tasks updated before this time.","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","required":false,"description":"Maximum results to return (1-200, default 50).","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Task"}}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createTask","tags":["Tasks"],"summary":"Create a task. Defaults to mid priority in the backlog.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true,"description":"Free-text description. Pass null to clear it."},"priority":{"type":"string","enum":["low","mid","high"]},"bucket":{"type":"string","enum":["backlog","up_next","in_progress","done"]},"assigneeId":{"type":"string","format":"uuid","nullable":true,"description":"userId of a project member. Pass null to unassign."},"tags":{"type":"array","items":{"type":"string"},"description":"Labels. Lowercased and deduplicated; replaces any existing tags."},"extraData":{"type":"object","additionalProperties":{},"nullable":true,"description":"Application-specific JSON object. Not for ordinary task or project information. Pass null to clear it."},"agent":{"type":"string","maxLength":64,"description":"Name of the agent making this call (e.g. \"instinct\"). Shown in the project's activity feed."}},"required":["title"],"additionalProperties":false}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectId}/tasks/done":{"get":{"operationId":"listDoneTasks","tags":["Tasks"],"summary":"List a project's completed tasks, most recently completed first.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"priority","in":"query","required":false,"schema":{"type":"string","enum":["low","mid","high"]}},{"name":"tags","in":"query","required":false,"description":"Only tasks with at least one of these tags. Repeat to pass several.","schema":{"type":"array","items":{"type":"string"}}},{"name":"completedAfter","in":"query","required":false,"description":"ISO 8601 UTC timestamp. Only tasks completed after this time.","schema":{"type":"string","format":"date-time"}},{"name":"completedBefore","in":"query","required":false,"description":"ISO 8601 UTC timestamp. Only tasks completed before this time.","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","required":false,"description":"Maximum results to return (1-200, default 50).","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Task"}}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tasks/{taskId}":{"get":{"operationId":"getTask","tags":["Tasks"],"summary":"Get a task, including its subtasks, links and updates.","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskDetail"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateTask","tags":["Tasks"],"summary":"Update a task. Omitted fields are left unchanged. Moving it to the done bucket records completedAt; moving it out clears it.","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true,"description":"Free-text description. Pass null to clear it."},"priority":{"type":"string","enum":["low","mid","high"]},"bucket":{"type":"string","enum":["backlog","up_next","in_progress","done"]},"assigneeId":{"type":"string","format":"uuid","nullable":true,"description":"userId of a project member. Pass null to unassign."},"tags":{"type":"array","items":{"type":"string"},"description":"Labels. Lowercased and deduplicated; replaces any existing tags."},"extraData":{"type":"object","additionalProperties":{},"nullable":true,"description":"Application-specific JSON object. Not for ordinary task or project information. Pass null to clear it."},"agent":{"type":"string","maxLength":64,"description":"Name of the agent making this call (e.g. \"instinct\"). Shown in the project's activity feed."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteTask","tags":["Tasks"],"summary":"Permanently delete a task and its subtasks, links and updates.","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Done. The response has no body."},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tasks/{taskId}/subtasks":{"post":{"operationId":"addSubtask","tags":["Subtasks"],"summary":"Add a subtask to a task.","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","minLength":1},"assigneeId":{"type":"string","format":"uuid","nullable":true,"description":"userId of a project member. Pass null to unassign."},"extraData":{"type":"object","additionalProperties":{},"nullable":true,"description":"Application-specific JSON object. Not for ordinary task or project information. Pass null to clear it."},"agent":{"type":"string","maxLength":64,"description":"Name of the agent making this call (e.g. \"instinct\"). Shown in the project's activity feed."}},"required":["text"],"additionalProperties":false}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subtask"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/subtasks/{subtaskId}":{"patch":{"operationId":"updateSubtask","tags":["Subtasks"],"summary":"Update a subtask's text, done state or extraData.","parameters":[{"name":"subtaskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","minLength":1},"done":{"type":"boolean"},"extraData":{"type":"object","additionalProperties":{},"nullable":true,"description":"Application-specific JSON object. Not for ordinary task or project information. Pass null to clear it."},"agent":{"type":"string","maxLength":64,"description":"Name of the agent making this call (e.g. \"instinct\"). Shown in the project's activity feed."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subtask"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/subtasks/{subtaskId}/assignee":{"put":{"operationId":"assignSubtask","tags":["Subtasks"],"summary":"Assign a subtask to a project member, or pass null to unassign.","parameters":[{"name":"subtaskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assigneeId":{"type":"string","format":"uuid","nullable":true,"description":"userId of a project member, or null to unassign."},"agent":{"type":"string","maxLength":64,"description":"Name of the agent making this call (e.g. \"instinct\"). Shown in the project's activity feed."}},"required":["assigneeId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subtask"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tasks/{taskId}/links":{"post":{"operationId":"addLink","tags":["Links and updates"],"summary":"Attach a link (docs, PR, reference) to a task.","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"An http(s) URL."},"label":{"type":"string","nullable":true,"description":"Optional display label."},"agent":{"type":"string","maxLength":64,"description":"Name of the agent making this call (e.g. \"instinct\"). Shown in the project's activity feed."}},"required":["url"],"additionalProperties":false}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Link"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tasks/{taskId}/updates":{"post":{"operationId":"addUpdate","tags":["Links and updates"],"summary":"Append a progress note to a task's timeline.","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","minLength":1},"agent":{"type":"string","maxLength":64,"description":"Name of the agent making this call (e.g. \"instinct\"). Shown in the project's activity feed."}},"required":["body"],"additionalProperties":false}}}},"responses":{"201":{"description":"Success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Update"}}}},"400":{"description":"The path, query or body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"The access token is missing, invalid or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The account has no active subscription or invite.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or you don't have access to it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"oauthAccessToken":{"type":"http","scheme":"bearer","description":"An OAuth 2.0 access token. The authorization server is listed at https://api.organarium.com/.well-known/oauth-protected-resource."}},"schemas":{"Error":{"type":"object","required":["error","error_description"],"properties":{"error":{"type":"string"},"error_description":{"type":"string"},"issues":{"type":"array","description":"Per-field problems, on validation errors only.","items":{"type":"object","required":["path","message"],"properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"extraData":{"type":"object","additionalProperties":{},"nullable":true},"createdById":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","description","extraData","createdById","createdAt","updatedAt"],"additionalProperties":false},"ProjectWithRole":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"extraData":{"type":"object","additionalProperties":{},"nullable":true},"createdById":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"role":{"type":"string","enum":["owner","member"]}},"required":["id","name","description","extraData","createdById","createdAt","updatedAt","role"],"additionalProperties":false},"ProjectDetail":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"extraData":{"type":"object","additionalProperties":{},"nullable":true},"createdById":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"links":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"url":{"type":"string"},"label":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","projectId","url","label","createdAt"],"additionalProperties":false}}},"required":["id","name","description","extraData","createdById","createdAt","updatedAt","links"],"additionalProperties":false},"ProjectLink":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"url":{"type":"string"},"label":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","projectId","url","label","createdAt"],"additionalProperties":false},"Member":{"type":"object","properties":{"userId":{"type":"string","format":"uuid"},"email":{"type":"string"},"role":{"type":"string","enum":["owner","member"]}},"required":["userId","email","role"],"additionalProperties":false},"Invite":{"type":"object","properties":{"code":{"type":"string"},"projectId":{"type":"string","format":"uuid"},"expiresAt":{"type":"string","format":"date-time"}},"required":["code","projectId","expiresAt"],"additionalProperties":false},"InviteAcceptance":{"type":"object","properties":{"project":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"extraData":{"type":"object","additionalProperties":{},"nullable":true},"createdById":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","description","extraData","createdById","createdAt","updatedAt"],"additionalProperties":false},"alreadyMember":{"type":"boolean","description":"True if the caller was already a member; the code isn't used up."}},"required":["project","alreadyMember"],"additionalProperties":false},"Task":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"createdById":{"type":"string","format":"uuid"},"assigneeId":{"type":"string","format":"uuid","nullable":true},"title":{"type":"string"},"description":{"type":"string","nullable":true},"priority":{"type":"string","enum":["low","mid","high"]},"bucket":{"type":"string","enum":["backlog","up_next","in_progress","done"]},"tags":{"type":"array","items":{"type":"string"}},"extraData":{"type":"object","additionalProperties":{},"nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time","nullable":true,"description":"Set when the task enters the done bucket; cleared if it leaves."}},"required":["id","projectId","createdById","assigneeId","title","description","priority","bucket","tags","extraData","createdAt","updatedAt","completedAt"],"additionalProperties":false},"TaskDetail":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"createdById":{"type":"string","format":"uuid"},"assigneeId":{"type":"string","format":"uuid","nullable":true},"title":{"type":"string"},"description":{"type":"string","nullable":true},"priority":{"type":"string","enum":["low","mid","high"]},"bucket":{"type":"string","enum":["backlog","up_next","in_progress","done"]},"tags":{"type":"array","items":{"type":"string"}},"extraData":{"type":"object","additionalProperties":{},"nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time","nullable":true,"description":"Set when the task enters the done bucket; cleared if it leaves."},"todos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"taskId":{"type":"string","format":"uuid"},"assigneeId":{"type":"string","format":"uuid","nullable":true},"text":{"type":"string"},"done":{"type":"boolean"},"extraData":{"type":"object","additionalProperties":{},"nullable":true},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time","nullable":true}},"required":["id","taskId","assigneeId","text","done","extraData","createdAt","completedAt"],"additionalProperties":false}},"links":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"taskId":{"type":"string","format":"uuid"},"url":{"type":"string"},"label":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","taskId","url","label","createdAt"],"additionalProperties":false}},"updates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"taskId":{"type":"string","format":"uuid"},"body":{"type":"string"},"seq":{"type":"integer","description":"Monotonic insert order within the feed."},"createdById":{"type":"string","format":"uuid","nullable":true},"agent":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","taskId","body","seq","createdById","agent","createdAt"],"additionalProperties":false}}},"required":["id","projectId","createdById","assigneeId","title","description","priority","bucket","tags","extraData","createdAt","updatedAt","completedAt","todos","links","updates"],"additionalProperties":false},"Subtask":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"taskId":{"type":"string","format":"uuid"},"assigneeId":{"type":"string","format":"uuid","nullable":true},"text":{"type":"string"},"done":{"type":"boolean"},"extraData":{"type":"object","additionalProperties":{},"nullable":true},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time","nullable":true}},"required":["id","taskId","assigneeId","text","done","extraData","createdAt","completedAt"],"additionalProperties":false},"Link":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"taskId":{"type":"string","format":"uuid"},"url":{"type":"string"},"label":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","taskId","url","label","createdAt"],"additionalProperties":false},"Update":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"taskId":{"type":"string","format":"uuid"},"body":{"type":"string"},"seq":{"type":"integer","description":"Monotonic insert order within the feed."},"createdById":{"type":"string","format":"uuid","nullable":true},"agent":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","taskId","body","seq","createdById","agent","createdAt"],"additionalProperties":false}}}}