Уведомления во внешние системы (webhook)
Webhook — уведомление, которое облако само отправляет во внешнюю систему, когда в VirtualPos что-то произошло: пробит чек или изменился остаток товара. Внешней системе не нужно опрашивать API по расписанию — она получает данные сразу после события. Так подключают учётные системы, сайты, сервисы аналитики и рассылок.
Как это работает
- Событие В VirtualPos происходит событие: касса передала чек в облако или изменилось количество товара.
- Запрос Облако отправляет POST-запрос с данными события в формате JSON на адрес, который вы указали.
- Ответ Внешняя система отвечает кодом от 200 до 299 — уведомление считается доставленным.
Для каждого события можно настроить несколько адресов: уведомление уйдёт на каждый.
События
| Касса: новый чек продажи\возврата | Касса передала в облако чек продажи или возврата |
| Запасы: изменилось количество товара на складе | Сохранена запись остатка: продажа, поступление, перемещение, списание, инвентаризация. Уведомление может прийти и тогда, когда количество не изменилось, — сравнивайте quantity_before и quantity_after |
Внимание. В списке Событие есть и другие варианты: смена открыта или закрыта, продавец вошёл в кассу или завершил сеанс, принято поступление или перемещение, возврат поставщику. Уведомления по ним пока не отправляются — используйте два события из таблицы выше.
Как настроить уведомление
- Откройте Администрирование → API и обмен с 1С и в блоке Отправка уведомлений (webhook) нажмите «Настроить webhook».
- Нажмите «Добавить».
- Выберите Событие.
- В поле URL для отправки уведомления укажите адрес вашей системы, например
https://erp.example.com/hooks/virtualpos/receipt. - Выберите Тип авторизации и заполните Логин и Пароль (токен) — см. Авторизация.

- В поле Включено выберите Да (включено) и нажмите «Сохранить».
| Включено | Да — уведомления отправляются. Нет — настройка сохранена, но уведомления не уходят |
| Событие | О чём уведомлять |
| URL для отправки уведомления | Адрес, на который отправляется запрос, до 1024 символов |
| Максимальное количество попыток | Сейчас не используется: уведомление отправляется один раз |
| Тип авторизации, Логин, Пароль (токен) | Как ваша система проверяет, что запрос пришёл от VirtualPos |
Все настроенные уведомления видны в списке: включено ли, событие, адрес.

Авторизация
- Тип авторизации Без авторизации Запрос отправляется без дополнительных заголовков. Подходит только для проверки.
- Тип авторизации Базовая авторизация по логину и паролю (HTTP Basic auth) В запрос добавляется заголовок
Authorization: Basic …с логином и паролем из настройки. - Тип авторизации Заголовок X-VIRTUALPOS-TOKEN с паролем В запрос добавляется заголовок
X-VIRTUALPOS-TOKENсо значением поля Пароль (токен).
Внимание. Принимайте уведомления только по защищённому адресу https:// и проверяйте токен или логин с паролем на своей стороне. В уведомлении о чеке передаются имя, телефон и почта покупателя.
Формат запроса
Облако отправляет POST-запрос с заголовком Content-Type: application/json. Тело запроса — объект JSON. Поле event содержит вид события, account — имя вашей учётной записи VirtualPos.
Новый чек
{
"event": "receipt",
"id": 15840,
"guid": "5f0c9a52-7d1e-4a7b-9a3e-2b6d1c4e8f10",
"datetime": "2026-10-10 12:35:08",
"account": "mycompany",
"type": "sale",
"checknum": 27,
"globalchecknum": 1042,
"session": 118,
"customer": {
"id": 512,
"ext_id": "C-000512",
"first_name": "Иван",
"last_name": "Петров",
"middle_name": "Сергеевич",
"email": "petrov@example.com",
"phone": "+79000000001"
},
"card": {
"id": 731,
"ext_id": null,
"uid": null,
"barcode": "2900000007310"
},
"warehouse_id": 2,
"warehouse_ext_id": "W-02",
"warehouse_name": "Магазин на Ленина",
"warehouse_address": "г. Примерск, ул. Ленина, 1",
"user_id": 14,
"user_name": "Смирнова Ольга Николаевна",
"amount": 1180,
"cost": 760,
"discount": 120,
"items": [
{
"line_id": 90211,
"id": 1052,
"ext_id": "A-1052",
"name": "Чайник заварочный, 800 мл",
"barcode": "4600000010526",
"quantity": 1,
"price": 1300,
"discount": 120,
"cost": 760,
"motivation_bonus": 0,
"motivation_bonus_description": null
}
]
}
id, guid | Ид чека в облаке и его уникальный идентификатор |
datetime | Дата и время чека |
type | Тип чека: sale — продажа, return — возврат |
checknum, globalchecknum, session | Номер чека в смене, сквозной номер чека и номер смены |
customer | Покупатель: ид, внешний ид, Ф.И.О., почта и телефон. null, если чек без покупателя |
card | Карта покупателя: ид, внешний ид, UID и штрихкод. null, если карта не использовалась |
warehouse_id, warehouse_ext_id, warehouse_name, warehouse_address | Точка продаж: ид, внешний ид, название и адрес |
user_id, user_name | Кассир: ид и Ф.И.О. |
amount, cost, discount | Сумма чека, себестоимость и скидка |
items | Строки чека: ид строки (line_id), ид товара (id), внешний ид, название, штрихкоды, количество, цена, скидка, себестоимость и бонус продавцу |
Изменение остатка
{
"event": "onhand",
"account": "mycompany",
"id": 48213,
"warehouse_id": 2,
"warehouse_ext_id": "W-02",
"item_id": 1052,
"item_ext_id": "A-1052",
"quantity": 7,
"quantity_before": 8,
"quantity_after": 7,
"lot_number": null,
"manufacture_date": null,
"expire_date": "2027-03-01",
"cost": 760
}
id | Ид записи остатка. У товара на одной точке продаж может быть несколько записей — по партиям |
warehouse_id, warehouse_ext_id | Точка продаж: ид и внешний ид |
item_id, item_ext_id | Товар: ид и внешний ид |
quantity_before, quantity_after | Количество в записи до и после изменения. При удалении записи quantity_after равно 0 |
quantity | Текущее количество в записи |
lot_number, manufacture_date, expire_date | Номер партии, дата производства и срок годности |
cost | Себестоимость единицы товара |
Подсказка. Уведомление об остатке приходит по каждой изменённой записи. Чек из пяти товаров вызывает одно уведомление о чеке и как минимум пять уведомлений об остатках. Чтобы узнать полный остаток товара на точке, запросите его через API — см. API: общие сведения.
Требования к принимающей системе
| Код ответа | От 200 до 299. Любой другой код считается ошибкой |
| Время ответа | Соединение должно установиться за 6 секунд, ответ — прийти за 10 секунд |
| Повторная отправка | Не выполняется: если ваша система была недоступна, уведомление не повторится |
| Порядок | Уведомления отправляются сразу после события, одно за другим |
Совет. Отвечайте на уведомление сразу, а обработку выполняйте у себя в фоне. Чтобы не потерять данные при сбоях, раз в сутки сверяйте чеки и остатки через API.
Проверка
Откройте настроенное уведомление и нажмите «Протестировать». Облако отправит на указанный адрес пробный запрос и покажет, куда он ушёл.
| Изменение остатка | Отправляется запрос в рабочем формате по последней записи остатка |
| Новый чек | Пробная отправка не поддерживается. Проверьте уведомление на настоящем чеке: пробейте чек на кассе |
Результат отправки записывается в системные журналы: успешные запросы — в серверный журнал информации, ошибки — в серверный журнал ошибок с адресом, кодом ответа и текстом ошибки.
Права доступа
Частые ошибки
| Ситуация | Причина | Что делать |
|---|---|---|
| Уведомления не приходят | Настройка выключена | Откройте уведомление и выберите Да (включено) в поле Включено |
Уведомления не приходят, в журнале ошибок Webhook error | Ваша система недоступна, отвечает дольше 10 секунд или возвращает код не из диапазона 200–299 | Проверьте адрес и работу принимающей системы. Код ответа и текст ошибки смотрите в серверном журнале ошибок |
| Ваша система отвечает кодом 401 или 403 | Не совпадают токен или логин с паролем | Проверьте Тип авторизации, Логин и Пароль (токен) |
| Не приходят уведомления о сменах, входе продавца, поступлениях | По этим событиям уведомления пока не отправляются | Используйте события «новый чек» и «изменилось количество товара» или получайте данные через API |
| Часть уведомлений потеряна | Принимающая система была недоступна, а повторной отправки нет | Сверьте данные через API за нужный период |
| Уведомление о чеке приходит с задержкой | Касса работала без связи и передала чеки позже | Это штатное поведение: ориентируйтесь на datetime чека — см. Работа без интернета |
| Кнопка «Протестировать» ничего не отправляет для события «новый чек» | Пробная отправка для этого события не поддерживается | Пробейте чек на кассе |