Публичный REST API для интеграций и скриптов. Базовый URL:
https://taskid.app/v1/api
Подключаете AI-ассистент (Claude, ChatGPT)? MCP-коннектор → проще и не требует вручную собирать HTTP-запросы.
API принимает и отдаёт JSON. Тела запросов -
application/json; charset=utf-8.
Даты - строки в формате ISO-8601 в UTC, без миллисекунд:
2026-04-18T12:34:56Z.
Идентификаторы - UUID v4, строки в каноническом формате.
API работает в паре с фоновой синхронизацией клиентов. Созданная через API задача появится в iOS/веб-интерфейсе после следующего sync-цикла (обычно пара секунд).
Каждый запрос требует заголовок:
Authorization: Bearer tkd_xxxxxxxxxxxxxxxxxxxxТокены создаются на странице API-токены.
GET-запросы.GET и
POST для задач,
заметок, списков и групп.При создании токена можно ограничить его конкретными списками - тогда запросы к другим спискам вернут 403.
Ошибки возвращаются со стандартными HTTP-кодами и JSON-телом вида:
{ "message": "list is not accessible by this token" } | Код | Когда |
|---|---|
| 400 | Некорректное тело запроса (нет title, невалидная дата). |
| 401 | Нет заголовка Authorization или токен не найден / отозван / истёк. |
| 403 | Не хватает scope (write для POST) или список недоступен токену. |
| 404 | Списка не существует или он удалён. |
| 429 | Превышен rate limit (касается отправки уведомлений). Заголовки Retry-After и X-RateLimit-* подскажут, через сколько секунд можно повторить. |
| 500 | Ошибка на сервере - стоит повторить позже. |
/v1/api/groupsГруппа - контейнер для обычных списков. Сама она задач и записей не содержит, но позволяет объединять несколько списков под одной крышей. Токены с ограниченным доступом видят только те группы, в которых лежит хотя бы один из их разрешённых списков.
curl -H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/groups { "groups": Group[] }/v1/api/groups| Поле | Тип | Описание |
|---|---|---|
| name | string * | Название группы. Обязательное поле, не пустое. |
| color | string | null | HEX-цвет или имя токена темы. Опционально. |
| icon | string | null | Имя иконки (SF Symbol). Опционально. |
curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "name": "Работа", "icon": "briefcase" }' \
https://taskid.app/v1/api/groups { "group": Group }/v1/api/groups/:id{ "group": Group }/v1/api/groups/:id| Поле | Тип | Описание |
|---|---|---|
| name | string | Новое название. Пустая строка не допускается. |
| color | string | null | HEX или имя токена темы. null - сбросить. |
| icon | string | null | Имя иконки (SF Symbol). null - сбросить. |
| archived | boolean | Архивировать / вернуть из архива. |
curl -X PATCH \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "name": "Рабочие проекты" }' \
https://taskid.app/v1/api/groups/GROUP_ID { "group": Group }/v1/api/groups/:idМягкое удаление. Списки, которые входили в группу, останутся - после sync они отобразятся в корне (parent_id указывает на удалённую группу). Requires scope=write (all_lists).
/v1/api/listsВозвращает все списки, к которым у этого токена есть доступ. Архивированные списки тоже приходят - флаг archived.
curl -H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/lists {
"lists": [
{
"id": "6f8a6f4e-9b0e-4a82-9f6b-2a3f1e4a5d1a",
"parent_id": null,
"name": "Работа",
"color": "#0a84ff",
"icon": "briefcase",
"archived": false,
"is_owner": true,
"is_shared": false
}
]
}Списками можно делиться (на сайте - кнопка «Поделиться»). В ответе одновременно приходят и собственные, и шаренные; различить помогают два булевых поля:
is_owner - true: вы владелец списка; false: участник чужого. Только владелец может редактировать сам список (имя, цвет, иконка, архивация, удаление, привязка к группе) - попытка участника даст 403. Содержимое (задачи и заметки) могут править оба.is_shared - true: у списка есть участники (расшарен), независимо от вашей роли; false: сугубо личный.В общих списках поля completed_user_id / deleted_user_id у задач показывают, кто реально закрыл/удалил заметку (а не её владельца).
/v1/api/listsСоздаёт новый список у пользователя-владельца токена.
| Поле | Тип | Описание |
|---|---|---|
| name | string * | Название списка. Обязательное поле. |
| color | string | null | HEX-цвет или имя токена темы. |
| icon | string | null | Имя иконки (SF Symbol). |
| parent_id | UUID | null | UUID группы, в которую сразу положить список. Группы создаются через /v1/api/groups. |
curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "name": "Покупки", "color": "#0a84ff" }' \
https://taskid.app/v1/api/lists {
"list": {
"id": "6f8a6f4e-...",
"parent_id": null,
"name": "Покупки",
"color": "#0a84ff",
"icon": null,
"archived": false
}
}/v1/api/lists/:idВозвращает один список по идентификатору.
curl -H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/lists/LIST_ID { "list": List }/v1/api/lists/:idЧастичное обновление: в теле только те поля, которые нужно изменить.
| Поле | Тип | Описание |
|---|---|---|
| name | string | Новое название. Пустая строка не допускается. |
| color | string | null | HEX или имя токена темы. null - сбросить. |
| icon | string | null | Имя иконки (SF Symbol). null - сбросить. |
| archived | boolean | Архивировать / вернуть из архива. |
POST /v1/api/lists/:id/attach.curl -X PATCH \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "name": "Покупки на неделю" }' \
https://taskid.app/v1/api/lists/LIST_ID { "list": List }/v1/api/lists/:id/attachПривязывает существующий список к группе или отвязывает его. В URL - id списка, в теле - только parent_id. Сам список не редактируется - меняется только его принадлежность группе.
{
"parent_id": UUID | null // null - вынести в корень
}curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "parent_id": "GROUP_ID" }' \
https://taskid.app/v1/api/lists/LIST_ID/attach curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "parent_id": null }' \
https://taskid.app/v1/api/lists/LIST_ID/attach { "list": List }/v1/api/lists/:idМягкое удаление списка (deleted_at = now). Задачи этого списка тоже перестанут показываться у клиентов после sync.
curl -X DELETE \
-H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/lists/LIST_ID /v1/api/lists/:id/tasksВозвращает задачи из конкретного списка.
| Параметр | По умолчанию | Значения |
|---|---|---|
| completed | 0 | 0 - скрыть завершённые, 1 - только завершённые, all - все. |
| limit | 100 | 1..500 |
| offset | 0 | ≥ 0 |
curl -H "Authorization: Bearer tkd_xxx" \
"https://taskid.app/v1/api/lists/6f8a6f4e-.../tasks?completed=0&limit=50" {
"list": { "id": "...", "name": "Работа" },
"total": 42,
"limit": 50,
"offset": 0,
"tasks": [ Task, Task, ... ]
} total - число задач, попавших под фильтр до применения limit/offset.
У каждой задачи (а также заметки и уведомления) есть массив files - вложения. Если ничего не прикреплено - массив пустой.
"files": [
{
"id": "9f1c...",
"name": "contract.pdf",
"size": 184320, // байты
"url": "https://taskid.app/files/aa/bb/cc/9f1c....pdf",
"source": "upload" // 'upload' | 'link'
},
{
"id": "1a2b...",
"name": "Status page",
"size": 0, // 0, если HEAD не вернул Content-Length
"url": "https://status.example.com/incidents/42",
"source": "link"
}
] source: "upload" - реально загруженный файл в нашем хранилище. url ведёт на taskid.app, скачивается прямым GET без заголовков (capability-токен зашит в путь). Учитывается в файловой квоте пользователя.source: "link" - внешний HTTPS-URL (наш сервер ничего не скачивает и не хранит). url ведёт на сторонний ресурс как есть. В квоте не учитывается; size может быть 0, если сервер ресурса не отдал Content-Length на HEAD-запросе при прикреплении./v1/api/lists/:id/tasksСоздаёт задачу в указанном списке.
| Поле | Тип | Описание |
|---|---|---|
| title | string * | Заголовок задачи. Обязательное поле. |
| note | string | null | Заметка (многострочный текст). |
| due_at | string | null | ISO-8601 в UTC, момент дедлайна. |
| due_has_time | boolean | Флаг «у даты есть время». Если false, в UI показывается только дата. |
| flagged | boolean | Метка «Важно». По умолчанию false. |
| priority | integer | 0 (none), 1 (low), 2 (med), 3 (high). По умолчанию 0. |
| parent_id | UUID | null | UUID родительской задачи - тогда создаётся сразу подзадача. Родитель должен быть в том же списке и сам не быть подзадачей (одноуровневая иерархия). Для привязки уже существующей задачи к другой - см. POST /v1/api/tasks/:id/attach. |
curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{
"title": "Позвонить врачу",
"due_at": "2026-04-20T08:00:00Z",
"due_has_time": true,
"flagged": true,
"priority": 2
}' \
https://taskid.app/v1/api/lists/LIST_ID/tasks curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "title": "Купить молоко", "parent_id": "PARENT_TASK_UUID" }' \
https://taskid.app/v1/api/lists/LIST_ID/tasks {
"task": {
"id": "3c6b...-...-...",
"list_id": "6f8a6f4e-...",
"title": "Позвонить врачу",
"note": null,
"due_at": "2026-04-20T08:00:00Z",
"due_has_time": true,
"completed_at": null,
"flagged": true,
"priority": 2,
"sort_order": 12000,
"files": [],
"version": "2026-04-18T12:34:56Z",
"updated_at": "2026-04-18T12:34:56Z"
}
}POST /v1/api/lists/:id/tasks файлы не прикрепляются. Сделай в два шага: 1) создай задачу, 2) загрузи файлы через POST /v1/api/files и привяжи через POST /v1/api/tasks/:id/files./v1/api/tasks/:idВозвращает одну задачу по её идентификатору.
curl -H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/tasks/TASK_ID { "task": Task }404, если задача не найдена или принадлежит списку, недоступному токену.
/v1/api/tasks/:idЧастичное обновление: в теле указываешь только те поля, которые хочешь изменить. Остальные поля задачи остаются как есть.
client_updated_at.| Поле | Тип | Описание |
|---|---|---|
| title | string | Заголовок. Пустая строка не допускается. |
| note | string | null | Заметка. null очищает. |
| due_at | string | null | ISO-8601 UTC или null для сброса даты. |
| due_has_time | boolean | Учитывать ли время в дате. |
| completed | boolean | true → completed_at = now, false → очистить. |
| flagged | boolean | Метка «Важно». |
| priority | integer | 0, 1, 2 или 3. |
| in_my_day | boolean | true добавляет в «Мой день» на сегодня, false убирает. |
curl -X PATCH \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "title": "Новое имя", "flagged": true }' \
https://taskid.app/v1/api/tasks/TASK_ID /v1/api/tasks/:idМягкое удаление: задача остаётся в БД с пометкой deleted_at - это нужно для корректной синхронизации с клиентами. Для пользователя задача пропадает из всех представлений.
curl -X DELETE \
-H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/tasks/TASK_ID /v1/api/tasks/:id/completeУдобный алиас для частого случая: устанавливает completed_at = now. Тело запроса не требуется. Идемпотентно: уже выполненная задача остаётся как есть.
curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/tasks/TASK_ID/complete { "task": Task }/v1/api/tasks/:id/reopenСнимает отметку о выполнении: completed_at = null. Идемпотентно.
curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/tasks/TASK_ID/reopen { "task": Task }/v1/api/tasks/:id/attachДелает существующую задачу :id подзадачей задачи parent_id, либо - если parent_id: null - отвязывает её от родителя (снова верхнеуровневая задача). Сама задача остаётся в том же списке.
{
"parent_id": UUID | null // null - отвязать
}:id не должна иметь собственных подзадач;curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "parent_id": "PARENT_TASK_ID" }' \
https://taskid.app/v1/api/tasks/CHILD_TASK_ID/attach curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "parent_id": null }' \
https://taskid.app/v1/api/tasks/CHILD_TASK_ID/attach { "task": Task }/v1/api/tasks/:id/filesПрикрепляет к задаче (а) ранее загруженные файлы по их id и/или (б) внешние HTTPS-ссылки. Минимум один из двух массивов должен быть непустым; можно слать оба одновременно.
Файлы: сначала залейте на сервер - см. «Загрузка файла» - и сохраните полученный id. Имя/размер/ссылку для скачивания сервер подтянет из БД сам. Ссылки: просто URL внешнего ресурса (картинка, дашборд, лог) - наш сервер ничего не скачивает и не кэширует, размер/MIME пытается определить HEAD-запросом.
| Поле | Тип | Описание |
|---|---|---|
| file_ids | UUID[] | Массив id ранее загруженных файлов. Каждый id - результат POST /v1/api/files. Файлы должны принадлежать вызывающему пользователю. Опционально, если есть links. |
| links | {url, name?}[] | Массив внешних ссылок. У каждой обязательное поле url (http/https) и опциональное name для отображения. Если имя не задано - сервер возьмёт его из Content-Disposition HEAD-ответа или из последнего сегмента URL. Опционально, если есть file_ids. |
curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{
"file_ids": ["9f1c-...", "5b2e-..."],
"links": [
{ "url": "https://grafana.example.com/d/api", "name": "Dashboard" },
{ "url": "https://status.example.com/incidents/42" }
]
}' \
https://taskid.app/v1/api/tasks/TASK_ID/files Полную обновлённую задачу с уже прикреплёнными файлами и ссылками в поле files (см. «Типы данных» - формат единый, с маркером source):
{
"task": {
"id": "TASK_ID",
"title": "Договор с подрядчиком",
"note": null,
"files": [
{
"id": "9f1c-...",
"name": "contract.pdf",
"size": 184320,
"url": "https://taskid.app/files/aa/bb/cc/9f1c....pdf",
"source": "upload"
},
{
"id": "1a2b-...",
"name": "Dashboard",
"size": 0,
"url": "https://grafana.example.com/d/api",
"source": "link"
}
],
... // остальные поля задачи - см. «Типы данных»
}
}Идемпотентно по file_ids - если файл уже прикреплён к этой задаче, повторный вызов оставит его как есть. Для links дедупликации по url нет: можно намеренно прикрепить один URL дважды с разными именами, у каждой ссылки свой id.
Пустые оба массива - 400. Хотя бы один должен содержать элементы.
Ссылки не учитываются в файловой квоте пользователя - у них нет загруженного содержимого. Учитываются только source: "upload" файлы.
/v1/api/tasks/:id/files/:fileIdУбирает файл или ссылку из массива files задачи. :fileId - значение поля id прикрепления (одинаковое для upload и link, тип определяется по source).
Если откреплённый source: "upload" файл загружали вы - он также помечается на удаление и физически сносится вскоре, квота освобождается сразу. Если файл загружал другой участник общего списка - у вас он просто исчезает из задачи; владелец остаётся прежним. Для source: "link" ничего физически не удаляется - ссылка просто перестаёт быть прикреплённой.
curl -X DELETE \
-H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/tasks/TASK_ID/files/FILE_ID Полную обновлённую задачу - в массиве files этого файла больше нет:
{
"task": {
"id": "TASK_ID",
"title": "Договор с подрядчиком",
"files": [], // или массив с другими, оставшимися файлами
...
}
} Если такого файла к задаче не прикреплено (или его уже открепили раньше) - вернётся 404.
/v1/api/lists/:id/infoЗаметки - отдельная сущность внутри списка: только заголовок и текст, без даты, важности, статуса выполнения. В task-эндпоинты и системные представления они не попадают.
limit - 1..500, по умолчанию 100offset - с какой заметки, по умолчанию 0curl -H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/lists/LIST_ID/info {
"list": { "id": UUID, "name": string },
"total": number,
"limit": number,
"offset": number,
"records": InfoRecord[]
}У заметки есть массив files с теми же полями, что у задачи: id, name, size, url (абсолютный, Authorization не нужен). Откреплённые/удалённые файлы не возвращаются. Прикрепить/открепить файл - см. «Прикрепить файлы к заметке» и «Открепить файл от заметки».
/v1/api/lists/:id/info| Поле | Тип | Описание |
|---|---|---|
| title | string * | Заголовок заметки. Обязательное поле, не пустое. |
| note | string | null | Многострочный текст заметки. Опционально. Это единственное содержательное поле кроме заголовка - полей вроде content, type, даты, важности или статуса выполнения у заметок нет. |
curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{ "title": "Wi-Fi пароль", "note": "Secret1234" }' \
https://taskid.app/v1/api/lists/LIST_ID/info {
"record": {
"id": "INFO_ID",
"list_id": "LIST_ID",
"title": "Wi-Fi пароль",
"note": "Secret1234",
"sort_order": 12000,
"files": [],
"version": "2026-04-18T12:34:56Z",
"updated_at": "2026-04-18T12:34:56Z"
}
}POST /v1/api/lists/:id/info файлы не прикрепляются. Сделай в два шага: 1) создай заметку, 2) загрузи файлы через POST /v1/api/files и привяжи через POST /v1/api/info/:id/files./v1/api/info/:id{ "record": InfoRecord }/v1/api/info/:id| Поле | Тип | Описание |
|---|---|---|
| title | string | Новый заголовок. Пустая строка не допускается. |
| note | string | null | Текст заметки. null - очистить. |
{ "record": InfoRecord } // полная заметка после изменений Структура полей - в разделе «Типы данных».
/v1/api/info/:idМягкое удаление - такая же семантика, как у задач.
/v1/api/info/:id/filesПрикрепляет к заметке загруженные файлы и/или внешние HTTPS-ссылки. Семантика и контракт - идентичны «Прикрепить файлы и ссылки к задаче»: принимаются file_ids и links (хотя бы один непустой), ответ - обновлённая заметка с полем files.
{
"file_ids": ["UUID", ...], // опционально
"links": [{ "url": "...", "name": "..." }, ...] // опционально
}curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{
"file_ids": ["9f1c-..."],
"links": [{ "url": "https://wiki.example.com/wifi", "name": "Wiki" }]
}' \
https://taskid.app/v1/api/info/INFO_ID/files Полную обновлённую заметку - в массиве files уже видны прикреплённые файлы и ссылки:
{
"record": {
"id": "INFO_ID",
"title": "Wi-Fi пароль",
"note": "Secret1234",
"files": [
{
"id": "9f1c-...",
"name": "router-photo.jpg",
"size": 92210,
"url": "https://taskid.app/files/aa/bb/cc/9f1c....jpg",
"source": "upload"
},
{
"id": "1a2b-...",
"name": "Wiki",
"size": 0,
"url": "https://wiki.example.com/wifi",
"source": "link"
}
],
...
}
}/v1/api/info/:id/files/:fileIdУбирает файл или ссылку из массива files заметки. Поведение и условия - см. «Открепить файл/ссылку от задачи»: для source: "upload" освобождается квота, для source: "link" ничего физически не удаляется.
curl -X DELETE \
-H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/info/INFO_ID/files/FILE_ID Полную обновлённую заметку - этого файла в массиве files уже нет:
{
"record": {
"id": "INFO_ID",
"title": "Wi-Fi пароль",
"files": [], // или другие, оставшиеся файлы
...
}
} Если такого файла к заметке не прикреплено - вернётся 404.
/v1/api/notificationsСоздаёт запись типа "уведомление" и присылает на устройства пользователя видимый push-баннер с заголовком и текстом. Замена Telegram-боту для алертов мониторинга, серверных событий и любых внешних сообщений, которые должны быстро доходить до телефона.
Уведомление физически хранится в той же таблице, что задачи и заметки, но имеет отдельный тип (kind=2). На клиенте оно появляется в системном списке "Уведомления" и в указанном пользовательском списке. Из любого уведомления можно одним тапом сделать задачу.
| Заголовок | Описание |
|---|---|
| Authorization | Bearer tkd_... со scope=write_notifications. |
| Content-Type | application/json |
| Idempotency-Key | Опционально. Если интеграция ретраит запрос при сетевых сбоях, передавайте один и тот же ключ - повторный запрос вернёт уже созданное уведомление со статусом 200, без дубликата. Ключ живёт 24 часа. |
| Поле | Тип | Описание |
|---|---|---|
| title | string * | Заголовок уведомления. Обязательное поле, не пустое. Отображается жирной строкой в push-баннере и в списке. |
| message | string | null | Текст уведомления. Любые URL-ы внутри клиент рендерит кликабельно - можно класть ссылки на дашборд, тикет, лог. Опционально. |
| list_id | string (uuid) | null | UUID списка, к которому привязать уведомление. Если не передан, уведомление попадает во "Входящие" (без списка). Для токенов с ограниченным доступом к спискам поле обязательно. |
| priority | integer 0..3 | Severity. Используется клиентом для иконки/цвета: 0=info, 1=low, 2=warn, 3=error. По умолчанию 0. |
| file_ids | UUID[] | Опционально. Прикрепить к создаваемому уведомлению ранее загруженные файлы. См. «Загрузка файла». Требует, чтобы токен также имел scope=write (на сами файлы), но конкретно этот POST принимается и со scope=write_notifications, если массив пустой/отсутствует. |
| links | {url, name?}[] | Опционально. Прикрепить внешние HTTPS-ссылки (дашборд, лог, скриншот). В файловой квоте не учитываются. Формат как у «Прикрепить файлы и ссылки к задаче». |
curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: alert-12345" \
-d '{
"title": "Прод упал",
"message": "503 на api.example.com",
"priority": 3,
"links": [
{ "url": "https://grafana.example.com/d/api", "name": "Dashboard" },
{ "url": "https://status.example.com/incidents/42" }
]
}' \
https://taskid.app/v1/api/notifications {
"notification": {
"id": "NOTIF_ID",
"list_id": null,
"title": "Прод упал",
"note": "503 на api.example.com",
"priority": 3,
"completed_at": null,
"sort_order": 12000,
"files": [
{
"id": "1a2b-...",
"name": "Dashboard",
"size": 0,
"url": "https://grafana.example.com/d/api",
"source": "link"
}
],
"version": "2026-04-18T12:34:56Z",
"updated_at": "2026-04-18T12:34:56Z",
"date_create": "2026-04-18T12:34:56Z"
}
} HTTP 201 при создании. Если запрос повторно пришёл с тем же Idempotency-Key - HTTP 200 с тем же телом (новая запись не создаётся).
Retry-After - интегрируйте экспоненциальный backoff. Лимит защищает от штормового потока (упавший монитор → тысячи алертов в минуту)./v1/api/notifications/:id/filesДобавляет файлы и/или внешние ссылки к уже существующему уведомлению. Полезно, когда интеграция шлёт алерт первым же запросом (текст мгновенно доходит до телефона), а скриншоты/дампы/ссылки на дашборды подгружает следом, не дожидаясь окончания загрузки.
Семантика и тело запроса - идентичны «Прикрепить файлы и ссылки к задаче». Возвращается обновлённое уведомление (объект notification, а не task).
Не путать с write_notifications - тот разрешает только создавать уведомления (POST /notifications). Для прикрепления файлов нужен полноценный write.
{
"file_ids": ["UUID", ...], // опционально
"links": [{ "url": "...", "name": "..." }, ...] // опционально
}curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-H "Content-Type: application/json" \
-d '{
"links": [
{ "url": "https://logs.example.com/alert/12345", "name": "Логи инцидента" }
]
}' \
https://taskid.app/v1/api/notifications/NOTIF_ID/files /v1/api/notifications/:id/files/:fileIdУбирает файл или ссылку из массива files уведомления. Поведение и условия - см. «Открепить файл/ссылку от задачи»: для source: "upload" освобождается квота, для source: "link" ничего физически не удаляется.
curl -X DELETE \
-H "Authorization: Bearer tkd_xxx" \
https://taskid.app/v1/api/notifications/NOTIF_ID/files/FILE_ID /v1/api/filesЗаливает один или несколько файлов на сервер. Эндпоинт сам по себе ничего не привязывает к задачам/заметкам/уведомлениям - он только возвращает id, по которому файл потом можно прикрепить через /v1/api/tasks/:id/files, /v1/api/info/:id/files или /v1/api/notifications/:id/files.
Если ваш контент - уже доступный по HTTPS URL ресурс (картинка в CDN, ссылка на дашборд, скриншот в S3), грузить его к нам не нужно. Используйте поле links в attach-эндпоинтах - URL сохранится как есть, файловая квота не задействуется.
multipart/form-data. Поле формы - files (можно несколько) или file (одиночный). Принимаются оба варианта.
curl -X POST \
-H "Authorization: Bearer tkd_xxx" \
-F "files=@/path/to/contract.pdf" \
-F "files=@/path/to/photo.jpg" \
https://taskid.app/v1/api/files {
"files": [
{ "id": "9f1c-...", "name": "contract.pdf", "size": 184320 },
{ "id": "5b2e-...", "name": "photo.jpg", "size": 92210 }
]
} URL для скачивания на этом шаге не отдаётся - он понадобится только когда файл будет прикреплён к задаче или заметке; там он уже придёт абсолютным в массиве files.
400 - тело не multipart или нет файлов / пустой файл.413 - превышен максимальный размер запроса или одного файла.507 - превышена квота хранилища пользователя.{
"id": UUID,
"parent_id": UUID | null, // UUID группы, в которой лежит список
"name": string,
"color": string | null, // HEX или имя токена темы
"icon": string | null, // SF Symbol
"archived": boolean,
"is_owner": boolean, // вы владелец списка
"is_shared": boolean // у списка есть участники
} {
"id": UUID,
"name": string,
"color": string | null,
"icon": string | null,
"archived": boolean
}{
"id": UUID,
"list_id": UUID | null,
"parent_id": UUID | null, // для подзадач
"title": string,
"note": string | null,
"due_at": string | null, // ISO-8601 UTC
"due_has_time": boolean,
"completed_at": string | null, // ISO-8601 UTC
"flagged": boolean,
"priority": 0 | 1 | 2 | 3,
"rrule_freq": 0 | 1 | 2 | 3 | 4 | 5, // 0=нет, HOURLY/DAILY/WEEKLY/MONTHLY/YEARLY
"rrule_interval": number, // >=1
"rrule_byday": number, // битмаска Пн=1..Вс=64
"rrule_bymonth": number, // битмаска янв=1..дек=2048
"rrule_bysetpos": number, // 1..4 или -1, 0=не задан
"rrule_end_kind": 0 | 1 | 2, // 0=никогда, 1=до даты, 2=после N
"rrule_until": string | null, // ISO-8601 UTC
"rrule_count": number,
"rrule_done": number,
"rrule_anchor": 0 | 1, // 0=schedule, 1=completion
"in_my_day": boolean,
"in_my_day_date": string | null, // YYYY-MM-DD
"sort_order": number,
"collapsed": 0 | 1, // 1 = подзадачи свёрнуты
"files": FileRef[], // см. «Прикреплённые файлы»
"version": string, // ISO-8601 UTC, обновляется на сервере
"updated_at": string, // ISO-8601 UTC
"date_create": string, // ISO-8601 UTC
"completed_user_id": UUID | null, // кто закрыл (важно в общих списках)
"deleted_user_id": UUID | null // кто удалил
}{
"id": UUID,
"list_id": UUID, // всегда привязан к конкретному списку
"title": string,
"note": string | null,
"sort_order": number,
"files": FileRef[], // см. «Прикреплённые файлы»
"version": string, // ISO-8601 UTC
"updated_at": string // ISO-8601 UTC
} {
"id": UUID,
"name": string, // оригинальное имя файла
"size": number, // размер в байтах
"url": string // абсолютный URL (https://taskid.app/files/...)
} content, type, дедлайна, статуса выполнения, флагов, priority и «Мой день» - по замыслу. Содержательная часть только в title и note. В task-эндпоинты и системные представления заметки не попадают.