§ 8.1

Подписка и события

Как подключить адрес, список событий, формат доставки.

обновлено 24 сентября 20265 мин чтениятолько на тарифахКомандаБизнес

Вебхук — это POST-запрос от DoneBy на ваш адрес, когда в пространстве что-то произошло: задачу создали, перенесли, выполнили. Вместо того чтобы опрашивать API каждую минуту, ваш сервер узнаёт об изменении сразу.

Доступ

Вебхуки работают на тарифах Команда (до 20 адресов) и Бизнес (до 100 адресов). Подключать и отключать адреса могут владелец и администраторы пространства.

Подключение в настройках

  1. Откройте Настройки → Вебхуки и нажмите «Добавить адрес».
  2. Укажите URL. Принимаются только адреса https:// с действительным сертификатом; адреса внутренних сетей (localhost, 10.x.x.x, 192.168.x.x) не принимаются.
  3. Отметьте события. Можно выбрать все, но лучше только нужные — меньше лишних запросов к вашему серверу.
  4. Сохраните и скопируйте секрет адреса — им подписывается каждая доставка. Секрет показывается один раз, потом его можно только перевыпустить.

В карточке адреса видны последние доставки: тип события, код ответа вашего сервера, время и номер попытки. Это первое место, куда стоит смотреть, если события «не приходят».

Подключение через API

То же самое делается запросом POST /webhooks с токеном, у которого есть скоуп webhooks:write. В ответе — секрет адреса, и это единственный раз, когда API его показывает.

Запрос
curl -X POST https://doneby.app/api/v1/webhooks \
  -H "Authorization: Bearer $DONEBY_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 9a7e2f40-1b6c-4d3e-8f25-c0d4b7a91e63" \
  -d '{
    "url": "https://example.com/hooks/doneby",
    "events": ["task.created", "task.completed", "task.due_soon"],
    "description": "Задачи в CRM"
  }'
Ответ · 201 Created
{
  "id": "whk_3Tq8Yb",
  "url": "https://example.com/hooks/doneby",
  "events": ["task.created", "task.completed", "task.due_soon"],
  "description": "Задачи в CRM",
  "secret": "c2f1a9e04b7d6385f0e1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3",
  "enabled": true,
  "created_at": "2026-09-24T08:40:00Z"
}

GET /webhooks возвращает все адреса пространства — без секретов. DELETE /webhooks/{id} отключает и удаляет адрес. Список событий удобнее менять в настройках.

События

Подписаться можно на любое сочетание событий. Объекты в data — в том же формате, что в REST API.

СобытиеКогда приходитЧто в data
task.createdЗадачу создали — в приложении, через API, письмом на адрес списка или импортом.task — задача целиком
task.updatedИзменились поля задачи: название, срок, исполнители, приоритет, список, раздел, повтор, чек-лист.task, changed — какие поля изменились, previous — их прежние значения
task.completedЗадачу отметили выполненной. У повторяющейся задачи — закрыли очередное повторение.task, completed_by — id участника
task.reopenedВыполненную задачу вернули в работу.task, reopened_by
task.deletedЗадачу удалили. Вместе с ней удаляются подзадачи — на каждую приходит своё событие.task — только id, list_id, parent_id, title
task.due_soonСрок скоро: за 30 минут до срока, а для задач без времени — в 9:00 в день срока. Приходит один раз на срок.task
comment.createdК задаче добавили комментарий.comment — id, text, author_id, mentions, created_at; task_id
list.createdСоздали новый список — вручную, из шаблона или через API.list — список целиком
list.archivedСписок отправили в архив.list
member.joinedУчастник принял приглашение в пространство.member — id, name, email, role

Формат доставки

Каждое событие — отдельный POST с JSON-телом и заголовком подписи. Конверт одинаковый для всех типов:

ПолеОписание
idИдентификатор события evt_…. Один и тот же во всех повторных доставках — по нему отсекают дубли.
typeТип события из таблицы выше.
created_atКогда событие произошло, ISO 8601 в UTC. Не путайте с моментом доставки — при повторах они расходятся.
workspace_idРабочее пространство wsp_…. Пригодится, если один обработчик принимает события нескольких пространств.
dataОбъект события: задача, комментарий, список или участник.
Доставка task.completed
POST /hooks/doneby HTTP/1.1
Host: example.com
Content-Type: application/json
X-DoneBy-Signature: t=1758707412,v1=3b9f0c7e1d4a26f58c0e9b7a1f2d3c4b5a69788f7e6d5c4b3a2918070f6e5d4c

{
  "id": "evt_6Rk2Pw",
  "type": "task.completed",
  "created_at": "2026-09-24T09:50:12Z",
  "workspace_id": "wsp_9Dn4Tz",
  "data": {
    "task": {
      "id": "tsk_4Gh8Np",
      "title": "Созвон по правкам карточек товара",
      "list_id": "lst_Ka7Tp3",
      "due_date": "2026-09-24",
      "due_time": "14:30",
      "timezone": "Europe/Moscow",
      "priority": 1,
      "assignee_ids": ["usr_Ol3gD7", "usr_Me0001"],
      "completed": true,
      "completed_at": "2026-09-24T09:50:12Z",
      "updated_at": "2026-09-24T09:50:12Z",
      "url": "https://doneby.app/app/list/lst_Ka7Tp3?task=tsk_4Gh8Np"
    },
    "completed_by": "usr_Ol3gD7"
  }
}

У task.updated в data есть ещё changed — список изменённых полей — и previous с их прежними значениями. Так легко отличить перенос срока от смены исполнителя, не храня у себя копию задачи.

task.updated · поля задачи сокращены
{
  "id": "evt_6Rk2Px",
  "type": "task.updated",
  "created_at": "2026-09-24T10:02:47Z",
  "workspace_id": "wsp_9Dn4Tz",
  "data": {
    "task": {
      "id": "tsk_8Kd2Lq",
      "title": "Подготовить отчёт за сентябрь",
      "due_date": "2026-10-01",
      "due_time": null,
      "updated_at": "2026-09-24T10:02:47Z"
    },
    "changed": ["due_date", "due_time"],
    "previous": { "due_date": "2026-09-30", "due_time": "15:00" }
  }
}

Как отвечать

  • Ответьте любым кодом 2xx в течение 10 секунд — доставка засчитана. Тело ответа DoneBy не читает.
  • Всё остальное считается неудачей: 3xx (редиректы не выполняются), 4xx, 5xx, таймаут, ошибка TLS или соединения. Событие уйдёт на повтор по расписанию.
  • Сначала ответьте, потом обрабатывайте. Положите событие в очередь, верните 200 и разбирайте его в фоне. Долгая обработка внутри запроса — самая частая причина повторов и дублей.
  • Прежде чем что-то делать с событием, проверьте подпись.

Важно

Порядок доставки не гарантирован: если первая попытка task.created не удалась, task.updated той же задачи может прийти раньше. Сравнивайте updated_at задачи с тем, что уже сохранено у вас, и не записывайте старое поверх нового.

Совет

Для отладки на своём компьютере используйте туннель с публичным HTTPS-адресом и отдельный адрес вебхука с одним-двумя событиями. Боевой адрес не трогайте.

Ограничения по тарифам

ТарифАдресов вебхуков
Стартнет
Командадо 20 адресов
Бизнесдо 100 адресов

Один адрес может получать сколько угодно типов событий. Ответ — 10 секунд, повторы — до 6 попыток на событие. Подробности о подписи, повторах и отключении адреса — в разделе Подпись и повторы.

см. также
Статья помогла?Отметьте галочкой — так мы понимаем, какие статьи дописать первыми.