Основы
Ошибки
API отвечает кодами HTTP: 2xx - запрос выполнен, 4xx - ошибка в запросе, 5xx - сбой на нашей стороне. Тело ошибки - JSON в формате RFC 7807.
Формат ошибки
{
"type": "https://dialogi.io/errors/unauthenticated",
"title": "Unauthenticated",
"status": 401,
"detail": "Invalid, expired or revoked API key.",
"request_id": "req_4WHRB5tCR3dmQk9nOr3ibwfx"
}
| Поле | Что в нём |
|---|---|
type |
Адрес описания ошибки. Последняя часть адреса - код ошибки, например unauthenticated. По коду удобно разбирать ошибку в программе |
title |
Короткое название на английском |
status |
Код HTTP, тот же, что у ответа |
detail |
Пояснение для человека на английском. Текст может меняться - не разбирайте его в программе |
request_id |
id запроса. Если поля нет, возьмите id из заголовка Request-Id |
errors |
Только у ошибки 422: какие поля не прошли проверку и почему |
Пример ошибки 422 с полем errors:
{
"type": "https://dialogi.io/errors/validation",
"title": "Validation Error",
"status": 422,
"detail": "The name field is required.",
"errors": {
"name": ["The name field is required."]
}
}
Если код ошибки в type вам незнаком, решайте по status. При сбое на нашей стороне (5xx) тело может прийти в другом формате - тогда ориентируйтесь только на статус.
Request-Id
В ответе на любой запрос к ресурсу API есть заголовок Request-Id:
Request-Id: req_4WHRB5tCR3dmQk9nOr3ibwfx
Записывайте его в свои логи. Если пишете в поддержку о конкретном запросе, приложите Request-Id.
Можно передать свой идентификатор в заголовке X-Request-ID - тогда Request-Id будет req_ и ваше значение. Так запрос проще связать с логами вашей системы.
Коды ошибок
| Код | Статус | Когда |
|---|---|---|
| bad-request | 400 |
Запрос нельзя выполнить в таком виде |
| idempotency-key-required | 400 |
Нет заголовка Idempotency-Key в запросе на создание |
| idempotency-key-invalid | 400 |
Idempotency-Key в неверном формате |
| unauthenticated | 401 |
Нет ключа, ключ неверный, истёк или отозван |
| api-addon-required | 402 |
Не подключено дополнение «Публичный API» |
| forbidden | 403 |
У ключа нет права или доступа к проекту |
| not-found | 404 |
Объект или адрес не найден |
| conflict | 409 |
Действие противоречит текущему состоянию данных |
| idempotency-conflict | 409 |
Idempotency-Key уже использован с другим запросом |
| idempotency-in-progress | 409 |
Запрос с этим Idempotency-Key ещё выполняется |
| validation | 422 |
Данные запроса не прошли проверку |
| rate-limited | 429 |
Превышен лимит запросов |
| unavailable | 503 |
Сервис временно недоступен |
| internal | 500 |
Внутренняя ошибка на нашей стороне |
| http | другой | Прочие ответы HTTP, например 405 |
Коды заявок на звонок, записей и диалогов - в разделах Заявки на звонок, Записи и Диалоги ниже.
bad-request
400. Запрос составлен так, что его нельзя выполнить. Что именно не так - в detail. Исправьте запрос и отправьте снова.
idempotency-key-required
400. В запросе на создание нет заголовка Idempotency-Key. Добавьте его - см. Идемпотентность.
idempotency-key-invalid
400. Ключ идемпотентности длиннее 64 символов, пустой или содержит недопустимые символы. Разрешены латинские буквы, цифры и символы _ - : ..
unauthenticated
401. Нет заголовка Authorization: Bearer dk_live_…, ключ скопирован с ошибкой, истёк после перевыпуска или отозван. Проверьте ключ в личном кабинете: «Настройки» → «Разработчикам». Повторять запрос с тем же ключом бесполезно.
api-addon-required
402. У компании не подключено дополнение «Публичный API». Подключите его в личном кабинете: «Оплата» → «Тариф» → «Дополнительно». После подключения ключ начинает работать в течение минуты.
forbidden
403. Ключ рабочий, но этот запрос ему не разрешён:
- у ключа нет нужного права - в
detailуказано, какого именно; project_idв запросе - проект, которого нет в ключе;- у ключа не осталось ни одного проекта, например все его проекты удалены;
- ключ отправлен на адрес, который не входит в публичный API.
Права и проекты ключа не меняются - создайте ключ с нужным доступом. См. Ключи и права.
not-found
404. Объекта с таким id нет, он удалён или находится в проекте, которого нет в ключе. Та же ошибка приходит на адрес, которого нет в API, например с опечаткой в названии ресурса.
conflict
409. Действие противоречит текущему состоянию данных. Подробность - в detail. Перечитайте объект и решите, нужно ли действие.
idempotency-conflict
409. Этот Idempotency-Key уже использован с другим запросом: другое тело, метод или адрес. Для нового запроса нужен новый ключ.
idempotency-in-progress
409. Первый запрос с этим Idempotency-Key ещё выполняется. Повторите через пару секунд с тем же ключом - получите его результат.
validation
422. Данные запроса не прошли проверку: нет обязательного поля, неверный формат, значение вне списка допустимых. Список полей с ошибками - в errors. Поле errors бывает не всегда - иногда пояснение только в detail, например когда у ключа несколько проектов, а project_id не передан.
Ошибка не запоминается ключом идемпотентности: исправьте тело и повторите запрос с тем же Idempotency-Key.
rate-limited
429. Превышен лимит запросов. Через сколько секунд можно повторить, указано в заголовке Retry-After. См. Лимиты запросов.
unavailable
503. Сервис временно не может обработать запрос. Повторите позже с нарастающей паузой. Запрос на создание повторяйте с тем же Idempotency-Key.
internal
500. Ошибка на нашей стороне. Повторите запрос позже - запрос на создание с тем же Idempotency-Key. Если ошибка повторяется, напишите в поддержку и приложите request_id.
http
Прочие ответы HTTP, у которых нет своего кода, например 405, если метод не поддерживается для этого адреса. Смотрите status и detail.
Заявки на звонок
| Код | Статус | Когда |
|---|---|---|
| perezvoni-not-configured | 409 |
В проекте не настроен Перезвони |
perezvoni-not-configured
409. В проекте не настроен Перезвони, поэтому заявку некому передать и звонок не состоится. Включите и настройте Перезвони в этом проекте в личном кабинете, затем повторите запрос.
Записи
В ошибках записей, кроме type, есть поле code - тот же код, записанный через подчёркивание: slot_unavailable.
| Код | Статус | Когда |
|---|---|---|
| slot-unavailable | 409 |
Время уже занято или у ресурса не хватает мест на всех гостей |
| outside-working-hours | 409 |
Время вне графика работы |
| no-resources | 409 |
В филиале нет исполнителя для этой услуги |
| appointment-not-reschedulable | 409 |
Запись в этом статусе нельзя перенести |
| appointment-not-cancellable | 409 |
Запись в этом статусе нельзя отменить |
| service-inactive | 409 |
Услугу записи выключили |
| invalid-duration | 422 |
Длительность вне границ или шага услуги |
| too-many-guests | 422 |
Аренда: гостей больше, чем max_guests услуги |
| starts-at-in-past | 422 |
Время начала в прошлом |
| service-not-found | 422 |
Услуга не найдена |
| branch-not-found | 422 |
Филиал не найден |
| branch-id-required | 422 |
Нужно указать филиал |
| resource-not-eligible | 422 |
Исполнитель не подходит для этой услуги |
| contact-not-found | 422 |
Клиент не найден |
slot-unavailable
409. Это время уже занято. У услуг fixed та же ошибка приходит, если у ресурса не хватает свободных мест на всех гостей: число гостей ограничивает capacity ресурса. Запросите свободные слоты с тем же числом гостей (guests) и выберите другое время.
outside-working-hours
409. Время не попадает в график работы филиала или исполнителя. Свободные слоты уже учитывают график.
no-resources
409. В выбранном филиале нет ни одного исполнителя, который оказывает эту услугу.
appointment-not-reschedulable
409. Запись нельзя перенести в её текущем статусе, например она уже отменена или завершена.
appointment-not-cancellable
409. Запись нельзя отменить в её текущем статусе, например она уже завершена.
service-inactive
409. Услугу этой записи выключили или удалили, поэтому запись нельзя перенести. Сама запись на месте: её можно прочитать и отменить. Чтобы перенести визит, включите услугу в личном кабинете или создайте запись на другую услугу.
invalid-duration
422. Для услуги с арендой времени duration_min меньше минимума, больше максимума или не попадает в шаг. Границы и шаг - в detail.
too-many-guests
422. Услуга с арендой (interval): гостей больше, чем max_guests услуги. У услуг fixed эта ошибка не приходит - лишние гости дают slot-unavailable.
starts-at-in-past
422. Время начала записи уже прошло.
service-not-found
422. Нет активной услуги с таким service_id, доступной ключу: услуги нет, она выключена или находится в проекте, которого нет в ключе.
branch-not-found
422. Среди активных филиалов проекта услуги нет филиала с таким branch_id, или у проекта вообще нет активных филиалов.
branch-id-required
422. У проекта несколько филиалов - укажите branch_id. Список филиалов отдаёт GET /v1/branches.
resource-not-eligible
422. Этот исполнитель не оказывает выбранную услугу или не работает в выбранном филиале.
contact-not-found
422. Клиента с таким contact_id нет в проекте услуги.
Диалоги
| Код | Статус | Когда |
|---|---|---|
| conversation-closed | 409 |
Диалог закрыт |
| conversation-archived | 409 |
Диалог в чате на сайте завершён |
| channel-not-supported | 409 |
В этот канал API не отправляет сообщения |
| channel-disconnected | 409 |
Канал диалога отключён |
Длина текста сообщения зависит от канала: Telegram и ВКонтакте - до 4096 символов, MAX - до 4000, чат на сайте и почта - до 8000. Текст длиннее - ошибка 422 validation.
Если сообщение не удалось доставить клиенту, это не ошибка запроса. API отвечает 201, сообщение сохраняется со "status": "failed", а причина - в поле failure.code:
| failure.code | Что случилось |
|---|---|
channel_not_configured |
Канал настроен не до конца: нет токена бота, ключ доступа устарел или у него нет нужных прав. Проверьте канал в личном кабинете |
recipient_unavailable |
Площадка не доставляет сообщения этому человеку: он заблокировал бота, запретил сообщения от сообщества или адрес получателя неизвестен |
provider_error |
Прочий сбой сети или площадки |
Повтор запроса с тем же Idempotency-Key вернёт то же сообщение со статусом failed. Чтобы отправить сообщение ещё раз, передайте новый ключ.
conversation-closed
409. Диалог закрыт или помечен как спам. API не открывает закрытые диалоги заново: ответьте из личного кабинета или дождитесь сообщения клиента - оно вернёт диалог в работу или начнёт новый.
conversation-archived
409. Диалог в чате на сайте завершён: посетитель сам начал новый диалог или диалог закрыли, а посетитель долго не возвращался. Сообщение до посетителя уже не дойдёт. Когда посетитель напишет снова, начнётся новый диалог - отвечайте в нём.
channel-not-supported
409. В канал этого диалога API не отправляет сообщения. Это диалоги продукта «Имидж» - комментарии в соцсетях: отвечать на них через API нельзя, читать и закрывать можно. Отправка работает в каналах web, telegram, vk, max и email.
channel-disconnected
409. Канал этого диалога отключили в личном кабинете, и отправить сообщение некуда. В этот диалог ответить уже нельзя - дождитесь, когда клиент напишет в подключённый канал.