☰ Меню · Киоски и сканеры
Руководства

Киоски и сканеры

Устройства без кассы: сканер на входе, планшет для регистрации гостей, сканер у стойки для выдачи наград.

Выдайте каждому устройству отдельный ключ только с правом devices:write. С ним устройство может сканировать карты, отмечать визиты, регистрировать гостей и выдавать награды, но не может получать список участников или отправлять чеки. Если планшет украдут, отзовите один этот ключ.

Сканируйте что угодно

Отправляйте в POST /v1/scans ровно то, что выдал сканер. Разные форматы мы разбираем сами: номер карты, QR карты, Code 128 с префиксом символики ]C1, Enter или Tab в конце от сканера в режиме эмуляции клавиатуры, ссылку на страницу карты или телефон, набранный на киоске.

curl
curl https://loyaltyfy.io/api/v1/scans \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "code": "]C14285324286429\r", "device_id": "door-1" }'
Ответ · 200
{
  "object": "scan",
  "matched": true,
  "matched_by": "4285324286429",
  "device_id": "door-1",
  "mechanic": "stamps",
  "member": {
    "object": "member",
    "card_number": "4285324286429",
    "first_name": "Ana",
    "stamps": { "current": 1, "required": 5, "rewards_available": 0 },
    ...
  },
  "actions": [
    { "type": "visit", "method": "POST", "path": "/v1/visits" },
    { "type": "transaction", "method": "POST", "path": "/v1/transactions" }
  ]
}

В actions перечислено, что устройство может сделать дальше для этого гостя, поэтому экран показывает нужные кнопки, не зная правил программы. Если гостя ждёт награда, появляется действие redeem_reward с путём для вызова.

JSON
"actions": [
  { "type": "visit", "method": "POST", "path": "/v1/visits" },
  { "type": "transaction", "method": "POST", "path": "/v1/transactions" },
  {
    "type": "redeem_reward",
    "method": "POST",
    "path": "/v1/members/4285324286429/rewards/redeem",
    "available": 1
  }
]

Штамп за визит без чека

В программах со штампами и визитами достаточно отметки о визите: дверь фитнес-зала, бокс автомойки, кофейная стойка без кассы. POST /v1/visits начисляет награду за визит по правилам программы. Передавайте уникальный external_id для каждой отметки (например, имя устройства и счётчик), повтор будет проигнорирован.

curl
curl https://loyaltyfy.io/api/v1/visits \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "door-1-2026-10-06-0042",
    "member": "4285324286429",
    "device_id": "door-1"
  }'
Ответ · 201
{
  "object": "visit",
  "id": "feb2ad75-ac7b-4bb6-8b64-192323b7f6ea",
  "external_id": "door-1-2026-10-06-0042",
  "status": "completed",
  "amount": 0,
  "stamps_earned": 1,
  "reward_unlocked": false,
  "register_id": "door-1",
  "livemode": false,
  "created_at": "2026-10-06T18:17:28.209+00:00",
  "member": {
    "object": "member",
    "card_number": "4285324286429",
    "stamps": { "current": 2, "required": 5, "rewards_available": 0 },
    ...
  },
  ...
}
В программах с кэшбэком начисление идёт за деньги, а не за визиты, поэтому визит для такого участника отклоняется с ошибкой 400 visit_not_supported. В actions сканирования для таких участников никогда не будет visit.

Чтобы не поставить два штампа, когда гость сканирует карту дважды подряд, собирайте external_id из участника и временного окна, например door-1-4285324286429-2026-10-06T18: не больше одного штампа в час.

Киоск регистрации

Планшет на входе запрашивает телефон и имя, показывает условия обработки данных и вызывает POST /v1/members с consent: true только после согласия гостя. Затем покажите wallet.apple_url или wallet.google_url в виде QR: гость сканирует его, и карта сразу попадает в Wallet.

curl
curl https://loyaltyfy.io/api/v1/members \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: kiosk-3-0193" \
  -d '{ "phone": "+306912345678", "first_name": "Eleni", "language": "el", "consent": true }'

# show response.wallet.apple_url or google_url as a QR on the kiosk screen

Если телефон уже зарегистрирован, запрос вернёт существующего участника с 200, так что гость, потерявший карту, просто получит её снова.

Вопросы по интеграции: api@loyaltyfy.io. Отвечаем в течение одного рабочего дня.