API Документація
Документація зовнішнього API для інтеграції з платформою Karbovanets.
Автентифікація
Всі API ендпоінти вимагають автентифікації одним із наступних методів:
API Ключ (Рекомендовано для інтеграцій)
X-API-Key: krb_aBcDeFgHiJkLmNoPqRsTuVwXyZ123456789012345678
Bearer Token
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
Важливо: Перший API ключ необхідно створити через веб-версію особистого кабінету. Після цього ви можете створювати додаткові ключі через API. Максимум 3 ключі на користувача.
Коди помилок
| Код | Опис |
|---|---|
| 400 | Невірні вхідні дані |
| 401 | Невірна або відсутня автентифікація |
| 404 | Ресурс не знайдено |
| 409 | Конфлікт бізнес-логіки |
| 422 | Помилка валідації |
Інформація про користувача
Повертає інформацію про автентифікованого користувача.
Відповідь
{
"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"
}
}
}
Мова інтерфейсу користувача
Зберігає мову автентифікованого користувача. Ця мова використовується для всіх сервісних листів (підтвердження email, статуси замовлень тощо). Доступні коди визначаються списком активних мов на сервері (наразі: en, uk, ru).
Тіло запиту
{
"data": {
"type": "language",
"attributes": {
"code": "uk"
}
}
}
Відповідь
204 No Content у разі успіху. 422 Unprocessable Entity — якщо код мови невідомий або мова не активна.
API Ключі
Створює новий 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). |
Обрані валюти
Повертає список обраних валют користувача з пагінацією.
Параметри запиту
| Параметр | Тип | Опис |
|---|---|---|
| page | integer | Номер сторінки |
| perPage | integer | Результатів на сторінку |
| filters[code] | string | Фільтр за кодом валюти |
| filters[base_currency] | string | Фільтр за базовою валютою |
Додає валюту до обраних. Відповідь: 204 No Content.
Видаляє валюту з обраних. Відповідь: 204 No Content.
Замовлення
Повертає список замовлень користувача з пагінацією та фільтрацією.
Параметри запиту
| Параметр | Тип | Опис |
|---|---|---|
| page | integer | Номер сторінки |
| perPage | integer | Результатів на сторінку |
| filters[hash] | string | Фільтр за хешем |
| filters[status] | string | CREATED, PENDING, PAID, EXPIRED, CANCELLED |
Статуси замовлень
| Статус | Опис |
|---|---|
| CREATED | Замовлення створено, очікує оплати |
| PENDING | Оплата в обробці |
| PAID | Замовлення оплачено та виконано |
| EXPIRED | Час на оплату вичерпано |
| CANCELLED | Замовлення скасовано |
Повертає одне замовлення за ID.
Повертає одне замовлення за хешем.
Створює нове замовлення.
Тіло запиту
{
"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_type | integer | Спосіб оплати (див. нижче) |
| to_amount | string | Сума до отримання |
| to_currency | string | Код валюти |
| custom_fields | object | Динамічні поля валюти |
| callback_url | string | URL для вебхука (опціонально) |
Варіанти payout_type
| Значення | Опис |
|---|---|
| 1 | Баланс — Сума замовлення буде списана з поточного балансу користувача. Користувач повинен мати достатньо коштів. |
| 2 |
Крипто оплата — У відповіді буде вказана адреса гаманця (поле in_requisite), на яку потрібно відправити крипту для оплати замовлення.
|
Скасовує замовлення. Відповідь: 204 No Content.
Завантажує історію замовлень як CSV файл (до 1000 останніх замовлень).
Депозити
Повертає список депозитів користувача з пагінацією.
Статуси депозитів
| Статус | Опис |
|---|---|
| CREATED | Депозит створено, очікує переказу |
| IN_PROGRESS | Переказ в обробці |
| SUCCESS | Депозит успішно зараховано |
| FAILED | Помилка зарахування |
Повертає один депозит за ID.
Створює новий запит на депозит.
Тіло запиту
{
"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 у тілі запиту не передається.
Створює виплату (ордер з джерелом 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_currency | string | Код валюти отримувача (має існувати в системі). |
to_amount | string | Сума у валюті отримувача (десяткове число рядком). |
fields | object | Мапа { тег → значення }. Список тегів — нижче. |
callback_url | string (url) | URL, на який ми POST-немо статус виплати на термінальних статусах. |
external_id | string | Ваш ідентифікатор виплати. Унікальний у межах вашого API-ключа — повтор віддасть 409. |
Теги полів
Ключі в fields — це теги custom-полів. Сервіс зіставляє тег із конкретним custom-полем валюти й валідатором (тип, мін/макс довжина тощо). Якщо тег не пов'язаний з жодним полем валюти — він ігнорується; якщо обов'язкове поле відсутнє — повертається 422 з тегом у field.
Приблизні назви — будуть уточнені.
| Поле | Тег | Приклад |
|---|---|---|
| Карта | card | 4242 4242 4242 4242 |
| CVU / CBU (Аргентина) | cbu | 0000003100000000000001 |
| IBAN / CLABE | iban | UA00 0000 0000 0000 0000 0000 000 |
| BSB code (Австралія) | bsb | 062-001 |
| Pix Key (Бразилія) | pix | [email protected] |
| Номер рахунку отримувача | account | 26000123456789 |
| Назва банку | bank | Privatbank |
| Банк-кореспондент | corr_bank | JPMorgan Chase, SWIFT CHASUS33 |
| ПІБ отримувача | fio | Ivanov Ivan Ivanovych |
| Номер телефону | phone | +380501234567 |
| Email отримувача | email | [email protected] |
| ІПН / податковий номер | ipn | 1234567890 |
| Країна отримувача | country | UA |
| Призначення платежу | purpose | Оплата послуг |
Відповідь (201 Created)
{
"data": {
"type": "orders",
"id": "<order_uid>",
"attributes": { "status": "PAID", "hash": "...", "...": "..." }
}
}
Помилки
| HTTP | Код | Опис |
|---|---|---|
| 400 | 6003 | Недостатньо коштів на балансі власника API-ключа. |
| 409 | 7003 | Виплата з таким external_id уже існує. |
| 422 | 0000 | Не пройшла валідація. У полі field — тег, що зламався (напр. card). |
| 401 | 2003 | Не передано / невалідний 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 хвилин.