Перейти к основному содержимому
Vitrina

API для разработчиков

Открытый API Vitrina: меню, заказы, бронирования, гости и продажи для вашей кассы, кухонного экрана, CRM или учёта. REST и JSON, ключи с правами доступа, вебхуки с подписью.

Что можно делать

  • Меню: категории, блюда, цены и наличие по точкам, а также стоп-лист: снять блюдо с продажи или вернуть его
  • Редактирование меню: категории и блюда, названия и описания на языках гостей, цены, порции, модификаторы, порядок и видимость
  • Заказы: список с фильтрами, состав и суммы, статусы кухни и выдачи (принят, готовится, готов, выдан)
  • Новые заказы из колл-центра, киоска или другого сайта по тем же ценам и правилам доставки, что и на вашем сайте; касса и кухня видят их сразу, а гость платит при получении
  • Доставка: кто везёт (только имя курьера), когда забрал и когда доставил: в самом заказе и событием
  • Оплаты и возвраты каждого заказа для сверки, только просмотр
  • Бронирования: список, новое бронирование и смена статуса (подтвердить, отклонить, гость пришёл или не пришёл)
  • Гости: профили и контакты, только с отдельным разрешением
  • Бонусы гостей: начислить или списать с причиной, с отдельным разрешением; баланс не уходит в минус, каждая операция записывается в журнал
  • Продажи по дням для учёта: заказы, выручка, скидки, возвраты и чаевые с разбивкой по способам оплаты и каналам
  • Точки: адреса, контакты и часы работы
  • События (новый заказ, смена статуса, оплата, отмена, возврат, доставка, новое бронирование, стоп-лист и изменения меню) вебхуком на ваш сервер

Принимать оплату, возвращать деньги и отменять заказы API не умеет: деньги гостей двигает только само заведение. Поэтому заказы из API гость оплачивает при получении.

Доступ и права

Ключ создаёт владелец заведения в панели управления, в разделе «API и вебхуки»: даёт интеграции название и выбирает права и точки. Ключ показывается один раз (в базе остаётся только его отпечаток), и отозвать его можно в любой момент. Имена, телефоны и адреса гостей интеграция видит только с правом customers:read.

Права ключа

locations:read
Точки: адреса, контакты и часы работы
menu:read
Меню, цены и наличие блюд
menu:write
Стоп-лист: снять блюдо с продажи или вернуть
menu:manage
Редактирование меню: категории, блюда, цены, порции и порядок
orders:read
Заказы: список и детали, без контактов гостя
orders:write
Статусы кухни и выдачи
orders:create
Новые заказы с оплатой при получении
payments:read
Оплаты и возвраты заказов, только просмотр
reservations:read
Бронирования: список и детали
reservations:write
Новое бронирование и смена его статуса
customers:read
Имя, телефон, почта и адрес гостя в заказах, бронированиях и списке гостей
loyalty:write
Начисление и списание бонусов гостя, только вместе с доступом к гостям
reports:read
Продажи по дням для учёта

Первый запрос

API работает на сервере заведения: у каждого клиента Vitrina свой сервер и свой домен. Ключ передаётся в заголовке Authorization: Bearer vit_live_…, ответ приходит в JSON в одном и том же конверте: данные, служебные поля и ошибка с кодом и текстом на языке запроса.

Запрос
curl https://api.example.com/api/open/v1/ping \
  -H "Authorization: Bearer vit_live_…"
Ответ
{
  "data": {
    "ok": true,
    "brand": "my-bistro",
    "apiVersion": "2026-10-13",
    "serverTime": "2026-10-13T09:30:00.000Z",
    "clientName": "POS integration",
    "scopes": ["menu:read", "orders:read", "orders:write"],
    "cafeIds": []
  },
  "meta": null,
  "error": null
}

Вебхуки

Адреса для событий владелец добавляет в том же разделе панели и выбирает, какие события на каждый отправлять. Каждый запрос подписан: заголовок Vitrina-Signature содержит время отправки и HMAC-SHA256 от времени и тела запроса, вычисленный секретом адреса. Имена и контакты гостей в событиях отправляем только на адреса с включённой галочкой «Отправлять контакты гостя».

События

order.created
Новый заказ
order.status_changed
Изменился статус заказа
order.paid
Заказ оплачен
order.cancelled
Заказ отменён
order.refunded
Гостю вернули деньги или бонусы
order.delivery_updated
Курьер назначен или снят, заказ забрали или доставили
reservation.created
Новое бронирование
reservation.status_changed
Изменился статус бронирования
menu.availability_changed
Блюдо снято с продажи или возвращено
menu.changed
Изменилось меню: категории, блюда, цены или порядок
Проверка подписи на Node.js
import { createHmac, timingSafeEqual } from 'node:crypto'

const TOLERANCE_SECONDS = 300

export function isFromVitrina(rawBody, header, secret) {
  const parts = header.split(',').map((part) => part.trim().split('='))
  const t = parts.find(([name]) => name === 't')?.[1] ?? ''
  const age = Math.abs(Date.now() / 1000 - Number(t))
  if (!/^\d+$/.test(t) || age > TOLERANCE_SECONDS) return false
  const hmac = createHmac('sha256', secret).update(`${t}.${rawBody}`)
  const want = Buffer.from(hmac.digest('hex'))
  return parts
    .filter(([name]) => name === 'v1')
    .map(([, value]) => Buffer.from(value ?? ''))
    .some((got) => got.length === want.length && timingSafeEqual(got, want))
}

Подпись считается от сырого тела запроса, до разбора JSON. Подпись старше 5 мин отбрасывайте; повторная доставка того же события несёт тот же Vitrina-Event-Id, по нему отсекайте дубликаты.

Лимиты и надёжность

  • 600 запросов в минуту на каждый ключ, пик до 60 за раз; сверх лимита приходит ответ 429 и заголовок Retry-After
  • Заголовок Idempotency-Key в POST, PUT и PATCH: повтор с тем же ключом в течение 24 ч возвращает первый ответ, а не создаёт дубль; для новых заказов и бонусов он обязателен
  • Списки отдаются страницами: limit до 200 и offset, в ответе есть общее количество
  • Если ваш сервер не ответил за 10 с, событие отправляем снова с растущей паузой: 8 попыток в течение почти двух суток
  • Адрес, который не принял 20 доставок подряд, отключается сам; журнал доставок хранится 30 дней, и любое событие из него можно отправить снова

Версии

Версия указана в адресе: /api/open/v1. Несовместимые изменения выходят только новой версией рядом со старой, и старая отвечает, пока ею пользуются. Дата редакции контракта есть в поле apiVersion каждого события, сейчас это 2026-10-13.

Полное описание

Все запросы, ответы и коды ошибок описаны в спецификации OpenAPI на сервере заведения: страница /api/open/v1/docs и файл /api/open/v1/openapi.json для генераторов клиентов.

Для интеграторов

Пишете интеграцию для нескольких заведений, например кассу, службу доставки или учёт? Напишите нам: дадим тестовый доступ и поможем с первым подключением.

Сколько стоит

API и вебхуки входят в тарифы «Полный» и «Сеть». Для «Старт» и «Ресторан» по запросу.

Сравнить тарифы