Перейти до основного вмісту
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 і вебхуки входять у тарифи «Повний» і «Мережа». Для «Старт» і «Ресторан» за запитом.

Порівняти тарифи