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
Выпустите ключ
Администратор открывает «Настройки → API и приложения → Ключи API», называет ключ по системе, которая будет им пользоваться, и отмечает права.
- 2
Сохраните ключ
Ключ вида dsk_k_… показывается один раз. Положите его в настройки своей системы или коннектора — в Дескусе™ остаётся только начало строки.
- 3
Проверьте подключение
GET /api/v1/me вернёт компанию, сотрудника и права ключа. Ключ работает от имени сотрудника, который его выпустил, и не может больше, чем этот сотрудник.
OAuth 2.0 — для приложений партнёров
- 1
Зарегистрируйте приложение
«Настройки → API и приложения → Мои приложения»: название, описание, сайт и адреса возврата. Получите client_id и client_secret.
- 2
Отправьте на проверку
Пока приложение не проверено Дескусом™, его подключает только ваша компания — так удобно отлаживать. После проверки — любая компания Дескуса™.
- 3
Получите код
Отправьте клиента на app.deskus.ru/oauth/authorize с client_id, redirect_uri, scope, state и code_challenge (PKCE S256). Администратор компании нажмёт «Разрешить», код придёт на адрес возврата.
- 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 | Отправить тестовое событие ping | webhooks |
Вебхуки
Подпишитесь в «Настройки → 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" } }
}
}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-форма.