Перейти к основному содержимому

API и интеграции: справочник

Справочник написан для разработчика интеграции. Пошаговая инструкция для пользователя находится в процессе «Интеграции».

Способы доступа​

СпособДля чегоАутентификация
REST APIЧтение и изменение данных из скриптов и сервисовAPI-ключ в заголовке Authorization: Bearer thor_sk_…
MCPЧтение данных ИИ-ассистентами (только чтение)API-ключ
WebhookПолучение событий в вашу системуПодпись X-Assist-Signature

Адреса​

  • REST API: https://<адрес кабинета>/api.
  • MCP: https://<адрес кабинета>/api/mcp (Streamable HTTP, без сессий).
  • Проверка работоспособности: GET /health и GET /ready без аутентификации.

Аутентификация​

  1. Создайте API-ключ на странице «API-ключи». Выберите роль: ключ получит права именно этой роли.
  2. Сохраните токен вида thor_sk_<идентификатор>.<секрет>: он показывается один раз.
  3. Передавайте токен в каждом запросе: Authorization: Bearer thor_sk_….

Для запросов с ключом заголовок X-Requested-With не нужен. Управление самими ключами через ключ невозможно: ответ 403.

Общие заголовки​

ЗаголовокКогдаЗначение
AuthorizationВсегдаBearer thor_sk_<id>.<secret>
Content-TypeДля POST и PATCH с теломapplication/json
Accept-LanguageПо желаниюru или en: язык сообщений
Idempotency-KeyРекомендуется для POST, PUT, PATCH, DELETEУникальная строка до 255 символов

Идемпотентность. Повтор запроса с тем же ключом и телом возвращает сохранённый ответ. Тот же ключ с другим телом: ошибка 409 IDEMPOTENCY_MISMATCH. Для загрузки файлов (multipart/form-data) не работает.

Формат данных​

  • Идентификаторы: UUID в нижнем регистре.
  • Даты и время: ISO 8601 с часовым поясом, например 2026-10-28T12:00:00.000Z.
  • Календарные дни (начало и конец задач и релизов): YYYY-MM-DD.
  • Описание: документ BlockNote (JSON) или null.
  • Оценка и длительности: минуты (целое число).

Пагинация. Списки отвечают объектом { items, pagination: { limit, offset, total, hasMore } }. Параметры limit и offset. Деревья задач используют курсор: nextCursor.

Права​

Каждый метод проверяет права роли ключа и охват записей. Права текущего ключа возвращает GET /api/me в поле permissions. Ошибка 403 означает недостаточные права, а не проблему аутентификации. Ошибка 404 может означать, что запись вне охвата роли.

Лимиты​

ЗонаЛимит
/api/auth/*40 запросов в минуту с адреса
Остальной /api/*180 запросов в минуту с адреса

При превышении ответ 429 RATE_LIMITED с заголовками x-ratelimit-limit, x-ratelimit-remaining, x-ratelimit-reset, retry-after.

Формат ошибок​

{ "error": { "code": "VALIDATION_ERROR", "message": "Invalid request body", "details": {} } }
HTTPКодКогда
400VALIDATION_ERRORНеверное тело или параметры запроса
401UNAUTHORIZEDНет или недействителен ключ или сессия
403FORBIDDENНет права
404NOT_FOUNDЗапись не найдена или вне охвата
409CONFLICT, IDEMPOTENCY_MISMATCHКонфликт данных, повтор с другим телом
429RATE_LIMITEDПревышен лимит
500INTERNALНеобработанная ошибка

Переход по стадии, который не прошёл гейт, возвращает ошибку с details.failures и подсказкой hint.

Основные методы​

Нужное право указано для роли ключа.

Профиль​

МетодПутьОписание
GET/api/meПрофиль, роль и права ключа
GET/api/me/my-workЗадачи «Моей работы»

Проекты, релизы, задачи​

МетодПутьОписаниеПраво
GET/api/projectsСписок проектов. Параметры q, kind, stageKey, limit, offsetПроекты: просмотр
POST/api/projectsСоздать проектПроекты: создание
GET/api/projects/:id/releasesРелизы проектаРелизы: просмотр
POST/api/projects/:id/releasesСоздать релизРелизы: создание
PATCH/api/releases/:idИзменить релизРелизы: изменение
POST/api/releases/:id/move-stageПеревести релизРелизы: изменение
GET/api/projects/:id/tasksДерево задач проектаЗадачи: просмотр
POST/api/projects/:id/tasksСоздать задачуЗадачи: создание
POST/api/releases/:id/tasksСоздать задачу в релизеЗадачи: создание
GET/api/tasks/:idПолучить задачуЗадачи: просмотр
PATCH/api/tasks/:idИзменить задачуЗадачи: изменение
POST/api/tasks/:id/move-stageПеревести задачу: тело {"stageKey":"in_progress","confirmed":true}Задачи: изменение
GET/api/tasks/:id/allowed-transitionsДопустимые переходыЗадачи: просмотр
DELETE/api/tasks/:idУдалить задачуЗадачи: удаление
GET/api/search?q=…Глобальный поискПрава просмотра

Часы и комментарии​

МетодПутьОписание
GET/api/tracksСписок треков
POST/api/tracksСоздать трек: taskId, workTypeId, description, durationMinutes, startedAt, endedAt, при праве — userId
GET/api/work-typesТипы работ
POST/api/entity-commentsКомментарий: entityType (task, release, project), entityId, body

Уведомления и отчёты​

МетодПутьОписание
GET/api/notificationsЛента уведомлений
POST/api/notifications/:id/readОтметить прочитанным
GET/api/reports/tracks/duration-matrixОтчёт «Часы по трекам» (есть .csv и .xlsx)
GET/api/reports/tracks/time-allocationОтчёт «Распределение времени»
GET/api/resources/plan-fact?yearMonth=YYYY-MMПлан-факт

Примеры​

Создать задачу:

curl -X POST "https://<адрес>/api/projects/<ID_ПРОЕКТА>/tasks" \
-H "Authorization: Bearer thor_sk_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: crm-import-001" \
-d '{"title": "Задача из CRM", "estimateMinutes": 120}'

Записать время:

curl -X POST "https://<адрес>/api/tracks" \
-H "Authorization: Bearer thor_sk_..." \
-H "Content-Type: application/json" \
-d '{"taskId": "<ID_ЗАДАЧИ>", "workTypeId": "<ID_ТИПА_РАБОТ>", "description": "Работа по интеграции", "durationMinutes": 60, "startedAt": "2026-10-28T09:00:00.000Z", "endedAt": "2026-10-28T10:00:00.000Z"}'

Перевести задачу на стадию:

curl -X POST "https://<адрес>/api/tasks/<ID_ЗАДАЧИ>/move-stage" \
-H "Authorization: Bearer thor_sk_..." \
-H "Content-Type: application/json" \
-d '{"stageKey": "in_progress", "confirmed": true}'

Правила записи времени те же, что в интерфейсе: «Правила и ограничения».

MCP для ИИ-ассистентов​

MCP-сервер работает только на чтение. Авторизация только по API-ключу. Запросы GET и DELETE возвращают 405.

ИнструментЧто возвращает
whoamiПользователь ключа, роль, коллекции с охватом
list_fieldsПоля задач и проектов
list_projects, get_projectПроекты; карточка проекта с командой и зонами ответственности (по projectId или префиксу)
list_tasks, get_taskЗадачи по всем проектам с фильтрами; карточка задачи (по taskId или ключу вида RGM-30)
list_usersПользователи; с projectId — команда проекта
list_time_tracksТреки времени и итог в минутах
list_field_tracksИстория значений полей

Списки принимают limit (1–100, по умолчанию 50) и offset. Даты в ответах: ISO 8601.

Webhook​

Webhook настраивается пользователем на вкладке «Каналы уведомлений» профиля: «Свои настройки уведомлений».

  • Assist отправляет один HTTPS POST на каждое событие.
  • Адрес должен быть публично доступным. Частные и локальные адреса отклоняются.
  • Секрет показывается один раз при создании.
  • Подпись: заголовок X-Assist-Signature содержит sha256= и шестнадцатеричный HMAC-SHA256 точного тела запроса, посчитанный с секретом webhook.

Пример проверки подписи (Python):

import hmac, hashlib

def is_valid(body: bytes, header: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, header)

Ограничения​

  1. Ключи создаются и отзываются только в интерфейсе.
  2. Удаление задач, проектов, релизов и треков мягкое: записи помечаются удалёнными.
  3. Переходы по стадиям могут быть заблокированы гейтом. Передайте confirmed: true после выполнения условий.
  4. Дополнительные поля из конструктора передаются как поля верхнего уровня тела запроса и проверяются по каталогу и правам на поля.
  5. Полный перечень методов и схем тел запросов ведёт команда разработки Assist. Запросите документ «REST API (интеграция)» у администратора.