{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-@l10n/ru/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Вебхуки"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"вебхуки","__idx":0},"children":["Вебхуки"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["MoreLogin может отправлять JSON-событие методом POST на ваш HTTPS-эндпоинт сразу после того, как операция с облачным телефоном или облачным браузером достигла итогового результата, поэтому опрашивать результат больше не нужно. На команду хранится один URL обратного вызова, и Local API с Open API пишут в одну и ту же запись."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"настройка-url-обратного-вызова","__idx":1},"children":["Настройка URL обратного вызова"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Оба контура предоставляют одну и ту же операцию. Open API:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST \"https://api.morelogin.com/webhook/config\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -d '{\n    \"callbackUrl\": \"https://example.com/morelogin/webhook\",\n    \"enabled\": true\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Local API:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST \"http://127.0.0.1:40000/api/webhook/config\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"callbackUrl\": \"https://example.com/morelogin/webhook\",\n    \"enabled\": true\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Маршрут Local API обслуживает настольный клиент, поэтому нужен клиент MoreLogin v2.66.0 или новее. Эндпоинт Open API от клиента не зависит."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["teamId"]}," никогда не читается из запроса. Каждый вызов настраивает команду из серверного контекста, поэтому направить события другой команды на свой эндпоинт нельзя."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["URL должен быть HTTPS, длиной от 1 до 1024 символов, с именем хоста, без данных пользователя, без фрагмента и с корректным портом. Все адреса, в которые он разрешается, должны маршрутизироваться в интернете: диапазоны localhost, частные, link-local, CGNAT, метаданных облака, зарезервированные протоколом, документационные и 6to4 отклоняются с кодом ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/ru/api-reference/getting-started/error-codes"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["41001"]}]},". Та же проверка повторяется в момент, когда доставка открывает соединение, поэтому имя хоста, которое позже разрешится в частный диапазон, приведёт к неудаче этой доставки, а не к обращению в вашу сеть."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Сохранение — это upsert по команде, поэтому отправить одно и то же тело дважды безвредно."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"отключение-доставки","__idx":2},"children":["Отключение доставки"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["enabled: false"]}," сохраняет URL и прекращает создание новых событий. Уже поставленные в очередь события отменяются по одному, в тот момент, когда каждое из них должно быть авторизовано, и только пока конфигурация всё ещё отключена — поэтому при быстром повторном включении события из очереди продолжат доставляться, а не будут отброшены."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"как-выглядит-доставка","__idx":3},"children":["Как выглядит доставка"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Каждая доставка — это ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST"]}," со следующими заголовками:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Заголовок"},"children":["Заголовок"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Значение"},"children":["Значение"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Content-Type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["application/json"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["User-Agent"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["MoreLogin-Webhook/1.0"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["X-Webhook-Event-Id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["То же, что ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventId"]}," в теле"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["X-Webhook-Event-Type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["То же, что ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventType"]}," в теле"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Два заголовка ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["X-Webhook-*"]}," намеренно дублируют поля тела, чтобы маршрутизатор или очередь могли распределять запросы по ним без разбора JSON."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"eventId\": \"c7f3a2b10d8e4f6a9c1b2d3e4f5a6b7c\",\n  \"eventType\": \"cloud_phone.power_off\",\n  \"eventTime\": \"1787241600000\",\n  \"data\": {\n    \"teamId\": \"10001\",\n    \"cloudPhoneId\": \"20001\",\n    \"reason\": \"MONEY_SAVING\"\n  },\n  \"result\": {\n    \"success\": true,\n    \"code\": \"0\",\n    \"message\": null\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Поле"},"children":["Поле"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Описание"},"children":["Описание"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Уникальный ID события. Повторы и внутренние воспроизведения того же события используют его повторно, поэтому это ключ идемпотентности"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventType"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Стабильное имя события из таблицы ниже"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventTime"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Когда наступил итоговый результат, в миллисекундах эпохи Unix. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Передаётся строкой"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data.teamId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Команда, которой принадлежит ресурс. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Передаётся строкой"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data.cloudPhoneId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Облачный телефон, к которому относится событие. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Передаётся строкой"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data.cloudBrowserId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Профиль облачного браузера, к которому относится событие. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Передаётся строкой"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data.runId"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Экземпляр запуска облачного браузера, к которому относится событие"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data.reason"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Только в ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_phone.power_off"]}," и ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_browser.stop"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.success"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Завершилась ли операция успешно"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.code"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0"]}," при успехе; иначе стабильный бизнес-код ошибки, не зависящий от языка"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.message"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," при успехе; иначе пояснение на языке команды с переходом на ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["en-US"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Все числовые идентификаторы и ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventTime"]}," приходят строками JSON, как и в остальной части API — см. ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/ru/api-reference/getting-started/response-format"},"children":["Общий формат ответа"]},". Разбирайте их как строки, а не как числа, иначе потеряете точность на 64-битных ID."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"события","__idx":4},"children":["События"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"eventType"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventType"]}]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Итоговый результат, о котором сообщается"},"children":["Итоговый результат, о котором сообщается"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_phone.power_on"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Включение удалось или не удалось"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_phone.power_off"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Выключение удалось. Неудачное выключение события не создаёт"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_phone.restart"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Перезапуск удался или не удался"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_phone.reset"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Сброс удался или не удался"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_phone.new_machine"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Новое устройство одним щелчком удалось или не удалось"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_browser.start"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Запуск облачного браузера удался или не удался"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_browser.stop"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Каждая попытка остановки облачного браузера, удачная или нет"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["События облачного телефона содержат ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["teamId"]}," и ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloudPhoneId"]},". События облачного браузера содержат ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["teamId"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloudBrowserId"]}," и ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["runId"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Включение, перезапуск, сброс и создание нового устройства одним щелчком сообщают ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["success: true"]}," только после того, как обратный вызов поставщика прошёл успешно и локальная синхронизация была зафиксирована. Ошибка списания средств или асинхронная проверка прокси, которая завершилась неудачей и довела до конца свою очистку, сообщают о неудачном включении и ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["не"]}," создают дополнительно событие выключения. Отложенные задачи, например установка предустановленных приложений или удаление устаревших файлов, результат не меняют."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Если выключение прервало загрузку, эта попытка не создаёт события включения; успешное выключение позже всё равно создаст собственное ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_phone.power_off"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"причины-остановки","__idx":5},"children":["Причины остановки"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_phone.power_off"]}," добавляет ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data.reason"]},":"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Значение"},"children":["Значение"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Смысл"},"children":["Смысл"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["NORMAL"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Обычное выключение"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["MONEY_SAVING"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Режим экономии средств"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTHER"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Задолженность, истечение срока, обслуживание или другая причина"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cloud_browser.stop"]}," добавляет ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data.reason"]},":"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Значение"},"children":["Значение"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Смысл"},"children":["Смысл"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["NORMAL"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Обычное закрытие"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["MONEY_SAVING"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Режим экономии средств"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ENERGY_SAVING"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Режим энергосбережения"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BROWSER_EXITED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Браузер завершился неожидано"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTHER"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Любая другая причина"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Внутренняя ошибка архивирования меняет только ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result"]}," и никогда не перезаписывает ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reason"]},", зафиксированный в начале остановки."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"доставка-повторы-и-порядок","__idx":6},"children":["Доставка, повторы и порядок"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Любой ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2xx"]}," считается доставкой. Любой другой статус, а также тайм-ауты соединения и чтения и сетевые ошибки считаются неудачей. Тайм-аут соединения — 5 секунд, тайм-аут чтения — 30 секунд."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Неудачная доставка повторяется не более 6 раз: через 10 секунд, 30 секунд, 60 секунд, 3 минуты, 10 минут и 30 минут. Это не более 7 запросов на одно событие. После неудачи шестого повтора событие перестаёт повторяться автоматически."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["События одного облачного телефона или одного облачного браузера доставляются в порядке создания, по одному. Разные ресурсы доставляются параллельно, поэтому не полагайтесь на какой-либо порядок между ними."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Повторы одного события всегда используют те же ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventId"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventTime"]}," и тело. В пограничных сетевых или восстановительных ситуациях одно и то же событие может быть доставлено несколько раз с неизменными значениями, поэтому ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["дедуплицируйте по ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventId"]}]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Для остановок облачного браузера одна попытка остановки даёт ровно одно событие. Последующий повтор вручную, принудительное освобождение вручную или принудительное освобождение, инициированное системой, — это новая операция, которая получает новый ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventId"]},". Две попытки никогда не объединяются в одно событие."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Операции облачного телефона определяются по ID задачи поставщика, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["traceId"]}," или стабильной бизнес-метке времени. Когда ни одного из них нет, сервис генерирует UUID и считает текущий итоговый обратный вызов новой операцией, поэтому вы получаете новый ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventId"]},", а две разные операции не сливаются в одну."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"реализация-получателя","__idx":7},"children":["Реализация получателя"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Возвращайте ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2xx"]}," сразу после того, как сохранили событие, а реальную работу выполняйте асинхронно. Тело ответа игнорируется, а медленный обработчик израсходует ваши 30 секунд на чтение и отправит событие в расписание повторов, хотя вы его уже получили."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Дедуплицируйте по ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["eventId"]},". Считайте повтор уже обработанным, а не воспроизводите побочные эффекты заново."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Не считайте полезную нагрузку доверенным вводом только потому, что она пришла на ваш эндпоинт. В этом выпуске обратные вызовы не подписываются, поэтому отправить запрос может любой, кто узнал ваш URL. Используйте URL, который трудно угадать, и прежде чем выполнять что-то дорогое, подтвердите состояние через API — например ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/ru/api-reference/cloud-phone/open-api"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /cloudphone/info"]}]}," для облачного телефона или ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /cloudbrowser/page"]}," для запуска облачного браузера."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.code"]}," использует те же бизнес-коды, что и синхронный API, поэтому неудачу можно найти в ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/ru/api-reference/getting-started/error-codes"},"children":["Коды ошибок"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.message"]}," — читаемая человеком строка, формулировка и язык которой могут меняться; ветвитесь по ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.success"]}," и ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.code"]},", но никогда по ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.message"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Машиночитаемый контракт каждого события, включая схемы и примеры по событиям, публикуется вместе со спецификацией общих ресурсов: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/ru/api-reference/shared-resources/open-api"},"children":["Shared Resources Open API"]},"."]}]},"headings":[{"value":"Вебхуки","id":"вебхуки","depth":1},{"value":"Настройка URL обратного вызова","id":"настройка-url-обратного-вызова","depth":2},{"value":"Отключение доставки","id":"отключение-доставки","depth":3},{"value":"Как выглядит доставка","id":"как-выглядит-доставка","depth":2},{"value":"События","id":"события","depth":2},{"value":"Причины остановки","id":"причины-остановки","depth":3},{"value":"Доставка, повторы и порядок","id":"доставка-повторы-и-порядок","depth":2},{"value":"Реализация получателя","id":"реализация-получателя","depth":2}],"frontmatter":{"seo":{"title":"Вебхуки"}},"lastModified":"2026-09-03T02:52:33.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/ru/api-reference/getting-started/webhooks","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}