Токен и воркспейс
GET/contexttasks:read
Воркспейс токена, его владелец и права. Удобно для проверки токена при настройке интеграции.
curl https://ahora.team/api/v1/context \
-H "Authorization: Bearer $AHORA_TOKEN"HTTP API для серверных интеграций: создавайте задачи из CRM и форм, забирайте изменения в отчёты, пишите комментарии из скриптов. JSON на входе и выходе, личный токен в заголовке.
https://ahora.team/api/v1
Начало работы
Откройте в Ahora «Настройки воркспейса → API и интеграции» и нажмите «Новый токен». Выберите доступ и срок действия, скопируйте секрет — он показывается один раз.
Проверьте токен запросом /context: он вернёт воркспейс, от чьего имени работает токен, и его права.
curl https://ahora.team/api/v1/context \
-H "Authorization: Bearer $AHORA_TOKEN"{
"workspace": {
"id": "01J9ZK0A1B2C3D4E5F6G7H8J9K",
"name": "Тропа",
"slug": "team"
},
"actor": {
"id": "01J9ZK3P7M1N5Q8S2V4X6Z0B3D",
"name": "Анна Смирнова"
},
"scopes": [
"tasks:read",
"tasks:write"
]
}Токен передаётся в заголовке Authorization: Bearer …. Он принадлежит человеку, который его создал, и действует только в одном воркспейсе. Всё, что делает токен, выглядит в Ahora как действие этого человека.
Токен перестаёт работать, если его отозвали, истёк срок или владельца отключили. Если владельца удалили из воркспейса, его токены отзываются насовсем: после повторного приглашения нужен новый токен. Во всех этих случаях приходит 401 invalid_token.
Всё, что делает токен, видно в Ahora так же, как действия человека: смена статуса, приоритета и срока попадает в ленту задачи, наблюдатели и исполнители получают уведомления, упомянутые в комментариях — тоже.
Токен — секрет уровня пароля. Храните его на сервере, а не в коде сайта или мобильного приложения: запросы из браузера с чужого домена API не принимает.
| Право | Что разрешает |
|---|---|
tasks:read | Контекст, доски, статусы, участники, задачи, комментарии и чек-листы |
tasks:write | Всё из tasks:read, а ещё создание и изменение задач, исполнители, комментарии и чек-листы |
Запросы и ответы — JSON в UTF-8, поля в camelCase. Даты — строки ISO 8601: в ответах всегда UTC (2026-10-21T09:00:00.000Z), в запросах можно с любым смещением (2026-10-21T12:00:00+03:00).
Один объект приходит в поле data, список — в data вместе с pagination. В PATCH-запросах отсутствующее поле не меняется, а null очищает его.
В каждом ответе есть заголовок X-Request-Id. Можно передать свой — он вернётся тем же.
При ошибке приходит HTTP-статус и объект error. Ориентируйтесь на code — он не меняется. message написан для людей и может уточняться.
{
"error": {
"code": "status_not_found",
"message": "Статус не найден",
"requestId": "req_01JB7F0A2C4E6G8J0L2N4Q6S8U"
}
}| Статус | Код | Когда |
|---|---|---|
| 400 | validation_error | Тело запроса не прошло проверку |
| 400 | invalid_limit, invalid_cursor, invalid_date, invalid_priority | Неверный параметр списка задач |
| 400 | invalid_idempotency_key | Idempotency-Key длиннее 200 символов |
| 400 | member_not_found | Среди assigneeIds есть не участник воркспейса |
| 401 | authentication_required | Нет заголовка Authorization |
| 401 | invalid_token | Токен неверный, отозван или истёк |
| 403 | insufficient_scope | Токену не хватает права, например tasks:write |
| 403 | board_archived, task_archived | Доска или задача в архиве — только чтение |
| 404 | board_not_found, status_not_found, task_not_found, member_not_found, comment_not_found, checklist_item_not_found | Объекта нет в этом воркспейсе |
| 409 | idempotency_conflict | Ключ уже использован с другим телом запроса |
| 409 | external_id_conflict | Такой externalId уже есть у задачи этого токена |
| 412 | version_conflict | Задачу изменили после того, как вы её прочитали |
| 429 | rate_limit_exceeded | Слишком много запросов на токен или слишком много запросов с неверным токеном |
300 запросов в минуту на токен. Лимит приходит в заголовке X-RateLimit-Limit. При превышении — 429 и Retry-After: 60: подождите указанное число секунд и повторите.
С одного адреса можно сделать 30 запросов в минуту с неверным или отозванным токеном, дальше API отвечает 429, не проверяя токен.
Надёжная интеграция
GET /tasks отдаёт задачи страницами, сначала недавно изменённые. Если pagination.hasMore равно true, передайте pagination.nextCursor в параметре cursor следующего запроса с теми же фильтрами. Курсор непрозрачный: не разбирайте и не собирайте его сами.
{
"data": [
"…"
],
"pagination": {
"nextCursor": "WzE3OTI0MzI5MjgxNDcsIjAxSkI3QzJXOUUiXQ",
"hasMore": true
}
}Если ответ на создание задачи не дошёл, запрос можно безопасно повторить с тем же заголовком Idempotency-Key. В течение суток Ahora вернёт первую созданную задачу, а не сделает вторую. Тот же ключ с другим телом — 409 idempotency_conflict.
externalId — ваш идентификатор: номер лида, заявки, тикета. Он уникален в пределах токена и возвращается в задаче, так что связь не потеряется и без своей базы.
curl https://ahora.team/api/v1/tasks \
-H "Authorization: Bearer $AHORA_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: crm-lead-92831" \
-d '{ "boardId": "01JB6Y0M4QZ8V3K2T7R5N9XW1A", "title": "Перезвонить клиенту", "externalId": "lead-92831" }'У задачи есть version — она растёт при каждом изменении, в том числе сделанном в приложении. GET /tasks/:taskId возвращает её в заголовке ETag.
Передайте ETag в If-Match при PATCH: если задачу успели изменить, придёт 412 version_conflict, и ничего не запишется. Перечитайте задачу, примените своё изменение и повторите. Без If-Match изменение записывается поверх текущей версии.
curl https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B \
-X PATCH \
-H "Authorization: Bearer $AHORA_TOKEN" \
-H "Content-Type: application/json" \
-H 'If-Match: "task-01JB7C2W9EXQ4N8R2T6V0Y3Z5B-v3"' \
-d '{ "statusId": "01JB6Y0M4R2D8F0H3K6M9P1S4T" }'Чтобы забирать изменения, запоминайте время начала каждого запуска и в следующий раз передавайте его в updatedAfter. В выдачу попадут задачи, у которых изменились поля или исполнители.
Новые комментарии и пункты чек-листа updatedAt задачи не меняют — их запрашивайте отдельно. Задача, удалённая в приложении, просто пропадает из выдачи, а GET /tasks/:taskId отвечает 404. Вебхуков пока нет.
Справочник
Так выглядит задача во всех ответах.
| Поле | Тип | Описание |
|---|---|---|
id | string | Идентификатор задачи |
key | string | Номер, как в приложении: TEAM-142 |
boardId, statusId | string | Доска и колонка |
title | string | Название, до 300 символов |
description | string | null | Описание в Markdown, до 20 000 символов |
priority | string | null | low, medium, high или urgent |
tags | string[] | До 8 тегов по 50 символов |
dueAt | string | null | Срок, ISO 8601 |
archived | boolean | Задача завершена и лежит в архиве |
assignees | { id, name }[] | Исполнители |
externalId | string | null | Ваш идентификатор; виден только токену, который его задал |
createdAt, updatedAt | string | ISO 8601, UTC |
version | integer | Растёт при каждом изменении |
GET/contexttasks:read
Воркспейс токена, его владелец и права. Удобно для проверки токена при настройке интеграции.
curl https://ahora.team/api/v1/context \
-H "Authorization: Bearer $AHORA_TOKEN"Доски и колонки создаются в приложении. Через API их можно только прочитать, чтобы узнать boardId и statusId.
GET/boardstasks:read
Все доски воркспейса в порядке боковой панели, включая архивные.
curl https://ahora.team/api/v1/boards \
-H "Authorization: Bearer $AHORA_TOKEN"{
"data": [
{
"id": "01JB6Y0M4QZ8V3K2T7R5N9XW1A",
"name": "Продажи",
"archived": false
}
]
}GET/boards/:boardId/statusestasks:read
Колонки доски слева направо. Первая — статус по умолчанию для новых задач.
curl https://ahora.team/api/v1/boards/01JB6Y0M4QZ8V3K2T7R5N9XW1A/statuses \
-H "Authorization: Bearer $AHORA_TOKEN"{
"data": [
{
"id": "01JB6Y0M4R2D8F0H3K6M9P1S4T",
"name": "К обсуждению",
"color": "#8E8E93",
"sortOrder": 0
}
]
}GET/memberstasks:read
До 100 участников по алфавиту. Нужны, чтобы найти id исполнителя.
querystringcurl "https://ahora.team/api/v1/members?query=анна" \
-H "Authorization: Bearer $AHORA_TOKEN"{
"data": [
{
"id": "01J9ZK3P7M1N5Q8S2V4X6Z0B3D",
"name": "Анна Смирнова"
}
]
}GET/taskstasks:read
Задачи воркспейса, сначала недавно изменённые. Без archived=true — только активные.
boardIdstringstatusIdstringassigneeIdstringprioritystringlow, medium, high или urgenttagstringarchivedbooleantrue — только задачи в архивеdueBefore, dueAfterISO 8601updatedAfterISO 8601querystringlimitintegercursorstringnextCursor из предыдущего ответаcurl "https://ahora.team/api/v1/tasks?boardId=01JB6Y0M4QZ8V3K2T7R5N9XW1A&limit=20" \
-H "Authorization: Bearer $AHORA_TOKEN"POST/taskstasks:write
Задача появляется в конце колонки, и все, кто смотрит доску, видят её сразу. Без statusId попадает в первую колонку доски. Исполнители получают уведомление, упомянутые в описании — тоже.
boardIdstringобязательноtitlestringобязательноstatusIdstringdescriptionstring | nullprioritystring | nulllow, medium, high, urgentdueAtstring | nulltagsstring[]assigneeIdsstring[]externalIdstringIdempotency-Keystringcurl https://ahora.team/api/v1/tasks \
-H "Authorization: Bearer $AHORA_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: crm-lead-92831" \
-d '{
"boardId": "01JB6Y0M4QZ8V3K2T7R5N9XW1A",
"title": "Перезвонить клиенту",
"description": "Заявка с сайта: интересуется тарифом на 30 человек",
"priority": "high",
"dueAt": "2026-10-21T12:00:00+03:00",
"tags": ["crm"],
"assigneeIds": ["01J9ZK3P7M1N5Q8S2V4X6Z0B3D"],
"externalId": "lead-92831"
}'{
"data": {
"id": "01JB7C2W9EXQ4N8R2T6V0Y3Z5B",
"key": "TEAM-142",
"boardId": "01JB6Y0M4QZ8V3K2T7R5N9XW1A",
"statusId": "01JB6Y0M4R2D8F0H3K6M9P1S4T",
"title": "Перезвонить клиенту",
"description": "Заявка с сайта: интересуется тарифом на 30 человек",
"priority": "high",
"tags": [
"crm"
],
"dueAt": "2026-10-21T09:00:00.000Z",
"archived": false,
"assignees": [
{
"id": "01J9ZK3P7M1N5Q8S2V4X6Z0B3D",
"name": "Анна Смирнова"
}
],
"externalId": "lead-92831",
"createdAt": "2026-10-19T10:24:05.311Z",
"updatedAt": "2026-10-19T10:24:05.311Z",
"version": 1
}
}GET/tasks/:taskIdtasks:read
Возвращает задачу и её версию в заголовке ETag.
curl -i https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B \
-H "Authorization: Bearer $AHORA_TOKEN"PATCH/tasks/:taskIdtasks:write
Передайте только то, что меняете. Завершить задачу — {"archived": true}, вернуть из архива — {"archived": false}. Задачу в архиве можно только вернуть.
При смене статуса карточка встаёт в конец новой колонки. Смена статуса, приоритета и срока записывается в ленту задачи, наблюдатели узнают о новом статусе и о завершении.
titlestringdescriptionstring | nullstatusIdstringprioritystring | nulllow, medium, high, urgentdueAtstring | nulltagsstring[]archivedbooleanIf-MatchstringETag задачи, см. «Одновременные изменения»curl https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B \
-X PATCH \
-H "Authorization: Bearer $AHORA_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "priority": "urgent", "dueAt": null }'{
"data": {
"id": "01JB7C2W9EXQ4N8R2T6V0Y3Z5B",
"key": "TEAM-142",
"boardId": "01JB6Y0M4QZ8V3K2T7R5N9XW1A",
"statusId": "01JB6Y0M4R2D8F0H3K6M9P1S4T",
"title": "Перезвонить клиенту",
"description": "Заявка с сайта: интересуется тарифом на 30 человек",
"priority": "urgent",
"tags": [
"crm"
],
"dueAt": null,
"archived": false,
"assignees": [
{
"id": "01J9ZK3P7M1N5Q8S2V4X6Z0B3D",
"name": "Анна Смирнова"
}
],
"externalId": "lead-92831",
"createdAt": "2026-10-19T10:24:05.311Z",
"updatedAt": "2026-10-19T11:02:40.118Z",
"version": 2
}
}PUT/tasks/:taskId/assignees/:userIdtasks:write
Повторное назначение ничего не меняет. Новый исполнитель получает уведомление, а в ленте задачи появляется запись. Возвращает текущий список исполнителей.
curl https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B/assignees/01J9ZK3P7M1N5Q8S2V4X6Z0B3D \
-X PUT \
-H "Authorization: Bearer $AHORA_TOKEN"{
"data": [
{
"id": "01J9ZK3P7M1N5Q8S2V4X6Z0B3D",
"name": "Анна Смирнова"
}
]
}DELETE/tasks/:taskId/assignees/:userIdtasks:write
Возвращает оставшихся исполнителей.
curl https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B/assignees/01J9ZK3P7M1N5Q8S2V4X6Z0B3D \
-X DELETE \
-H "Authorization: Bearer $AHORA_TOKEN"GET/tasks/:taskId/commentstasks:read
Все комментарии от старых к новым. kind: "system" — записи о событиях задачи, text — комментарии людей.
curl https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B/comments \
-H "Authorization: Bearer $AHORA_TOKEN"{
"data": [
{
"id": "01JB7D4F6H8K0M2P4R6T8V0X2Z",
"body": "Клиент просит перезвонить после обеда",
"kind": "text",
"parentId": null,
"createdAt": "2026-10-19T10:31:12.004Z",
"author": {
"id": "01J9ZK3P7M1N5Q8S2V4X6Z0B3D",
"name": "Анна Смирнова"
}
}
]
}POST/tasks/:taskId/commentstasks:write
Комментарий подписан именем владельца токена и сразу появляется у всех, у кого открыта задача. Наблюдатели и упомянутые получают уведомление. Чтобы ответить в ветке, передайте parentId.
bodystringобязательноparentIdstring | nullcurl https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B/comments \
-H "Authorization: Bearer $AHORA_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "body": "Счёт оплачен, можно начинать" }'GET/tasks/:taskId/checklisttasks:read
Пункты в порядке, в котором они стоят в задаче.
curl https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B/checklist \
-H "Authorization: Bearer $AHORA_TOKEN"{
"data": [
{
"id": "01JB7E1G3J5L7N9Q1S3U5W7Y9A",
"taskId": "01JB7C2W9EXQ4N8R2T6V0Y3Z5B",
"title": "Отправить договор",
"isDone": false,
"sortOrder": 0,
"createdAt": "2026-10-19T10:40:00.000Z"
}
]
}POST/tasks/:taskId/checklisttasks:write
Пункт добавляется в конец списка.
titlestringобязательноcurl https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B/checklist \
-H "Authorization: Bearer $AHORA_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "title": "Отправить договор" }'PATCH/tasks/:taskId/checklist/:itemIdtasks:write
Переименовать пункт или отметить выполненным.
titlestringisDonebooleancurl https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B/checklist/01JB7E1G3J5L7N9Q1S3U5W7Y9A \
-X PATCH \
-H "Authorization: Bearer $AHORA_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "isDone": true }'DELETE/tasks/:taskId/checklist/:itemIdtasks:write
Возвращает {"ok": true}.
curl https://ahora.team/api/v1/tasks/01JB7C2W9EXQ4N8R2T6V0Y3Z5B/checklist/01JB7E1G3J5L7N9Q1S3U5W7Y9A \
-X DELETE \
-H "Authorization: Bearer $AHORA_TOKEN"Если вам нужно что-то из этого, напишите нам — так мы поймём, что делать дальше.
updatedAfter