{"openapi":"3.1.0","info":{"title":"Nyblit API","version":"1.0.0-beta","summary":"Read and manage your Nyblit Tasks, Projects, Workflows and Statuses.","description":"Authenticate with a personal access token: `Authorization: Bearer nyb_pat_…`. Create tokens in Nyblit → My account → API Access. Requires a plan with API Access.","contact":{"name":"Nyblit","url":"https://www.nyblit.app"}},"servers":[{"url":"https://developers.nyblit.app/api/v1"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"User","description":"Who the token acts as."},{"name":"Tasks","description":"Tasks always have exactly one Disposition."},{"name":"Projects","description":"Optional grouping for tasks."},{"name":"Workflows","description":"User-defined Workflows and their Statuses."},{"name":"Dispositions","description":"The five fixed Dispositions (tabs)."}],"paths":{"/me":{"get":{"operationId":"getMe","tags":["User"],"summary":"Get the token’s user","description":"Identity and the token’s scopes — handy for checking a token works. Any valid token; no scope needed.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/dispositions":{"get":{"operationId":"listDispositions","tags":["Dispositions"],"summary":"List Dispositions","description":"All five, in tab order, with their current labels and colours. Any valid token; no scope needed.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispositionList"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/tasks":{"get":{"operationId":"listTasks","tags":["Tasks"],"summary":"List tasks","description":"Your tasks. Oldest first, with cursor pagination. Unknown query parameters are rejected with 400 so typos do not silently return everything. Requires `tasks:read`.","security":[{"bearerAuth":["tasks:read"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size (1–100).","schema":{"default":50,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"`next_cursor` from the previous page.","schema":{"type":"string","maxLength":200}},{"name":"disposition","in":"query","required":false,"schema":{"type":"string","enum":["not_started","in_progress","waiting","on_hold","done"]}},{"name":"project_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"updated_since","in":"query","required":false,"description":"Only tasks updated at or after this time.","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},{"name":"include_archived","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskList"}}}},"400":{"description":"Invalid query parameters.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"createTask","tags":["Tasks"],"summary":"Create a task","description":"Creates a task in your account; it appears in the apps straight away. Send `status_id` to start it on a Status (that sets its Workflow and Disposition), or `workflow_id` to land on that Workflow’s Status for the Disposition. Counts against your plan’s active-task limit. Requires `tasks:write`.","security":[{"bearerAuth":["tasks:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Any unique string (1–255 printable characters). Retrying with the same key returns the task the first request created (`200` + `Idempotent-Replayed: true`) instead of creating another.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTask"}}}},"responses":{"200":{"description":"Replayed — the task an earlier request with this `Idempotency-Key` created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"201":{"description":"Created.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."},"Location":{"schema":{"type":"string"},"description":"URL of the new task."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, the plan lacks API Access, or the plan’s active-task limit is reached (`task_limit_reached`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/tasks/{id}":{"get":{"operationId":"getTask","tags":["Tasks"],"summary":"Get a task","description":"One of your tasks. Requires `tasks:read`.","security":[{"bearerAuth":["tasks:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No task with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"operationId":"updateTask","tags":["Tasks"],"summary":"Update a task","description":"Changes only the fields you send. The same rules as the app apply: a Status sets the Workflow and Disposition; changing the Disposition alone clears the Status; changing the Workflow resets its step progress; `on_hold_until` needs the `on_hold` Disposition, and leaving `on_hold` clears it. Requires `tasks:write`.","security":[{"bearerAuth":["tasks:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":false,"description":"The task’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTask"}}}},"responses":{"200":{"description":"OK — the updated task.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No task with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The task changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"operationId":"deleteTask","tags":["Tasks"],"summary":"Delete a task","description":"Permanently deletes the task and its checklist, attachments and links. This cannot be undone. Requires `tasks:write`.","security":[{"bearerAuth":["tasks:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":false,"description":"The task’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No task with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The task changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/tasks/{id}/complete":{"post":{"operationId":"completeTask","tags":["Tasks"],"summary":"Complete a task","description":"Moves the task to `done` and stamps `completed_at`. Same as `PATCH` with `{\"disposition\": \"done\"}`. Requires `tasks:write`.","security":[{"bearerAuth":["tasks:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":false,"description":"The task’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK — the updated task.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No task with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The task changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/tasks/{id}/later":{"post":{"operationId":"laterTask","tags":["Tasks"],"summary":"Move a task to Later","description":"Moves the task to `on_hold` (Later). With `until`, it wakes back onto Today (`in_progress`) at that time, returning to the Today Status it left. Requires `tasks:write`.","security":[{"bearerAuth":["tasks:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":false,"description":"The task’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaterTask"}}}},"responses":{"200":{"description":"OK — the updated task.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No task with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The task changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/tasks/{id}/archive":{"post":{"operationId":"archiveTask","tags":["Tasks"],"summary":"Archive a task","description":"Hides the task from its tab without deleting it. List with `include_archived=true` to see it. Requires `tasks:write`.","security":[{"bearerAuth":["tasks:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":false,"description":"The task’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK — the updated task.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No task with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The task changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/tasks/{id}/unarchive":{"post":{"operationId":"unarchiveTask","tags":["Tasks"],"summary":"Unarchive a task","description":"Puts an archived task back on its tab. Requires `tasks:write`.","security":[{"bearerAuth":["tasks:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":false,"description":"The task’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK — the updated task.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No task with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The task changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/tasks/{id}/steps":{"get":{"operationId":"listTaskSteps","tags":["Tasks"],"summary":"List a task’s steps","description":"Progressive steps in app order: the Today Statuses of the task’s Workflow, or its own checklist when it has no Workflow. Requires `tasks:read`.","security":[{"bearerAuth":["tasks:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepList"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No task with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"createTaskStep","tags":["Tasks"],"summary":"Add a checklist step","description":"Adds a step to the end of the task’s checklist. Only for tasks without a Workflow (their steps come from the Workflow). The first step replaces a whole-task time estimate; after that the task’s time is the sum of its steps. At most 100 steps per task. Requires `tasks:write`.","security":[{"bearerAuth":["tasks:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStep"}}}},"responses":{"201":{"description":"Created.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Step"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No task with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/tasks/{id}/steps/{step_id}":{"patch":{"operationId":"updateTaskStep","tags":["Tasks"],"summary":"Update a step","description":"Tick, untick, rename (checklist steps only) or set the minutes for one step. Minutes update the task’s time to the sum of its steps. Requires `tasks:write`.","security":[{"bearerAuth":["tasks:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"step_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"A step `id` from the task’s steps list."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStep"}}}},"responses":{"200":{"description":"OK — the updated step.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Step"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such task in your account, or the step is not one of its steps.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"operationId":"deleteTaskStep","tags":["Tasks"],"summary":"Delete a checklist step","description":"Removes a checklist step. Workflow steps can’t be removed from a task (400) — untick them or change the task’s Workflow. Requires `tasks:write`.","security":[{"bearerAuth":["tasks:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"step_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"A step `id` from the task’s steps list."}],"responses":{"204":{"description":"Deleted.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such task in your account, or the step is not one of its steps.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/projects":{"get":{"operationId":"listProjects","tags":["Projects"],"summary":"List projects","description":"Projects you own. Oldest first, with cursor pagination. Unknown query parameters are rejected with 400 so typos do not silently return everything. Requires `projects:read`.","security":[{"bearerAuth":["projects:read"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size (1–100).","schema":{"default":50,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"`next_cursor` from the previous page.","schema":{"type":"string","maxLength":200}},{"name":"include_archived","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectList"}}}},"400":{"description":"Invalid query parameters.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"createProject","tags":["Projects"],"summary":"Create a project","description":"Adds a project at the end of your project list. Requires `projects:write`.","security":[{"bearerAuth":["projects:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Any unique string (1–255 printable characters). Retrying with the same key returns the project the first request created (`200` + `Idempotent-Replayed: true`) instead of creating another.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProject"}}}},"responses":{"200":{"description":"Replayed — the project an earlier request with this `Idempotency-Key` created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"201":{"description":"Created.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."},"Location":{"schema":{"type":"string"},"description":"URL of the new project."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/projects/{id}":{"get":{"operationId":"getProject","tags":["Projects"],"summary":"Get a project","description":"One of your projects. Requires `projects:read`.","security":[{"bearerAuth":["projects:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No project with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"operationId":"updateProject","tags":["Projects"],"summary":"Update a project","description":"Changes only the fields you send. `archived: true` hides the project; its tasks are unchanged. Requires `projects:write`.","security":[{"bearerAuth":["projects:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":false,"description":"The project’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProject"}}}},"responses":{"200":{"description":"OK — the updated project.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No project with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The project changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"operationId":"deleteProject","tags":["Projects"],"summary":"Delete a project","description":"Permanently deletes the project. Its tasks stay but lose their project; files, contacts and email links attached to the project itself are deleted with it. This cannot be undone. Requires `projects:write`.","security":[{"bearerAuth":["projects:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":false,"description":"The project’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No project with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The project changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/workflows":{"get":{"operationId":"listWorkflows","tags":["Workflows"],"summary":"List Workflows","description":"Your Workflows. Oldest first, with cursor pagination. Unknown query parameters are rejected with 400 so typos do not silently return everything. Requires `workflows:read`.","security":[{"bearerAuth":["workflows:read"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size (1–100).","schema":{"default":50,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"`next_cursor` from the previous page.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowList"}}}},"400":{"description":"Invalid query parameters.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"createWorkflow","tags":["Workflows"],"summary":"Create a Workflow","description":"Adds a Workflow at the end of your list, optionally with its Statuses in one call. Its Today (`in_progress`) Statuses become the progressive steps of tasks on it. Requires `workflows:write`.","security":[{"bearerAuth":["workflows:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Any unique string (1–255 printable characters). Retrying with the same key returns the Workflow the first request created (`200` + `Idempotent-Replayed: true`) instead of creating another.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkflow"}}}},"responses":{"200":{"description":"Replayed — the Workflow an earlier request with this `Idempotency-Key` created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowWithStatuses"}}}},"201":{"description":"Created.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."},"Location":{"schema":{"type":"string"},"description":"URL of the new Workflow."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowWithStatuses"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/workflows/{id}":{"get":{"operationId":"getWorkflow","tags":["Workflows"],"summary":"Get a Workflow","description":"One of your Workflows. Requires `workflows:read`.","security":[{"bearerAuth":["workflows:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workflow"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No Workflow with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"operationId":"updateWorkflow","tags":["Workflows"],"summary":"Update a Workflow","description":"Renames it or changes its emoji / description. Requires `workflows:write`.","security":[{"bearerAuth":["workflows:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":false,"description":"The Workflow’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkflow"}}}},"responses":{"200":{"description":"OK — the updated Workflow.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workflow"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No Workflow with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The Workflow changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"operationId":"deleteWorkflow","tags":["Workflows"],"summary":"Delete a Workflow","description":"Permanently deletes the Workflow and its Statuses. Tasks on it stay (in the same Disposition) with no Workflow or Status. This cannot be undone. Requires `workflows:write`.","security":[{"bearerAuth":["workflows:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":false,"description":"The Workflow’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No Workflow with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The Workflow changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/workflows/{id}/statuses":{"get":{"operationId":"listWorkflowStatuses","tags":["Workflows"],"summary":"List a Workflow’s Statuses","description":"Grouped by Disposition in tab order, then by position. Requires `workflows:read`.","security":[{"bearerAuth":["workflows:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"The Workflow’s `id`."}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusList"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No Workflow with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"createStatus","tags":["Workflows"],"summary":"Add a Status","description":"Adds a Status at the end of its Disposition’s Statuses in this Workflow. Requires `workflows:write`.","security":[{"bearerAuth":["workflows:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"The Workflow’s `id`."},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any unique string (1–255 printable characters). Retrying with the same key returns the Status the first request created (`200` + `Idempotent-Replayed: true`) instead of creating another.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStatus"}}}},"responses":{"200":{"description":"Replayed — the Status an earlier request with this `Idempotency-Key` created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}},"201":{"description":"Created.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."},"Location":{"schema":{"type":"string"},"description":"URL of the new Status."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No Workflow with this id in your account.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/workflows/{id}/statuses/{status_id}":{"get":{"operationId":"getStatus","tags":["Workflows"],"summary":"Get a Status","description":"One Status of one of your Workflows. Requires `workflows:read`.","security":[{"bearerAuth":["workflows:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"The Workflow’s `id`."},{"name":"status_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"A Status `id` from the Workflow’s Statuses."}],"responses":{"200":{"description":"OK.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such Workflow in your account, or the Status is not one of its Statuses.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"operationId":"updateStatus","tags":["Workflows"],"summary":"Update a Status","description":"Changes only the fields you send. Changing its Disposition moves every unarchived task on this Status to that Disposition as well (a task’s Disposition always matches its Status). Requires `workflows:write`.","security":[{"bearerAuth":["workflows:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"The Workflow’s `id`."},{"name":"status_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"A Status `id` from the Workflow’s Statuses."},{"name":"If-Match","in":"header","required":false,"description":"The Status’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStatus"}}}},"responses":{"200":{"description":"OK — the updated Status.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."},"ETag":{"schema":{"type":"string"},"description":"The resource `version`, quoted."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such Workflow in your account, or the Status is not one of its Statuses.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The Status changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"operationId":"deleteStatus","tags":["Workflows"],"summary":"Delete a Status","description":"Permanently deletes the Status. Tasks on it keep their Workflow and Disposition, with no Status. This cannot be undone. Requires `workflows:write`.","security":[{"bearerAuth":["workflows:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"The Workflow’s `id`."},{"name":"status_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"A Status `id` from the Workflow’s Statuses."},{"name":"If-Match","in":"header","required":false,"description":"The Status’s `ETag` (or `version`) from your last read. If it has changed since, you get `412`.","schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote this when contacting support."}}},"400":{"description":"Invalid body, header or field (see `errors`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid, expired or revoked token.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Token lacks the scope, or the plan lacks API Access.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such Workflow in your account, or the Status is not one of its Statuses.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"412":{"description":"The Status changed since your `If-Match` version.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded. Wait `Retry-After` seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"schema":{"type":"integer"}}}},"503":{"description":"The API is temporarily disabled.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"schemas":{"DispositionKey":{"$id":"#/components/schemas/DispositionKey","type":"string","enum":["not_started","in_progress","waiting","on_hold","done"]},"User":{"$id":"#/components/schemas/User","type":"object","properties":{"object":{"type":"string","const":"user"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"email":{"type":["string","null"]},"name":{"type":["string","null"]},"token":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"scopes":{"type":"array","items":{"type":"string","enum":["tasks:read","tasks:write","projects:read","projects:write","workflows:read","workflows:write","webhooks:manage"]}}},"required":["id","scopes"],"additionalProperties":false}},"required":["object","id","email","name","token"],"additionalProperties":false},"Task":{"$id":"#/components/schemas/Task","type":"object","properties":{"object":{"type":"string","const":"task"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"title":{"type":"string"},"notes":{"type":["string","null"]},"url":{"description":"Link attached to the task.","type":["string","null"]},"disposition":{"$ref":"#/components/schemas/DispositionKey"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"status_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"Status within the task’s Workflow. Setting a Status sets the Disposition."},"project_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"due_date":{"anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}]},"deadline":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"on_hold_until":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}],"description":"When a task in the `on_hold` (Later) Disposition wakes up."},"is_urgent":{"type":"boolean"},"estimated_minutes":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"archived":{"type":"boolean"},"completed_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"version":{"type":"string","description":"Opaque version. Sent as the `ETag`; pass it in `If-Match` when updating or deleting."}},"required":["object","id","title","notes","url","disposition","workflow_id","status_id","project_id","due_date","deadline","on_hold_until","is_urgent","estimated_minutes","archived","completed_at","created_at","updated_at","version"],"additionalProperties":false},"TaskList":{"$id":"#/components/schemas/TaskList","type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"has_more":{"type":"boolean"},"next_cursor":{"description":"Pass as `cursor` to fetch the next page.","type":["string","null"]}},"required":["object","data","has_more","next_cursor"],"additionalProperties":false},"Step":{"$id":"#/components/schemas/Step","type":"object","properties":{"object":{"type":"string","const":"step"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["status","subtask"],"description":"`status` = a Today Status of the task’s Workflow (ticking moves the task through the Workflow); `subtask` = a checklist item on a task with no Workflow."},"title":{"type":"string"},"completed":{"type":"boolean"},"estimated_minutes":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["object","id","kind","title","completed","estimated_minutes"],"additionalProperties":false},"StepList":{"$id":"#/components/schemas/StepList","type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Step"}}},"required":["object","data"],"additionalProperties":false},"Project":{"$id":"#/components/schemas/Project","type":"object","properties":{"object":{"type":"string","const":"project"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"notes":{"type":["string","null"]},"color":{"description":"Hex colour, e.g. `#3480E0`.","type":["string","null"]},"target_completion_date":{"anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}]},"archived":{"type":"boolean"},"archived_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"sort_order":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Position in the app’s project list (ascending)."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"version":{"type":"string","description":"Opaque version, also sent as the `ETag`."}},"required":["object","id","name","notes","color","target_completion_date","archived","archived_at","sort_order","created_at","updated_at","version"],"additionalProperties":false},"ProjectList":{"$id":"#/components/schemas/ProjectList","type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"has_more":{"type":"boolean"},"next_cursor":{"description":"Pass as `cursor` to fetch the next page.","type":["string","null"]}},"required":["object","data","has_more","next_cursor"],"additionalProperties":false},"Workflow":{"$id":"#/components/schemas/Workflow","type":"object","properties":{"object":{"type":"string","const":"workflow"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"description":{"type":["string","null"]},"emoji":{"type":["string","null"]},"sort_order":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Position in the app’s Workflow list (ascending)."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"version":{"type":"string","description":"Opaque version, also sent as the `ETag`."}},"required":["object","id","name","description","emoji","sort_order","created_at","updated_at","version"],"additionalProperties":false},"WorkflowList":{"$id":"#/components/schemas/WorkflowList","type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Workflow"}},"has_more":{"type":"boolean"},"next_cursor":{"description":"Pass as `cursor` to fetch the next page.","type":["string","null"]}},"required":["object","data","has_more","next_cursor"],"additionalProperties":false},"Status":{"$id":"#/components/schemas/Status","type":"object","properties":{"object":{"type":"string","const":"status"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"workflow_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":["string","null"]},"disposition":{"description":"Assigning this Status moves the task to this Disposition.","$ref":"#/components/schemas/DispositionKey"},"sort_order":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Order within its Disposition (ascending)."},"default_estimated_minutes":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"version":{"type":"string"}},"required":["object","id","workflow_id","name","emoji","disposition","sort_order","default_estimated_minutes","created_at","updated_at","version"],"additionalProperties":false},"StatusList":{"$id":"#/components/schemas/StatusList","type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Status"}}},"required":["object","data"],"additionalProperties":false},"Disposition":{"$id":"#/components/schemas/Disposition","type":"object","properties":{"object":{"type":"string","const":"disposition"},"key":{"$ref":"#/components/schemas/DispositionKey"},"label":{"type":"string","description":"Current tab label. Admin-editable — store the key, not this."},"color":{"type":"string","description":"Accent colour (hex)."}},"required":["object","key","label","color"],"additionalProperties":false},"DispositionList":{"$id":"#/components/schemas/DispositionList","type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Disposition"}}},"required":["object","data"],"additionalProperties":false},"CreateTask":{"$id":"#/components/schemas/CreateTask","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200,"description":"1–200 characters (trimmed)."},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"url":{"anyOf":[{"type":"string","maxLength":2048,"format":"uri"},{"type":"null"}],"description":"Link attached to the task (`http` or `https`)."},"disposition":{"description":"Defaults to `not_started`.","$ref":"#/components/schemas/DispositionKey"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"One of your Workflows, or `null` for none. The task lands on that Workflow’s Status for its Disposition."},"status_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"One of your Statuses. Sets the task’s Workflow and Disposition to match."},"project_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"One of your projects, or `null`."},"due_date":{"anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}]},"deadline":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"on_hold_until":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}],"description":"Wake time for a task in `on_hold` (Later). At that time it moves back to Today (`in_progress`)."},"is_urgent":{"type":"boolean"},"estimated_minutes":{"anyOf":[{"type":"integer","minimum":0,"maximum":100000},{"type":"null"}]}},"required":["title"],"additionalProperties":false},"UpdateTask":{"$id":"#/components/schemas/UpdateTask","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200,"description":"1–200 characters (trimmed)."},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"url":{"anyOf":[{"type":"string","maxLength":2048,"format":"uri"},{"type":"null"}],"description":"Link attached to the task (`http` or `https`)."},"disposition":{"description":"Changing the Disposition on its own clears the Status. Omit it when you send `status_id`.","$ref":"#/components/schemas/DispositionKey"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"One of your Workflows, or `null` for none. The task lands on that Workflow’s Status for its Disposition."},"status_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"One of your Statuses. Sets the task’s Workflow and Disposition to match."},"project_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"One of your projects, or `null`."},"due_date":{"anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}]},"deadline":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"on_hold_until":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}],"description":"Wake time for a task in `on_hold` (Later). At that time it moves back to Today (`in_progress`)."},"is_urgent":{"type":"boolean"},"estimated_minutes":{"anyOf":[{"type":"integer","minimum":0,"maximum":100000},{"type":"null"}]},"archived":{"type":"boolean"}},"additionalProperties":false},"LaterTask":{"$id":"#/components/schemas/LaterTask","type":"object","properties":{"until":{"description":"When the task wakes back onto Today. `null` removes the wake time. Omit to keep the current wake time (none if the task was not already in Later).","anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},"additionalProperties":false},"CreateStep":{"$id":"#/components/schemas/CreateStep","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":80,"description":"What to do (1–80 characters)."},"estimated_minutes":{"anyOf":[{"type":"integer","minimum":0,"maximum":100000},{"type":"null"}],"description":"Minutes for this step; `0` or `null` clears it. The task’s time becomes the sum of its steps."}},"required":["title"],"additionalProperties":false},"UpdateStep":{"$id":"#/components/schemas/UpdateStep","type":"object","properties":{"title":{"description":"Checklist steps only; Workflow steps are named in the Workflow.","type":"string","minLength":1,"maxLength":80},"completed":{"description":"Tick or untick. On a task in `in_progress` (Today), ticking a Workflow step moves the task’s Status on to the next open step, and unticking makes that step its Status.","type":"boolean"},"estimated_minutes":{"anyOf":[{"type":"integer","minimum":0,"maximum":100000},{"type":"null"}],"description":"Minutes for this step; `0` or `null` clears it. The task’s time becomes the sum of its steps."}},"additionalProperties":false},"CreateProject":{"$id":"#/components/schemas/CreateProject","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80,"description":"1–80 characters (trimmed)."},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"color":{"description":"Defaults to `#2358E0`.","type":"string","enum":["#DD2554","#D76517","#D1901D","#8DAB1D","#42A926","#20B084","#20ADAD","#1E9FD3","#2358E0","#6F4CE6","#A54DE2","#CA44C3","#E8489C","#AA6926","#7089A4"]},"target_completion_date":{"anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}]}},"required":["name"],"additionalProperties":false},"UpdateProject":{"$id":"#/components/schemas/UpdateProject","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80,"description":"1–80 characters (trimmed)."},"notes":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"color":{"description":"One of the app’s project colours: `#DD2554`, `#D76517`, `#D1901D`, `#8DAB1D`, `#42A926`, `#20B084`, `#20ADAD`, `#1E9FD3`, `#2358E0`, `#6F4CE6`, `#A54DE2`, `#CA44C3`, `#E8489C`, `#AA6926`, `#7089A4`.","type":"string","enum":["#DD2554","#D76517","#D1901D","#8DAB1D","#42A926","#20B084","#20ADAD","#1E9FD3","#2358E0","#6F4CE6","#A54DE2","#CA44C3","#E8489C","#AA6926","#7089A4"]},"target_completion_date":{"anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}]},"archived":{"description":"Archiving hides the project; its tasks are unchanged.","type":"boolean"}},"additionalProperties":false},"CreateStatus":{"$id":"#/components/schemas/CreateStatus","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80,"description":"1–80 characters (trimmed)."},"disposition":{"type":"string","enum":["in_progress","waiting","on_hold","done"],"description":"Any Disposition except `not_started` (Not Started has no Statuses)."},"emoji":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"A single emoji, or `null` for none. Replaces any image icon (e.g. a Genmoji set on iPhone)."},"default_estimated_minutes":{"anyOf":[{"type":"integer","minimum":0,"maximum":100000},{"type":"null"}],"description":"Default minutes for this step on new tasks (Today Statuses); `0` or `null` clears it."}},"required":["name","disposition"],"additionalProperties":false},"UpdateStatus":{"$id":"#/components/schemas/UpdateStatus","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80,"description":"1–80 characters (trimmed)."},"disposition":{"description":"Moves every (unarchived) task on this Status to the new Disposition too.","type":"string","enum":["in_progress","waiting","on_hold","done"]},"emoji":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"A single emoji, or `null` for none. Replaces any image icon (e.g. a Genmoji set on iPhone)."},"default_estimated_minutes":{"anyOf":[{"type":"integer","minimum":0,"maximum":100000},{"type":"null"}],"description":"Default minutes for this step on new tasks (Today Statuses); `0` or `null` clears it."}},"additionalProperties":false},"CreateWorkflow":{"$id":"#/components/schemas/CreateWorkflow","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80,"description":"1–80 characters (trimmed)."},"emoji":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"A single emoji, or `null` for none. Replaces any image icon (e.g. a Genmoji set on iPhone)."},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"statuses":{"description":"Statuses to create with it (≤ 50), in order. Today (`in_progress`) Statuses become the task steps.","maxItems":50,"type":"array","items":{"$ref":"#/components/schemas/CreateStatus"}}},"required":["name"],"additionalProperties":false},"UpdateWorkflow":{"$id":"#/components/schemas/UpdateWorkflow","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80,"description":"1–80 characters (trimmed)."},"emoji":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"A single emoji, or `null` for none. Replaces any image icon (e.g. a Genmoji set on iPhone)."},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]}},"additionalProperties":false},"WorkflowWithStatuses":{"$id":"#/components/schemas/WorkflowWithStatuses","type":"object","properties":{"object":{"type":"string","const":"workflow"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"description":{"type":["string","null"]},"emoji":{"type":["string","null"]},"sort_order":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Position in the app’s Workflow list (ascending)."},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"version":{"type":"string","description":"Opaque version, also sent as the `ETag`."},"statuses":{"type":"array","items":{"$ref":"#/components/schemas/Status"},"description":"Its Statuses, grouped by Disposition in tab order."}},"required":["object","id","name","description","emoji","sort_order","created_at","updated_at","version","statuses"],"additionalProperties":false},"Problem":{"$id":"#/components/schemas/Problem","type":"object","properties":{"type":{"type":"string","description":"Stable URI identifying the error, e.g. `https://developers.nyblit.app/errors/rate_limited`."},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"code":{"type":"string","enum":["invalid_request","invalid_token","insufficient_scope","plan_required","access_disabled","task_limit_reached","not_found","precondition_failed","rate_limited","api_disabled","internal_error"]},"request_id":{"type":"string"},"errors":{"description":"Field-level validation errors.","type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["field","message"],"additionalProperties":false}}},"required":["type","title","status","code","request_id"],"additionalProperties":false}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"nyb_pat_…","description":"Personal access token. Scopes: `tasks:read` — Read your tasks.; `tasks:write` — Create, update and delete your tasks.; `projects:read` — Read your projects.; `projects:write` — Create, update and delete your projects.; `workflows:read` — Read your Workflows and Statuses.; `workflows:write` — Create, update and delete your Workflows and Statuses.; `webhooks:manage` — Manage webhook subscriptions.."}}}}