API Документація

Документація зовнішнього API для інтеграції з платформою Karbovanets.

Автентифікація

Всі API ендпоінти вимагають автентифікації одним із наступних методів:

API Ключ (Рекомендовано для інтеграцій)

X-API-Key: krb_aBcDeFgHiJkLmNoPqRsTuVwXyZ123456789012345678

Bearer Token

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...

Важливо: Перший API ключ необхідно створити через веб-версію особистого кабінету. Після цього ви можете створювати додаткові ключі через API. Максимум 3 ключі на користувача.

Коди помилок

Код Опис
400Невірні вхідні дані
401Невірна або відсутня автентифікація
404Ресурс не знайдено
409Конфлікт бізнес-логіки
422Помилка валідації

Інформація про користувача

GET /users/me

Повертає інформацію про автентифікованого користувача.

Відповідь

{
  "data": {
    "type": "users",
    "id": "GApnxJlkaIVC92d4o44n6",
    "attributes": {
      "email": "[email protected]",
      "balance": {
        "value": "1500.00000000",
        "precision": 8
      },
      "language": "uk",
      "created_at": "2024-01-15 10:30:00",
      "updated_at": "2024-03-18 14:20:00"
    }
  }
}

Мова інтерфейсу користувача

POST /users/me/language

Зберігає мову автентифікованого користувача. Ця мова використовується для всіх сервісних листів (підтвердження email, статуси замовлень тощо). Доступні коди визначаються списком активних мов на сервері (наразі: en, uk, ru).

Тіло запиту

{
  "data": {
    "type": "language",
    "attributes": {
      "code": "uk"
    }
  }
}

Відповідь

204 No Content у разі успіху. 422 Unprocessable Entity — якщо код мови невідомий або мова не активна.

API Ключі

POST /users/me/api-keys

Створює новий API ключ. Максимум 3 ключі на користувача.

Увага: Ключ показується лише один раз при створенні. Збережіть його надійно.

Відповідь (201 Created)

{
  "data": {
    "type": "api_keys",
    "id": "xK9mNpQrStUvWxYz12345",
    "attributes": {
      "key": "krb_aBcDeFgHiJkLmNoPqRsTuVwXyZ123456789012345678",
      "callback_signing_key": "aBcD1234eFgH5678iJkL9012mNoP3456qRsT7890uVwX1234yZ56",
      "created_at": "2024-03-18T10:00:00Z"
    }
  }
}

Поля відповіді

Поле Опис
keyСам API-ключ. Передається в заголовку X-API-Key для будь-якого захищеного запиту.
callback_signing_keyСпільний секрет для перевірки підпису вихідних payout-вебхуків (HMAC-SHA512 у заголовку PAYLOAD-WITH-SIGNATURE).

Обрані валюти

GET /me/currencies

Повертає список обраних валют користувача з пагінацією.

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

Параметр Тип Опис
pageintegerНомер сторінки
perPageintegerРезультатів на сторінку
filters[code]stringФільтр за кодом валюти
filters[base_currency]stringФільтр за базовою валютою
POST /me/currencies/{currency_id}/favourites

Додає валюту до обраних. Відповідь: 204 No Content.

DELETE /me/currencies/{currency_id}/favourites

Видаляє валюту з обраних. Відповідь: 204 No Content.

Замовлення

GET /orders

Повертає список замовлень користувача з пагінацією та фільтрацією.

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

Параметр Тип Опис
pageintegerНомер сторінки
perPageintegerРезультатів на сторінку
filters[hash]stringФільтр за хешем
filters[status]stringCREATED, PENDING, PAID, EXPIRED, CANCELLED

Статуси замовлень

Статус Опис
CREATEDЗамовлення створено, очікує оплати
PENDINGОплата в обробці
PAIDЗамовлення оплачено та виконано
EXPIREDЧас на оплату вичерпано
CANCELLEDЗамовлення скасовано
GET /orders/{order_id}

Повертає одне замовлення за ID.

GET /order/{order_hash}

Повертає одне замовлення за хешем.

POST /orders

Створює нове замовлення.

Тіло запиту

{
  "data": {
    "type": "create_order_request",
    "attributes": {
      "payout_type": 1,
      "to_amount": "1000",
      "to_currency": "P24UAH",
      "custom_fields": {
        "unq_identifier_37": "4149123456789012"
      },
      "callback_url": "https://your-site.com/webhook/order"
    }
  }
}

Поля запиту

Поле Тип Опис
payout_typeintegerСпосіб оплати (див. нижче)
to_amountstringСума до отримання
to_currencystringКод валюти
custom_fieldsobjectДинамічні поля валюти
callback_urlstringURL для вебхука (опціонально)

Варіанти payout_type

Значення Опис
1 Баланс — Сума замовлення буде списана з поточного балансу користувача. Користувач повинен мати достатньо коштів.
2 Крипто оплата — У відповіді буде вказана адреса гаманця (поле in_requisite), на яку потрібно відправити крипту для оплати замовлення.
POST /orders/{order_id}/cancel

Скасовує замовлення. Відповідь: 204 No Content.

GET /user/orders/history/download

Завантажує історію замовлень як CSV файл (до 1000 останніх замовлень).

Депозити

GET /deposits

Повертає список депозитів користувача з пагінацією.

Статуси депозитів

Статус Опис
CREATEDДепозит створено, очікує переказу
IN_PROGRESSПереказ в обробці
SUCCESSДепозит успішно зараховано
FAILEDПомилка зарахування
GET /deposits/{deposit_id}

Повертає один депозит за ID.

POST /deposits

Створює новий запит на депозит.

Тіло запиту

{
  "data": {
    "type": "create_deposit_request",
    "attributes": {
      "amount": 500.00
    }
  }
}

Як поповнити баланс: 1) Створіть депозит через POST /deposits. 2) Отримайте USDT TRC20 адресу з відповіді. 3) Відправте USDT на цю адресу. 4) Система автоматично зарахує кошти на ваш баланс.

Виплати (API-source)

Тільки X-API-Key. Цей роут не приймає Bearer-токен. Юзер, з балансу якого знімаються кошти — власник API-ключа; user_id у тілі запиту не передається.

POST /payout

Створює виплату (ордер з джерелом api) у валюті отримувача. Сума одразу списується з балансу власника API-ключа. Значення полів виплати передаються тегами — внутрішнє відображення тег → custom field робить сам сервіс (див. Теги полів).

Тіло запиту

{
  "data": {
    "type": "create_payout_request",
    "attributes": {
      "to_currency": "P24UAH",
      "to_amount": "1500.00",
      "fields": {
        "card": "4242424242424242",
        "fio": "Ivanov Ivan",
        "iban": "UA00..."
      },
      "callback_url": "https://exchanger.example.com/webhook/auto-withdraws-integrations/karbovanets_uah/abc123",
      "external_id": "abc123"
    }
  }
}

Поля запиту

Поле Тип Опис
to_currencystringКод валюти отримувача (має існувати в системі).
to_amountstringСума у валюті отримувача (десяткове число рядком).
fieldsobjectМапа { тег → значення }. Список тегів — нижче.
callback_urlstring (url)URL, на який ми POST-немо статус виплати на термінальних статусах.
external_idstringВаш ідентифікатор виплати. Унікальний у межах вашого API-ключа — повтор віддасть 409.

Теги полів

Ключі в fields — це теги custom-полів. Сервіс зіставляє тег із конкретним custom-полем валюти й валідатором (тип, мін/макс довжина тощо). Якщо тег не пов'язаний з жодним полем валюти — він ігнорується; якщо обов'язкове поле відсутнє — повертається 422 з тегом у field.

Приблизні назви — будуть уточнені.

Поле Тег Приклад
Картаcard4242 4242 4242 4242
CVU / CBU (Аргентина)cbu0000003100000000000001
IBAN / CLABEibanUA00 0000 0000 0000 0000 0000 000
BSB code (Австралія)bsb062-001
Pix Key (Бразилія)pix[email protected]
Номер рахунку отримувачаaccount26000123456789
Назва банкуbankPrivatbank
Банк-кореспондентcorr_bankJPMorgan Chase, SWIFT CHASUS33
ПІБ отримувачаfioIvanov Ivan Ivanovych
Номер телефонуphone+380501234567
Email отримувачаemail[email protected]
ІПН / податковий номерipn1234567890
Країна отримувачаcountryUA
Призначення платежуpurposeОплата послуг

Відповідь (201 Created)

{
  "data": {
    "type": "orders",
    "id": "<order_uid>",
    "attributes": { "status": "PAID", "hash": "...", "...": "..." }
  }
}

Помилки

HTTP Код Опис
4006003Недостатньо коштів на балансі власника API-ключа.
4097003Виплата з таким external_id уже існує.
4220000Не пройшла валідація. У полі field — тег, що зламався (напр. card).
4012003Не передано / невалідний X-API-Key.

Зворотний вебхук

Після створення виплати система оновлює статус ордера у фоні. Тільки на термінальних статусах (COMPLETED, ERROR, CANCELLED, DELETED) ми відправляємо POST на ваш callback_url. Тіло запиту підписане HMAC-SHA512 від base64(utf8_encode(raw_body)) із вашим callback_signing_key (отриманим при створенні API-ключа). Підпис у заголовку PAYLOAD-WITH-SIGNATURE.

POST {callback_url}
Content-Type: application/json
PAYLOAD-WITH-SIGNATURE: <hmac-sha512>

{
  "status": 3,
  "card_number": "4242...",
  "amount_to_pay": "1500.00",
  "amount_paid": "1500.00",
  "payment_id": 12345,
  "operator_email": null
}
status Сенс
3Виконано (COMPLETED)
5Помилка / скасовано / видалено (ERROR / CANCELLED / DELETED)

Ретраї доставки

Будь-яка відповідь, яка не 2xx (включно з 4xx: 401, 403, 404, 429 тощо), а також помилки рівня з'єднання (DNS, timeout) — вважаються транзитними. Ми ретраїмо доставку до 3 разів із backoff-ом: 60s → 300s → 300s. Це дає час полагодити whitelist, ротацію токена чи короткий релізний даунтайм на вашому боці без втрати вебхука. Якщо після усіх спроб 2xx не отримано — спроба фіксується в логах; рекомендуємо як fallback час від часу звіряти статус ордера через ваші внутрішні монiторинги.

Вебхуки

При створенні замовлення з callback_url, система надішле POST запит на ваш URL при зміні статусу замовлення.

Тіло вебхука

{
  "order_id": "coY8sOZ6sej4RKvOUvIgq",
  "hash": "abc123def456",
  "status": "PAID",
  "amount": "100.00000000",
  "to_amount": "4125.00000000",
  "currency_from": "USDTTRC20",
  "currency_to": "P24UAH",
  "created_at": "2024-03-18T10:00:00+00:00",
  "updated_at": "2024-03-18T10:15:00+00:00"
}

Політика повторів: 3 спроби з затримками 1, 5 та 15 хвилин.