Как настроить вебхуки школы: доступные события, формат запроса, проверка подписи, повторные попытки и автоматическое отключение эндпоинта.
Вебхуки автоматически уведомляют ваши внешние сервисы о событиях в школе: регистрации, оплате (только в коммерческой школе), записи на курс, завершении курса. Когда событие происходит, платформа отправляет POST-запрос с данными события на адрес, который вы указали. Так школу связывают с CRM, ботами, таблицами и собственными сервисами без постоянного опроса API.
Вебхуки находятся в разделе Панель управления → Моя школа → Для разработчиков → Вебхуки (в корпоративной школе — Панель управления → Компания → Для разработчиков → Вебхуки). Работать с ними может сотрудник с правом Управление настройками школы (в корпоративной школе — Управление настройками компании).
В школе может быть не больше 5 вебхуков. Удалённые вебхуки в лимит не входят.
Каждый вебхук — это один адрес и набор событий, на которые он подписан.
Вебхуки настраиваются только в кабинете. Через API школы ими управлять нельзя.
Откройте раздел Вебхуки (в корпоративной школе — Вебхуки компании) и нажмите Создать вебхук.
2
Укажите адрес
В поле Ссылка введите адрес вашего сервиса, например https://my-service.com/api/exode. Длина адреса — до 255 символов. Используйте HTTPS.
3
Добавьте заметку
В поле Служебная заметка напишите, для чего этот вебхук, например «Интеграция с AmoCRM». Заметка видна только в списке вебхуков, длина — до 255 символов.
4
Выберите события
Отметьте события в списке Выбранные события. Счётчик справа показывает, сколько событий выбрано.
5
Проверьте доставку
Нажмите на стрелку рядом с событием, чтобы отправить тестовое событие на указанный адрес. Убедитесь, что ваш сервис принял запрос.
6
Сохраните вебхук
Нажмите Создать. При создании платформа генерирует секретный ключ для проверки подписи.
В списке вебхуков у каждой строки есть переключатель Активен / Не активен и меню действий: Редактировать, Копировать подпись и Удалить вебхук.
Для подписки доступны 13 событий (в корпоративной школе — 11):
Событие в кабинете
Идентификатор
Когда срабатывает
Пользователь зарегистрировался
UserSignedUp
Новый пользователь сам зарегистрировался в школе
Пользователь заполнил данные
UserAcquainted
Пользователь заполнил и отправил форму знакомства
Пользователь подключил Telegram
UserTgConnected
Пользователь привязал или сменил Telegram
Пользователь создан через LMS
UserCreatedViaLms
Сотрудник школы создал пользователя вручную
Запись на бесплатный курс
ProductEnrolledToFree
Пользователь записался на бесплатный курс
Запись на курс через LMS
ProductEnrolledViaLms
Сотрудник школы выдал доступ вручную
Запись пользователя на курс через оплату
ProductEnrolledViaPayment
Доступ выдан после успешной оплаты (только в коммерческой школе)
Запись по ссылке-приглашению
ProductEnrolledByInviteLink
Пользователь записался по ссылке-приглашению
Платеж завершён
PaymentCompleted
Платёж успешно оплачен (только в коммерческой школе)
Прогресс курса изменён
CourseProgressChanged
У ученика изменился статус прогресса по уроку
Практика успешно пройдена (проверена)
CourseLessonPracticeCompleted
Практика перешла в статус «Пройдена»
Курс завершен
CourseCompleted
Ученик завершил все доступные модули и уроки курса
Сертификат выдан
CertificateIssued
Ученику выдан сертификат
В школах для корпоративного обучения событий Платеж завершён и Запись пользователя на курс через оплату нет.
Подписаться можно только на события из таблицы. Событий о входе и выходе из системы, регистрации по реферальной ссылке, отправке практики на проверку, автопроверке практики, возврате средств и окончании подписки нет.
В каждом запросе есть заголовок signature. Это HMAC-SHA256 от сырого тела запроса, посчитанный на секретном ключе вебхука и записанный в шестнадцатеричном виде.
1
Скопируйте секретный ключ
В меню вебхука выберите Копировать подпись — в буфер попадёт секретный ключ из 64 символов. Та же ссылка есть в форме редактирования над полем Ссылка. Сохраните ключ в настройках своего сервиса.
2
Посчитайте подпись на своей стороне
Посчитайте HMAC-SHA256 от тела запроса в том виде, в каком оно пришло. Не разбирайте JSON и не собирайте его заново: другой порядок полей или пробелы дадут другую подпись.
Около 11, 33, 77 и 165 минут. Последняя попытка — примерно через 4 часа 46 минут после первой
Порядок доставки
Не гарантируется
Любой другой ответ, превышение 15 секунд или сетевая ошибка считаются неудачей. После 5 неудачных попыток событие больше не отправляется. Если вебхук выключили, пока шли повторы, оставшиеся попытки отменяются.
Отвечайте кодом 200 сразу после проверки подписи, а тяжёлую обработку выполняйте в фоне. Используйте idempotencyKey, чтобы не обработать одно событие дважды: при повторной попытке ключ тот же.
Если вебхук не принял ни одного события 14 дней подряд, платформа выключает его. Владелец школы получает уведомление и письмо Webhook отключён с адресом вебхука.Выключенный вебхук не получает новые события. Чтобы снова получать события, исправьте адрес или сервис и включите вебхук переключателем в списке. После ручного включения отсчёт 14 дней начинается заново.
Тестовое событие отправляется кнопкой-стрелкой рядом с событием в форме вебхука. Кнопка есть только у событий, доступных для выбора.
Тест отправляется на адрес из поля Ссылка, даже если вебхук ещё не сохранён.
В теле — пример данных события в том же формате, что и у настоящих событий.
Тест отправляется один раз, без повторных попыток.
Тест из формы сохранённого вебхука подписывается его секретным ключом. Тест из формы нового вебхука подписывается временным ключом, поэтому проверить его подпись не получится.
Почему мой сервис отвечает 204, а события приходят повторно?
Успешными считаются только ответы 200, 201 и 202. Ответ 204 платформа считает неудачей и повторяет отправку. Отвечайте кодом 200.
Почему подпись не совпадает?
Чаще всего подпись считают от заново собранного JSON, а не от сырого тела запроса. Считайте HMAC-SHA256 от тела в том виде, в каком оно пришло. Также проверьте, что используете ключ из Копировать подпись именно этого вебхука и что тест отправлен из формы сохранённого вебхука.
Сколько раз платформа повторяет отправку?
Всего до 5 попыток: первая и 4 повтора с паузами около 11, 33, 77 и 165 минут. После этого событие считается недоставленным.
Почему вебхук выключился сам?
Вебхук выключается, если 14 дней подряд не принял ни одного события. Владелец школы получает об этом уведомление и письмо. Исправьте адрес или работу сервиса и включите вебхук переключателем.
Можно ли создать больше 5 вебхуков?
Нет, в школе может быть не больше 5 вебхуков. Удалите неиспользуемые или подпишите один вебхук на несколько событий. Если лимита не хватает, напишите в поддержку.
Приходят ли события в том порядке, в котором произошли?
Нет, порядок не гарантируется: события отправляются параллельно, а неудачные попытки повторяются позже. Ориентируйтесь на поле timestamp.
Почему в списке нет событий о входе в систему или возврате средств?
Такие события не отправляются, поэтому подписаться на них нельзя. Для подписки доступны 13 событий из таблицы выше (в корпоративной школе — 11).
Придёт ли вебхук, если я подпишу два адреса на одно событие?
Да. Событие уйдёт на каждый активный вебхук, который на него подписан, с одинаковым idempotencyKey.
Где посмотреть, что именно приходит в данных события?
Отправьте тестовое событие на свой адрес и посмотрите тело запроса. Полное описание данных каждого события — в документации API.
Обновлено: 2026-10-17 07:07 UTC
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Exode — Product documentation","colors":{"primary":"#0e32cf","light":"#3a9cfc","dark":"#0e32cf"},"logo":{"light":"https://mintcdn.com/exode-faq/RM155sfnW-prDXlV/logo/dark.svg?fit=max\u0026auto=format\u0026n=RM155sfnW-prDXlV\u0026q=85\u0026s=226b8c34c13ebf24544dd5b62ed2a413","dark":"https://mintcdn.com/exode-faq/nK1GoAso5impPdQT/logo/light.svg?fit=max\u0026auto=format\u0026n=nK1GoAso5impPdQT\u0026q=85\u0026s=e9f1d77186583292eb8e9ff7839322c2"},"favicon":"https://mintcdn.com/exode-faq/Qt_iwajwYtzMNgtj/favicon.ico?fit=max\u0026auto=format\u0026n=Qt_iwajwYtzMNgtj\u0026q=85\u0026s=ab877d4deb8ab432bb3f59ae7580f411","navbar":{"links":[{"icon":"phone","href":"tel:781139570","label":"78-113-95-70"},{"href":"https://docs.exode.biz/en/welcome","label":"API"}],"primary":{"type":"button","label":"Support","href":"https://t.me/exode_biz_support"}},"footer":{"socials":{"telegram":"https://t.me/exode_biz","instagram":"https://www.instagram.com/exode_uz"}},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","navbar":{"links":[{"icon":"phone","href":"tel:781139570","label":"78-113-95-70"},{"href":"https://docs.exode.biz/en/welcome","label":"API"}],"primary":{"type":"button","label":"Support","href":"https://t.me/exode_biz_support"}},"href":"en/welcome"},{"language":"ru","navbar":{"links":[{"icon":"phone","href":"tel:781139570","label":"78-113-95-70"},{"href":"https://docs.exode.biz/ru/welcome","label":"API"}],"primary":{"type":"button","label":"Поддержка","href":"https://t.me/exode_biz_support"}},"href":"ru/welcome"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"exode-faq","hasAudioNarration":false,"actualSubdomain":"exode-faq","customDomains":["faq.exode.biz"],"gitSource":{"type":"github","owner":"aslanorlov","repo":"exode-faq","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"f8ffc1b8-5299-4bc5-b826-b92fb598100f","liveDeploymentHistoryId":"6ad325650d7b01a838871775","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad325650d7b01a838871775"},"entitlements":{},"buildId":"6ad325650d7b01a838871775","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"en","tag":"General","count":54},{"language":"ru","tag":"Общее","count":54},{"language":"en","tag":"Corporate training and HR","count":14},{"language":"ru","tag":"Корпобучение и HR","count":14},{"language":"en","tag":"Online schools","count":12},{"language":"ru","tag":"Онлайн-школы","count":12},{"language":"en","tag":"Getting started","count":7},{"language":"en","tag":"Courses","count":7},{"language":"en","tag":"School setup","count":7},{"language":"ru","tag":"Начало работы","count":7},{"language":"ru","tag":"Курсы","count":7},{"language":"ru","tag":"Настройка школы","count":7},{"language":"en","tag":"Sales and payments","count":6},{"language":"ru","tag":"Продажи и платежи","count":6},{"language":"en","tag":"Communication and content","count":5},{"language":"en","tag":"Lessons and modules","count":5},{"language":"en","tag":"School customization","count":5},{"language":"ru","tag":"Общение и контент","count":5},{"language":"ru","tag":"Уроки и модули","count":5},{"language":"ru","tag":"Кастомизация школы","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"ru/general/developers/webhooks","slug":"/ru/general/developers/webhooks","pageMetadata":{"title":"Вебхуки","description":"Как настроить вебхуки школы: доступные события, формат запроса, проверка подписи, повторные попытки и автоматическое отключение эндпоинта.","href":"/ru/general/developers/webhooks"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Как настроить вебхуки школы: доступные события, формат запроса, проверка подписи, повторные попытки и автоматическое отключение эндпоинта.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,hr:`hr`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,CodeBlock,Heading,Note,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Вебхуки автоматически уведомляют ваши внешние сервисы о событиях в школе: регистрации, оплате (только в коммерческой школе), записи на курс, завершении курса. Когда событие происходит, платформа отправляет POST-запрос с данными события на адрес, который вы указали. Так школу связывают с CRM, ботами, таблицами и собственными сервисами без постоянного опроса API.`}),`\n`,_jsx(Heading,{level:`2`,id:`где-настроить`,children:`Где настроить`}),`\n`,_jsxs(_components.p,{children:[`Вебхуки находятся в разделе `,_jsx(_components.strong,{children:`Панель управления → Моя школа → Для разработчиков → Вебхуки`}),` (в корпоративной школе — `,_jsx(_components.strong,{children:`Панель управления → Компания → Для разработчиков → Вебхуки`}),`). Работать с ними может сотрудник с правом `,_jsx(_components.strong,{children:`Управление настройками школы`}),` (в корпоративной школе — `,_jsx(_components.strong,{children:`Управление настройками компании`}),`).`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`В школе может быть не больше 5 вебхуков. Удалённые вебхуки в лимит не входят.`}),`\n`,_jsx(_components.li,{children:`Каждый вебхук — это один адрес и набор событий, на которые он подписан.`}),`\n`,_jsx(_components.li,{children:`Вебхуки настраиваются только в кабинете. Через API школы ими управлять нельзя.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`как-создать-вебхук`,children:`Как создать вебхук`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Нажмите «Создать вебхук»`,children:_jsxs(_components.p,{children:[`Откройте раздел `,_jsx(_components.strong,{children:`Вебхуки`}),` (в корпоративной школе — `,_jsx(_components.strong,{children:`Вебхуки компании`}),`) и нажмите `,_jsx(_components.strong,{children:`Создать вебхук`}),`.`]})}),_jsx(Step,{title:`Укажите адрес`,children:_jsxs(_components.p,{children:[`В поле `,_jsx(_components.strong,{children:`Ссылка`}),` введите адрес вашего сервиса, например `,_jsx(_components.a,{href:`https://my-service.com/api/exode`,children:`https://my-service.com/api/exode`}),`. Длина адреса — до 255 символов. Используйте HTTPS.`]})}),_jsx(Step,{title:`Добавьте заметку`,children:_jsxs(_components.p,{children:[`В поле `,_jsx(_components.strong,{children:`Служебная заметка`}),` напишите, для чего этот вебхук, например «Интеграция с AmoCRM». Заметка видна только в списке вебхуков, длина — до 255 символов.`]})}),_jsx(Step,{title:`Выберите события`,children:_jsxs(_components.p,{children:[`Отметьте события в списке `,_jsx(_components.strong,{children:`Выбранные события`}),`. Счётчик справа показывает, сколько событий выбрано.`]})}),_jsx(Step,{title:`Проверьте доставку`,children:_jsx(_components.p,{children:`Нажмите на стрелку рядом с событием, чтобы отправить тестовое событие на указанный адрес. Убедитесь, что ваш сервис принял запрос.`})}),_jsx(Step,{title:`Сохраните вебхук`,children:_jsxs(_components.p,{children:[`Нажмите `,_jsx(_components.strong,{children:`Создать`}),`. При создании платформа генерирует секретный ключ для проверки подписи.`]})})]}),`\n`,_jsxs(_components.p,{children:[`В списке вебхуков у каждой строки есть переключатель `,_jsx(_components.strong,{children:`Активен`}),` / `,_jsx(_components.strong,{children:`Не активен`}),` и меню действий: `,_jsx(_components.strong,{children:`Редактировать`}),`, `,_jsx(_components.strong,{children:`Копировать подпись`}),` и `,_jsx(_components.strong,{children:`Удалить вебхук`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`события`,children:`События`}),`\n`,_jsx(_components.p,{children:`Для подписки доступны 13 событий (в корпоративной школе — 11):`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Событие в кабинете`}),_jsx(_components.th,{children:`Идентификатор`}),_jsx(_components.th,{children:`Когда срабатывает`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Пользователь зарегистрировался`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UserSignedUp`})}),_jsx(_components.td,{children:`Новый пользователь сам зарегистрировался в школе`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Пользователь заполнил данные`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UserAcquainted`})}),_jsx(_components.td,{children:`Пользователь заполнил и отправил форму знакомства`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Пользователь подключил Telegram`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UserTgConnected`})}),_jsx(_components.td,{children:`Пользователь привязал или сменил Telegram`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Пользователь создан через LMS`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UserCreatedViaLms`})}),_jsx(_components.td,{children:`Сотрудник школы создал пользователя вручную`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Запись на бесплатный курс`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ProductEnrolledToFree`})}),_jsx(_components.td,{children:`Пользователь записался на бесплатный курс`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Запись на курс через LMS`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ProductEnrolledViaLms`})}),_jsx(_components.td,{children:`Сотрудник школы выдал доступ вручную`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Запись пользователя на курс через оплату`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ProductEnrolledViaPayment`})}),_jsx(_components.td,{children:`Доступ выдан после успешной оплаты (только в коммерческой школе)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Запись по ссылке-приглашению`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ProductEnrolledByInviteLink`})}),_jsx(_components.td,{children:`Пользователь записался по ссылке-приглашению`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Платеж завершён`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`PaymentCompleted`})}),_jsx(_components.td,{children:`Платёж успешно оплачен (только в коммерческой школе)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Прогресс курса изменён`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`CourseProgressChanged`})}),_jsx(_components.td,{children:`У ученика изменился статус прогресса по уроку`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Практика успешно пройдена (проверена)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`CourseLessonPracticeCompleted`})}),_jsx(_components.td,{children:`Практика перешла в статус «Пройдена»`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Курс завершен`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`CourseCompleted`})}),_jsx(_components.td,{children:`Ученик завершил все доступные модули и уроки курса`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Сертификат выдан`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`CertificateIssued`})}),_jsx(_components.td,{children:`Ученику выдан сертификат`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`В школах для корпоративного обучения событий `,_jsx(_components.strong,{children:`Платеж завершён`}),` и `,_jsx(_components.strong,{children:`Запись пользователя на курс через оплату`}),` нет.`]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Подписаться можно только на события из таблицы. Событий о входе и выходе из системы, регистрации по реферальной ссылке, отправке практики на проверку, автопроверке практики, возврате средств и окончании подписки нет.`})}),`\n`,_jsx(Heading,{level:`2`,id:`формат-запроса`,children:`Формат запроса`}),`\n`,_jsx(_components.p,{children:`Платформа отправляет POST-запрос с телом в формате JSON. У тела одинаковая структура для всех событий:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Поле`}),_jsx(_components.th,{children:`Что содержит`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`event`})}),_jsx(_components.td,{children:`Идентификатор события из таблицы выше`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`timestamp`})}),_jsx(_components.td,{children:`Момент события в формате ISO 8601, время UTC`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`idempotencyKey`})}),_jsx(_components.td,{children:`Уникальный ключ события. Он одинаковый для всех ваших вебхуков и не меняется при повторных попытках`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`data`})}),_jsx(_components.td,{children:`Данные события: пользователь, курс, платёж, доступ — состав зависит от события`})]})]})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"зависит от события\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"event\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"PaymentCompleted\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"timestamp\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-10-15T09:30:12.512Z\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"idempotencyKey\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"7qqQL3bE0o8R8d3X\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`В `,_jsx(_components.code,{children:`data`}),` попадают только поля из публичного описания событий, лишние поля вырезаются. Полный состав `,_jsx(_components.code,{children:`data`}),` для каждого события описан в `,_jsx(_components.a,{href:`https://docs.exode.biz/ru/exode-api/webhooks/about`,children:`документации API`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`проверка-подписи`,children:`Проверка подписи`}),`\n`,_jsxs(_components.p,{children:[`В каждом запросе есть заголовок `,_jsx(_components.code,{children:`signature`}),`. Это HMAC-SHA256 от сырого тела запроса, посчитанный на секретном ключе вебхука и записанный в шестнадцатеричном виде.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Скопируйте секретный ключ`,children:_jsxs(_components.p,{children:[`В меню вебхука выберите `,_jsx(_components.strong,{children:`Копировать подпись`}),` — в буфер попадёт секретный ключ из 64 символов. Та же ссылка есть в форме редактирования над полем `,_jsx(_components.strong,{children:`Ссылка`}),`. Сохраните ключ в настройках своего сервиса.`]})}),_jsx(Step,{title:`Посчитайте подпись на своей стороне`,children:_jsx(_components.p,{children:`Посчитайте HMAC-SHA256 от тела запроса в том виде, в каком оно пришло. Не разбирайте JSON и не собирайте его заново: другой порядок полей или пробелы дадут другую подпись.`})}),_jsx(Step,{title:`Сравните подписи`,children:_jsx(_components.p,{children:`Если подписи не совпадают, отклоните запрос.`})})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`27`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`27`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` crypto`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'crypto'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` express`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'express'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` app`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` express`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'/webhooks/exode'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`express`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`raw`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`type:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'application/json'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }), (`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`req`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`res`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`=>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` rawBody`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` req`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`body`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'utf8'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` received`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` req`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`header`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'signature'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`||`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ''`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` expected`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` crypto`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`createHmac`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'sha256'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`process`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`EXODE_WEBHOOK_SECRET`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`update`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`rawBody`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`digest`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'hex'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` isValid`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` received`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`length`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ===`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` expected`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`length`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` crypto`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`timingSafeEqual`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Buffer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`received`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Buffer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`expected`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`!`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`isValid`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` res`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`status`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`401`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`send`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'invalid signature'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` payload`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` JSON`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`parse`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`rawBody`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` /* Обработайте событие и запомните payload.idempotencyKey */`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` res`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`sendStatus`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`200`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Секретный ключ — конфиденциальные данные. Храните его только на сервере и не публикуйте в кастомном коде школы или в открытых репозиториях.`})}),`\n`,_jsx(Heading,{level:`2`,id:`доставка-и-повторные-попытки`,children:`Доставка и повторные попытки`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Параметр`}),_jsx(_components.th,{children:`Значение`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Метод`}),_jsx(_components.td,{children:`POST, тело в JSON`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Время на ответ`}),_jsx(_components.td,{children:`15 секунд`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Успешный ответ`}),_jsx(_components.td,{children:`HTTP-коды 200, 201 и 202`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Число попыток`}),_jsx(_components.td,{children:`До 5: первая отправка и до 4 повторов`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Паузы между попытками`}),_jsx(_components.td,{children:`Около 11, 33, 77 и 165 минут. Последняя попытка — примерно через 4 часа 46 минут после первой`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Порядок доставки`}),_jsx(_components.td,{children:`Не гарантируется`})]})]})]}),`\n`,_jsx(_components.p,{children:`Любой другой ответ, превышение 15 секунд или сетевая ошибка считаются неудачей. После 5 неудачных попыток событие больше не отправляется. Если вебхук выключили, пока шли повторы, оставшиеся попытки отменяются.`}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Отвечайте кодом 200 сразу после проверки подписи, а тяжёлую обработку выполняйте в фоне. Используйте `,_jsx(_components.code,{children:`idempotencyKey`}),`, чтобы не обработать одно событие дважды: при повторной попытке ключ тот же.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`автоматическое-отключение`,children:`Автоматическое отключение`}),`\n`,_jsxs(_components.p,{children:[`Если вебхук не принял ни одного события 14 дней подряд, платформа выключает его. Владелец школы получает уведомление и письмо `,_jsx(_components.strong,{children:`Webhook отключён`}),` с адресом вебхука.`]}),`\n`,_jsx(_components.p,{children:`Выключенный вебхук не получает новые события. Чтобы снова получать события, исправьте адрес или сервис и включите вебхук переключателем в списке. После ручного включения отсчёт 14 дней начинается заново.`}),`\n`,_jsx(Heading,{level:`2`,id:`тестовые-события`,children:`Тестовые события`}),`\n`,_jsx(_components.p,{children:`Тестовое событие отправляется кнопкой-стрелкой рядом с событием в форме вебхука. Кнопка есть только у событий, доступных для выбора.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Тест отправляется на адрес из поля `,_jsx(_components.strong,{children:`Ссылка`}),`, даже если вебхук ещё не сохранён.`]}),`\n`,_jsx(_components.li,{children:`В теле — пример данных события в том же формате, что и у настоящих событий.`}),`\n`,_jsx(_components.li,{children:`Тест отправляется один раз, без повторных попыток.`}),`\n`,_jsx(_components.li,{children:`Тест из формы сохранённого вебхука подписывается его секретным ключом. Тест из формы нового вебхука подписывается временным ключом, поэтому проверить его подпись не получится.`}),`\n`,_jsx(_components.li,{children:`Можно отправить не больше 100 тестов за 10 минут.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`частые-вопросы`,children:`Частые вопросы`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Почему мой сервис отвечает 204, а события приходят повторно?`,id:`pochemu-moy-servis-otvechaet-204-a-sobytiya-prikhodyat-povtorno`,children:_jsx(_components.p,{children:`Успешными считаются только ответы 200, 201 и 202. Ответ 204 платформа считает неудачей и повторяет отправку. Отвечайте кодом 200.`})}),_jsx(Accordion,{title:`Почему подпись не совпадает?`,id:`pochemu-podpis-ne-sovpadaet`,children:_jsxs(_components.p,{children:[`Чаще всего подпись считают от заново собранного JSON, а не от сырого тела запроса. Считайте HMAC-SHA256 от тела в том виде, в каком оно пришло. Также проверьте, что используете ключ из `,_jsx(_components.strong,{children:`Копировать подпись`}),` именно этого вебхука и что тест отправлен из формы сохранённого вебхука.`]})}),_jsx(Accordion,{title:`Сколько раз платформа повторяет отправку?`,id:`skolko-raz-platforma-povtoryaet-otpravku`,children:_jsx(_components.p,{children:`Всего до 5 попыток: первая и 4 повтора с паузами около 11, 33, 77 и 165 минут. После этого событие считается недоставленным.`})}),_jsx(Accordion,{title:`Почему вебхук выключился сам?`,id:`pochemu-vebkhuk-vyklyuchilsya-sam`,children:_jsx(_components.p,{children:`Вебхук выключается, если 14 дней подряд не принял ни одного события. Владелец школы получает об этом уведомление и письмо. Исправьте адрес или работу сервиса и включите вебхук переключателем.`})}),_jsx(Accordion,{title:`Можно ли создать больше 5 вебхуков?`,id:`mozhno-li-sozdat-bolshe-5-vebkhukov`,children:_jsx(_components.p,{children:`Нет, в школе может быть не больше 5 вебхуков. Удалите неиспользуемые или подпишите один вебхук на несколько событий. Если лимита не хватает, напишите в поддержку.`})}),_jsx(Accordion,{title:`Приходят ли события в том порядке, в котором произошли?`,id:`prikhodyat-li-sobytiya-v-tom-poryadke-v-kotorom-proizoshli`,children:_jsxs(_components.p,{children:[`Нет, порядок не гарантируется: события отправляются параллельно, а неудачные попытки повторяются позже. Ориентируйтесь на поле `,_jsx(_components.code,{children:`timestamp`}),`.`]})}),_jsx(Accordion,{title:`Почему в списке нет событий о входе в систему или возврате средств?`,id:`pochemu-v-spiske-net-sobytiy-o-vkhode-v-sistemu-ili-vozvrate-sredstv`,children:_jsx(_components.p,{children:`Такие события не отправляются, поэтому подписаться на них нельзя. Для подписки доступны 13 событий из таблицы выше (в корпоративной школе — 11).`})}),_jsx(Accordion,{title:`Придёт ли вебхук, если я подпишу два адреса на одно событие?`,id:`pridyot-li-vebkhuk-esli-ya-podpishu-dva-adresa-na-odno-sobytie`,children:_jsxs(_components.p,{children:[`Да. Событие уйдёт на каждый активный вебхук, который на него подписан, с одинаковым `,_jsx(_components.code,{children:`idempotencyKey`}),`.`]})}),_jsx(Accordion,{title:`Где посмотреть, что именно приходит в данных события?`,id:`gde-posmotret-chto-imenno-prikhodit-v-dannykh-sobytiya`,children:_jsxs(_components.p,{children:[`Отправьте тестовое событие на свой адрес и посмотрите тело запроса. Полное описание данных каждого события — в `,_jsx(_components.a,{href:`https://docs.exode.biz/ru/exode-api/webhooks/about`,children:`документации API`}),`.`]})})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(_components.p,{children:_jsx(_components.em,{children:`Обновлено: 2026-10-17 07:07 UTC`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Вебхуки","description":"Как настроить вебхуки школы: доступные события, формат запроса, проверка подписи, повторные попытки и автоматическое отключение эндпоинта.","href":"/ru/general/developers/webhooks"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Где настроить","slug":"где-настроить","depth":2,"children":[]},{"title":"Как создать вебхук","slug":"как-создать-вебхук","depth":2,"children":[]},{"title":"События","slug":"события","depth":2,"children":[]},{"title":"Формат запроса","slug":"формат-запроса","depth":2,"children":[]},{"title":"Проверка подписи","slug":"проверка-подписи","depth":2,"children":[]},{"title":"Доставка и повторные попытки","slug":"доставка-и-повторные-попытки","depth":2,"children":[]},{"title":"Автоматическое отключение","slug":"автоматическое-отключение","depth":2,"children":[]},{"title":"Тестовые события","slug":"тестовые-события","depth":2,"children":[]},{"title":"Частые вопросы","slug":"частые-вопросы","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/exode-faq/0f03cceb9db709c8/lang-detect.js"],"subdomain":"exode-faq","siteName":"Exode — Product documentation","title":"Вебхуки - Exode — Product documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/general/developers/webhooks","matchLevel":1},"ru":{"href":"/ru/general/developers/webhooks","matchLevel":0}}},"lastModified":"2026-10-17T07:36:12.771Z","originalFileLocation":"ru/general/developers/webhooks.mdx","locale":"ru"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Как настроить вебхуки школы: доступные события, формат запроса, проверка подписи, повторные попытки и автоматическое отключение эндпоинта.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Exode — Product documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/exode-faq/Wp7VM_dlt_4QlPSi/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/exode-faq/Wp7VM_dlt_4QlPSi/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/exode-faq/Wp7VM_dlt_4QlPSi/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/exode-faq/Wp7VM_dlt_4QlPSi/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/exode-faq/Wp7VM_dlt_4QlPSi/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/exode-faq/Wp7VM_dlt_4QlPSi/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/exode-faq/Wp7VM_dlt_4QlPSi/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/exode-faq/Wp7VM_dlt_4QlPSi/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/exode-faq/Wp7VM_dlt_4QlPSi/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Вебхуки - Exode — Product documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Как настроить вебхуки школы: доступные события, формат запроса, проверка подписи, повторные попытки и автоматическое отключение эндпоинта.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Exode — Product documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://faq.exode.biz/ru/general/developers/webhooks\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://exode-faq.mintlify.app/_mintlify/api/og/v2?division=%D0%94%D0%BB%D1%8F+%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2\u0026amp;title=%D0%92%D0%B5%D0%B1%D1%85%D1%83%D0%BA%D0%B8\u0026amp;description=%D0%9A%D0%B0%D0%BA+%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C+%D0%B2%D0%B5%D0%B1%D1%85%D1%83%D0%BA%D0%B8+%D1%88%D0%BA%D0%BE%D0%BB%D1%8B%3A+%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D1%8B%D0%B5+%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F%2C+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%2C+%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0+%D0%BF%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%B8%2C+%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D1%8B%D0%B5+%D0%BF%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B8+%D0%B8+%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5+%D0%BE%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5+%D1%8D%D0%BD%D0%B4%D0%BF%D0%BE%D0%B8%D0%BD%D1%82%D0%B0.\u0026amp;theme=4b81d533b2a2f5ec2be885ba\u0026amp;signature=ddf69d825c0912bc0ba61700c893f2096e527d9e88204a6bc4a127b39b2a1293\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Вебхуки - Exode — Product documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Как настроить вебхуки школы: доступные события, формат запроса, проверка подписи, повторные попытки и автоматическое отключение эндпоинта.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://exode-faq.mintlify.app/_mintlify/api/og/v2?division=%D0%94%D0%BB%D1%8F+%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2\u0026amp;title=%D0%92%D0%B5%D0%B1%D1%85%D1%83%D0%BA%D0%B8\u0026amp;description=%D0%9A%D0%B0%D0%BA+%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C+%D0%B2%D0%B5%D0%B1%D1%85%D1%83%D0%BA%D0%B8+%D1%88%D0%BA%D0%BE%D0%BB%D1%8B%3A+%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D1%8B%D0%B5+%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F%2C+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%2C+%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0+%D0%BF%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D0%B8%2C+%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D1%8B%D0%B5+%D0%BF%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B8+%D0%B8+%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5+%D0%BE%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5+%D1%8D%D0%BD%D0%B4%D0%BF%D0%BE%D0%B8%D0%BD%D1%82%D0%B0.\u0026amp;theme=4b81d533b2a2f5ec2be885ba\u0026amp;signature=ddf69d825c0912bc0ba61700c893f2096e527d9e88204a6bc4a127b39b2a1293\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/exode-faq/Wp7VM_dlt_4QlPSi/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Exode — Product documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0e32cf\">\u003clink data-mint-head rel=\"canonical\" href=\"https://faq.exode.biz/ru/general/developers/webhooks\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/ru/general/developers/webhooks.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ru\" href=\"https://faq.exode.biz/ru/general/developers/webhooks\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://faq.exode.biz/en/general/developers/webhooks\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://faq.exode.biz/en/general/developers/webhooks\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://faq.exode.biz/#organization\",\"name\":\"Exode — Product documentation\",\"url\":\"https://faq.exode.biz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/exode-faq/RM155sfnW-prDXlV/logo/dark.svg?fit=max\u0026auto=format\u0026n=RM155sfnW-prDXlV\u0026q=85\u0026s=226b8c34c13ebf24544dd5b62ed2a413\"}},{\"@type\":\"WebSite\",\"@id\":\"https://faq.exode.biz#website\",\"name\":\"Exode — Product documentation\",\"url\":\"https://faq.exode.biz\",\"publisher\":{\"@id\":\"https://faq.exode.biz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://faq.exode.biz/ru/general/developers/webhooks#webpage\",\"url\":\"https://faq.exode.biz/ru/general/developers/webhooks\",\"name\":\"Вебхуки\",\"description\":\"Как настроить вебхуки школы: доступные события, формат запроса, проверка подписи, повторные попытки и автоматическое отключение эндпоинта.\",\"dateModified\":\"2026-10-17T07:36:12.771Z\",\"isPartOf\":{\"@id\":\"https://faq.exode.biz#website\"},\"breadcrumb\":{\"@id\":\"https://faq.exode.biz/ru/general/developers/webhooks#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://faq.exode.biz/ru/general/developers/webhooks#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Для разработчиков\",\"item\":\"https://faq.exode.biz/ru/general/developers/technical-overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Вебхуки\",\"item\":\"https://faq.exode.biz/ru/general/developers/webhooks\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://faq.exode.biz/ru/general/developers/webhooks#article\",\"headline\":\"Вебхуки\",\"name\":\"Вебхуки\",\"description\":\"Как настроить вебхуки школы: доступные события, формат запроса, проверка подписи, повторные попытки и автоматическое отключение эндпоинта.\",\"url\":\"https://faq.exode.biz/ru/general/developers/webhooks\",\"mainEntityOfPage\":{\"@id\":\"https://faq.exode.biz/ru/general/developers/webhooks#webpage\"},\"dateModified\":\"2026-10-17T07:36:12.771Z\",\"publisher\":{\"@id\":\"https://faq.exode.biz/#organization\"},\"isPartOf\":{\"@id\":\"https://faq.exode.biz#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Exode — Product documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Exode — Product documentation","nav":{"global":null,"languages":[{"language":"en","navbar":{"links":[{"icon":"phone","href":"tel:781139570","label":"78-113-95-70"},{"href":"https://docs.exode.biz/en/welcome","label":"API"}],"primary":{"type":"button","label":"Support","href":"https://t.me/exode_biz_support"}},"pages":[{"title":"en","href":"/en/general/developers/webhooks"}]},{"language":"ru","navbar":{"links":[{"icon":"phone","href":"tel:781139570","label":"78-113-95-70"},{"href":"https://docs.exode.biz/ru/welcome","label":"API"}],"primary":{"type":"button","label":"Поддержка","href":"https://t.me/exode_biz_support"}},"tabs":[{"tab":"Общее","groups":[{"group":"Начало работы","pages":[{"title":"Вступление","href":"/ru/welcome"},{"title":"Обзор платформы","href":"/ru/general/getting-started/overview"}]},{"group":"Создание школы","pages":[{"title":"Регистрация и создание школы","href":"/ru/general/school-creation/registration"},{"title":"Тип школы: продажа курсов или корпоративное обучение","href":"/ru/general/school-creation/school-type"},{"title":"Адрес и домен школы","href":"/ru/general/school-creation/domain"}]},{"group":"Настройка школы","pages":[{"group":"Кастомизация школы","root":{"title":"Кастомизация школы","href":"/ru/general/school-setup/customization"},"pages":[{"title":"Логотип и иконка","href":"/ru/general/school-setup/logo-and-icon"},{"title":"Темы оформления","href":"/ru/general/school-setup/themes"},{"title":"Каталог курсов","href":"/ru/general/school-setup/course-catalog"},{"title":"Левое меню сайта","href":"/ru/general/school-setup/left-menu"},{"title":"Футер сайта","href":"/ru/general/school-setup/footer"}]},{"title":"Доступные языки","href":"/ru/general/school-setup/languages"},{"title":"Вход и регистрация","href":"/ru/general/school-setup/registration-settings"}]},{"group":"Роли и права","pages":[{"title":"Роли в школе","href":"/ru/general/roles-permissions/user-roles"},{"title":"Права доступа","href":"/ru/general/roles-permissions/access-rights"}]},{"group":"Курсы","pages":[{"title":"Настройки курса","href":"/ru/general/courses/settings"},{"title":"Типы курсов","href":"/ru/general/courses/course-types"},{"title":"Создание курсов","href":"/ru/general/courses/creating-courses"},{"title":"Пакеты курсов","href":"/ru/general/courses/course-packages"},{"title":"Защита контента","href":"/ru/general/courses/content-protection"},{"title":"SEO оптимизация","href":"/ru/general/courses/seo"},{"title":"Отзывы","href":"/ru/general/courses/reviews"}]},{"group":"Уроки и модули","pages":[{"title":"Создание уроков и модулей","href":"/ru/general/lessons-modules/creating"},{"title":"Содержание урока","href":"/ru/general/lessons-modules/content"},{"group":"Практика","root":{"title":"Практика","href":"/ru/general/lessons-modules/practice"},"pages":[{"title":"Настройки урока и практики","href":"/ru/general/lessons-modules/settings"},{"title":"Типы заданий","href":"/ru/general/lessons-modules/task-types"},{"title":"Проверка практики","href":"/ru/general/lessons-modules/checking-practice"}]}]},{"group":"База заданий","pages":[{"title":"Создание заданий","href":"/ru/general/task-bank/creating-tasks"},{"title":"Использование заданий","href":"/ru/general/task-bank/using-tasks"}]},{"group":"Награждение и геймификация","pages":[{"group":"Сертификаты","root":{"title":"Сертификаты","href":"/ru/general/gamification/certificates"},"pages":[{"title":"Настройка выдачи сертификата","href":"/ru/general/gamification/creating-certificates"},{"title":"Изменение сертификата","href":"/ru/general/gamification/editing-certificates"},{"title":"Где ученик видит сертификат","href":"/ru/general/gamification/certificate-display"}]},{"title":"Геймификация: звёзды и рейтинг","href":"/ru/general/gamification/gamification"}]},{"group":"Люди","pages":[{"title":"Добавление пользователей","href":"/ru/general/users/adding-users"},{"title":"Доступ к курсу","href":"/ru/general/users/adding-to-course"},{"title":"Карточка пользователя","href":"/ru/general/users/user-card"},{"title":"Фильтр по просмотру видео","href":"/ru/general/users/video-watch-filter"}]},{"group":"Группы","pages":[{"title":"Группы и потоки","href":"/ru/general/groups/creating-groups"},{"title":"Настройки группы","href":"/ru/general/groups/group-settings"}]},{"group":"Общение и контент","pages":[{"title":"Мессенджер","href":"/ru/general/communication/messenger"},{"title":"Уведомления","href":"/ru/general/communication/notifications"},{"title":"База знаний и AI-ассистент","href":"/ru/general/communication/knowledge-base"},{"title":"Истории (сторис)","href":"/ru/general/communication/stories"},{"title":"Telegram-бот школы","href":"/ru/general/communication/telegram-bot"}]},{"group":"Аналитика","pages":[{"title":"Главная аналитика","href":"/ru/general/analytics/main-analytics"},{"title":"Как считаются показатели","href":"/ru/general/analytics/detailed-analytics"},{"title":"Таблицы и выгрузки","href":"/ru/general/analytics/dashboards"},{"title":"Прогресс ученика","href":"/ru/general/analytics/personal-analytics"}]},{"group":"Мобильное приложение","pages":[{"title":"Мобильное приложение","href":"/ru/general/mobile-app/mobile-app"}]},{"group":"Справка","pages":[{"title":"Глоссарий","href":"/ru/general/reference/glossary"},{"title":"Что доступно на платформе","href":"/ru/general/reference/feature-status"}]},{"group":"Для разработчиков","pages":[{"title":"Техническая документация","description":"Обзор инструментов для разработчиков и интеграторов: API школы, вебхуки, кастомный код, выгрузки, кастомные страницы с мини-приложениями и Exode SDK.","href":"/ru/general/developers/technical-overview"},{"title":"Вебхуки","href":"/ru/general/developers/webhooks"},{"title":"Кастомный код","description":"Свои скрипты и стили на сайте школы: куда вставляется код, ограничения, настройки интерфейса и целевые события для Яндекс Метрики, Google Analytics, Meta Pixel и VK Ads.","href":"/ru/general/developers/custom-code"},{"title":"API","href":"/ru/general/developers/api"}]}]},{"tab":"Онлайн-школы","pages":[{"title":"Онлайн-школы","href":"/ru/online-schools/getting-started/user-scenarios"}]},{"tab":"Корпобучение и HR","pages":[{"title":"Корпобучение и HR","href":"/ru/corporate/overview"}]}]}]},"title":"Вебхуки - Exode — Product documentation","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}