API з PII (фаза 2)

DeepLoyalty API з PII

Що таке PII?

Персональні дані, також відомі як особиста інформація або персонально ідентифікована інформація (PII) (джерело)

У нашому випадку PII включає:

  • Ім’я клієнта
  • Телефон
  • Дату народження клієнта

Вимоги до Bank API

Загальна схема

Загальна схема — отримання картки лояльності (банк, платформа, ритейлер)

Загальна схема — обробка чеків і нарахування бонусів

Основні дані передаються з платформи до ритейлера

  • Отримання токена авторизації для доступу до API ритейлера
  • Реєстрація\пошук клієнта (після отримання згоди від клієнта)
  • Ініціювання нарахування бонусів на основі чека та знайденого клієнта

Основні дані передаються від ритейлера до платформи

  • Отримання токена авторизації для доступу до API платформи
  • Загальна інформація про всі безготівкові покупки (як ідентифіковані з нарахованими бонусами, так і неідентифіковані) з метою:
    • Ідентифіковані покупки — інформація про нараховані бонуси одразу передається до банківської виписки для відображення клієнту
    • Неідентифіковані покупки — ідентифікуємо покупки шляхом порівняння з транзакціями клієнта на картках і подальшого додаткового нарахування бонусів клієнту на основі структури чека
    1. Факт нарахування бонусів після успішного знаходження чека та транзакції клієнта

BASE_URL:

devprod
https://api.dev.deeployalty.iohttps://api.deeployalty.io

Банки

Авторизація

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

Метод: GET

URL: /retailers

Параметри: sortByName

Доступні значення: ASC, DESC

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

HTTP-код: 200

{
  "result": "ok",
  "traceID": "24f6550d-8fdd-4aaf-bc42-677cc588f2d8",
  "retailers": [
    {
      "retailerId": "0b92202e-5b79-480f-9b3e-33679b81372e",
      "name": "KIMS",
      "nameEn": "KIMS",
      "description": "KIMS - Мережа хімчисток одягу та взуття в Україні",
      "logoUrl": "https://loyalty-cads-deeployalty-static-file-storage.s3.eu-central-1.amazonaws.com/70b2ad1b-1093-441c-adf1-f6f724a640fb",
      "iosAppUrl": null,
      "androidAppUrl": null,
      "dateOfAdd": "2024-11-05",
      "codeType": "Code 39",
      "useCode": true
    },
    {
      "retailerId": "1e931bd9-9309-4474-babc-6196f4a16089",
      "name": "SOCAR Energy",
      "nameEn": "SOCAR Energy",
      "description": "Socar — мережа автозаправних комплексів в Україні",
      "logoUrl": "https://loyalty-cads-deeployalty-static-file-storage.s3.eu-central-1.amazonaws.com/0808d0b3-6c90-4ef4-8ab2-4d48a27c3759",
      "iosAppUrl": "https://apps.apple.com/ua/app/socarlevel/id691196059?l=uk",
      "androidAppUrl": "https://play.google.com/store/apps/details?id=com.bizico.socar&hl=uk",
      "dateOfAdd": "2024-11-05",
      "codeType": "pdf417",
      "useCode": true
    }
  ]
}

Опис об’єкта відповіді

ПараметрТипОпис
resultstringСтатус відповіді ok/error
retailersarrayМасив ритейлерів

Опис масиву retailers

ПараметрТипОпис
retailerIdstringСтатус відповіді ok/error
namestringНазва ритейлера
descriptionstringОпис ритейлера
logoUrlstringURL логотипу ритейлера
iosAppUrlstringURL iOS-додатку ритейлера
androidAppUrlstringURL Android-додатку ритейлера
useCodebooleanРитейлер використовує QR/BAR-коди
dateOfAddstringдата додавання до системи
codeTypestringтип qr\barcode

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

HTTP-код: 500

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

{
  "result": "error",
  "error": {
    "...": "..."
  },
  "traceID": "e63b811e-aab1-4de5-be73-b2b1ed291b7f",
  "statusCode": 500
}

Отримання відкритих карток лояльності користувача за банком

Ендпоінт: /cards/customer

Метод: GET

Параметри: customerId

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

HTTP-код: 200

{
  "result": "ok",
  "traceID": "08a3e1cb-32dc-4af3-a6d6-f42a00a7b60f",
  "cards": [
    {
      "bankId": "5aec26a8-d2da-49a3-96be-b9da2448f426",
      "retailerId": "b7720467-363d-4c5a-aabd-b51cd595856d",
      "customerId": "29090",
      "cardNumber": "+11088775032",
      "statusCode": "d44e29c2-ba73-4f66-8186-e14f88c4dd6f",
      "createdAt": "2024-10-10T14:32:19.674Z"
    },
    {
      "bankId": "5aec26a8-d2da-49a3-96be-b9da2448f426",
      "retailerId": "09238c4a-cbe2-4a96-b15d-d678ec921691",
      "customerId": "29090",
      "cardNumber": "0e8ba4fd-3e85-11ef-a97a-005056b90a07",
      "statusCode": "d44e29c2-ba73-4f66-8186-e14f88c4dd6f",
      "createdAt": "2024-11-07T18:45:23.867Z"
    }
  ]
}

Відповідь

Опис об’єкта відповіді

ПолеТипОпис
resultstringСтатус відповіді ok/error
cardsarrayМасив ритейлерів

Опис масиву retailers

ПолеТипОпис
bankIdstringУнікальний ID банку
retailerIdstringУнікальний ID ритейлера
customerIdstringУнікальний ID клієнта в банку
cardNumberstringНомер картки користувача
statusCodestringСтатус картки лояльності. d44e29c2-ba73-4f66-8186-e14f88c4dd6f — знайдено існуючу картку, e8b8b056-0291-45b8-9ff0-7eb0489ab837 — зареєстровано нову картку
createdAtstringДата створення картки лояльності

Пошук\реєстрація картки лояльності (банк)

Метод: POST

URL: /card

Картка лояльності — реєстрація / пошук (банк)

Опис основного об’єкта

ПараметрТипОбов’язковийОпис
retailersarray of uuidТакМасив ID ритейлерів
first_namestringТакІм’я клієнта
middle_namestringТакПо батькові клієнта
last_namestringТакПрізвище клієнта
date_birthdateТакДата народження клієнта. Формат yyyy-mm-dd
phonestringТакНомер телефону клієнта (без ”+“)
emailstringТакEmail клієнта
customerIdstringТакID клієнта в банку

Тіло запиту:

{
  "retailers": ["09238c4a-cbe3-4a96-b15d-d678ec921692", "b4a12b27-21db-4c55-9b1e-00b914f3ffd8"],
  "first_name": "Іван",
  "middle_name": "Васильович",
  "last_name": "Петров",
  "date_birth": "1983-07-21",
  "phone": "380992222222",
  "email": "petrov.ivan@gmail.com",
  "customerId": "1234567890"
}

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

HTTP-код: 201

{
  "message": "Successfully received",
  "traceID": "b5a12b39-62dd-4e55-8b2e-01b914f3gfd5"
}

Асинхронна відповідь до Bank API

{
  "result": "ok",
  "card": "777777208698700",
  "balance": 0,//in uah
  "cardStatus": "e8b8b056-0291-45b8-9ff0-7eb0489ab837",
  "traceID": "e63b811e-aab1-4de5-be73-b2b1ed291b7f",
  "retailerId": "c4a12b27-21db-4c55-9b1e-00b914f3ffd8"
}

Опис об’єкта відповіді

ПараметрТипОпис
resultstringСтатус відповіді ok/error
cardstringНомер картки лояльності
cardStatusuuidСтатус картки: d44e29c2-ba73-4f66-8186-e14f88c4dd6f — знайдено існуючу картку; e8b8b056-0291-45b8-9ff0-7eb0489ab837 — зареєстровано нову картку
balancenumberБаланс картки лояльності
traceIDuuidID запиту
retailerIduuidID ритейлера

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

HTTP-код: 400

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

{
  "result": "error",
  "description": "Validation error",
  "error": "\"date_birth\" is required",
  "traceID": "87fdfae6-9340-4b23-a73b-233d0c35bf11"
}

Асинхронна відповідь з помилкою до Bank API

{
  "result": "error",
  "description": "Registration error",
  "error": "Client not found",
  "traceID": "87fdfae6-9340-4b23-a73b-233d0c35bf11",
  "retailerId": "c4a12b27-21db-4c55-9b1e-00b914f3ffd8",
  "statusCode": 404
}

Отримання балансу картки лояльності (банк)

Метод: POST

URL: /balance

Картка лояльності — отримання балансу (банк)

Опис основного об’єкта

ПараметрТипОбов’язковийОпис
retailerIduuidТакID ритейлера
customerIdstringТакID клієнта в банку

Тіло запиту:

{
  "retailerId": "09238c4a-cbe3-4a96-b15d-d678ec921692",
  "customerId": "1234567890"
}

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

HTTP-код: 200

{
  "result": "ok",
  "card": "777777208698700",
  "balance": 0,//in uah
  "traceID": "e63b811e-aab1-4de5-be73-b2b1ed291b7f",
  "retailerId": "c4a12b27-21db-4c55-9b1e-00b914f3ffd8"
}

Опис об’єкта відповіді

ПараметрТипОпис
resultstringСтатус відповіді ok/error
cardstringНомер картки лояльності
balancenumberБаланс картки лояльності
traceIDuuidID запиту
retailerIduuidID ритейлера

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

HTTP-код: 400/500

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

{
  "result": "error",
  "error": {
    "...": "..."
  },
  "traceID": "e63b811e-aab1-4de5-be73-b2b1ed291b7f",
  "retailerId": "c4a12b27-21db-4c55-9b1e-00b914f3ffd8"
}

Помилки

ПараметрТипОпис
errorobjectПомилка ритейлера

Отримання QR/Bar-коду картки лояльності (банк)

Метод: POST

URL: /qr

Картка лояльності — отримання QR / штрихкоду (банк)

Опис основного об’єкта

ПараметрТипОбов’язковийОпис
retailerIduuidТакID ритейлера
customerIdstringТакID клієнта в банку

Тіло запиту:

{
  "retailerId": "09238c4a-cbe3-4a96-b15d-d678ec921692",
  "customerId": "1234567890"
}

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

HTTP-код: 200

{
  "result": "ok",
  "type": "qr",
  "cardType": "bonus",
  "code": "AAKLSJWJJJJJDPWPFRFVHWJWHWWWWFSFFDDS...FDFFFHJDGKLDSHNDSLDSKGLFLSDJSDJHSHFLDFL9FDKEJHW",
  "codeExpire": "1718305539438",
  "traceID": "ace75bae-ee93-415f-8cb1-0642b1269ba2",
  "retailerId": "c4a12b27-21db-4c55-9b1e-00b914f3ffd8"
}

//value in timestamp (without timezone) or null - if qr is static

HTTP-код: 200

{
  "result": "ok",
  "type": "Code 128", for barcode
  "cardType": "discount",
  "code": "AAKLSJWJJJJJDPWPFRFVHWJWHWWWWFSFFDDS...FDFFFHJDGKLDSHNDSLDSKGLFLSDJSDJHSHFLDFL9FDKEJHW",
  "traceID": "ace75bae-ee93-415f-8cb1-0642b1269ba2",
  "retailerId": "c4a12b27-21db-4c55-9b1e-00b914f3ffd8"
}

Типи штрихкодів:

  • UPC-A
  • UPC-E
  • Code 128
  • EAN-13
  • EAN-8
  • Code 39
  • Interleaved 2 of 5
  • Codabar
  • pdf417

Опис об’єкта відповіді

ПараметрТипОпис
resultstringСтатус відповіді ok/error
typestringТип коду (qr/bar)
cardTypestringbonus — ритейлер використовує картку лояльності з бонусами; discount — ритейлер використовує дисконтну картку без бонусів
codestringКод картки лояльності
traceIDuuidID запиту
retailerIduuidID ритейлера
codeExpirestringчас дії QR-коду

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

HTTP-код: 400/500

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

{
  "result": "error",
  "error": {
    "...": "..."
  },
  "traceID": "e63b811e-aab1-4de5-be73-b2b1ed291b7f",
  "retailerId": "c4a12b27-21db-4c55-9b1e-00b914f3ffd8"
}

Помилки

ПараметрТипОпис
errorobjectПомилка ритейлера

Інформація про нарахування бонусів (банк)

Метод: POST

URL: /transaction

Опис основного об’єкта

ПараметрТипОбов’язковийОпис
transaction_idstringТакID транзакції в банку
balancenumberТакПоточний бонусний баланс клієнта
added_bonusesnumberТакНараховані бонуси
request_idstringТакID запиту банку

Тіло запиту:

{
  "transaction_id": "09238c4a-cbe3-4a96-b15d-d678ec921692",
  "request_id ": "33324995830-fd2324",
  "balance": 130,
  "added_bonuses": 23
}

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

HTTP-код: 200

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

{
  "transaction_id": "Transaction ID in bank",
  "status": "Status of adding bonuses"
}

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

HTTP-код: 400

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

{
  "text": "Error text"
}

Скасування картки лояльності (банк)

Метод: POST

URL: /cancel

Опис основного об’єкта

ПараметрТипОбов’язковийОпис
retailerIdstringТакID ритейлера
cardnumberТакПоточний бонусний баланс клієнта
customerIdstringТакID клієнта

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

HTTP-код: 200

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

{
  "result": "ok",
  "card": "24087fee-2ccd-11ef-a97a-005056b90a07",
  "traceID": "357373d1-e24e-4105-bc70-805448728eab",
  "retailerId": "09238c4a-cbe2-4a96-b15d-d678ec921691"
}

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

HTTP-код: 400

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

{
  "result": "error",
  "description": "Validation error",
  "error": {
    "message": "\"customerId\" is required"
  },
  "traceID": "e12791bb-ae5e-4667-9427-2713347105c5"
}

Список помилок Retailer API — Помилки Retailer API для картки лояльності


Ритейлери

Авторизація

Реєстрація/отримання номера картки лояльності

Метод: POST

URL: /card/register

Опис об’єкта заголовків

ПараметрТипОбов’язковийОпис
AuthorizationstringТакBasic або інший тип заголовка авторизації

Опис основного об’єкта

ПараметрТипОбов’язковийОпис
first_namestringТакІм’я клієнта
middle_namestringТакПо батькові клієнта
last_namestringТакПрізвище клієнта
date_birthdateТакДата народження клієнта у форматі “YYYY-MM-DD”
phonestringТакНомер телефону клієнта у форматі “380XXXXXXXXX”
emailstringТакEmail клієнта
datetimenumberТакПоточний timestamp
traceIDuuidТакID запиту

Тіло запиту:

{
  "first_name": "Ганна",
  "middle_name": "Петрівна",
  "last_name": "Шевченко",
  "date_birth": "1996-04-16",
  "phone": "380991234567",
  "email": "someemail.ganna@gmail.com",
  "datetime": 1693481166857,
  "traceID": "812191c4-612a-42d2-b45e-31055ee29c0a"
}

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

HTTP-код: 200

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

{
  "result": "ok",
  "card": "7777666655554444",
  "cardStatus": "e8b8b056-0291-45b8-9ff0-7eb0489ab837"
}

Опис об’єкта відповіді

ПараметрТипОбов’язковийОпис
resultstringТакРезультат запиту (ok/error)
cardstringТакНомер картки лояльності
cardStatusuuidТакСтатус картки: d44e29c2-ba73-4f66-8186-e14f88c4dd6f — знайдено існуючу картку; e8b8b056-0291-45b8-9ff0-7eb0489ab837 — зареєстровано нову картку

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

HTTP-код: 400

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

{
  "result": "error",
  "error": "Error text or object"
}

Отримання балансу картки лояльності

Метод: GET

URL: /card/balance

Опис об’єкта заголовків

ПараметрТипОбов’язковийОпис
AuthorizationstringТакBasic або інший тип заголовка авторизації

Параметри запиту

ПараметрТипОбов’язковийОпис
cardstringТакНомер картки лояльності клієнта

Приклад запиту: /card/balance?11122233444

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

HTTP-код: 200

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

{
  "result": "ok",
  "card": "7777666655554444",
  "balance": 123
}

//in uah

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

HTTP-код: 400

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

{
  "result": "error",
  "error": "Error text or object"
}

Отримання QR/Bar-коду картки лояльності (банк)

Метод: GET

URL: /card/code

Опис об’єкта заголовків

ПараметрТипОбов’язковийОпис
AuthorizationstringТакBasic або інший тип заголовка авторизації

Опис основного об’єкта

ПараметрТипОбов’язковийОпис
cardstringТакНомер картки лояльності клієнта
datetimenumberТакПоточний timestamp
traceIDuuidТакID запиту

Тіло запиту:

{
  "card": "7777666655554444",
  "datetime": 1693481166857,
  "traceID": "812191c4-612a-42d2-b45e-31055ee29c0a"
}

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

HTTP-код: 200

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

{
  "result": "ok",
  "card": "7777666655554444",
  "type": "qr",
  "code": "AAKLSJWJJJJJDPWPFRFVHWJWHWWWWFSFFDDS...FDFFFHJDGKLDSHNDSLDSKGLFLSDJSDJHSHFLDFL9FDKEJHW"
}

// or “bar”

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

HTTP-код: 400

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

{
  "result": "error",
  "error": "Error text or object"
}

Ідентифікація клієнта

Ідентифікація клієнта в ритейлера:

  • orderId - ID чека
  • customerId - ID клієнта

POST

URL: /customer_ident

Тіло запиту:

{
  "orderId": "Purchase receipt ID",
  "customerId": "customer's ID"
}

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

HTTP-код: 200

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

{
  "result": "ok"
}

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

HTTP-код: 400

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

{
  "result": "error",
  "text": "error text"
}

Ініціювання нарахування бонусів

Після ідентифікації клієнта за чеком платформа надішле:

  • orderId - ID чека
  • transactionId - ID транзакції в банку (має бути повернутий у відповіді після зарахування бонусів)
  • card - Картка лояльності клієнта

POST

URL: /addbonuses

Тіло запиту:

{
  "orderId": "Purchase receipt ID",
  "transactionId": "Bank transaction ID",
  "card ": "Client's loyalty card number"
}

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

HTTP-код: 200

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

{
  "balance": "Client's current bonus balance",
  "added_bonuses": "Added bonuses"
}

//in uah

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

HTTP-код: 400

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

{
  "text": "Error text"
}

Асинхронна відповідь для нарахування бонусів

Метод: POST

URL: /card/accrual

Опис об’єкта заголовків

ПараметрТипОбов’язковийОпис
AuthorizationstringТакBasic або інший тип заголовка авторизації

Опис основного об’єкта

ПараметрТипОбов’язковийОпис
cardstringТакНомер картки лояльності клієнта
balancenumberТакБаланс картки лояльності клієнта
added_bonusesnumberТакНараховані бонуси
order_idstringТакID замовлення чека

Тіло запиту:

{
  "card": "99087342111",
  "balance": 1496.87,
  "added_bonuses": 11.25,
  "order_id": "d44e29c2-ba73-4f66-8186-e14f88c4dd6f"
}

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

HTTP-код: 200

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

{
  "result": "ok"
}

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

HTTP-код: 400

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

{
  "status": 400,
  "code": 1008,
  "message": "Error text"
}