{"openapi":"3.1.0","info":{"title":"tasuki hosted API","version":"0.1.0","description":"Manage a tasuki task list from an agent. Every /api/v1 call needs `Authorization: Bearer ts_...` (a token created by the human in tasuki). The token's trust level decides what it may do: Suggest only (read, suggest, comment), Trusted (also write), Full (also complete, delete and undo); explicit scopes (read, suggest, write, comment, complete, delete, undo) and an optional project restriction can be chosen instead. Feature-detect with GET /api/v1/capabilities. Writes accept an Idempotency-Key header and ?dry_run=true. v1 is additive-only (docs/API_POLICY.md). Tasks added with Suggest only come back as status 'proposed' and wait for the human to accept them. Accepting, rejecting, undoing and managing agents are human-only and return 403 to a token. Unknown JSON fields are rejected with 400. The native iOS app signs in with OAuth 2.1 + PKCE (docs/NATIVE_APP_AUTH.md) and then uses the same routes as the signed-in human, with a Bearer access token."},"servers":[{"url":"https://app.usetasuki.com"}],"security":[{"bearerAuth":[]}],"paths":{"/health":{"get":{"summary":"Liveness","operationId":"health","security":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"env":{"type":"string"},"version":{"type":"string"}}}}}}}}},"/openapi.json":{"get":{"summary":"This document","operationId":"openapi","security":[],"responses":{"200":{"description":"The OpenAPI document."}}}},"/api/v1/tasks":{"get":{"summary":"List tasks","operationId":"listTasks","description":"Needs the read scope. Deleted tasks are not listed. With no paging parameter the response is a bare array (as always); with limit/offset/cursor it is a page envelope.","parameters":[{"name":"blocked","in":"query","schema":{"type":"boolean"},"description":"true: only tasks with an open blocker; false: only unblocked tasks."},{"name":"ref.{key}","in":"query","schema":{"type":"string"},"description":"Exact ref filter, e.g. ref.ticket=INC-1042 (one ref at a time; the key is a-z 0-9 _ . -). The same as GET /tasks/by-ref but with the list filters."},{"name":"status","in":"query","schema":{"type":"string"},"description":"todo, doing, done or proposed; comma separated for several."},{"name":"project","in":"query","schema":{"type":"string"},"description":"Exact project name."},{"name":"project_id","in":"query","schema":{"type":"string"}},{"name":"label","in":"query","schema":{"type":"string"}},{"name":"priority","in":"query","schema":{"type":"string"},"description":"1-4 or a comma separated list."},{"name":"due_before","in":"query","schema":{"type":"string"},"description":"Strictly before this YYYY-MM-DD."},{"name":"due_after","in":"query","schema":{"type":"string"}},{"name":"due_on","in":"query","schema":{"type":"string"}},{"name":"due_today","in":"query","schema":{"type":"boolean"}},{"name":"overdue","in":"query","schema":{"type":"boolean"}},{"name":"has_due","in":"query","schema":{"type":"boolean"}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Substring search over title, notes, next action, waiting_on."},{"name":"next_actor","in":"query","schema":{"type":"string","enum":["human","agent","other"]}},{"name":"waiting","in":"query","schema":{"type":"boolean"}},{"name":"parent_id","in":"query","schema":{"type":"string"}},{"name":"top_level","in":"query","schema":{"type":"boolean"}},{"name":"available","in":"query","schema":{"type":"boolean"},"description":"Hide tasks whose start_date is in the future."},{"name":"sort","in":"query","schema":{"type":"string","enum":["created","updated","due","priority","manual","title"]}},{"name":"order","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500},"description":"Paging: with limit, offset or cursor the response is {tasks,total,limit,offset,next_cursor?} instead of a bare array."},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0}},{"name":"cursor","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Matching tasks (array) or a page.","content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Task"}},{"$ref":"#/components/schemas/TaskPage"}]}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}},"post":{"summary":"Add a task","operationId":"addTask","description":"Needs add or propose. With only propose the task is created with status 'proposed' and origin 'agent:<name>'. `status` is not accepted here.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/DryRun"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewTask"}}}},"responses":{"200":{"description":"An open task with the same title already existed (duplicate_of_existing: true), or this was a dry run (see dry_run=true).","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Task"},{"$ref":"#/components/schemas/DryRun"}]}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"201":{"description":"The new task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/capabilities":{"get":{"summary":"What this server supports","operationId":"capabilities","security":[],"description":"Feature flags, limits, rate-limit policy, supported MCP versions and deprecations. The static part needs no sign-in; with a valid credential the response also has `you` (scopes, project restriction, workspace_id).","responses":{"200":{"description":"Capabilities.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Capabilities"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/tasks/batch":{"post":{"summary":"Add or update up to 50 tasks","operationId":"batchTasks","description":"Items are independent (not all-or-nothing): each gets its own result with its own status and error; trust and scope are checked per item and every item counts toward the task caps. One request for rate limits. Takes one request-level Idempotency-Key. dry_run (body or query) previews every item.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/DryRun"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}}},"responses":{"200":{"description":"Per-item results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResult"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/tasks/by-ref":{"get":{"summary":"Find tasks by a ref","operationId":"tasksByRef","description":"Needs the read scope. Exact match on one ref key and value (done tasks included). Use it to find the task for an email conversation, a ticket or a URL.","parameters":[{"name":"key","in":"query","required":true,"schema":{"type":"string","pattern":"^[a-z0-9_.-]{1,32}$"}},{"name":"value","in":"query","required":true,"schema":{"type":"string","maxLength":512}}],"responses":{"200":{"description":"Tasks carrying that ref.","content":{"application/json":{"schema":{"type":"object","properties":{"tasks":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"total":{"type":"integer"}}}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/tasks/{id}/comments":{"parameters":[{"name":"id","in":"path","required":true,"description":"Task id, for example t_a1b2c3.","schema":{"type":"string"}}],"get":{"summary":"List a task's comments","operationId":"listComments","description":"Needs the read scope. Oldest first.","responses":{"200":{"description":"Comments.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No task with that id (or it is not yours).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}},"post":{"summary":"Comment on a task","operationId":"addComment","description":"Needs the comment scope (every preset has it, Suggest only included). Plain text, 1-2,000 characters, at most 200 comments per task.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["body"],"additionalProperties":false,"properties":{"body":{"type":"string","minLength":1,"maxLength":2000}}}}}},"responses":{"201":{"description":"The comment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No task with that id (or it is not yours).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/tasks/{id}/comments/{cid}":{"parameters":[{"name":"id","in":"path","required":true,"description":"Task id, for example t_a1b2c3.","schema":{"type":"string"}},{"name":"cid","in":"path","required":true,"description":"Comment id, for example cm_a1b2c3d4e5.","schema":{"type":"string"}}],"patch":{"summary":"Edit a comment","operationId":"editComment","description":"A person edits their own comments; an agent only its own.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["body"],"additionalProperties":false,"properties":{"body":{"type":"string","minLength":1,"maxLength":2000}}}}}},"responses":{"200":{"description":"The comment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No task with that id (or it is not yours).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}},"delete":{"summary":"Delete a comment (soft)","operationId":"deleteComment","description":"A person may delete any comment on their tasks; an agent only its own.","responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No task with that id (or it is not yours).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/changes/{id}/undo":{"parameters":[{"name":"id","in":"path","required":true,"description":"Change id: the activity number, as '41' or 'ev_41' (change_id in the change feed).","schema":{"type":"string"}}],"post":{"summary":"Undo one change","operationId":"undoChange","description":"Humans always; an agent needs the `undo` scope and may only undo changes it made itself (the `undo_any` scope lifts that). Refused with 409 and a reason when the thing changed again since (same rule as the app's Undo button), or when the change is itself an undo. The undo is logged as its own change.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Undone.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"undone":{"type":"string"},"task":{"$ref":"#/components/schemas/Task"}}}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No such change.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"409":{"description":"Cannot undo: changed since, or is an undo (body has reason).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/tasks/{id}":{"parameters":[{"name":"id","in":"path","required":true,"description":"Task id, for example t_a1b2c3.","schema":{"type":"string"}}],"get":{"summary":"Get one task","operationId":"getTask","description":"Needs the read scope.","responses":{"200":{"description":"The task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No task with that id (or it is not yours).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}},"patch":{"summary":"Change a task","operationId":"updateTask","description":"Needs the edit scope, or complete when setting status to done. An empty string clears an optional field. Pass base_version to fail with 409 if someone else changed the task.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/DryRun"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskPatch"}}}},"responses":{"200":{"description":"The updated task, or a dry run.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Task"},{"$ref":"#/components/schemas/DryRun"}]}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No task with that id (or it is not yours).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"409":{"description":"The task changed since base_version; the body carries the current task.","content":{"application/json":{"schema":{"type":"object","required":["error","current"],"properties":{"error":{"type":"string"},"current":{"$ref":"#/components/schemas/Task"}}}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}},"delete":{"summary":"Delete a task","operationId":"deleteTask","description":"Needs the delete scope. Soft delete: the human can undo it.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/DryRun"}],"responses":{"200":{"description":"Deleted ({ok: true}), or a dry run.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"ok":{"type":"boolean"}}},{"$ref":"#/components/schemas/DryRun"}]}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No task with that id (or it is not yours).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/tasks/{id}/complete":{"parameters":[{"name":"id","in":"path","required":true,"description":"Task id, for example t_a1b2c3.","schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"},{"$ref":"#/components/parameters/DryRun"}],"post":{"summary":"Mark a task done","operationId":"completeTask","description":"Needs the complete scope. `evidence` ({text, links}) is stored on the task and in the activity log; if the owner turned on 'Require evidence when agents complete tasks', an agent without evidence gets 400 with evidence_required: true. Completing a recurring task creates the next instance (response has recurred_to). A task with open sub-tasks returns 409 with open_subtasks unless complete_children is true.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"notes":{"type":"string","maxLength":20000},"evidence":{"type":"object","additionalProperties":false,"properties":{"text":{"type":"string","maxLength":4000},"links":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":1000}}}},"complete_children":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The completed task, or a dry run.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Task"},{"$ref":"#/components/schemas/DryRun"}]}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No task with that id (or it is not yours).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"409":{"description":"Open sub-tasks (body has open_subtasks).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/activity":{"get":{"summary":"Recent activity","operationId":"activity","description":"Needs the read scope. Newest first.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Log entries.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Activity"}}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/changes":{"get":{"summary":"Changes feed","operationId":"changes","description":"Needs the read scope. TWO shapes. (1) Legacy, unchanged: with a numeric `since` (or none) it returns task snapshots (including soft-deleted tombstones, deleted=true) whose seq is greater than `since`, plus the new high-water seq. (2) The event feed: with format=events or a cursor (`since=c_123` or `since=now`) it returns ordered change events for task, project, label, comment and agent-suggestion with an opaque cursor, next_cursor, has_more and reset. See docs/CHANGES_FEED.md.","parameters":[{"name":"wait","in":"query","schema":{"type":"integer","minimum":0,"maximum":25},"description":"Event feed only: long-poll. Hold the request up to this many seconds and answer early when there is a new event. Polled every ~2 s on the server; at most 3 waiting requests per account (429 beyond that)."},{"name":"since","in":"query","schema":{"type":"string"},"description":"Legacy: an integer seq. Event feed: a cursor from next_cursor (c_123), or 'now' for just the current cursor."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":1000,"default":500},"description":"Legacy default 500 (max 1000); event feed default 100 (max 500)."},{"name":"format","in":"query","schema":{"type":"string","enum":["events"]},"description":"events: return the change-event feed."},{"name":"view","in":"query","schema":{"type":"string","enum":["compact","full"],"default":"compact"},"description":"Event feed: compact (default) leaves out long fields such as notes; full sends the whole task."}],"responses":{"200":{"description":"Changes (legacy) or a ChangeFeed.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Changes"},{"$ref":"#/components/schemas/ChangeFeed"}]}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/today":{"get":{"summary":"Today view","operationId":"today","description":"Needs the read scope. Ranked: overdue, due_today, your_move (next_actor=human, no date), waiting (next_actor agent/other or waiting_on set), proposals, inbox. A task appears once, in the first section that fits; tasks with a future start_date are hidden. Dates are in the user's timezone.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"The ranked sections.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Today"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/projects":{"get":{"summary":"List projects","operationId":"listProjects","description":"Needs the read scope. Archived projects only with include_archived=true.","parameters":[{"name":"include_archived","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Projects with open task counts.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Project"}}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}},"post":{"summary":"Create a project","operationId":"createProject","description":"Needs the add or edit scope. 409 if the name exists (ignoring case).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","maxLength":60},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}}}}}},"responses":{"201":{"description":"The project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"409":{"description":"Name exists or the 200 project limit was reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/projects/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Project id, for example p_a1b2c3d4."}],"patch":{"summary":"Rename, recolour, archive or reorder a project","operationId":"updateProject","description":"Needs the edit scope. Renaming updates the project name on its tasks.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string"},"color":{"type":"string"},"archived":{"type":"boolean"},"sort_order":{"type":"number"}}}}}},"responses":{"200":{"description":"The project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No such project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"409":{"description":"Name exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}},"delete":{"summary":"Delete a project","operationId":"deleteProject","description":"Needs the delete scope. Its tasks are kept and lose the project. Undoable from the activity log.","responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"No such project.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/labels":{"get":{"summary":"List labels","operationId":"listLabels","description":"Needs the read scope. Labels are free-form short names created by using them on a task.","responses":{"200":{"description":"Labels with open task counts.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"color":{"type":"string"},"open_tasks":{"type":"integer"}}}}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/labels/{name}":{"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"},"description":"Label name (URL-encoded)."}],"patch":{"summary":"Rename a label (human only)","operationId":"renameLabel","security":[{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}}}}}},"responses":{"200":{"description":"Renamed.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such label.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Delete a label (human only)","operationId":"deleteLabel","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such label.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/rejections":{"get":{"summary":"What the human rejected, and why","operationId":"listRejections","description":"Needs the read scope. Newest first. Read it before proposing tasks.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"agent","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Reason list and rejections.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rejections"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/parse":{"post":{"summary":"Quick-add hints","operationId":"parseQuickAdd","description":"Needs the read scope. Deterministic parser for '#project @label p1 tomorrow every mon ~30m'. Returns the chips and a task body ready to POST to /tasks. Nothing is saved.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","maxLength":500}}}}}},"responses":{"200":{"description":"Parsed hints.","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"chips":{"type":"array","items":{"type":"object"}},"fields":{"type":"object"},"task":{"type":"object"}}}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Bad JSON, unknown field, wrong type, or too long.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"403":{"description":"The token does not have the scope this needs, or the action is human-only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"422":{"description":"Idempotency-Key reused with a different request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"description":"Rate limited; see Retry-After and the RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Tasuki-API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/settings":{"get":{"summary":"User settings (human only)","operationId":"getSettings","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"Settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"summary":"Change settings (human only)","operationId":"updateSettings","security":[{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"timezone":{"type":"string"},"require_agent_evidence":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}}},"400":{"description":"Bad timezone.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/import/preview":{"post":{"summary":"Preview an import (human only)","operationId":"importPreview","security":[{"cookieAuth":[]}],"description":"Parses the file text and reports what would be created. Writes nothing and stores nothing. Formats: todoist_csv, todoist_json, things_csv, things_json, csv, markdown. Max 2 MB.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["format","content"],"additionalProperties":false,"properties":{"format":{"type":"string","enum":["todoist_csv","todoist_json","things_csv","things_json","csv","markdown"]},"content":{"type":"string"},"default_project":{"type":"string","maxLength":60}}}}}},"responses":{"200":{"description":"Counts, warnings and the first 50 tasks.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Not that format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Over 2 MB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/import/commit":{"post":{"summary":"Run an import (human only)","operationId":"importCommit","security":[{"cookieAuth":[]}],"description":"Same body as preview. Creates the tasks with origin 'import' and ONE activity entry (op 'import'); undo it with POST /activity/{n}/revert. 409 if it would exceed the 5,000 task limit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["format","content"],"properties":{"format":{"type":"string"},"content":{"type":"string"},"default_project":{"type":"string"}}}}}},"responses":{"201":{"description":"Result.","content":{"application/json":{"schema":{"type":"object","properties":{"batch":{"type":"string"},"created":{"type":"integer"},"done":{"type":"integer"},"projects_created":{"type":"integer"},"skipped":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Task limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/export":{"get":{"summary":"Export your data (human only)","operationId":"exportData","security":[{"cookieAuth":[]}],"parameters":[{"name":"format","in":"query","schema":{"type":"string","enum":["json","csv","markdown"],"default":"json"}}],"description":"json: everything; csv: all task fields; markdown: a zip with one Obsidian Tasks .md per project.","responses":{"200":{"description":"The file."},"400":{"description":"Unknown format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tasks/{id}/accept":{"parameters":[{"name":"id","in":"path","required":true,"description":"Task id, for example t_a1b2c3.","schema":{"type":"string"}}],"post":{"summary":"Accept a proposal (human only)","operationId":"acceptTask","security":[{"cookieAuth":[]}],"description":"An optional JSON body of task fields (as in PATCH, without status) is applied while accepting: edit then accept.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"The accepted task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not a proposal.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tasks/{id}/reject":{"parameters":[{"name":"id","in":"path","required":true,"description":"Task id, for example t_a1b2c3.","schema":{"type":"string"}}],"post":{"summary":"Reject a proposal (human only)","operationId":"rejectTask","security":[{"cookieAuth":[]}],"description":"Optional body {reason_code, reason}. reason_code is one of not_relevant, duplicate, not_now, too_vague, not_for_agents, already_done, other. Agents read these through GET /rejections.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"reason_code":{"type":"string"},"reason":{"type":"string","maxLength":500}}}}}},"responses":{"200":{"description":"Rejected.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not a proposal.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/activity/{n}/revert":{"parameters":[{"name":"n","in":"path","required":true,"schema":{"type":"integer"}}],"post":{"summary":"Undo an activity entry (human only)","operationId":"revert","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"Reverted.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"task":{"oneOf":[{"$ref":"#/components/schemas/Task"},{"type":"null"}]}}}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such entry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me":{"get":{"summary":"Current user (human only)","operationId":"me","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"The user (id, email, name, created_at, workspace_id).","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"created_at":{"type":"string"},"workspace_id":{"type":"string","readOnly":true,"description":"The user's personal workspace id (read-only; sharing is not available yet)."}}}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/agents":{"get":{"summary":"List agent tokens (human only)","operationId":"listAgents","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"Agents (never includes tokens).","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Agent"}}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create an agent token (human only)","operationId":"createAgent","security":[{"cookieAuth":[]}],"description":"Returns the plaintext token exactly once; only its SHA-256 is stored.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"project_ids":{"type":"array","maxItems":50,"items":{"type":"string"},"description":"Optional: limit this token to these projects. It then cannot see or touch tasks in any other project (404), including through the change feed, list, search and Today."},"name":{"type":"string"},"preset":{"type":"string","enum":["suggest","trusted","full"]},"scopes":{"type":"array","items":{"type":"string","enum":["read","propose","add","edit","complete","delete","suggest","write","comment","undo","undo_any","webhooks"]}}}}}}},"responses":{"201":{"description":"The agent and its one-time token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewAgent"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/agents/{id}":{"parameters":[{"name":"id","in":"path","required":true,"description":"Task id, for example t_a1b2c3.","schema":{"type":"string"}}],"patch":{"summary":"Narrow an agent: project restriction and/or scopes (human only)","operationId":"updateAgent","security":[{"cookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"project_ids":{"type":["array","null"],"items":{"type":"string"},"description":"Limit the agent to these projects (null = all)."},"scopes":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"The agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agent"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Revoke an agent token (human only)","operationId":"revokeAgent","security":[{"cookieAuth":[]}],"responses":{"200":{"description":"Revoked.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/devices":{"get":{"summary":"List your devices","operationId":"listDevices","description":"Human session or the native app credential only; agent tokens get 403. Disabled devices are included (disabled: true). Tokens are never returned.","responses":{"200":{"description":"Devices.","content":{"application/json":{"schema":{"type":"object","properties":{"devices":{"type":"array","items":{"$ref":"#/components/schemas/Device"}}}}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Register or refresh this phone for push","operationId":"registerDevice","description":"Human session or the native app credential only; agent tokens get 403. Upsert by token: a token seen under another user moves to you; re-posting a disabled device re-enables it. apns_env must match how the app was signed (sandbox for Xcode builds, production for TestFlight / App Store). 60 per hour. See docs/PUSH_AND_DEVICES.md.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["token","apns_env"],"additionalProperties":false,"properties":{"token":{"type":"string","description":"APNs device token, hex, 32-200 characters."},"apns_env":{"type":"string","enum":["sandbox","production"]},"app_version":{"type":"string","maxLength":40},"os_version":{"type":"string","maxLength":40},"timezone":{"type":"string","description":"IANA name."},"locale":{"type":"string","maxLength":20}}}}}},"responses":{"200":{"description":"The token was already known; refreshed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Device"}}}},"201":{"description":"A new device row.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Device"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Device limit reached (10).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/devices/{id}":{"parameters":[{"name":"id","in":"path","required":true,"description":"Device id, for example dv_3f9a1c02b7.","schema":{"type":"string"}}],"delete":{"summary":"Remove a device","operationId":"deleteDevice","description":"Human session or the native app credential only; agent tokens get 403. Call on sign-out. Also deletes its Live Activity tokens.","responses":{"200":{"description":"Removed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such device.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/devices/{id}/activities":{"parameters":[{"name":"id","in":"path","required":true,"description":"Device id, for example dv_3f9a1c02b7.","schema":{"type":"string"}}],"post":{"summary":"Register a Live Activity update token","operationId":"registerActivity","description":"Human session or the native app credential only; agent tokens get 403. One review_waiting per device (a new one replaces the old), five activities per device. Tokens expire when the activity ends (APNs 410 deletes them).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","push_token"],"additionalProperties":false,"properties":{"kind":{"type":"string","enum":["review_waiting","focus"]},"push_token":{"type":"string"},"task_id":{"type":"string"},"started_at":{"type":"string","format":"date-time"}}}}}},"responses":{"200":{"description":"The token was already registered; updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveActivity"}}}},"201":{"description":"Registered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveActivity"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such device.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/devices/{id}/activities/{aid}":{"parameters":[{"name":"id","in":"path","required":true,"description":"Device id, for example dv_3f9a1c02b7.","schema":{"type":"string"}},{"name":"aid","in":"path","required":true,"description":"Activity id, for example la_...","schema":{"type":"string"}}],"delete":{"summary":"Remove a Live Activity token","operationId":"deleteActivity","description":"Human session or the native app credential only; agent tokens get 403.","responses":{"200":{"description":"Removed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such device or activity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/devices/{id}/push-to-start":{"parameters":[{"name":"id","in":"path","required":true,"description":"Device id, for example dv_3f9a1c02b7.","schema":{"type":"string"}}],"put":{"summary":"Store the push-to-start token","operationId":"setPushToStart","description":"Human session or the native app credential only; agent tokens get 403. The iOS 17.2+ token that lets the server start the review_waiting Live Activity. Send {token: null} to clear it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["token"],"additionalProperties":false,"properties":{"token":{"type":["string","null"]}}}}}},"responses":{"200":{"description":"Stored.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such device.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/notification-settings":{"get":{"summary":"Notification preferences","operationId":"getNotificationSettings","description":"Human session or the native app credential only; agent tokens get 403. Defaults: suggestions on, live_activities on, everything else off, quiet hours off.","responses":{"200":{"description":"Settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationSettings"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"summary":"Change notification preferences","operationId":"putNotificationSettings","description":"Human session or the native app credential only; agent tokens get 403. Merges the fields you send (quiet_hours may be partial); unknown fields are a 400. Returns the full document.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationSettings"}}}},"responses":{"200":{"description":"The merged settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationSettings"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhooks":{"get":{"summary":"List webhooks","operationId":"listWebhooks","description":"A human session sees all; a PAT with the `webhooks` scope sees the ones it created. Secrets are never listed.","responses":{"200":{"description":"Webhooks.","content":{"application/json":{"schema":{"type":"object","properties":{"webhooks":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create a webhook","operationId":"createWebhook","description":"Human session or a PAT with the `webhooks` scope (in no preset). Max 5 per user. https only; private, loopback and link-local addresses are refused (checked again at every delivery); redirects are never followed. The signing secret is returned ONCE. A project-restricted agent's webhook only sees events for its projects. See docs/WEBHOOKS.md.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url","events"],"additionalProperties":false,"properties":{"url":{"type":"string","maxLength":2000},"events":{"type":"array","items":{"type":"string","enum":["task.created","task.updated","task.completed","task.deleted","suggestion.created","suggestion.accepted","suggestion.rejected","comment.created"]}}}}}}},"responses":{"201":{"description":"Created; includes the secret (shown once).","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"secret":{"type":"string","description":"whsec_..., shown once."}}}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Webhook limit reached (5).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhooks/{id}":{"parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id, for example wh_ab12cd34ef56.","schema":{"type":"string"}}],"delete":{"summary":"Delete a webhook","operationId":"deleteWebhook","responses":{"200":{"description":"Deleted (its delivery log goes too).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such webhook.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhooks/{id}/deliveries":{"parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id, for example wh_ab12cd34ef56.","schema":{"type":"string"}}],"get":{"summary":"Delivery log","operationId":"listDeliveries","description":"The last 50 attempts: status, latency, short error. Never a request or response body.","responses":{"200":{"description":"Deliveries, newest first.","content":{"application/json":{"schema":{"type":"object","properties":{"deliveries":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}}}}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such webhook.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhooks/{id}/test":{"parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id, for example wh_ab12cd34ef56.","schema":{"type":"string"}}],"post":{"summary":"Send a test ping","operationId":"testWebhook","description":"One signed webhook.ping delivery, logged, not retried. 30 per hour.","responses":{"200":{"description":"The result of the ping.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"status":{"type":["integer","null"]},"latency_ms":{"type":"integer"},"error":{"type":["string","null"]},"delivery_id":{"type":"string"}}}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed for this credential.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such webhook.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/agents/{id}/usage":{"parameters":[{"name":"id","in":"path","required":true,"description":"Agent id.","schema":{"type":"string"}}],"get":{"summary":"An agent's usage (human only)","operationId":"agentUsage","security":[{"cookieAuth":[]}],"description":"Requests, writes, suggestions, errors and latency percentiles (bucketed) for the last 30 days, per day. Counts only, no task text.","responses":{"200":{"description":"Usage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentUsage"}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not a human session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"headers":{"ApiVersion":{"description":"The API major version that answered (1).","schema":{"type":"string"}},"RateLimitLimit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimitReset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"1-200 printable characters. Repeating the same request with the same key within 24 hours returns the first result (marked idempotent_replay: true and an Idempotent-Replay: true header); the same key with a different request is 422.","schema":{"type":"string","maxLength":200}},"DryRun":{"name":"dry_run","in":"query","required":false,"description":"true: return what would change ({would_apply, diff, would_require_review, trust_check}) and write nothing. Scope and trust are applied exactly as for a real call.","schema":{"type":"boolean"}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Agent token (ts_...), or an OAuth access token issued to the native app. Keep it private."},"cookieAuth":{"type":"apiKey","in":"cookie","name":"__Host-tasuki_session","description":"Human browser session (same-origin only)."}},"schemas":{"Task":{"type":"object","required":["id","title","status"],"properties":{"id":{"type":"string"},"title":{"type":"string","maxLength":500},"status":{"type":"string","enum":["todo","doing","done","proposed"],"description":"'proposed' means waiting for the human to accept it."},"next":{"type":"string","maxLength":500,"description":"The next action, written as actor · imperative. Put 'Done when:' criteria in notes."},"due":{"type":"string","maxLength":500},"effort":{"type":"string","maxLength":500,"description":"Effort in minutes."},"project":{"type":"string","maxLength":500},"origin":{"type":"string","description":"'human' or 'agent:<name>'."},"created":{"type":"string","format":"date-time"},"updated":{"type":"string","format":"date-time"},"notes":{"type":"string","maxLength":20000},"version":{"type":"integer","description":"Increments on every change; use as base_version for optimistic concurrency."},"next_action":{"type":"string","maxLength":500,"description":"Same field as `next`: the very next action, a short imperative."},"next_actor":{"type":"string","enum":["human","agent","other"],"description":"Who moves next. Drives the Today view."},"next_actor_name":{"type":"string","maxLength":80},"waiting_on":{"type":"string","maxLength":500,"description":"Free text: what or who this is blocked on."},"waiting_until":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Follow-up date for waiting_on."},"due_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Due date in the user's timezone. Setting `due` to an ISO date fills this."},"due_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"Due time HH:MM, wall-clock in due_tz."},"due_tz":{"type":"string","description":"IANA zone the due_time was set in (defaults to the user's timezone setting)."},"start_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Hide until: not shown on Today before this date."},"recurrence":{"description":"Object, or text such as 'every weekday' on input. Always an object on output (plus recurrence_text).","oneOf":[{"type":"object","description":"Recurrence rule. freq daily|weekdays|weekly|monthly|yearly; interval N; days (weekly) mon..sun; day 1-31 or -1 (monthly/yearly); month 1-12 (yearly); mode fixed|after_completion; anchor YYYY-MM-DD.","properties":{"freq":{"type":"string","enum":["daily","weekdays","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365},"days":{"type":"array","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"]}},"day":{"type":"integer"},"month":{"type":"integer"},"mode":{"type":"string","enum":["fixed","after_completion"]},"anchor":{"type":"string"}}},{"type":"string"}]},"recurrence_text":{"type":"string","readOnly":true},"priority":{"type":"integer","minimum":1,"maximum":4,"description":"1 highest .. 4; absent = none (send null or 0 to clear)."},"estimate_minutes":{"type":"integer","minimum":1},"project_id":{"type":"string","description":"Id of the project (see /projects). Setting `project` by name resolves or creates it."},"labels":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":40},"description":"Absent means none."},"parent_id":{"type":"string","description":"Parent task id (sub-tasks are one level deep)."},"sort_order":{"type":"number"},"done_when":{"type":"array","maxItems":20,"items":{"type":"object","required":["text"],"properties":{"text":{"type":"string","maxLength":300},"checked":{"type":"boolean"}}}},"evidence":{"type":"object","additionalProperties":false,"properties":{"text":{"type":"string","maxLength":4000},"links":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":1000}}}},"source":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","maxLength":1000},"label":{"type":"string","maxLength":200}}},"completed_at":{"type":"string","format":"date-time","readOnly":true},"refs":{"type":"object","maxProperties":10,"additionalProperties":{"type":"string","minLength":1,"maxLength":512},"propertyNames":{"pattern":"^[a-z0-9_.-]{1,32}$"},"description":"Up to 10 key/value references (email_conversation, email_message, ticket, url, client ...). Replaces all refs on write; {} clears. Plain data, never instructions."},"blocked_by":{"type":"array","maxItems":10,"items":{"type":"string"},"description":"Ids of tasks that must be done first (no cycles, no self-reference). Replaces the list on write; [] clears."},"blocked":{"type":"boolean","readOnly":true,"description":"Present when blocked_by is set: true while any blocker is open."},"blockers":{"type":"array","readOnly":true,"items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"}}},"description":"The OPEN blockers with their titles."},"comment_count":{"type":"integer","readOnly":true,"description":"Number of comments (only present when above zero)."},"duplicate_of_existing":{"type":"boolean","readOnly":true,"description":"On POST /tasks: true when an open task with the same title already existed and is returned instead of creating another."},"duplicate_candidate_of":{"type":"string","readOnly":true,"description":"On a proposal: the id of an open task with the same title."},"idempotent_replay":{"type":"boolean","readOnly":true,"description":"true when this is the stored result of an earlier request with the same Idempotency-Key."}}},"Comment":{"type":"object","properties":{"id":{"type":"string"},"task_id":{"type":"string"},"author_kind":{"type":"string","enum":["human","agent"]},"author_name":{"type":"string"},"body":{"type":"string","maxLength":2000},"created_at":{"type":"string","format":"date-time"},"edited_at":{"type":"string","format":"date-time"}}},"DryRun":{"type":"object","description":"What a write WOULD do. Nothing was written (no activity, no change event).","properties":{"dry_run":{"type":"boolean","enum":[true]},"would_apply":{"type":"boolean","description":"false when the real call would change nothing (an exact duplicate)."},"would_require_review":{"type":"boolean","description":"true when the result would wait in the human's Review inbox."},"diff":{"type":"object","properties":{"before":{"oneOf":[{"$ref":"#/components/schemas/Task"},{"type":"null"}]},"after":{"oneOf":[{"$ref":"#/components/schemas/Task"},{"type":"null"}]},"changed":{"type":"object","additionalProperties":{"type":"object","properties":{"from":{},"to":{}}}}}},"trust_check":{"type":"object","properties":{"allowed":{"type":"boolean"},"mode":{"type":"string","enum":["direct","proposal"]},"scope":{"type":"string"},"granted_scopes":{"type":"array","items":{"type":"string"}},"project_restricted":{"type":"boolean"}}},"duplicate_of":{"type":"string"},"duplicate_candidate_of":{"type":"string"},"also_completes":{"type":"array","items":{"type":"string"}},"would_spawn":{"type":"boolean"}}},"BatchRequest":{"type":"object","required":["items"],"additionalProperties":false,"properties":{"op":{"type":"string","enum":["add","update"],"default":"add"},"items":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","description":"A NewTask (op add) or a TaskPatch with the task id (op update)."}},"dry_run":{"type":"boolean"}}},"BatchResult":{"type":"object","properties":{"op":{"type":"string"},"dry_run":{"type":"boolean"},"total":{"type":"integer"},"succeeded":{"type":"integer"},"failed":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"ok":{"type":"boolean"},"status":{"type":"integer","description":"HTTP-style status of this item."},"task":{"$ref":"#/components/schemas/Task"},"dry_run":{"$ref":"#/components/schemas/DryRun"},"duplicate_of_existing":{"type":"boolean"},"error":{"type":"string"},"details":{"type":"object"}}}}}},"ChangeEvent":{"type":"object","description":"One change. De-duplicate on id (delivery is at-least-once). Ordered by cursor.","properties":{"id":{"type":"string","description":"ev_<n>"},"cursor":{"type":"string","description":"c_<n>; opaque, pass the last one back"},"at":{"type":"string","format":"date-time"},"type":{"type":"string","description":"<entity>.<action>, e.g. task.completed"},"entity":{"type":"string","enum":["task","project","label","comment","agent-suggestion","import"]},"entity_id":{"type":"string"},"action":{"type":"string","enum":["created","updated","completed","reopened","deleted","restored","recurred","blocked","unblocked","proposed","accepted","rejected","reverted"]},"actor":{"type":"object","properties":{"kind":{"type":"string","enum":["human","agent"]},"name":{"type":"string"},"id":{"type":"string"}}},"origin":{"type":["string","null"],"description":"web | ios | api | mcp, or null for older entries."},"change_id":{"type":"string","description":"Pass to POST /changes/{id}/undo."},"version":{"type":"integer"},"project_id":{"type":"string"},"parent":{"type":"object","properties":{"entity":{"type":"string"},"id":{"type":"string"}}},"changed":{"type":"array","items":{"type":"string"}},"after":{"type":["object","null"],"description":"The entity after the change (compact task view), null for a delete."},"deleted":{"type":"boolean","enum":[true]},"undo_of":{"type":"string"},"resync":{"type":"string","enum":["tasks"],"description":"The change touched many tasks without one event each; re-list them."},"scope_exit":{"type":"boolean"}}},"ChangeFeed":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/ChangeEvent"}},"next_cursor":{"type":"string"},"has_more":{"type":"boolean"},"reset":{"type":"boolean","description":"true: your cursor is too old or invalid; discard local state, re-fetch (see baseline) and continue from next_cursor."},"retention_days":{"type":"integer"},"workspace_id":{"type":"string"},"baseline":{"type":"object","properties":{"instruction":{"type":"string"},"fetch":{"type":"array","items":{"type":"string"}}}}}},"Capabilities":{"type":"object","properties":{"api_version":{"type":"string"},"server":{"type":"object"},"features":{"type":"object","additionalProperties":{"type":"boolean"}},"limits":{"type":"object"},"rate_limit":{"type":"object"},"changes_feed":{"type":"object"},"scopes":{"type":"object"},"mcp":{"type":"object"},"idempotency":{"type":"object"},"openapi":{"type":"string"},"deprecations":{"type":"array","items":{"type":"object"}},"you":{"type":"object","description":"Only with a valid credential: kind, name, workspace_id, scopes, project_ids."},"push":{"type":"object"},"webhooks":{"type":"object"},"long_poll":{"type":"object"}}},"TaskPage":{"type":"object","properties":{"tasks":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"next_cursor":{"type":"string"}}},"Project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"},"archived":{"type":"boolean"},"sort_order":{"type":"number"},"open_tasks":{"type":"integer"},"created":{"type":"string"},"updated":{"type":"string"}}},"Settings":{"type":"object","properties":{"timezone":{"type":"string"},"require_agent_evidence":{"type":"boolean"}}},"Rejections":{"type":"object","properties":{"reasons":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"label":{"type":"string"}}}},"rejections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"rejected_at":{"type":"string"},"agent":{"type":["string","null"]},"title":{"type":"string"},"reason_code":{"type":"string"},"reason_label":{"type":"string"},"reason":{"type":"string"},"suggestion":{"type":"object"}}}}}},"Today":{"type":"object","properties":{"date":{"type":"string"},"timezone":{"type":"string"},"time":{"type":"string"},"counts":{"type":"object"},"sections":{"type":"object","properties":{"overdue":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"due_today":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"your_move":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"waiting":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"proposals":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"inbox":{"type":"array","items":{"$ref":"#/components/schemas/Task"}}}},"truncated":{"type":"boolean"}}},"NewTask":{"type":"object","required":["title"],"additionalProperties":false,"properties":{"next":{"type":"string","maxLength":500,"description":"The next action, written as actor · imperative. Put 'Done when:' criteria in notes."},"due":{"type":"string","maxLength":500},"effort":{"type":"string","maxLength":500,"description":"Effort in minutes."},"project":{"type":"string","maxLength":500},"notes":{"type":"string","maxLength":20000},"next_action":{"type":"string","maxLength":500,"description":"Same field as `next`: the very next action, a short imperative."},"next_actor":{"type":"string","enum":["human","agent","other"],"description":"Who moves next. Drives the Today view."},"next_actor_name":{"type":"string","maxLength":80},"waiting_on":{"type":"string","maxLength":500,"description":"Free text: what or who this is blocked on."},"waiting_until":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Follow-up date for waiting_on."},"due_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Due date in the user's timezone. Setting `due` to an ISO date fills this."},"due_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"Due time HH:MM, wall-clock in due_tz."},"start_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Hide until: not shown on Today before this date."},"recurrence":{"description":"Object, or text such as 'every weekday' on input. Always an object on output (plus recurrence_text).","oneOf":[{"type":"object","description":"Recurrence rule. freq daily|weekdays|weekly|monthly|yearly; interval N; days (weekly) mon..sun; day 1-31 or -1 (monthly/yearly); month 1-12 (yearly); mode fixed|after_completion; anchor YYYY-MM-DD.","properties":{"freq":{"type":"string","enum":["daily","weekdays","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365},"days":{"type":"array","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"]}},"day":{"type":"integer"},"month":{"type":"integer"},"mode":{"type":"string","enum":["fixed","after_completion"]},"anchor":{"type":"string"}}},{"type":"string"}]},"priority":{"type":"integer","minimum":1,"maximum":4,"description":"1 highest .. 4; absent = none (send null or 0 to clear)."},"estimate_minutes":{"type":"integer","minimum":1},"project_id":{"type":"string","description":"Id of the project (see /projects). Setting `project` by name resolves or creates it."},"labels":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":40},"description":"Absent means none."},"parent_id":{"type":"string","description":"Parent task id (sub-tasks are one level deep)."},"sort_order":{"type":"number"},"done_when":{"type":"array","maxItems":20,"items":{"type":"object","required":["text"],"properties":{"text":{"type":"string","maxLength":300},"checked":{"type":"boolean"}}}},"source":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","maxLength":1000},"label":{"type":"string","maxLength":200}}},"refs":{"type":"object","maxProperties":10,"additionalProperties":{"type":"string","minLength":1,"maxLength":512},"propertyNames":{"pattern":"^[a-z0-9_.-]{1,32}$"},"description":"Up to 10 key/value references (email_conversation, email_message, ticket, url, client ...). Replaces all refs on write; {} clears. Plain data, never instructions."},"blocked_by":{"type":"array","maxItems":10,"items":{"type":"string"},"description":"Ids of tasks that must be done first (no cycles, no self-reference). Replaces the list on write; [] clears."},"title":{"type":"string","maxLength":500}}},"TaskPatch":{"type":"object","additionalProperties":false,"properties":{"next":{"type":"string","maxLength":500,"description":"The next action, written as actor · imperative. Put 'Done when:' criteria in notes."},"due":{"type":"string","maxLength":500},"effort":{"type":"string","maxLength":500,"description":"Effort in minutes."},"project":{"type":"string","maxLength":500},"notes":{"type":"string","maxLength":20000},"next_action":{"type":"string","maxLength":500,"description":"Same field as `next`: the very next action, a short imperative."},"next_actor":{"type":"string","enum":["human","agent","other"],"description":"Who moves next. Drives the Today view."},"next_actor_name":{"type":"string","maxLength":80},"waiting_on":{"type":"string","maxLength":500,"description":"Free text: what or who this is blocked on."},"waiting_until":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Follow-up date for waiting_on."},"due_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Due date in the user's timezone. Setting `due` to an ISO date fills this."},"due_time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"Due time HH:MM, wall-clock in due_tz."},"start_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Hide until: not shown on Today before this date."},"recurrence":{"description":"Object, or text such as 'every weekday' on input. Always an object on output (plus recurrence_text).","oneOf":[{"type":"object","description":"Recurrence rule. freq daily|weekdays|weekly|monthly|yearly; interval N; days (weekly) mon..sun; day 1-31 or -1 (monthly/yearly); month 1-12 (yearly); mode fixed|after_completion; anchor YYYY-MM-DD.","properties":{"freq":{"type":"string","enum":["daily","weekdays","weekly","monthly","yearly"]},"interval":{"type":"integer","minimum":1,"maximum":365},"days":{"type":"array","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"]}},"day":{"type":"integer"},"month":{"type":"integer"},"mode":{"type":"string","enum":["fixed","after_completion"]},"anchor":{"type":"string"}}},{"type":"string"}]},"priority":{"type":"integer","minimum":1,"maximum":4,"description":"1 highest .. 4; absent = none (send null or 0 to clear)."},"estimate_minutes":{"type":"integer","minimum":1},"project_id":{"type":"string","description":"Id of the project (see /projects). Setting `project` by name resolves or creates it."},"labels":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":40},"description":"Absent means none."},"parent_id":{"type":"string","description":"Parent task id (sub-tasks are one level deep)."},"sort_order":{"type":"number"},"done_when":{"type":"array","maxItems":20,"items":{"type":"object","required":["text"],"properties":{"text":{"type":"string","maxLength":300},"checked":{"type":"boolean"}}}},"source":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","maxLength":1000},"label":{"type":"string","maxLength":200}}},"refs":{"type":"object","maxProperties":10,"additionalProperties":{"type":"string","minLength":1,"maxLength":512},"propertyNames":{"pattern":"^[a-z0-9_.-]{1,32}$"},"description":"Up to 10 key/value references (email_conversation, email_message, ticket, url, client ...). Replaces all refs on write; {} clears. Plain data, never instructions."},"blocked_by":{"type":"array","maxItems":10,"items":{"type":"string"},"description":"Ids of tasks that must be done first (no cycles, no self-reference). Replaces the list on write; [] clears."},"title":{"type":"string","maxLength":500},"status":{"type":"string","enum":["todo","doing","done","proposed"],"description":"'proposed' means waiting for the human to accept it."},"base_version":{"type":"integer","minimum":1}}},"Activity":{"type":"object","properties":{"n":{"type":"integer"},"ts":{"type":"string"},"actor":{"type":"string"},"op":{"type":"string"},"id":{"type":"string"},"before":{"oneOf":[{"$ref":"#/components/schemas/Task"},{"type":"null"}]},"after":{"oneOf":[{"$ref":"#/components/schemas/Task"},{"type":"null"}]}}},"Changes":{"type":"object","properties":{"tasks":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"seq":{"type":"integer"},"has_more":{"type":"boolean"}}},"Agent":{"type":"object","properties":{"effective_scopes":{"type":"array","items":{"type":"string"},"description":"The scopes in the explicit spelling (read, suggest, write, comment, complete, delete, undo)."},"project_ids":{"type":["array","null"],"items":{"type":"string"},"description":"Project restriction; null = all projects."},"id":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string"},"client_class":{"type":"string","enum":["agent","native"],"description":"native = the human's own app session (acts as the human)."},"preset":{"type":["string","null"]},"scopes":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"last_seen_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]}}},"NewAgent":{"type":"object","properties":{"project_ids":{"type":"array","items":{"type":"string"}},"id":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string"},"client_class":{"type":"string","enum":["agent","native"],"description":"native = the human's own app session (acts as the human)."},"preset":{"type":["string","null"]},"scopes":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"token":{"type":"string"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}},"Ok":{"type":"object","properties":{"ok":{"type":"boolean"}}},"Device":{"type":"object","properties":{"id":{"type":"string"},"platform":{"type":"string","enum":["ios"]},"apns_env":{"type":"string","enum":["sandbox","production"]},"app_version":{"type":["string","null"]},"os_version":{"type":["string","null"]},"timezone":{"type":["string","null"]},"locale":{"type":["string","null"]},"token_suffix":{"type":"string","description":"Last 6 characters of the token; the full token is never returned."},"created_at":{"type":"string"},"last_seen_at":{"type":["string","null"]},"last_push_at":{"type":["string","null"]},"disabled":{"type":"boolean"},"failure_count":{"type":"integer"},"push_available":{"type":"boolean","description":"Mirrors capabilities.features.push."}}},"LiveActivity":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["review_waiting","focus"]},"task_id":{"type":["string","null"]},"started_at":{"type":["string","null"]},"created_at":{"type":"string"}}},"NotificationSettings":{"type":"object","additionalProperties":false,"properties":{"suggestions":{"type":"boolean"},"agent_activity":{"type":"boolean"},"blocked_cleared":{"type":"boolean"},"comments":{"type":"boolean"},"due":{"type":"boolean"},"live_activities":{"type":"boolean"},"quiet_hours":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"timezone":{"type":"string"}}}}},"Webhook":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"created_by":{"type":"string"},"disabled":{"type":"boolean"},"disabled_reason":{"type":["string","null"]},"consecutive_failures":{"type":"integer"},"last_success_at":{"type":["string","null"]},"last_failure_at":{"type":["string","null"]}}},"WebhookDelivery":{"type":"object","properties":{"id":{"type":"string"},"event":{"type":"string"},"attempt":{"type":"integer"},"ok":{"type":"boolean"},"status":{"type":["integer","null"]},"latency_ms":{"type":["integer","null"]},"error":{"type":["string","null"]},"at":{"type":"string"}}},"AgentUsage":{"type":"object","properties":{"agent_id":{"type":"string"},"name":{"type":"string"},"last_used_at":{"type":["string","null"]},"window_days":{"type":"integer"},"totals":{"type":"object"},"last_7_days":{"type":"object"},"latency_note":{"type":"string"},"daily":{"type":"array","items":{"type":"object"}}}}}}}