Tapaya
Прийом платежів у торговій точціПосібник з інтеграціїCloud Accept APIBeta

Cloud Accept API

Beta

Запускайте платежі в торговій точці на спареному пристрої Tapaya зі свого ECR або бекенда POS.

Cloud Accept API дає змогу вашому електронному касовому апарату (ECR) або бекенду POS запускати платіж на пристрої Tapaya через хмару. Ваша система ніколи не взаємодіє з пристроєм напряму: вона надсилає запит на платіж до Tapaya, Tapaya сповіщає спарений пристрій, і пристрій показує клієнту екран оплати. Інформація про перебіг надходить вам у вигляді вебхуків або ви отримуєте її опитуванням (polling).

Виберіть спосіб спарювання пристроїв

Кожен пристрій, на який ви надсилаєте платежі, потребує externalDeviceId: назви, під якою його знає ваша система, наприклад till-01. Призначити його можна одним із двох способів:

Перш ніж почати

  1. Отримайте свій Server Secret Token на сторінці API Keys. Нижче ви обміняєте його на токен доступу в межах мерчанта (див. Автентифікація в Platform API).
  2. Зареєструйте мерчанта і збережіть його merchantToken. Див. Реєстрація нового мерчанта.
  3. Підготуйте кожен пристрій із застосунком Tapaya, у якому виконано вхід від імені цього мерчанта, щоб його можна було спарити і він міг отримувати запити.

Один токен, один мерчант

Кожен виклик Cloud Accept API стосується рівно одного мерчанта. Щоб обслуговувати кількох мерчантів, отримуйте через обмін окремий токен доступу для кожного з них.

Спарювання пристрою

Спарювання призначає пристрою Tapaya externalDeviceId, щоб ви могли знайти його у списку пристроїв і вибрати його як цільовий під час запуску платежу.

Призначення з вашого застосунку

Ваш застосунок викликає на пристрої функцію Accept SDK, яка призначає йому externalDeviceId. Використовуйте той самий ідентифікатор у кожному виклику Cloud Accept API для цього пристрою.

Сканування QR-коду

Мерчант відкриває процес спарювання в Tapaya Platform, яка показує QR-код для externalDeviceId, що призначається. Мерчант сканує його застосунком Tapaya для мерчантів на цільовому пристрої, і застосунок завершує спарювання.

Обмін на токен доступу

Обміняйте свій Server Secret Token і merchantToken мерчанта на токен доступу за допомогою POST /ecr/auth. merchantToken надсилається лише тут; усі подальші виклики надсилають тільки Authorization: Bearer <accessToken>.

curl -X 'POST' 'https://api.tapaya.com/ecr/auth' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer REPLACE_ME' \
-d '{
        "merchantToken": "unique_merchant_id_from_your_db"
    }'
200 OK
{
    "accessToken": "...",
    "tokenType": "Bearer",
    "expiresAt": "2026-01-13T16:30:59Z"
}
КодОпис
401API-токен недійсний або строк його дії минув.
403Доступ до мерчанта заборонено.

Оновлюйте токен до настання expiresAt. Викличте POST /ecr/auth/refresh із поточним, ще дійсним accessToken у заголовку Authorization. Ендпоінт повертає те саме тіло з новим токеном; збережіть його і надалі використовуйте саме його.

curl -X 'POST' 'https://api.tapaya.com/ecr/auth/refresh' \
-H 'Authorization: Bearer ACCESS_TOKEN'
КодОпис
401Токен доступу недійсний, строк його дії минув або його відкликано. Отримайте новий через POST /ecr/auth.
403Ви більше не маєте доступу до мерчанта. Новий токен не видається.

Пошук готового пристрою

Отримайте список пристроїв мерчанта за допомогою GET /ecr/devices. Додайте ?connected=true, щоб виключити відключені пристрої, або отримайте один пристрій за допомогою GET /ecr/devices/{externalDeviceId}.

curl 'https://api.tapaya.com/ecr/devices/till-01' \
-H 'Authorization: Bearer ACCESS_TOKEN'
200 OK
{
    "externalDeviceId": "till-01",
    "name": "Front counter",
    "connected": true,
    "availability": "ready",
    "lastSeenAt": "2026-01-13T16:30:59Z",
    "updatedAt": "2026-01-13T16:30:59Z"
}

Надсилайте платежі лише на пристрій, у якого availability має значення ready. Список є лише знімком стану: доступність перевіряється повторно під час надсилання, тож навіть пристрій у стані ready може відхилити запит. Див. Доступність пристрою.

Надсилання запиту на платіж

Надішліть суму на пристрій за допомогою POST /ecr/payment-requests. Tapaya зберігає запит і сповіщає пристрій, який показує екран оплати.

curl -X 'POST' 'https://api.tapaya.com/ecr/payment-requests' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H 'Idempotency-Key: order-1042-attempt-1' \
-d '{
        "externalDeviceId": "till-01",
        "amount": 12500,
        "tipAmount": 500,
        "currency": "CZK"
    }'

Параметри:

ПолеТипОбов'язковеОпис
externalDeviceIdstring✓Спарений пристрій, який має показати платіж.
amountinteger✓Сума в найменшій одиниці валюти (12500 дорівнює 125,00 Kč).
tipAmountintegerЧайові в найменшій одиниці валюти.
currencystring✓Код валюти ISO 4217.
paymentTokenstringНаявний платіж, до якого слід прив'язати запит.
202 Accepted
{
    "requestId": "...",
    "status": "pending",
    "paymentToken": null,
    "expiresAt": "2026-01-13T16:30:59Z"
}

202 не є результатом платежу

202 Accepted означає, що Tapaya зберегла запит. Це не означає, що пристрій його отримав або що клієнт заплатив. Усе, що завершиться збоєм пізніше, надійде вам як зміна статусу.

Зробіть повторні спроби безпечними. Заголовок Idempotency-Key є обов'язковим. Повторне використання ключа з тим самим тілом повертає початковий запит замість запуску другого платежу; повторне використання з іншим тілом повертає 409 idempotency_conflict. Прив'яжіть ключ до продажу та спроби, як у order-1042-attempt-1.

Відстеження результату

Стежте за статусами запиту за допомогою вебхуків або періодично опитуйте GET /ecr/payment-requests/{requestId}. Щойно запит досягне статусу payment_created, відповідь міститиме paymentToken, а про перебіг самого платежу повідомлятимуть події payment.updated.

Щоб отримувати вебхуки, зареєструйте свій HTTPS-ендпоінт за допомогою POST /ecr/webhook-subscriptions або задайте для мерчанта callback URL і типи подій у Tapaya Platform.

curl -X 'POST' 'https://api.tapaya.com/ecr/webhook-subscriptions' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-d '{
        "url": "https://integrator.example.com/webhooks/tapaya",
        "events": ["payment_request.updated", "payment.updated"]
    }'
201 Created
{
    "subscriptionId": "...",
    "url": "https://integrator.example.com/webhooks/tapaya",
    "events": ["payment_request.updated", "payment.updated"],
    "signingSecret": "..."
}

Збережіть signing secret

signingSecret повертається лише під час створення підписки. Збережіть його в захищеному місці; він знадобиться вам для перевірки підпису вхідних вебхуків.

Підписка належить інтегратору й мерчанту, а не токену доступу, тому вона зберігається після оновлення токена. Відповідайте на кожну подію кодом 2xx, щойно приймете її.

Перевірте результат, перш ніж закривати продаж

Вебхуки є сповіщеннями, а не підтвердженням оплати, і вебхук може надійти із запізненням або не надійти зовсім. Ніколи не закривайте продаж лише на підставі вебхука:

  • Коли вебхук надходить, підтвердьте кінцевий результат через API, наприклад за допомогою запиту з розділу Отримання даних платежу.
  • Коли вебхук не надходить протягом тайм-ауту, що відповідає вашому процесу оплати, і не пізніше expiresAt запиту, викличте GET /ecr/payment-requests/{requestId}, щоб дізнатися його поточний статус, а потім підтвердьте платіж через API, як описано вище.

Довідка

Ендпоінти

МетодЕндпоінтОпис
POST/ecr/authОбмінює ваш API-токен і merchantToken на токен доступу.
POST/ecr/auth/refreshОновлює ще дійсний токен доступу.
GET/ecr/devicesПовертає список пристроїв мерчанта. Необов'язковий фільтр connected=true.
GET/ecr/devices/{externalDeviceId}Повертає один пристрій і його поточну доступність.
POST/ecr/payment-requestsЗберігає запит на платіж і сповіщає пристрій. Потребує Idempotency-Key.
GET/ecr/payment-requests/{requestId}Повертає статус запиту, причину відхилення (якщо є) і paymentToken.
POST/ecr/webhook-subscriptionsРеєструє HTTPS URL і типи подій. Signing secret (ключ підпису) повертає лише один раз.
GET/ecr/webhook-subscriptionsПовертає список ваших підписок для мерчанта без signing secret.
DELETE/ecr/webhook-subscriptions/{subscriptionId}Видаляє підписку.

Доступність пристрою

Обидва ендпоінти для пристроїв повертають externalDeviceId, name, connected, availability, lastSeenAt і updatedAt.

ЗначенняОпис
readyПідключений і здатний отримати та показати запит.
busyОбробляє платіж або має активний запит.
unavailableВідключений, не має дійсної сесії або не може показати екран оплати.

Статуси запиту

СтатусОпис
pendingЗбережений і очікує, поки пристрій його прийме.
acknowledgedПристрій його отримав; платежу ще може не існувати.
payment_createdПлатіж і його paymentToken існують. Подальший перебіг відстежуйте за платежем.
rejectedПристрій або Tapaya відхилили запит.

Помилки

КодПричинаОпис
403 / 404Об'єкт недоступнийУ вас немає дозволу або об'єкт не існує.
409device_busyПристрій уже має активний запит або платіж.
409device_unavailableПристрій підключений, але не готовий.
409idempotency_conflictКлюч уже використано з іншим тілом.
503device_offlineПристрій не підключений.

Помилки валідації суми та валюти відповідають тим самим правилам, що й решта Platform API.

Події вебхуків

ПодіяНадсилається, колиВміст data
device.connectedПристрій відкриває нове активне з'єднання.externalDeviceId, connected, availability, lastSeenAt
device.disconnectedЗ'єднання закривається або спливає тайм-аут перевірки активності.externalDeviceId, connected, availability, lastSeenAt
device.availability_changedДоступність змінюється між ready, busy і unavailable.externalDeviceId, availability, необов'язково reason
payment_request.updatedЗапит збережено, підтверджено, відхилено, строк його дії минув або для нього створено платіж.requestId, externalDeviceId, status, paymentToken, reference, reason, expiresAt
payment.updatedЗмінюється статус платежу.paymentToken, requestId, externalDeviceId, status, reference, amount, currency, необов'язково receiptUrl

Кожна подія надходить як HTTP POST в однаковій обгортці:

{
    "eventId": "...",
    "type": "payment_request.updated",
    "occurredAt": "2026-01-13T16:30:59Z",
    "data": {
        "requestId": "...",
        "externalDeviceId": "till-01",
        "status": "acknowledged",
        "paymentToken": null,
        "reference": "ORDER-1042",
        "reason": null,
        "expiresAt": "2026-01-13T16:30:59Z"
    }
}
Чогось бракує на цій сторінці?Надішліть запит на функцію. Ми додамо цю сторінку, щоб команда бачила контекст.