Agent API — доступ внешним агентам
API для программного доступа к канбану (LLM-агенты, скрипты, curl) через API-ключи (bearer-токены). Права — те же, что у пользователя-владельца ключа.
- Base URL
https://trelka.ru - Аутентификациязаголовок
Authorization: Bearer <token>. - Хранениев БД лежит только SHA-256-хэш токена (
api_keys.key_hash), сам токен не хранится. - Токенпоказывается ровно один раз — в ответе на создание ключа. Повторно его получить нельзя.
Получение API-ключа
Управление ключами (/api/agent/keys*) работает только по браузерной сессии — bearer-токен не даёт создавать/спискивать/отзывать ключи (иначе ключ мог бы плодить ключи).
Создать ключ
# Нужна сессия (cookie) залогиненного пользователя — например, скопировать Cookie из браузера
curl -X POST https://trelka.ru/api/agent/keys \
-H 'Content-Type: application/json' \
-H 'Cookie: <next-auth.session-token=...>' \
-d '{"name": "my-agent"}'Ответ 201 (токен — только здесь):
{
"data": {
"id": "3f2c…uuid",
"name": "my-agent",
"token": "trelka_<64 hex символов>"
}
}Сохраните token. Дальше он используется во всех запросах ниже.
Список своих ключей
curl -X GET https://trelka.ru/api/agent/keys -H 'Cookie: <next-auth.session-token=...>'Ответ 200 (без токена и без хэша):
{
"data": [
{
"id": "3f2c…uuid",
"name": "my-agent",
"created_at": "2026-08-17T12:00:00.000Z",
"last_used_at": null,
"revoked_at": null
}
]
}Отозвать ключ
curl -X DELETE https://trelka.ru/api/agent/keys/3f2c…uuid -H 'Cookie: <next-auth.session-token=...>'Ответ 204 No Content. После отзыва ключ перестаёт аутентифицироваться (401).
Агент-эндпоинты
Доступны и по bearer-токену, и по браузерной сессии.
Список досок
curl -X GET https://trelka.ru/api/agent/boards -H 'Authorization: Bearer <token>'Ответ 200 — доски, где пользователь участник (role: owner | member):
{
"data": [
{
"id": "…uuid",
"title": "Sprint 42",
"description": null,
"owner_id": "…uuid",
"created_at": "2026-08-17T12:00:00.000Z",
"updated_at": "2026-08-17T12:00:00.000Z",
"role": "owner"
}
]
}Полное дерево доски
Один запрос — вся доска: списки, карточки, метки, чеклисты, комментарии (с автором-имейлом).
curl -X GET https://trelka.ru/api/agent/boards/<board_id> -H 'Authorization: Bearer <token>'Ответ 200:
{
"data": {
"id": "…uuid",
"title": "Sprint 42",
"description": null,
"owner_id": "…uuid",
"owner": { "id": "…uuid", "email": "owner@example.com" },
"created_at": "2026-08-17T12:00:00.000Z",
"updated_at": "2026-08-17T12:00:00.000Z",
"role": "owner",
"customLabels": [
{ "id": "…uuid", "board_id": "…uuid", "name": "Срочно", "color": "red" }
],
"lists": [
{
"id": "…uuid",
"title": "To Do",
"board_id": "…uuid",
"position": 0,
"created_at": "2026-08-17T12:00:00.000Z",
"cards": [
{
"id": "…uuid",
"title": "Настроить CI",
"description": "markdown…",
"list_id": "…uuid",
"position": 0,
"due_date": "2026-08-20T00:00:00.000Z",
"created_at": "2026-08-17T12:00:00.000Z",
"updated_at": "2026-08-17T12:00:00.000Z",
"labels": ["red", "blue"],
"customLabels": [
{ "id": "…uuid", "board_id": "…uuid", "name": "Срочно", "color": "red" }
],
"checklist": [
{ "id": "…uuid", "card_id": "…uuid", "title": "пункт", "is_checked": false, "position": 0 }
],
"comments": [
{
"id": "…uuid",
"author_id": "…uuid",
"author_name": "Иван",
"author_email": "owner@example.com",
"content": "текст",
"created_at": "2026-08-17T12:00:00.000Z",
"updated_at": "2026-08-17T12:00:00.000Z"
}
]
}
]
}
]
}
}Создать карточку
Один вызов: карточка + цветные метки + кастомные метки + чеклист.
curl -X POST https://trelka.ru/api/agent/boards/<board_id>/cards \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{
"listId": "<list_id>",
"title": "Задача",
"description": "опционально",
"dueDate": "2026-08-20",
"position": 0,
"labelColors": ["red", "blue"],
"customLabelIds": ["<label_id>"],
"checklist": [
{ "text": "первый пункт" },
{ "text": "второй пункт", "isChecked": true }
]
}'Поля тела:
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
listId | string | да | id списка (колонки) этой доски |
title | string | да | название карточки |
description | string | нет | описание (markdown) |
dueDate | string | нет | срок, ISO-дата/дата-время |
position | number | нет | позиция в списке (иначе — в конец) |
labelColors | string[] | нет | дефолтные цвета: red orange yellow green teal blue purple pink gray |
customLabelIds | string[] | нет | id кастомных меток этой доски |
checklist | object[] | нет | { text: string, isChecked?: boolean }[] |
Ответ 201 — созданная карточка (структура как элемент cards выше).
Коды ошибок
| Код | Когда |
|---|---|
400 | невалидное тело (пустой title, неверный цвет метки, чужая/несуществующая кастомная метка, неверная дата) |
401 | нет/невалидный/отозванный токен, либо нет сессии |
403 | аутентифицирован, но не участник доски |
404 | доска/список/ключ не найдены |
201 | ресурс создан |
204 | ключ отозван (тела нет) |
Замечания
- Токен показывается один раз при создании; хранится в БД как SHA-256-хэш — восстановить токен по БД невозможно.
last_used_atобновляется при каждом успешном использовании ключа.- Не реализовано (бэклог): rate-limit, UI-страница управления ключами, scope
read-only.