КешбекиAPI адмін-панелі кешбеку для банків

API адмін-панелі кешбеку для банків

Зовнішнє API для інтеграції кор-проєкту банку з адмін-панеллю кешбеків Deeployalty. Аналог API адмін-панелі кешбеку для мерчантів, але для банків.

ENV:

DevProd
https://admin-panel.dev.deeployalty.io/deeployalty-admin/https://admin-panel.deeployalty.io/deeployalty-admin/

Swagger (OpenAPI)

Інтерактивна документація зі схемами запитів і відповідей:

DevProd
Swagger UIadmin-panel.dev.deeployalty.io/deeployalty-admin/swaggeradmin-panel.deeployalty.io/deeployalty-admin/swagger

У Swagger шукайте ендпоінти з префіксом /cashbacks/for-bank та підтвердження/відхилення кампаній банком.

Інструкція зі звірки кешбек-кампаній у порталі (звіти банку та мерчанта): звірка кешбек-кампаній.

Авторизація

Авторизація для всіх API відбувається за допомогою Bearer Token.

Як згенерувати Bearer Token

Для генерації токена використовуйте api.

Приклад:

{
  "Authorization": "Bearer {{authToken}}"
}

Зверніть увагу: токен має термін дії.


Отримання списку кешбеків

Метод: GET

Ендпоінт: /cashbacks/for-bank

Query-параметри:

ПараметрТипОбов’язковийОпис
namestringНіНазва кешбеку
skustring[]НіSKU товару
retailerIduuidНіID мерчанта
statusstringНіСтатус кампанії: active, finished, approved, deleted
bankApprovalStatusstringНіГрупа статусів кешбеку в банку (див. Статус банку нижче)
dateFromstring (ISO8601)НіДата початку кешбеку
dateTostring (ISO8601)НіДата завершення кешбеку

Статус кешбеку

Статус кешбекуОпис
activeкешбек-кампанії розпочато і вони активні
finishedкешбек-кампанії завершено (фільтр відповідає статусу awaitingCompensationConfirmation)
approvedучасть у кешбек-кампанії схвалено банком і мерчантом (кампанія ще не стартувала)
deletedкешбек-кампанію видалено

Для інтеграції з адмін-панеллю та отримання всіх кешбек-кампаній, які дійсно схвалені банком і мерчантом і будуть активні на конкретну дату, потрібно брати статус active для всієї кампанії, а не лише active у масиві banks[].

Якщо кампанія активна і мерчант додає ще один термінал, повний список terminal id можна взяти в terminals[]. Наприклад, використовуйте сервіс, який раз на 12 годин перевіряє, чи змінилося це поле; якщо так — оновіть дані у своїй системі.

Статус банку

Статус банкуОпис
pendingкешбек-кампанія очікує рішення банку
approvedучасть у кешбек-кампанії схвалено банком
declinedучасть у кешбек-кампанії відхилено банком
expiredкешбек-кампанія завершилася або мерчант схвалив старт кампанії без цього банку

Успішна відповідь

HTTP-код: 200

Тіло відповіді:

[
  {
    "cashbackId": "11111111-2222-4333-8444-555555555501",
    "retailerId": "22222222-3333-4333-8444-555555555502",
    "createdByRetailerId": "22222222-3333-4333-8444-555555555502",
    "createdByBankId": null,
    "createdByType": "retailer",
    "banks": [
      {
        "id": "33333333-4444-4333-8444-555555555503",
        "status": "pending",
        "settlementConfirmed": false,
        "bankReportingStatus": null,
        "hasBankReport": false,
        "hasSecondBankReport": false,
        "merchantReportUploadsCount": 0
      }
    ],
    "name": "Кешбек на продукти (приклад)",
    "description": "Опис кампанії (приклад)",
    "participationTerms": "Умови участі (приклад)",
    "bannerSmall": "https://cdn.example.invalid/banners/small.png",
    "bannerBig": "https://cdn.example.invalid/banners/big.png",
    "sku": ["SKU-EXAMPLE-001"],
    "categoryId": ["10", "20"],
    "allProducts": false,
    "purchaseOnline": true,
    "purchaseOffline": true,
    "dateFrom": "2026-01-01T00:00:00.000Z",
    "dateTo": "2026-03-31T23:59:59.999Z",
    "minAmount": 100,
    "maxAmount": 5000,
    "maxBudget": 100000,
    "percentage": 10,
    "expectedCompensation": null,
    "merchantCompensationPercentage": 0,
    "merchantCategoryCode": ["5411"],
    "countryId": "44444444-5555-4333-8444-555555555504",
    "terminals": [
      {
        "terminal_id": "TERM-0001",
        "terminal_name": "Каса №1 (приклад)",
        "terminal_location": "м. Київ, вул. Прикладна, 1"
      }
    ],
    "terminalsDeeployalty": false,
    "paymentSystemsId": [
      "aaaaaaaa-bbbb-4ccc-8ddd-000000000001",
      "aaaaaaaa-bbbb-4ccc-8ddd-000000000002"
    ],
    "status": "awaitingBankApproval",
    "createdAt": "2026-01-15T10:00:00.000Z",
    "updatedAt": "2026-01-15T10:00:00.000Z",
    "retailer": {
      "retailerId": "22222222-3333-4333-8444-555555555502",
      "name": "Мерчант (приклад)"
    },
    "country": {
      "id": "44444444-5555-4333-8444-555555555504",
      "name": "Ukraine",
      "code": "UA",
      "currency": {
        "code": "UAH",
        "icon": "",
        "name": "Ukrainian hryvnia",
        "symbol": "₴"
      }
    },
    "segment": {
      "segmentId": "55555555-6666-4333-8444-555555555505",
      "cashbackId": "11111111-2222-4333-8444-555555555501",
      "customersCount": 2,
      "customerIds": [
        "66666666-7777-4333-8444-555555555506",
        "77777777-8888-4333-8444-555555555507"
      ],
      "formedAt": "2026-01-10T12:00:00.000Z",
      "sourceFileName": "segment-upload-example.xlsx"
    }
  }
]

Формат відповіді: масив об’єктів (без пагінації). У кожному елементі — кампанія, до якої ваш банк доданий учасником. Масив banks[] містить лише ваш банк (ідентифікатор з JWT).

Поля кампанії (корінь об’єкта)

ПолеТипОпис
cashbackIduuidІдентифікатор кешбек-кампанії
retailerIduuidМерчант-власник кампанії
createdByRetailerIduuid | nullМерчант, який створив кампанію (якщо автор — мерчант)
createdByBankIduuid | nullБанк, який створив кампанію (якщо автор — банк)
createdByTypestringХто створив кампанію: bank або retailer
namestringНазва кампанії
descriptionstring | nullОпис для клієнтів / UI
participationTermsstring | nullУмови участі в кампанії
bannerSmallstring | nullURL або data-URI малого банера
bannerBigstring | nullURL або data-URI великого банера
skustring[]SKU товарів, на які діє кешбек (порожній масив, якщо не застосовується)
categoryIdstring[]Ідентифікатори категорій товарів
allProductsbooleantrue — кешбек на весь асортимент без прив’язки до SKU/категорій
purchaseOnlinebooleanКешбек діє на онлайн-покупки
purchaseOfflinebooleanКешбек діє на офлайн-покупки
dateFromstring (ISO8601)Початок періоду кампанії (UTC)
dateTostring (ISO8601)Кінець періоду кампанії (UTC)
minAmountnumber | nullМінімальна сума чека для нарахування
maxAmountnumber | nullМаксимальна сума чека для нарахування
maxBudgetnumber | nullМаксимальний бюджет кампанії (на банк)
percentagenumber | nullВідсоток кешбеку
expectedCompensationnumber | nullОчікувана компенсація (якщо задана)
merchantCompensationPercentagenumber | nullЧастка компенсації мерчанта (0–100), решта — банк
merchantCategoryCodestring[] | nullMCC-коди мерчанта для кампанії
countryIduuid | nullКраїна кампанії
terminalsDeeployaltybooleantrue — перелік терміналів із довідника Deeployalty
paymentSystemsIduuid[]Платіжні системи, дозволені для кампанії
statusstringДетальний статус кампанії (див. таблицю нижче)
createdAtstring (ISO8601)Час створення
updatedAtstring (ISO8601)Час останнього оновлення

Статус кампанії (status)

Значення з внутрішнього життєвого циклу кампанії. Для фільтрації в query використовуйте зведені значення з розділу «Статус кешбеку» вище; у відповіді приходить детальний статус, наприклад:

ЗначенняКоли зустрічається
awaitingBankApprovalОчікує рішення банку
awaitingMerchantApprovalОчікує рішення мерчанта
approvedСхвалено, ще не стартувала
activeКампанія активна
awaitingCompensationConfirmationПеріод завершено, етап звірки / компенсації
completed, paymentConfirmed, awaitingCompensationPayment, compensationReceivedПізніші етапи після звірки
declined, expired, deletedВідхилено, прострочено або видалено

Повний перелік також у Swagger.

Участь вашого банку (banks[])

ПолеТипОпис
banksarrayЗавжди один елемент — ваш банк
banks[].iduuidID банку (з JWT)
banks[].statusstringРішення банку: pending, approved, declined, expired (див. «Статус банку»)
banks[].settlementConfirmedbooleanЧи мерчант підтвердив врегулювання з цим банком
banks[].bankReportingStatusstring | nullЕтап звірки після завершення періоду кампанії; null, поки період не завершено або банк не approved
banks[].hasBankReportbooleanЧи завантажено звіт банку
banks[].hasSecondBankReportbooleanЧи є повторне завантаження звіту банку (після коментарів мерчанта)
banks[].merchantReportUploadsCountnumberСкільки разів мерчант завантажував свій звіт

Значення bankReportingStatus

ЗначенняОпис
awaitingBankReconciliationОчікується перший звіт банку
awaitingMerchantReconciliationConfirmationЗвіт банку є, очікується дія мерчанта
awaitingUpdatedBankReconciliationМерчант завантажив звіт, очікується оновлений звіт банку
awaitingCompensationConfirmationЗвірка завершена, очікується підтвердження компенсації

Мерчант (retailer)

ПолеТипОпис
retailer.retailerIduuidID мерчанта
retailer.namestringНазва мерчанта

Країна (country)

ПолеТипОпис
country.iduuidID країни
country.namestringНазва країни
country.codestringКод ISO 3166-1 alpha-2
country.currency.codestringКод валюти (наприклад UAH)
country.currency.namestringНазва валюти
country.currency.symbolstringСимвол валюти
country.currency.iconstringURL іконки валюти (може бути порожнім)

Термінали (terminals[])

ПолеТипОпис
terminalsarrayТермінали, на яких діє кампанія (з деталями зі знімка або довідника)
terminals[].terminal_idstringІдентифікатор терміналу
terminals[].terminal_namestring | nullНазва (null, якщо невідома)
terminals[].terminal_locationstring | nullЛокація (null, якщо невідома)
terminals[].merchant_idstring | nullОпційно: ID мерчанта в платіжній системі
terminals[].merchant_namestring | nullОпційно: назва в платіжній системі

Сегмент клієнтів банку (segment)

ПолеТипОпис
segmentobject | nullСегмент клієнтів вашого банку для цієї кампанії; null, якщо мерчант не формував сегмент
segment.segmentIduuidID сегмента
segment.cashbackIduuidID кампанії
segment.customersCountnumberКількість клієнтів у сегменті
segment.customerIdsstring[]Ідентифікатори клієнтів (внутрішні ID Deeployalty)
segment.formedAtstring (ISO8601)Час формування сегмента
segment.sourceFileNamestringНазва файлу, з якого мерчант сформував сегмент

Відповідь з помилкою

HTTP-код: 400

Тіло відповіді:

{
  "statusCode": 400,
  "message": [
    "retailerId must be a UUID",
    "name must be shorter than or equal to 27 characters",
    "merchantCompensationPercentage must be at least 0"
  ],
  "error": "Bad Request"
}

Коди помилок:

  • 400 — помилки валідації (невірний UUID, довжина рядка, діапазон числа)
  • 401 — неавторизовано (відсутній або невірний JWT-токен)
  • 403 — заборонено (недостатньо прав — потрібна роль ADMIN або EDITOR)

Отримання списку мерчантів

Метод: GET

Ендпоінт: /retailers

Успішна відповідь

HTTP-код: 200

Тіло відповіді:

[
  {
    "retailerId": "22222222-3333-4333-8444-555555555502",
    "name": "Мерчант (приклад)",
    "webhookUrl": null,
    "apiUrl": null,
    "description": "Опис мерчанта (приклад)",
    "logoUrl": "https://cdn.example.invalid/merchants/logo.png",
    "iosAppUrl": null,
    "androidAppUrl": null,
    "login": null,
    "urlIdent": "example-merchant",
    "rro": null,
    "nameEn": "Example merchant",
    "cardIssuing": null,
    "cardPresentationId": "88888888-9999-4333-8444-555555555508",
    "isReview": false,
    "isMask": false,
    "dataSaleToWebhook": null,
    "domain": ["merchant.example"],
    "excludedBank": null,
    "merchantCategoryCode": ["5411", "5812"],
    "createdAt": "2026-01-01T10:00:00.000Z",
    "updateAt": "2026-01-15T10:00:00.000Z"
  }
]

Отримання даних мерчанта

Метод: GET

Ендпоінт: /retailers/:id

ПараметрТипОбов’язковийОпис
iduuidТакID мерчанта (retailerId)

Успішна відповідь

HTTP-код: 200

Тіло відповіді:

{
  "retailerId": "22222222-3333-4333-8444-555555555502",
  "name": "Мерчант (приклад)",
  "webhookUrl": null,
  "apiUrl": null,
  "description": "Опис мерчанта (приклад)",
  "logoUrl": "https://cdn.example.invalid/merchants/logo.png",
  "iosAppUrl": null,
  "androidAppUrl": null,
  "login": null,
  "urlIdent": "example-merchant",
  "rro": null,
  "nameEn": "Example merchant",
  "cardIssuing": null,
  "cardPresentationId": "88888888-9999-4333-8444-555555555508",
  "isReview": false,
  "isMask": false,
  "dataSaleToWebhook": null,
  "domain": ["merchant.example"],
  "excludedBank": null,
  "merchantCategoryCode": ["5411", "5812"],
  "createdAt": "2026-01-01T10:00:00.000Z",
  "updateAt": "2026-01-15T10:00:00.000Z"
}

Підтвердження кешбек-кампанії банком

Метод: POST

Ендпоінт: /cashbacks/:cashbackId/confirm

Параметри (path):

ПараметрТипОбов’язковийОпис
cashbackIduuidТакID кешбеку

Успішна відповідь

HTTP-код: 201

Тіло відповіді:

{
  "id": "11111111-2222-4333-8444-555555555501",
  "status": "awaitingBankApproval",
  "message": "Cashback confirmed successfully",
  "createdAt": "2026-01-15T10:05:00.000Z",
  "updatedAt": "2026-01-15T10:05:00.000Z"
}
ПолеТипОпис
iduuidID кешбек-кампанії (cashbackId)
statusstringСтатус кампанії після підтвердження (детальний lifecycle, див. GET /cashbacks/for-bank)
messagestringТекст результату; для кампанії, створеної банком, може бути Cashback confirmed successfully and campaign auto-approved
createdAtstring (ISO8601)Час створення кампанії
updatedAtstring (ISO8601)Час останнього оновлення

Відповідь з помилкою

HTTP-код: 400

Тіло відповіді:

{
  "statusCode": 400,
  "message": "Cashback not found",
  "error": "Bad Request"
}

Коди помилок:

  • 400 — Bad Request (кешбек не знайдено, невірний ID кешбеку)
  • 401 — неавторизовано (відсутній або невірний JWT-токен)
  • 403 — заборонено (недостатньо прав — потрібна роль ADMIN або EDITOR, або користувач не є банком)

Відхилення кешбек-кампанії банком

Метод: POST

Ендпоінт: /cashbacks/:cashbackId/reject

Параметри (path):

ПараметрТипОбов’язковийОпис
cashbackIduuidТакID кешбеку

Тіло запиту:

ПараметрТипОбов’язковийОпис
commentstringНіКоментар із причиною відхилення
{
  "comment": "Campaign does not meet our requirements"
}

Успішна відповідь

HTTP-код: 201

{
  "id": "11111111-2222-4333-8444-555555555501",
  "status": "awaitingBankApproval",
  "message": "Cashback rejected successfully",
  "createdAt": "2026-01-15T10:05:00.000Z",
  "updatedAt": "2026-01-15T10:05:00.000Z"
}
ПолеТипОпис
iduuidID кешбек-кампанії (cashbackId)
statusstringСтатус кампанії після відхилення. Для кампанії, створеної банком, зазвичай declined. Для кампанії мерчанта статус кампанії може не змінитися (наприклад awaitingBankApproval) — відхилення вашого банку видно в banks[].status = declined у GET /cashbacks/for-bank
messagestringЗавжди Cashback rejected successfully при успіху
createdAtstring (ISO8601)Час створення кампанії
updatedAtstring (ISO8601)Час останнього оновлення

Відповідь з помилкою

HTTP-код: 400

Тіло відповіді:

{
  "statusCode": 400,
  "message": "Cashback not found",
  "error": "Bad Request"
}

Коди помилок:

  • 400 — Bad Request (кешбек не знайдено, невірний ID кешбеку)
  • 401 — неавторизовано (відсутній або невірний JWT-токен)
  • 403 — заборонено (недостатньо прав — потрібна роль ADMIN або EDITOR, або користувач не є банком)