Для разработчиков

API Дескуса™ — тикеты, клиенты и вебхуки для интеграций

REST API хелпдеска: тикеты из форм и CRM, ответы клиентам, клиенты, статьи базы знаний и события вебхуками. Ключ API — для своей системы, OAuth 2.0 — для партнёров.

Адрес
https://app.deskus.ru/api/v1
Формат
JSON, время в UTC (ISO 8601), курсорные страницы
Доступ
Ключ API или токен OAuth 2.0 в заголовке Authorization: Bearer
Лимит
600 запросов в минуту на ключ или подключение
Повторы
Заголовок Idempotency-Key у POST — сутки без дублей
Спецификация
OpenAPI 3.1 — deskus.ru/api/openapi.json
Документация
developer.deskus.ru — каждый метод с примерами, OAuth, вебхуки, рецепты

Быстрый старт

Обращение клиента с формы сайта — одним запросом. Клиент узнаётся по почте и телефону, команда получает тикет как из любого другого канала.

Создать обращение
curl https://app.deskus.ru/api/v1/tickets \
  -H "Authorization: Bearer dsk_k_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-4821" \
  -d '{
    "subject": "Не пришёл заказ №4821",
    "message": "Заказала 1 кг эфиопии три дня назад, посылки нет.",
    "client": { "name": "Анна", "email": "anna@example.com" }
  }'
Ответить клиенту
curl https://app.deskus.ru/api/v1/tickets/T-1042/messages \
  -H "Authorization: Bearer dsk_k_…" \
  -H "Content-Type: application/json" \
  -d '{ "type": "reply", "text": "Анна, посылка уже в пути — трек придёт письмом." }'
Список тикетов курсором
curl "https://app.deskus.ru/api/v1/tickets?status=new,open&limit=50" \
  -H "Authorization: Bearer dsk_k_…"

{ "data": [ { "id": "…", "number": "T-1042", "status": "open", … } ],
  "next_cursor": "WyIyMDI2LTEwLTIw…" }
Ошибка — всегда в одном виде
HTTP/1.1 422
X-Request-Id: req_8d1f…

{ "error": {
    "code": "validation_error",
    "message": "Поле message обязательно.",
    "details": { "field": "message" },
    "request_id": "req_8d1f…" } }

Ключ API — для своей системы

  1. 1

    Выпустите ключ

    Администратор открывает «Настройки → API и приложения → Ключи API», называет ключ по системе, которая будет им пользоваться, и отмечает права.

  2. 2

    Сохраните ключ

    Ключ вида dsk_k_… показывается один раз. Положите его в настройки своей системы или коннектора — в Дескусе™ остаётся только начало строки.

  3. 3

    Проверьте подключение

    GET /api/v1/me вернёт компанию, сотрудника и права ключа. Ключ работает от имени сотрудника, который его выпустил, и не может больше, чем этот сотрудник.

OAuth 2.0 — для приложений партнёров

  1. 1

    Зарегистрируйте приложение

    «Настройки → API и приложения → Мои приложения»: название, описание, сайт и адреса возврата. Получите client_id и client_secret.

  2. 2

    Отправьте на проверку

    Пока приложение не проверено Дескусом™, его подключает только ваша компания — так удобно отлаживать. После проверки — любая компания Дескуса™.

  3. 3

    Получите код

    Отправьте клиента на app.deskus.ru/oauth/authorize с client_id, redirect_uri, scope, state и code_challenge (PKCE S256). Администратор компании нажмёт «Разрешить», код придёт на адрес возврата.

  4. 4

    Обменяйте код на токены

    POST /api/oauth/token с grant_type=authorization_code. Токен доступа живёт час, refresh_token — 90 дней и одноразовый: каждое обновление возвращает новую пару.

Обмен кода на токены
curl https://app.deskus.ru/api/oauth/token \
  -u "dskapp_…:dsk_s_…" \
  -d grant_type=authorization_code \
  -d code=dsk_c_… \
  -d redirect_uri=https://example.com/oauth/callback \
  -d code_verifier=…

Права

Ключ и приложение получают только отмеченные права — и не больше прав сотрудника, от имени которого работают.

ПравоЧто даёт
tickets:readСписок тикетов, карточка и переписка
tickets:writeОбращения клиентов, ответы, заметки, статус и приоритет
clients:readПоиск клиентов по почте и телефону, карточка
clients:writeНовые клиенты с проверкой дублей
kb:readОпубликованные статьи базы знаний и поиск по ним
webhooksПодписки на события этого ключа или приложения

Эндпоинты

Тикеты можно искать по id и по номеру (T-1042). Списки — новые сверху, следующая страница — по next_cursor.

Параметры и примеры каждого метода

Доступ

GET/api/v1/meКто я: компания, сотрудник, права ключалюбое

Тикеты

GET/api/v1/ticketsСписок тикетовtickets:read
POST/api/v1/ticketsОбращение клиентаtickets:write
GET/api/v1/tickets/{id}Тикетtickets:read
PATCH/api/v1/tickets/{id}Сменить статус, приоритет, тему, ответственногоtickets:write
GET/api/v1/tickets/{id}/messagesПереписка тикетаtickets:read
POST/api/v1/tickets/{id}/messagesОтветить клиенту или написать заметкуtickets:write

Клиенты

GET/api/v1/clientsНайти клиентовclients:read
POST/api/v1/clientsНовый клиентclients:write
GET/api/v1/clients/{id}Клиентclients:read

База знаний

GET/api/v1/kb/articlesОпубликованные статьиkb:read
GET/api/v1/kb/articles/searchПоиск по статьямkb:read
GET/api/v1/kb/articles/{id}Статья с текстомkb:read

Вебхуки

GET/api/v1/webhooksПодписки этого ключа или приложенияwebhooks
POST/api/v1/webhooksПодписаться на событияwebhooks
GET/api/v1/webhooks/{id}Подпискаwebhooks
PATCH/api/v1/webhooks/{id}Изменить или включить сноваwebhooks
DELETE/api/v1/webhooks/{id}Отписатьсяwebhooks
GET/api/v1/webhooks/{id}/deliveriesЖурнал доставок за 30 днейwebhooks
POST/api/v1/webhooks/{id}/testОтправить тестовое событие pingwebhooks

Вебхуки

Подпишитесь в «Настройки → API и приложения → Вебхуки» или запросом POST /api/v1/webhooks — так коннекторы подписываются сами. Тело подписано тем же способом, что «Приём по API».

ticket.createdНовый тикет — с карточкой клиента
ticket.updatedСменились статус, приоритет, тема, ответственный или команда — с полем changes: было и стало
message.createdНовое сообщение: от клиента, ответ сотрудника или заметка (поле kind)
client.createdНовый клиент — из любого канала или вручную
Что приходит на ваш адрес
POST https://example.com/deskus/webhook
X-Deskus-Event: ticket.updated
X-Deskus-Delivery: 3f0c…
X-Deskus-Signature: sha256=9b1e…

{
  "id": "evt_5c2a…",
  "type": "ticket.updated",
  "created_at": "2026-10-20T09:15:00.000Z",
  "company_id": "…",
  "data": {
    "ticket": { "number": "T-1042", "status": "closed", … },
    "changes": { "status": { "from": "open", "to": "closed" } }
  }
}
Проверка подписи, Node.js
import crypto from "node:crypto";

// rawBody — тело запроса байтами, до JSON.parse
function isFromDeskus(rawBody, signatureHeader, secret) {
  const expected = "sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(expected);
  const b = Buffer.from(String(signatureHeader || ""));
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}
Вопросы

Вопросы и ответы

Чем API отличается от «Приёма по API»?

«Приём по API» — канал приёма: ваша система передаёт сообщения клиентов, Дескус™ возвращает ответы операторов. Открытый API — доступ к самому хелпдеску: тикеты, клиенты, база знаний, статусы и события. Подпись запросов у них одна и та же.

От чьего имени действует ключ?

От имени сотрудника, который его выпустил: ответ клиенту подписан им, запись о смене статуса — тоже. Права ключа не шире прав этого сотрудника в кабинете, а отключённый сотрудник — значит, и ключ не работает. Смену сотрудника действия через API не открывают.

Как не создать два тикета, если запрос повторился?

Передайте заголовок Idempotency-Key — например, номер заказа или UUID. Повтор с тем же ключом и тем же телом сутки возвращает первый ответ, а тот же ключ с другим телом — ошибку 422.

Что будет, если наш адрес вебхука не ответит?

Ждём ответ 10 секунд. Не 2xx — повторяем: через минуту, 5 и 15 минут, час, 3, 6 и 12 часов — восемь попыток почти за сутки. Журнал доставок за 30 дней виден в настройках и по API. Если адрес три дня подряд не принимает события, подписка выключается.

В каком порядке приходят события?

Порядок не гарантирован, а повтор может прийти дважды. Отсекайте дубли по полю id события и смотрите на время created_at и на состояние тикета в теле.

Можно ли обращаться к API из браузера?

Нет: API — для запросов сервер-сервер, ключ нельзя показывать на странице. Для сайта есть виджет, для форм — «Приём по API» и HTML-форма.