{"openapi":"3.1.0","info":{"title":"Diginet Task API","version":"1.0.0","description":"The Diginet Task public API: tasks, projects, comments, time and people — as the person a token belongs to, with exactly their permissions.\n\n## Authentication\nCreate a personal API token in **Profile → API tokens** and send it as `Authorization: Bearer dgt_pat_…`. A token acts as you: your role, the projects you can see, your workspace’s plan. A **read** token can only call GET endpoints; a **read and write** token can call everything. Workspace admins can see and revoke every token in **Settings → Security**.\n\n## Pagination\nEvery list answers `{ \"data\": [...], \"hasMore\": true, \"nextCursor\": \"…\" }`. Pass `cursor=<nextCursor>` for the next page; `limit` sets the page size (1–100, default 50).\n\n## Errors\nErrors are `{ \"error\": { \"code\", \"message\", \"details\" } }` with a meaningful status: 401 (missing, invalid, expired or revoked token), 403 (your role or plan does not allow it, or a read-only token tried to write), 404 (missing — or not yours to see), 409 (conflict), 422 (`validation_error`, with field `details`), 429 (rate limited).\n\n## Rate limits\nEach token may make 120 requests a minute by default (public API and MCP together). Every answer carries `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset` (seconds); over the limit you get 429 with `Retry-After`.\n\n## Idempotency\nCreates accept an `Idempotency-Key` header. Retrying with the same key within 24 hours returns the first response (with `Idempotent-Replayed: true`) instead of creating twice; reusing a key for a different request is a 409. Subscribing a hook (`POST /v1/hooks`) is the exception: its signing secret is shown once and never stored, so it is not replayed.\n\n## Triggers\nIntegration platforms can **poll** `GET /v1/tasks?sort=created_desc&since=…` (new tasks), `sort=updated_desc&since=…` (changed tasks) or `GET /v1/comments?since=…` (new comments), or **subscribe** with `POST /v1/hooks` (see Webhooks). Hook deliveries are signed: `X-Diginet-Signature: sha256=<HMAC-SHA256 of the raw body with the hook’s secret>`.\n\n## MCP\nThe same token connects an AI assistant to the MCP server at `/mcp` (Streamable HTTP)."},"servers":[{"url":"https://work-api.zinvee.com"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Me","description":"The person a token acts as."},{"name":"Tasks","description":"Create, read, update and trash tasks. Also the polling triggers."},{"name":"Subtasks","description":"A task’s checklist."},{"name":"Comments","description":"Discussion on a task."},{"name":"Custom fields","description":"Field definitions and each task’s values."},{"name":"Time entries","description":"Time logged on tasks."},{"name":"Projects","description":"Projects, their members and status updates."},{"name":"People","description":"The people you work with."},{"name":"Labels","description":"The workspace’s labels."},{"name":"Hooks","description":"REST hook subscriptions — instant triggers for integration platforms."}],"paths":{"/v1/me":{"get":{"operationId":"getMe","summary":"Who the token acts as","description":"The person the token belongs to, their workspace, and the token’s own name, scopes and expiry. A good first call to check a token works.\n\nNeeds a token with **read** access.","tags":["Me"],"x-scope":"read","x-guests":true,"responses":{"200":{"description":"The token’s person and workspace.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/tasks":{"get":{"operationId":"listTasks","summary":"List tasks","description":"Tasks you can see, filtered and sorted. **Polling triggers:** `sort=created_desc&since=<newest createdAt you saw>` returns only new tasks; `sort=updated_desc&since=…` only changed ones (newest first).\n\nNeeds a token with **read** access.","tags":["Tasks"],"x-scope":"read","x-guests":true,"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."},{"name":"status","in":"query","required":false,"schema":{"type":"string","examples":["todo,in_progress"]},"description":"One status, or several separated by commas (todo, in_progress, review, done)."},{"name":"priority","in":"query","required":false,"schema":{"type":"string","enum":["low","normal","high","urgent"]}},{"name":"project","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"description":"Tasks in this project (its own and those also added to it)."},{"name":"assignee","in":"query","required":false,"schema":{"anyOf":[{"const":"me","type":"string"},{"type":"string","format":"uuid"}]},"description":"A person’s id, or `me` for tasks assigned to you."},{"name":"label","in":"query","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"parent","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"description":"Only the children of this epic."},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"Full-text search in titles and descriptions."},{"name":"open","in":"query","required":false,"schema":{"type":"boolean"},"description":"Only open tasks (not done)."},{"name":"overdue","in":"query","required":false,"schema":{"type":"boolean"},"description":"Only tasks past their due date and not done."},{"name":"dueBefore","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"dueAfter","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["created_desc","created_asc","updated_desc","updated_asc","due_asc","due_desc","priority_desc","urgency"],"default":"created_desc"},"description":"Order of the results. Polling integrations use `created_desc` or `updated_desc` with `since`."},{"name":"since","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"With `sort=created_*`: only tasks created after this moment. With `sort=updated_*`: only tasks changed after it. Not allowed with other sorts."}],"responses":{"200":{"description":"A page of tasks.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"operationId":"createTask","summary":"Create a task","description":"Same rules as the app: who you may assign, which projects you may add work to, what your plan allows.\n\nNeeds a token with **read and write** access.","tags":["Tasks"],"x-scope":"write","x-guests":true,"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Any unique string (a UUID is ideal). A retry with the same key returns the first response.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"description":{"type":"string","maxLength":20000},"status":{"type":"string","enum":["todo","in_progress","review","done"],"description":"Defaults to `todo`."},"priority":{"type":"string","enum":["low","normal","high","urgent"],"description":"Defaults to `normal`."},"dueAt":{"type":["string","null"],"description":"An ISO 8601 date-time with offset (`2026-10-05T12:30:00+05:30`), or a date (`2026-10-05`) — a date is due at 18:00 (starts at 09:00) in the workspace’s timezone.","examples":["2026-10-05","2026-10-05T12:30:00+05:30"]},"startAt":{"type":["string","null"],"description":"An ISO 8601 date-time with offset (`2026-10-05T12:30:00+05:30`), or a date (`2026-10-05`) — a date is due at 18:00 (starts at 09:00) in the workspace’s timezone.","examples":["2026-10-05","2026-10-05T12:30:00+05:30"]},"projectId":{"type":["string","null"],"format":"uuid"},"parentTaskId":{"type":["string","null"],"format":"uuid","description":"Create it under this epic."},"assigneeIds":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":20},"labelIds":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":20},"subtasks":{"type":"array","items":{"type":"string","minLength":1,"maxLength":300},"maxItems":50,"description":"Checklist item titles."}},"required":["title"],"additionalProperties":false}}}},"responses":{"201":{"description":"The new task.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/tasks/{id}":{"get":{"operationId":"getTask","summary":"Get a task","description":"A task you can’t see answers 404, exactly like one that doesn’t exist.\n\nNeeds a token with **read** access.","tags":["Tasks"],"x-scope":"read","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."}],"responses":{"200":{"description":"The task.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}},"patch":{"operationId":"updateTask","summary":"Update a task","description":"Send only the fields to change. Which fields you may change follows your role, exactly as in the app.\n\nNeeds a token with **read and write** access.","tags":["Tasks"],"x-scope":"write","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"description":{"type":["string","null"],"maxLength":20000},"status":{"type":"string","enum":["todo","in_progress","review","done"]},"priority":{"type":"string","enum":["low","normal","high","urgent"]},"dueAt":{"type":["string","null"],"description":"An ISO 8601 date-time with offset (`2026-10-05T12:30:00+05:30`), or a date (`2026-10-05`) — a date is due at 18:00 (starts at 09:00) in the workspace’s timezone.","examples":["2026-10-05","2026-10-05T12:30:00+05:30"]},"startAt":{"type":["string","null"],"description":"An ISO 8601 date-time with offset (`2026-10-05T12:30:00+05:30`), or a date (`2026-10-05`) — a date is due at 18:00 (starts at 09:00) in the workspace’s timezone.","examples":["2026-10-05","2026-10-05T12:30:00+05:30"]},"projectId":{"type":["string","null"],"format":"uuid","description":"Move the task to another project (null: no project)."},"parentTaskId":{"type":["string","null"],"format":"uuid"},"assigneeIds":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":20,"description":"Replaces the assignees."},"labelIds":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":20,"description":"Replaces the labels."},"estimateMinutes":{"type":["integer","null"],"minimum":1,"maximum":10080}},"additionalProperties":false}}}},"responses":{"200":{"description":"The updated task.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"operationId":"deleteTask","summary":"Move a task to the trash","description":"Admins and managers can restore it from the trash in the app until it is purged.\n\nNeeds a token with **read and write** access. Not available to guests.","tags":["Tasks"],"x-scope":"write","x-guests":false,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."}],"responses":{"204":{"description":"Moved to the trash.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/tasks/{id}/subtasks":{"get":{"operationId":"listSubtasks","summary":"List a task’s checklist","description":"Needs a token with **read** access.","tags":["Subtasks"],"x-scope":"read","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."}],"responses":{"200":{"description":"A page of checklist items.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Subtask"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"operationId":"createSubtask","summary":"Add a checklist item","description":"Needs a token with **read and write** access.","tags":["Subtasks"],"x-scope":"write","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any unique string (a UUID is ideal). A retry with the same key returns the first response.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"assigneeId":{"type":["string","null"],"format":"uuid","description":"Who does this item — someone who can see the task (null takes them off)."},"dueAt":{"type":["string","null"],"format":"date-time","description":"When this item is due (null clears it)."}},"required":["title"],"additionalProperties":false}}}},"responses":{"201":{"description":"The new checklist item.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subtask"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/subtasks/{id}":{"patch":{"operationId":"updateSubtask","summary":"Rename or tick off a checklist item","description":"Needs a token with **read and write** access.","tags":["Subtasks"],"x-scope":"write","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"done":{"type":"boolean"},"assigneeId":{"type":["string","null"],"format":"uuid","description":"Who does this item — someone who can see the task (null takes them off)."},"dueAt":{"type":["string","null"],"format":"date-time","description":"When this item is due (null clears it)."}},"additionalProperties":false}}}},"responses":{"200":{"description":"The updated checklist item.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subtask"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"operationId":"deleteSubtask","summary":"Delete a checklist item","description":"Needs a token with **read and write** access.","tags":["Subtasks"],"x-scope":"write","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Deleted.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/tasks/{id}/comments":{"get":{"operationId":"listComments","summary":"List a task’s comments","description":"Oldest first.\n\nNeeds a token with **read** access.","tags":["Comments"],"x-scope":"read","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."}],"responses":{"200":{"description":"A page of comments.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"operationId":"createComment","summary":"Comment on a task","description":"Followers of the task are notified, as for a comment made in the app.\n\nNeeds a token with **read and write** access.","tags":["Comments"],"x-scope":"write","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any unique string (a UUID is ideal). A retry with the same key returns the first response.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":10000},"mentions":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":20,"description":"People to notify (they must be able to see the task)."},"parentId":{"type":"string","format":"uuid","description":"Reply to this comment (a reply to a reply joins the same thread)."}},"required":["body"],"additionalProperties":false}}}},"responses":{"201":{"description":"The new comment.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/comments":{"get":{"operationId":"listRecentComments","summary":"List recent comments","description":"Comments on every task you can see, newest first, each with the task it is on. **Polling trigger:** `since=<newest createdAt you saw>` returns only new comments — the same objects the `comment.created` hook delivers, on every plan.\n\nNeeds a token with **read** access.","tags":["Comments"],"x-scope":"read","x-guests":true,"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."},{"name":"task","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"Only comments on this task (its id, or its key such as `DGT-42`)."},{"name":"since","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Only comments posted after this moment. Polling triggers pass the newest `createdAt` they have seen."}],"responses":{"200":{"description":"A page of comments, newest first.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CommentEvent"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/custom-fields":{"get":{"operationId":"listCustomFields","summary":"List custom field definitions","description":"Needs a token with **read** access.","tags":["Custom fields"],"x-scope":"read","x-guests":true,"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."},{"name":"project","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"description":"Workspace fields plus this project’s own."}],"responses":{"200":{"description":"A page of field definitions.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomField"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/tasks/{id}/custom-fields":{"get":{"operationId":"getTaskCustomFields","summary":"Get a task’s custom field values","description":"Needs a token with **read** access.","tags":["Custom fields"],"x-scope":"read","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."}],"responses":{"200":{"description":"Every field that applies to the task, with its value.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValue"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}},"put":{"operationId":"setTaskCustomFields","summary":"Set a task’s custom field values","description":"Values are checked against each field’s type and options. Formula and rollup fields are read-only.\n\nNeeds a token with **read and write** access.","tags":["Custom fields"],"x-scope":"write","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"values":{"type":"object","additionalProperties":{},"propertyNames":{"format":"uuid"},"description":"Field id → value; null clears it. Fields you leave out are unchanged."}},"required":["values"],"additionalProperties":false}}}},"responses":{"200":{"description":"The task’s values after the change.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValue"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/tasks/{id}/time-entries":{"get":{"operationId":"listTimeEntries","summary":"List time logged on a task","description":"Needs a token with **read** access.","tags":["Time entries"],"x-scope":"read","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."}],"responses":{"200":{"description":"A page of time entries.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TimeEntry"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"operationId":"createTimeEntry","summary":"Log time on a task","description":"Refused for a week whose timesheet is submitted or approved.\n\nNeeds a token with **read and write** access.","tags":["Time entries"],"x-scope":"write","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64},"description":"The task’s id, or its key (e.g. `DGT-42`)."},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any unique string (a UUID is ideal). A retry with the same key returns the first response.","schema":{"type":"string","maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"durationMinutes":{"type":"integer","minimum":1,"maximum":1440},"startedAt":{"type":"string","format":"date-time","description":"Defaults to now minus the duration."},"note":{"type":"string","maxLength":500},"billable":{"type":"boolean","description":"Pro and Business. Omitted: the project’s default."}},"required":["durationMinutes"],"additionalProperties":false}}}},"responses":{"201":{"description":"The new time entry.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/projects":{"get":{"operationId":"listProjects","summary":"List projects","description":"Projects you can see: every workspace project, plus private ones you are on (admins see all).\n\nNeeds a token with **read** access.","tags":["Projects"],"x-scope":"read","x-guests":true,"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."},{"name":"archived","in":"query","required":false,"schema":{"type":"boolean"},"description":"Archived projects instead of active ones."}],"responses":{"200":{"description":"A page of projects.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/projects/{id}":{"get":{"operationId":"getProject","summary":"Get a project","description":"Needs a token with **read** access.","tags":["Projects"],"x-scope":"read","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The project.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/projects/{id}/members":{"get":{"operationId":"listProjectMembers","summary":"List a project’s members","description":"Needs a token with **read** access.","tags":["Projects"],"x-scope":"read","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."}],"responses":{"200":{"description":"A page of members.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProjectMember"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/projects/{id}/status-updates":{"get":{"operationId":"listProjectStatusUpdates","summary":"List a project’s status updates","description":"Newest first.\n\nNeeds a token with **read** access.","tags":["Projects"],"x-scope":"read","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."}],"responses":{"200":{"description":"A page of status updates.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProjectStatusUpdate"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/people":{"get":{"operationId":"listPeople","summary":"List people","description":"The workspace’s members and invited people. A guest sees only the people on their projects.\n\nNeeds a token with **read** access.","tags":["People"],"x-scope":"read","x-guests":true,"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"Match on name or email."}],"responses":{"200":{"description":"A page of people.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Person"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/labels":{"get":{"operationId":"listLabels","summary":"List labels","description":"Needs a token with **read** access.","tags":["Labels"],"x-scope":"read","x-guests":true,"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."}],"responses":{"200":{"description":"A page of labels.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Label"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/hooks":{"get":{"operationId":"listHooks","summary":"List your hook subscriptions","description":"Needs a token with **read** access.","tags":["Hooks"],"x-scope":"read","x-guests":true,"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Items per page (1–100, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"The `nextCursor` of the previous page."}],"responses":{"200":{"description":"A page of hooks.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Hook"}},"hasMore":{"type":"boolean","description":"True when another page follows."},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}},"required":["data","hasMore","nextCursor"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"operationId":"createHook","summary":"Subscribe to an event","description":"Pro and Business. Every matching event is POSTed to `targetUrl`, signed with the returned `secret`. Deliveries carry only what you can see at the time. Answer `410 Gone` to unsubscribe; after repeated failures the hook is switched off and you are notified. Not idempotent: the signing secret is shown once and never stored, so a retry makes a second subscription — delete the one you don’t use.\n\nNeeds a token with **read and write** access.","tags":["Hooks"],"x-scope":"write","x-guests":true,"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"event":{"type":"string","enum":["task.created","task.updated","task.completed","comment.created","project.created"]},"targetUrl":{"type":"string","format":"uri","maxLength":2000,"description":"Where to POST the events. Must be reachable on the public internet."}},"required":["event","targetUrl"],"additionalProperties":false}}}},"responses":{"201":{"description":"The subscription, with its signing secret (shown only now).","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedHook"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/hooks/{id}":{"delete":{"operationId":"deleteHook","summary":"Unsubscribe","description":"Needs a token with **read and write** access.","tags":["Hooks"],"x-scope":"write","x-guests":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Unsubscribed.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"webhooks":{"task.created":{"post":{"summary":"A task was created","description":"Sent to every hook subscribed to `task.created` whose owner can see the resource at delivery time. Answer 2xx within 10 seconds; anything else is retried with backoff, and after 10 failed deliveries in a row the hook is switched off. Answer 410 to unsubscribe.","operationId":"hook_task_created","parameters":[{"name":"X-Diginet-Signature","in":"header","required":true,"description":"`sha256=` + hex HMAC-SHA256 of the raw request body, keyed with the hook’s secret.","schema":{"type":"string"}},{"name":"X-Diginet-Event","in":"header","required":true,"schema":{"type":"string","const":"task.created"}},{"name":"X-Diginet-Delivery","in":"header","required":true,"description":"Unique per delivery and the same on retries — dedupe on it.","schema":{"type":"string","format":"uuid"}},{"name":"X-Diginet-Hook","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","event","hookId","occurredAt","sentAt","payload"],"properties":{"id":{"type":"string","format":"uuid","description":"The delivery id (same as X-Diginet-Delivery)."},"event":{"type":"string","const":"task.created"},"hookId":{"type":"string","format":"uuid"},"occurredAt":{"type":"string","format":"date-time"},"sentAt":{"type":"string","format":"date-time"},"payload":{"$ref":"#/components/schemas/Task"}}}}}},"responses":{"200":{"description":"Received."},"410":{"description":"Unsubscribe this hook."}}}},"task.updated":{"post":{"summary":"A task changed (any field)","description":"Sent to every hook subscribed to `task.updated` whose owner can see the resource at delivery time. Answer 2xx within 10 seconds; anything else is retried with backoff, and after 10 failed deliveries in a row the hook is switched off. Answer 410 to unsubscribe.","operationId":"hook_task_updated","parameters":[{"name":"X-Diginet-Signature","in":"header","required":true,"description":"`sha256=` + hex HMAC-SHA256 of the raw request body, keyed with the hook’s secret.","schema":{"type":"string"}},{"name":"X-Diginet-Event","in":"header","required":true,"schema":{"type":"string","const":"task.updated"}},{"name":"X-Diginet-Delivery","in":"header","required":true,"description":"Unique per delivery and the same on retries — dedupe on it.","schema":{"type":"string","format":"uuid"}},{"name":"X-Diginet-Hook","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","event","hookId","occurredAt","sentAt","payload"],"properties":{"id":{"type":"string","format":"uuid","description":"The delivery id (same as X-Diginet-Delivery)."},"event":{"type":"string","const":"task.updated"},"hookId":{"type":"string","format":"uuid"},"occurredAt":{"type":"string","format":"date-time"},"sentAt":{"type":"string","format":"date-time"},"payload":{"$ref":"#/components/schemas/Task"}}}}}},"responses":{"200":{"description":"Received."},"410":{"description":"Unsubscribe this hook."}}}},"task.completed":{"post":{"summary":"A task was marked done","description":"Sent to every hook subscribed to `task.completed` whose owner can see the resource at delivery time. Answer 2xx within 10 seconds; anything else is retried with backoff, and after 10 failed deliveries in a row the hook is switched off. Answer 410 to unsubscribe.","operationId":"hook_task_completed","parameters":[{"name":"X-Diginet-Signature","in":"header","required":true,"description":"`sha256=` + hex HMAC-SHA256 of the raw request body, keyed with the hook’s secret.","schema":{"type":"string"}},{"name":"X-Diginet-Event","in":"header","required":true,"schema":{"type":"string","const":"task.completed"}},{"name":"X-Diginet-Delivery","in":"header","required":true,"description":"Unique per delivery and the same on retries — dedupe on it.","schema":{"type":"string","format":"uuid"}},{"name":"X-Diginet-Hook","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","event","hookId","occurredAt","sentAt","payload"],"properties":{"id":{"type":"string","format":"uuid","description":"The delivery id (same as X-Diginet-Delivery)."},"event":{"type":"string","const":"task.completed"},"hookId":{"type":"string","format":"uuid"},"occurredAt":{"type":"string","format":"date-time"},"sentAt":{"type":"string","format":"date-time"},"payload":{"$ref":"#/components/schemas/Task"}}}}}},"responses":{"200":{"description":"Received."},"410":{"description":"Unsubscribe this hook."}}}},"comment.created":{"post":{"summary":"Someone commented on a task","description":"Sent to every hook subscribed to `comment.created` whose owner can see the resource at delivery time. Answer 2xx within 10 seconds; anything else is retried with backoff, and after 10 failed deliveries in a row the hook is switched off. Answer 410 to unsubscribe.","operationId":"hook_comment_created","parameters":[{"name":"X-Diginet-Signature","in":"header","required":true,"description":"`sha256=` + hex HMAC-SHA256 of the raw request body, keyed with the hook’s secret.","schema":{"type":"string"}},{"name":"X-Diginet-Event","in":"header","required":true,"schema":{"type":"string","const":"comment.created"}},{"name":"X-Diginet-Delivery","in":"header","required":true,"description":"Unique per delivery and the same on retries — dedupe on it.","schema":{"type":"string","format":"uuid"}},{"name":"X-Diginet-Hook","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","event","hookId","occurredAt","sentAt","payload"],"properties":{"id":{"type":"string","format":"uuid","description":"The delivery id (same as X-Diginet-Delivery)."},"event":{"type":"string","const":"comment.created"},"hookId":{"type":"string","format":"uuid"},"occurredAt":{"type":"string","format":"date-time"},"sentAt":{"type":"string","format":"date-time"},"payload":{"$ref":"#/components/schemas/CommentEvent"}}}}}},"responses":{"200":{"description":"Received."},"410":{"description":"Unsubscribe this hook."}}}},"project.created":{"post":{"summary":"A project was created","description":"Sent to every hook subscribed to `project.created` whose owner can see the resource at delivery time. Answer 2xx within 10 seconds; anything else is retried with backoff, and after 10 failed deliveries in a row the hook is switched off. Answer 410 to unsubscribe.","operationId":"hook_project_created","parameters":[{"name":"X-Diginet-Signature","in":"header","required":true,"description":"`sha256=` + hex HMAC-SHA256 of the raw request body, keyed with the hook’s secret.","schema":{"type":"string"}},{"name":"X-Diginet-Event","in":"header","required":true,"schema":{"type":"string","const":"project.created"}},{"name":"X-Diginet-Delivery","in":"header","required":true,"description":"Unique per delivery and the same on retries — dedupe on it.","schema":{"type":"string","format":"uuid"}},{"name":"X-Diginet-Hook","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","event","hookId","occurredAt","sentAt","payload"],"properties":{"id":{"type":"string","format":"uuid","description":"The delivery id (same as X-Diginet-Delivery)."},"event":{"type":"string","const":"project.created"},"hookId":{"type":"string","format":"uuid"},"occurredAt":{"type":"string","format":"date-time"},"sentAt":{"type":"string","format":"date-time"},"payload":{"$ref":"#/components/schemas/Project"}}}}}},"responses":{"200":{"description":"Received."},"410":{"description":"Unsubscribe this hook."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"dgt_pat_…","description":"A personal API token from Profile → API tokens."}},"headers":{"RateLimit-Limit":{"description":"Requests allowed per minute for this token.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"responses":{"Unauthorized":{"description":"Missing, invalid, expired or revoked token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"Your role, the project, your plan or the token’s scope does not allow this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Not found — or not yours to see.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Conflict":{"description":"Conflicts with the current state (or an Idempotency-Key reuse).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ValidationError":{"description":"The request is invalid; `details` lists each field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Too many requests for this token.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"PersonRef":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]},"email":{"type":"string"}},"required":["id","name","email"],"description":"A person in the workspace."},"Label":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"color":{"type":["string","null"],"description":"Hex colour, e.g. `#2563eb`."}},"required":["id","name","color"],"description":"A label tasks can carry."},"Task":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"key":{"type":"string","description":"Human-readable key, e.g. `DGT-42` (unique within the workspace)."},"number":{"type":"integer","description":"The number in the key."},"title":{"type":"string"},"description":{"type":["string","null"],"description":"Plain text with light formatting (`**bold**`, `*italic*`, `` `code` ``). null when empty."},"status":{"type":"string","enum":["todo","in_progress","review","done"]},"priority":{"type":"string","enum":["low","normal","high","urgent"]},"startAt":{"type":["string","null"],"format":"date-time"},"dueAt":{"type":["string","null"],"format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"isOverdue":{"type":"boolean","description":"Past its due date and not done."},"project":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":["string","null"],"description":"null when it is a private project you are not on (you reach the task another way)."}},"required":["id","name"],"description":"The task’s home project; null when it has none."},"parentTaskId":{"type":["string","null"],"format":"uuid","description":"The epic this task belongs to."},"assignees":{"type":"array","items":{"$ref":"#/components/schemas/PersonRef"}},"labels":{"type":"array","items":{"$ref":"#/components/schemas/Label"}},"createdBy":{"anyOf":[{"$ref":"#/components/schemas/PersonRef"},{"type":"null"}],"description":"A person in the workspace."},"estimateMinutes":{"type":["integer","null"]},"subtaskCount":{"type":"integer"},"subtaskDoneCount":{"type":"integer"},"commentCount":{"type":"integer"},"attachmentCount":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"url":{"type":"string","description":"Opens the task in the app."}},"required":["id","key","number","title","description","status","priority","startAt","dueAt","completedAt","isOverdue","project","parentTaskId","assignees","labels","createdBy","estimateMinutes","subtaskCount","subtaskDoneCount","commentCount","attachmentCount","createdAt","updatedAt","url"],"description":"A task."},"Subtask":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"taskId":{"type":"string","format":"uuid"},"title":{"type":"string"},"done":{"type":"boolean"},"position":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"assigneeId":{"type":["string","null"],"format":"uuid","description":"Who does this item (null = nobody in particular)."},"dueAt":{"type":["string","null"],"format":"date-time","description":"When this item is due."}},"required":["id","taskId","title","done","position","createdAt","assigneeId","dueAt"],"description":"A checklist item on a task."},"Comment":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"taskId":{"type":"string","format":"uuid"},"body":{"type":"string"},"author":{"$ref":"#/components/schemas/PersonRef"},"createdAt":{"type":"string","format":"date-time"},"editedAt":{"type":["string","null"],"format":"date-time"},"parentId":{"type":["string","null"],"format":"uuid","description":"The comment this one replies to (null = it starts a thread)."}},"required":["id","taskId","body","author","createdAt","editedAt","parentId"],"description":"A comment on a task."},"CommentEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"taskId":{"type":"string","format":"uuid"},"body":{"type":"string"},"author":{"$ref":"#/components/schemas/PersonRef"},"createdAt":{"type":"string","format":"date-time"},"editedAt":{"type":["string","null"],"format":"date-time"},"parentId":{"type":["string","null"],"format":"uuid","description":"The comment this one replies to (null = it starts a thread)."},"task":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"key":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"}},"required":["id","key","title","url"]}},"required":["id","taskId","body","author","createdAt","editedAt","parentId","task"],"description":"A comment, with the task it is on."},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":["string","null"]},"color":{"type":["string","null"]},"visibility":{"type":"string","enum":["workspace","private"],"description":"`private`: only its members and admins see it."},"archived":{"type":"boolean"},"myRole":{"type":["string","null"],"enum":["editor","commenter",null],"description":"Your role on the project; null when you are not a member."},"openTaskCount":{"type":"integer"},"overdueTaskCount":{"type":"integer"},"totalTaskCount":{"type":"integer"},"latestStatus":{"type":["object","null"],"properties":{"status":{"type":"string","enum":["on_track","at_risk","off_track","on_hold","complete"]},"createdAt":{"type":"string","format":"date-time"}},"required":["status","createdAt"],"description":"The newest status update’s health."},"createdAt":{"type":"string","format":"date-time"},"url":{"type":"string","description":"Opens the project in the app."}},"required":["id","name","description","color","visibility","archived","myRole","openTaskCount","overdueTaskCount","totalTaskCount","latestStatus","createdAt","url"],"description":"A project."},"ProjectMember":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The person’s id."},"name":{"type":["string","null"]},"email":{"type":"string"},"workspaceRole":{"type":"string","enum":["admin","manager","staff","guest"]},"projectRole":{"type":"string","enum":["editor","commenter"]},"isOwner":{"type":"boolean"},"addedAt":{"type":"string","format":"date-time"}},"required":["id","name","email","workspaceRole","projectRole","isOwner","addedAt"],"description":"Someone on a project."},"ProjectStatusUpdate":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["on_track","at_risk","off_track","on_hold","complete"]},"summary":{"type":"string"},"author":{"anyOf":[{"$ref":"#/components/schemas/PersonRef"},{"type":"null"}],"description":"A person in the workspace."},"createdAt":{"type":"string","format":"date-time"}},"required":["id","projectId","status","summary","author","createdAt"],"description":"A project status update."},"Person":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]},"email":{"type":"string"},"role":{"type":"string","enum":["admin","manager","staff","guest"]},"status":{"type":"string","enum":["active","invited"]}},"required":["id","name","email","role","status"],"description":"Someone you work with."},"CustomField":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"type":{"type":"string","enum":["text","number","select","multiselect","date","checkbox","url","formula","rollup"]},"options":{"type":["array","null"],"items":{"type":"string"},"description":"The choices of a select / multiselect field."},"projectId":{"type":["string","null"],"format":"uuid","description":"null: a workspace-wide field."},"computed":{"type":"boolean","description":"Formula and rollup fields are calculated and read-only."}},"required":["id","name","type","options","projectId","computed"],"description":"A custom field definition."},"CustomFieldValue":{"type":"object","properties":{"fieldId":{"type":"string","format":"uuid"},"name":{"type":"string"},"type":{"type":"string","enum":["text","number","select","multiselect","date","checkbox","url","formula","rollup"]},"value":{"description":"text/url/select: string · number: number · multiselect: string[] · date: ISO date-time · checkbox: boolean · null: unset."}},"required":["fieldId","name","type"],"description":"A task’s value for one custom field."},"TimeEntry":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"taskId":{"type":"string","format":"uuid"},"user":{"$ref":"#/components/schemas/PersonRef"},"startedAt":{"type":"string","format":"date-time"},"durationMinutes":{"type":["integer","null"],"description":"null while a timer is running."},"note":{"type":["string","null"]},"billable":{"type":"boolean"}},"required":["id","taskId","user","startedAt","durationMinutes","note","billable"],"description":"Time logged on a task."},"Hook":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"event":{"type":"string","enum":["task.created","task.updated","task.completed","comment.created","project.created"]},"targetUrl":{"type":"string"},"enabled":{"type":"boolean"},"disabledReason":{"type":["string","null"],"enum":["failing","gone","blocked_target",null]},"consecutiveFailures":{"type":"integer"},"lastDeliveryAt":{"type":["string","null"],"format":"date-time"},"lastSuccessAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","event","targetUrl","enabled","disabledReason","consecutiveFailures","lastDeliveryAt","lastSuccessAt","createdAt"],"description":"A REST hook subscription."},"CreatedHook":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"event":{"type":"string","enum":["task.created","task.updated","task.completed","comment.created","project.created"]},"targetUrl":{"type":"string"},"enabled":{"type":"boolean"},"disabledReason":{"type":["string","null"],"enum":["failing","gone","blocked_target",null]},"consecutiveFailures":{"type":"integer"},"lastDeliveryAt":{"type":["string","null"],"format":"date-time"},"lastSuccessAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"secret":{"type":"string","description":"The HMAC-SHA256 key that signs every delivery (`X-Diginet-Signature`). Returned only now."}},"required":["id","event","targetUrl","enabled","disabledReason","consecutiveFailures","lastDeliveryAt","lastSuccessAt","createdAt","secret"],"description":"A new REST hook subscription, with its signing secret."},"Me":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]},"email":{"type":"string"},"role":{"type":"string","enum":["admin","manager","staff","guest"]},"workspace":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"timezone":{"type":"string","description":"IANA timezone the workspace’s days follow."},"taskKeyPrefix":{"type":"string","description":"The prefix of task keys, e.g. `DGT`."}},"required":["id","name","timezone","taskKeyPrefix"]},"token":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["read","write"]}},"expiresAt":{"type":["string","null"],"format":"date-time"}},"required":["id","name","scopes","expiresAt"]}},"required":["id","name","email","role","workspace","token"],"description":"The person the token acts as, their workspace and the token itself."},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable code, e.g. `not_found`, `validation_error`."},"message":{"type":"string","description":"Human-readable explanation."},"details":{"description":"Field errors for `validation_error`: `[{ path, message }]`."}},"required":["code","message"]}},"required":["error"],"description":"Every error has this shape."}}}}