Основы
Идемпотентность
Сеть рвётся, и запрос приходится повторять. Чтобы повтор не создал второй контакт, вторую запись или второй звонок клиенту, передавайте в каждом запросе на создание заголовок Idempotency-Key - любую уникальную строку до 64 символов.
Заголовок
curl https://api.ru.dialogi.io/v1/contacts \
-H "Authorization: Bearer dk_live_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-20195208" \
-d '{"name": "Анна Смирнова", "phone": "+79101234567"}'
Заголовок обязателен в запросах на создание. Запросы на чтение (GET) и изменение (PATCH) его не учитывают - их повтор ничего не дублирует.
Вместо Idempotency-Key можно передать X-Idempotency-Key. Если есть оба, действует Idempotency-Key.
Что происходит при повторе
| Ситуация | Ответ | Что делать |
|---|---|---|
| Тот же ключ, то же тело | Прежний ответ, заголовок Idempotent-Replayed: true |
Ничего - это успех |
| Тот же ключ, другое тело | 409 idempotency-conflict |
Новый ключ для нового запроса |
| Первый запрос ещё выполняется | 409 idempotency-in-progress |
Повторить через пару секунд |
| Заголовка нет | 400 idempotency-key-required |
Добавить заголовок |
order-20195208-2.Ключ хранится 24 часа. Ответы с ошибкой не запоминаются - после исправления запроса можно повторить его с тем же ключом.
У заявок на звонок, записей и сообщений в диалог ключ, кроме того, закреплён за созданным объектом без срока - так повтор не закажет второй звонок, не займёт время второй раз и не отправит клиенту сообщение дважды. Повтор с тем же ключом и тем же телом вернёт этот объект, с другим телом - 409 idempotency-conflict.
У сообщений ключ закреплён за диалогом, в который ушло сообщение. Тот же ключ в запросе к другому диалогу в первые 24 часа - 409 idempotency-conflict, а позже отправит новое сообщение. Для каждого сообщения берите свой ключ.
Правила ключа
- Длина от 1 до 64 символов: латинские буквы, цифры и символы
_-:.. Другой ключ - ошибка400idempotency-key-invalid. - Ключи идемпотентности разных ключей API не пересекаются. Одна и та же строка у двух ключей API - два независимых ключа.
- «То же тело» значит буквально те же байты. Другой порядок полей или лишний пробел - уже другое тело и ответ
409. Сохраняйте тело запроса и при повторе отправляйте его без изменений. - Повтор возвращает тот же статус и то же тело, что и первый ответ. Исключение - повтор заявки, записи или сообщения позже, чем через 24 часа: статус тот же, а в теле объект в его текущем состоянии, например уже отменённая запись.
Request-Idу повтора свой, и повтор тоже расходует лимит запросов.