{"openapi":"3.1.0","info":{"title":"TaskOS API","version":"1.0.0","summary":"The complete AI-agent interface to TaskOS","description":"Operate a TaskOS account from any capable AI agent. Create a scoped token in API Access and send it as `Authorization: Bearer <token>`. The authenticated owner is always derived from the token; never send a user ID. Dates use `YYYY-MM-DD`, timestamps use ISO 8601, and all JSON results use either a `{ data, meta? }` success envelope or `{ error: { code, message, details? } }` error envelope."},"servers":[{"url":"https://task.infinitatech.com/api/v1","description":"Production"}],"externalDocs":{"description":"AI-agent operating guide","url":"https://task.infinitatech.com/api/docs"},"tags":[{"name":"Tasks","description":"Create and manage the task lifecycle, including subtasks, dependencies, time, and tags."},{"name":"Comments","description":"Append timestamped notes to a task."},{"name":"Views","description":"Purpose-built planning views and recommendations."},{"name":"Projects","description":"Organize tasks into projects."},{"name":"Activity","description":"Read history and deterministic summaries."}],"paths":{"/me":{"get":{"operationId":"get_me","summary":"Inspect the current token","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object"}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/tasks":{"get":{"operationId":"get_tasks","tags":["Tasks"],"summary":"Search and filter tasks","security":[{"bearerAuth":[]}],"parameters":[{"name":"status","in":"query","schema":{"type":"string"}},{"name":"priority","in":"query","schema":{"type":"string"}},{"name":"project_id","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}},{"name":"due_before","in":"query","schema":{"type":"string"}},{"name":"due_after","in":"query","schema":{"type":"string"}},{"name":"scheduled_date","in":"query","schema":{"type":"string"}},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"order","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer"}},{"name":"offset","in":"query","schema":{"type":"integer"}},{"name":"tags","in":"query","description":"Comma-separated tags; a task must carry every listed tag to match.","schema":{"type":"string","example":"sales,quick win"}},{"name":"parent_task_id","in":"query","description":"A task id to list that task's subtasks, or the literal `none` for top-level tasks only.","schema":{"type":"string"}},{"name":"blocked","in":"query","description":"`true` returns only tasks waiting on an open blocker, `false` only workable ones.","schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}},"post":{"operationId":"create_task","tags":["Tasks"],"summary":"Create a task","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"example":{"title":"Send the launch brief","status":"todo","priority":"high","value_score":5,"scheduled_date":"2026-09-01","estimated_minutes":30,"tags":["launch"]},"properties":{"title":{"type":"string","maxLength":300},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."}}}}}},"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/tasks/bulk":{"patch":{"operationId":"bulk_update_tasks","tags":["Tasks"],"summary":"Apply one patch to many tasks","description":"Applies the same field changes to every listed task in a single statement, for reorganizing work without one request per task. Ownership is checked first: if any id is unknown, deleted, or owned by another user the whole batch is rejected with 422 and nothing changes. Completing recurring tasks here spawns their next occurrences, returned in meta.spawned_tasks.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ids","patch"],"example":{"ids":["6ad28d2e-7c47-4e06-ae72-29469d812ef1","0f6f2d81-9a3e-4c2b-9c19-2f1a0b7d5e44"],"patch":{"status":"todo","project_id":null}},"properties":{"ids":{"type":"array","minItems":1,"maxItems":100,"uniqueItems":true,"items":{"type":"string","format":"uuid"},"description":"Between 1 and 100 unique task ids, all owned by the token holder."},"patch":{"type":"object","required":[],"example":{"title":"Send the launch brief","status":"todo","priority":"high","value_score":5,"scheduled_date":"2026-09-01","estimated_minutes":30,"tags":["launch"]},"properties":{"title":{"type":"string","maxLength":300},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."}},"description":"The fields to set on every listed task. At least one field is required."}}}}}},"responses":{"200":{"description":"Every listed task was updated","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}},"meta":{"type":"object","properties":{"updated":{"type":"integer"},"spawned_tasks":{"type":"array","items":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/tasks/{taskId}":{"parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"get":{"operationId":"get_task","tags":["Tasks"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}},"patch":{"operationId":"update_task","tags":["Tasks"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"example":{"title":"Send the launch brief","status":"todo","priority":"high","value_score":5,"scheduled_date":"2026-09-01","estimated_minutes":30,"tags":["launch"]},"properties":{"title":{"type":"string","maxLength":300},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."}}}}}},"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}},"delete":{"operationId":"delete_task","tags":["Tasks"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"204":{"description":"Deleted"},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/tasks/{taskId}/complete":{"post":{"operationId":"complete_task","tags":["Tasks"],"summary":"Idempotently complete a task","description":"Sets status to completed and records completed_at and an activity event. Repeating the call returns the already-completed task without duplicating completion. If the task has a recurrence rule, the next occurrence is created and returned as meta.spawned_task.","security":[{"bearerAuth":[]}],"parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"meta":{"type":"object","properties":{"spawned_task":{"type":["object","null"],"example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/tasks/{taskId}/reopen":{"post":{"operationId":"reopen_task","tags":["Tasks"],"summary":"Idempotently reopen a task","description":"Moves a completed task back to todo, clears completed_at, and records a reopen event.","security":[{"bearerAuth":[]}],"parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/tasks/{taskId}/subtasks":{"get":{"operationId":"get_subtasks","tags":["Tasks"],"summary":"List a task's subtasks","description":"Returns the tasks whose parent_task_id is this task, oldest first. Nesting is exactly one level deep, so these never have subtasks of their own.","security":[{"bearerAuth":[]}],"parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/tasks/{taskId}/comments":{"parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"get":{"operationId":"get_task_comments","tags":["Comments"],"summary":"Read a task's note log","description":"Timestamped notes attached to the task, oldest first. Use these for follow-ups and status updates instead of rewriting description.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","example":{"id":"a2f0c1d4-63b1-4a2c-9f0e-7c5b2d8e1a33","task_id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","body":"Client asked to call back tomorrow.","created_at":"2026-09-01T09:12:00Z","updated_at":"2026-09-01T09:12:00Z"},"properties":{"id":{"type":"string","format":"uuid"},"task_id":{"type":"string","format":"uuid"},"body":{"type":"string","maxLength":10000},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}},"post":{"operationId":"create_task_comment","tags":["Comments"],"summary":"Add a note to a task","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["body"],"example":{"body":"Client asked to call back tomorrow."},"properties":{"body":{"type":"string","minLength":1,"maxLength":10000}}}}}},"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","example":{"id":"a2f0c1d4-63b1-4a2c-9f0e-7c5b2d8e1a33","task_id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","body":"Client asked to call back tomorrow.","created_at":"2026-09-01T09:12:00Z","updated_at":"2026-09-01T09:12:00Z"},"properties":{"id":{"type":"string","format":"uuid"},"task_id":{"type":"string","format":"uuid"},"body":{"type":"string","maxLength":10000},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","example":{"id":"a2f0c1d4-63b1-4a2c-9f0e-7c5b2d8e1a33","task_id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","body":"Client asked to call back tomorrow.","created_at":"2026-09-01T09:12:00Z","updated_at":"2026-09-01T09:12:00Z"},"properties":{"id":{"type":"string","format":"uuid"},"task_id":{"type":"string","format":"uuid"},"body":{"type":"string","maxLength":10000},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/tasks/{taskId}/comments/{commentId}":{"delete":{"operationId":"delete_task_comment","tags":["Comments"],"summary":"Delete a note","security":[{"bearerAuth":[]}],"parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"commentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","example":{"id":"a2f0c1d4-63b1-4a2c-9f0e-7c5b2d8e1a33","task_id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","body":"Client asked to call back tomorrow.","created_at":"2026-09-01T09:12:00Z","updated_at":"2026-09-01T09:12:00Z"},"properties":{"id":{"type":"string","format":"uuid"},"task_id":{"type":"string","format":"uuid"},"body":{"type":"string","maxLength":10000},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"204":{"description":"Deleted"},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/tags":{"get":{"operationId":"get_tags","tags":["Tasks"],"summary":"List every tag in use","description":"Each distinct tag on the account with the number of live tasks carrying it, most used first. Use it to discover the vocabulary before filtering /tasks?tags=…","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"count":{"type":"integer"}}},"example":[{"tag":"sales","count":12}]}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/inbox":{"get":{"operationId":"get_inbox","tags":["Views"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/today":{"get":{"operationId":"get_today","tags":["Views"],"summary":"Get today's actionable work","description":"Returns open tasks that are in progress, scheduled today, due today, or overdue in the account timezone. Tasks waiting on an open blocker are excluded — they are counted in meta.blocked_count instead — and meta.estimated_minutes totals the estimates of everything returned.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}},"meta":{"type":"object","properties":{"blocked_count":{"type":"integer"},"estimated_minutes":{"type":"integer"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/upcoming":{"get":{"operationId":"get_upcoming","tags":["Views"],"summary":"Get future work","description":"Returns open tasks scheduled or due after today in the account timezone.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/next-task":{"get":{"operationId":"get_next_task","tags":["Views"],"summary":"Get the recommended next task","description":"Prefers in-progress and Today-eligible tasks, then sorts by value/priority score, due date, and age. Tasks waiting on an open blocker are never recommended. Returns null when no open task exists.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":["object","null"],"example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/projects":{"get":{"operationId":"get_projects","tags":["Projects"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"color":{"type":"string"},"archived_at":{"type":["string","null"],"format":"date-time"}}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}},"post":{"operationId":"create_project","tags":["Projects"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"color":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"color":{"type":"string"},"archived_at":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/projects/{projectId}":{"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"get":{"operationId":"get_project","tags":["Projects"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"color":{"type":"string"},"archived_at":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}},"patch":{"operationId":"update_project","tags":["Projects"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"color":{"type":"string"},"archived_at":{"type":["string","null"],"format":"date-time"}}}}}},"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"color":{"type":"string"},"archived_at":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}},"delete":{"operationId":"archive_project","tags":["Projects"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"color":{"type":"string"},"archived_at":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/activity":{"get":{"operationId":"get_activity","tags":["Activity"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}},"/daily-summary":{"get":{"operationId":"get_daily_summary","tags":["Activity"],"summary":"Summarize a calendar day","description":"Returns completed task snapshots, remaining Today work, overdue count, and the recommended next task for the requested date in the account timezone. Requires both tasks:read and activity:read.","security":[{"bearerAuth":[]}],"parameters":[{"name":"date","in":"query","description":"Local calendar date; defaults to today in the account timezone.","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Successful operation","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object"}}}}}},"400":{"description":"Malformed JSON","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"401":{"description":"Missing, invalid, expired, or revoked token","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"404":{"description":"Resource absent or owned by another user","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}},"422":{"description":"Request validation or ownership-reference failure","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"TaskOS API token","description":"A scoped token created by the user in TaskOS API Access. Raw tokens are shown once, hashed at rest, revocable, and optionally expiring."}},"schemas":{"Task":{"type":"object","example":{"id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","title":"Send the launch brief","description":"Share the final brief with stakeholders.","status":"todo","priority":"high","value_score":5,"priority_score":65,"project_id":null,"due_date":"2026-09-02","scheduled_date":"2026-09-01","parent_task_id":null,"blocked_by_task_id":null,"is_blocked":false,"estimated_minutes":30,"time_spent_minutes":null,"tags":["launch"],"completed_at":null,"created_at":"2026-08-31T18:00:00Z","updated_at":"2026-08-31T18:00:00Z"},"required":["id","title","status","priority","value_score","priority_score","tags","is_blocked","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["inbox","todo","in_progress","completed"]},"priority":{"type":"string","enum":["none","low","medium","high","urgent"]},"value_score":{"type":"integer","minimum":1,"maximum":5},"priority_score":{"type":"integer"},"project_id":{"type":["string","null"],"format":"uuid"},"due_date":{"type":["string","null"],"format":"date"},"scheduled_date":{"type":["string","null"],"format":"date"},"recurrence":{"type":["object","null"],"description":"Repeat rule. Completing the task creates the next occurrence, shifted from its scheduled_date (or due_date) and rolled forward past today if the task was completed late. A recurring task must have a due_date or scheduled_date to shift.","required":["freq","interval"],"example":{"freq":"weekly","interval":1},"properties":{"freq":{"type":"string","enum":["daily","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365,"default":1}}},"parent_task_id":{"type":["string","null"],"format":"uuid","description":"The task this one is a subtask of. Nesting is exactly one level deep: a subtask cannot itself take subtasks."},"blocked_by_task_id":{"type":["string","null"],"format":"uuid","description":"A task that must be completed before this one is workable. Cycles are rejected."},"is_blocked":{"type":"boolean","readOnly":true,"description":"Derived: true while blocked_by_task_id points at a task that is not yet completed. Blocked tasks are excluded from /today and never returned by /next-task."},"parent":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"blocked_by":{"type":["object","null"],"readOnly":true,"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"}}},"subtask_count":{"type":"integer","readOnly":true,"description":"How many live subtasks this task has."},"subtask_completed_count":{"type":"integer","readOnly":true,"description":"How many of those subtasks are completed."},"estimated_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task is expected to take, in minutes."},"time_spent_minutes":{"type":["integer","null"],"minimum":0,"maximum":100000,"description":"How long the task has actually taken so far, in minutes."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","maxLength":50},"example":["sales","quick win"],"description":"Free-form labels that cut across projects. Sending this key replaces the task's entire tag set; send [] or null to clear it. Tags are normalized to lowercase with collapsed whitespace, and may contain letters, numbers, spaces, hyphens, and underscores."},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"TaskComment":{"type":"object","example":{"id":"a2f0c1d4-63b1-4a2c-9f0e-7c5b2d8e1a33","task_id":"6ad28d2e-7c47-4e06-ae72-29469d812ef1","body":"Client asked to call back tomorrow.","created_at":"2026-09-01T09:12:00Z","updated_at":"2026-09-01T09:12:00Z"},"properties":{"id":{"type":"string","format":"uuid"},"task_id":{"type":"string","format":"uuid"},"body":{"type":"string","maxLength":10000},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"color":{"type":"string"},"archived_at":{"type":["string","null"],"format":"date-time"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}