КешбекиAPI нарахувань кешбеку від банку

API нарахувань кешбеку від банку

Увага: банк має надсилати ці дані в реальному часі для кожної транзакції, де нараховано кешбек (або скасовано нарахування при refund), замість очікування файлу акту звірки.

Два способи запису в ту саму таблицю cashback_bank_accruals:

ВерсіяЕндпоінтЩо передається
Перша (одна транзакція)POST /cashback-bank-accrualsОдин об’єкт: campaignId, bankId і поля однієї транзакції
Друга (масив)POST /v2/cashback-bank-accrualscampaignId і bankId один раз, транзакції — у масиві accruals

GET /cashback-bank-accruals спільний: у відповіді видно рядки і з першої версії, і з другої. Окремого GET для v2 немає.

У шляху першої версії префікса /v1 немає — це POST /cashback-bank-accruals.


Створення факту нарахування (одна транзакція)

Ендпоінт: /cashback-bank-accruals

Метод: POST

Опис: Перша версія API: один запит — одна транзакція. Фіксує факт нарахування кешбеку від банку по транзакції. На основі цих даних чеки можна знаходити та зіставляти автоматично, не чекаючи файлу звірки від банку. Для кількох транзакцій на одну кампанію і один банк використовуйте пакетне створення.

Заголовки: x-trace-id uuid

Тіло запиту

ПолеТипОбов’язковийОпис
campaignIdUUIDТакID кампанії (cashback ID), до якої належить нарахування
bankIdUUIDТакPartner ID банку, що передає нарахування
transactionIdstringТакID транзакції
cardMaskstringТакМаска картки (PAN)
operationDatestring (ISO date-time)ТакДата операції
operationAmountnumberТакСума операції
cashbackAmountnumberТакСума кешбеку, нарахована банком
rrnstringТакReference Retrieval Number
terminalIdstringНіTerminal ID
terminalAuthCodestringНіКод авторизації терміналу
clientIdstringНіClient ID від банку
orderIdstringНіOrder ID (зазвичай банк не передає; може бути заповнений після зіставлення)
statusstringНіСтатус від банку (зберігається як є)
bankPaymentSharenumberНіЧастка банку в розподілі виплати кешбеку
merchantPaymentSharenumberНіЧастка мерчанта в розподілі виплати кешбеку
purchaseDatestring (ISO date-time)ТакДата покупки
{
  "campaignId": "11111111-2222-4333-8444-555555555501",
  "bankId": "33333333-4444-4333-8444-555555555503",
  "transactionId": "2qtL1H/HGEeJ8iV3eiLwdQ==",
  "cardMask": "464237******1234",
  "operationDate": "2026-09-10T12:00:00Z",
  "operationAmount": 250.50,
  "cashbackAmount": 15.50,
  "rrn": "525609471435",
  "terminalId": "E0197712",
  "terminalAuthCode": "AUTH123",
  "clientId": "6FO09WL12123",
  "status": "approved",
  "bankPaymentShare": 7.50,
  "merchantPaymentShare": 8.00,
  "purchaseDate": "2026-09-10T12:00:00Z"
}

Відповідь

ПолеТипОпис
idUUIDУнікальний ідентифікатор факту нарахування
campaignIdUUIDID кампанії (cashback ID)
bankIdUUIDID банку, що передав нарахування
transactionIdstringID транзакції
cardMaskstringМаска картки (PAN)
operationDateDateДата операції
operationAmountnumberСума операції
cashbackAmountnumberСума кешбеку від банку
rrnstringReference Retrieval Number
terminalIdstringTerminal ID
terminalAuthCodestringКод авторизації терміналу
clientIdstringClient ID від банку
orderIdstringOrder ID, заповнюється після зіставлення
statusstringСтатус від банку
bankPaymentSharenumberЧастка банку
merchantPaymentSharenumberЧастка мерчанта
purchaseDateDateДата покупки
retailerIdUUIDID мерчанта, заповнюється після зіставлення з чеком
createdAtDateЧас створення
updatedAtDateЧас останнього оновлення
{
  "id": "44444444-5555-4333-8444-555555555504",
  "campaignId": "11111111-2222-4333-8444-555555555501",
  "bankId": "33333333-4444-4333-8444-555555555503",
  "transactionId": "2qtL1H/HGEeJ8iV3eiLwdQ==",
  "cardMask": "464237******1234",
  "operationDate": "2026-09-10T12:00:00Z",
  "operationAmount": 250.50,
  "cashbackAmount": 15.50,
  "rrn": "525609471435",
  "terminalId": "E0197712",
  "terminalAuthCode": "AUTH123",
  "clientId": "6FO09WL12123",
  "orderId": null,
  "status": "approved",
  "bankPaymentShare": 7.50,
  "merchantPaymentShare": 8.00,
  "purchaseDate": "2026-09-10T12:00:00Z",
  "retailerId": null,
  "createdAt": "2026-09-10T12:00:05.000Z",
  "updatedAt": "2026-09-10T12:00:05.000Z"
}

Помилки

HTTP-кодТип помилкиОпис
400BadRequestExceptionНевалідні дані запиту або помилка валідації
404NotFoundExceptionБанк з указаним bankId або кампанія з указаним campaignId не знайдені
500DatabaseExceptionПомилка бази даних

Пакетне створення (масив транзакцій)

Ендпоінт: /v2/cashback-bank-accruals

Метод: POST

Опис: Друга версія API: банк одним запитом надсилає кілька транзакцій на одну кампанію і один банк. campaignId і bankId передаються один раз на рівні кореня. Кожна транзакція — окремий об’єкт у масиві accruals (ті самі поля, що в тілі одиночного POST /cashback-bank-accruals, крім campaignId і bankId).

Кожен елемент зберігається окремим рядком у таблиці cashback_bank_accruals у тій самій формі, що й одиночний POST. Весь масив пишеться однією транзакцією: якщо будь-який елемент невалідний або немає банку чи кампанії, не зберігається нічого.

Прочитати збережені рядки можна тим самим GET /cashback-bank-accruals.

Заголовки: x-trace-id uuid

Тіло запиту

ПолеТипОбов’язковийОпис
campaignIdUUIDТакID кампанії (cashback ID), спільний для всіх елементів
bankIdUUIDТакPartner ID банку, спільний для всіх елементів
accrualsarrayТакЩонайменше одна транзакція. Верхньої межі розміру немає
accruals[].transactionIdstringТакID транзакції
accruals[].cardMaskstringТакМаска картки (PAN)
accruals[].operationDatestring (ISO date-time)ТакДата операції
accruals[].operationAmountnumberТакСума операції
accruals[].cashbackAmountnumberТакСума кешбеку, нарахована банком
accruals[].rrnstringТакReference Retrieval Number
accruals[].terminalIdstringНіTerminal ID
accruals[].terminalAuthCodestringНіКод авторизації терміналу
accruals[].clientIdstringНіClient ID від банку
accruals[].orderIdstringНіOrder ID (зазвичай банк не передає)
accruals[].statusstringНіСтатус від банку (зберігається як є)
accruals[].bankPaymentSharenumberНіЧастка банку в розподілі виплати кешбеку
accruals[].merchantPaymentSharenumberНіЧастка мерчанта в розподілі виплати кешбеку
accruals[].purchaseDatestring (ISO date-time)ТакДата покупки
{
  "campaignId": "11111111-2222-4333-8444-555555555501",
  "bankId": "33333333-4444-4333-8444-555555555503",
  "accruals": [
    {
      "transactionId": "TXN-EXAMPLE-1",
      "cardMask": "464237******1234",
      "operationDate": "2026-09-10T12:00:00Z",
      "operationAmount": 250.5,
      "cashbackAmount": 12.5,
      "rrn": "525609471435",
      "terminalId": "TERM-0001",
      "terminalAuthCode": "AUTH123",
      "clientId": "CLIENT-EXAMPLE-1",
      "status": "approved",
      "bankPaymentShare": 7.5,
      "merchantPaymentShare": 5,
      "purchaseDate": "2026-09-10T12:00:00Z"
    },
    {
      "transactionId": "TXN-EXAMPLE-2",
      "cardMask": "464237******5678",
      "operationDate": "2026-09-10T13:00:00Z",
      "operationAmount": 100,
      "cashbackAmount": 5,
      "rrn": "525609471436",
      "purchaseDate": "2026-09-10T13:00:00Z"
    }
  ]
}

Відповідь

HTTP-код: 200

Тіло — масив збережених рядків. Кожен елемент має ті самі поля, що й відповідь одиночного POST /cashback-bank-accruals (id, campaignId, bankId, поля транзакції, createdAt, updatedAt). campaignId і bankId повторюються в кожному рядку.

Помилки

HTTP-кодТип помилкиОпис
400BadRequestExceptionНевалідні дані запиту або елемент масиву. Нічого не збережено
404NotFoundExceptionБанк з указаним bankId або кампанія з указаним campaignId не знайдені. Нічого не збережено
500DatabaseExceptionПомилка бази даних. Нічого не збережено

Отримання списку нарахувань

Ендпоінт: /cashback-bank-accruals

Метод: GET

Опис: Повертає сторінковий список фактів нарахування з фільтрами за періодом, кампанією, банком та/або мерчантом. У списку є рядки, створені і одиночним POST /cashback-bank-accruals, і пакетним POST /v2/cashback-bank-accruals.

Заголовки: x-trace-id uuid

Query-параметри

ПолеТипОбов’язковийОпис
pagenumberНіНомер сторінки (за замовчуванням: 1)
pageSizenumberНіРозмір сторінки (за замовчуванням: 10)
campaignIdUUIDНіФільтр за ID кампанії (cashback ID)
bankIdUUIDНіФільтр за ID банку
retailerIdUUIDНіФільтр за ID мерчанта
dateFromstring (ISO date)НіПочаток діапазону дати покупки
dateTostring (ISO date)НіКінець діапазону дати покупки
GET /cashback-bank-accruals?bankId=33333333-4444-4333-8444-555555555503&dateFrom=2026-09-01&dateTo=2026-09-30&page=1&pageSize=10

Відповідь

ПолеТипОпис
dataarrayСписок записів (та сама структура, що в POST)
pagination.pagenumberПоточна сторінка
pagination.pageSizenumberРозмір сторінки
pagination.totalPagesnumberУсього сторінок
pagination.totalItemsnumberУсього записів
pagination.hasNextPagebooleanЧи є наступна сторінка
pagination.hasPrevPagebooleanЧи є попередня сторінка
{
  "data": [
    {
      "id": "44444444-5555-4333-8444-555555555504",
      "campaignId": "11111111-2222-4333-8444-555555555501",
      "bankId": "33333333-4444-4333-8444-555555555503",
      "transactionId": "2qtL1H/HGEeJ8iV3eiLwdQ==",
      "cardMask": "464237******1234",
      "operationDate": "2026-09-10T12:00:00Z",
      "operationAmount": 250.50,
      "cashbackAmount": 15.50,
      "rrn": "525609471435",
      "orderId": null,
      "status": "approved",
      "bankPaymentShare": 7.50,
      "merchantPaymentShare": 8.00,
      "purchaseDate": "2026-09-10T12:00:00Z",
      "retailerId": null,
      "createdAt": "2026-09-10T12:00:05.000Z",
      "updatedAt": "2026-09-10T12:00:05.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 10,
    "totalPages": 1,
    "totalItems": 1,
    "hasNextPage": false,
    "hasPrevPage": false
  }
}

Помилки

HTTP-кодТип помилкиОпис
400BadRequestExceptionНевалідні query-параметри
500DatabaseExceptionПомилка бази даних

Примітки

  • Перша версія (POST /cashback-bank-accruals) — одна транзакція в тілі запиту. Друга (POST /v2/cashback-bank-accruals) — масив транзакцій accruals на одну кампанію і один банк.
  • Для refund передавайте від’ємну cashbackAmount (аналогічно до попереднього API відповідей банку) і в одиночному POST, і в елементах accruals.
  • Доступ до API — на рівні інфраструктури (JWT, IP allow-list); див. JWT авторизація.