Sign in
Конвертації/Convert API

Convert API

Конвертуйте криптовалюти напряму з балансу вашого мерчанта — отримайте живу котирування та виконайте за ринковою ціною.

Convert API дозволяє обмінювати валюти, які зберігаються на балансі вашого мерчанта, за поточною ринковою ціною — той самий рушій, що працює у вкладці Обмін панелі мерчанта, тепер доступний із вашого бекенду.

Ендпоінти Convert підписуються вашим звичайним API-ключем — тим самим, що використовується для запитів Payment API, а не ключем Payout API. Виконання конвертації одразу списує та зараховує баланс вашого мерчанта, тож ставтеся до цього ключа з такою ж обережністю, як до будь-яких облікових даних, що рухають гроші.

Отримати ціну конвертації

Повертає орієнтовну котирування для конвертації за поточною ринковою ціною — ефективний курс і підсумкові суми. Нічого не списується і не резервується; викликайте скільки завгодно разів перед виконанням.

POST/v1/convert/price

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

ПолеТипОбов'язковоОписЗначення
from_currencystringтакВалюта, з якої конвертуємо
to_currencystringтакВалюта, в яку конвертуємо. Має відрізнятися від from_currency
amountdecimalтакСума конвертації, більша за 0
amount_typestringтакДо якої сторони належить amount

amount_type=from — витратити рівно amount у from_currency. amount_type=to — отримати рівно amount у to_currency.

🟢 200 OK · application/json

JSON
{
  "state": 0,
  "result": {
    "success": true,
    "from_currency": "BTC",
    "to_currency": "USDT",
    "amount_type": "from",
    "from_amount": "0.01000000",
    "to_amount": "947.86690000",
    "effective_rate": "94786.69000000",
    "from_amount_usd": "947.87",
    "to_amount_usd": "947.87"
  }
}

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

ПолеТипОпис
successbooleanЧи вдалося успішно розрахувати котирування
from_currencystringВихідна валюта
to_currencystringЦільова валюта
amount_typestringПовторює amount_type із запиту
from_amountstringСума, яка буде списана в from_currency
to_amountstringСума, яка буде зарахована в to_currency
effective_ratestringКурс, застосований до цього котирування — 1 одиниця from_currency у to_currency (уже враховує ціноутворення платформи)
from_amount_usdstring | nullЕквівалент from_amount у USD
to_amount_usdstring | nullЕквівалент to_amount у USD
  • Котирування є лише орієнтовним — ринкова ціна може змінитися між отриманням котирування і викликом виконання.
  • Цей виклик не списує і не резервує жодного балансу.
Credentials
RequestPOST/v1/convert/price
curl -X POST https://api.2328.io/api/v1/convert/price \
  -H "Content-Type: application/json" \
  -H "User-Agent: MyShop/1.0 (+https://myshop.example)" \
  -H "project: YOUR_PROJECT_UUID" \
  -H "sign: YOUR_HMAC_SIGNATURE"
Response
Click Try it to see the response here.

Виконати конвертацію

Виконує конвертацію за поточною ринковою ціною та оновлює баланс вашого мерчанта. Окремого кроку «підтвердити котирування» немає — викликайте цей ендпоінт напряму із сумою, яку хочете конвертувати.

POST/v1/convert

Ідемпотентність. Повторення точно того самого запиту (ті самі from_currency, to_currency, amount, amount_type) протягом приблизно хвилини після першого виклику поверне вже наявну конвертацію замість створення другої. Після закінчення цього вікна ідентичний запит вважатиметься новою конвертацією — не повторюйте виклик наосліп після таймауту, спершу перевірте результат попереднього виклику.

Цей ендпоінт обмежено 10 запитами на хвилину на одного викликача — суворіше за загальний ліміт API, — оскільки кожен виклик рухає реальний баланс.

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

ПолеТипОбов'язковоОписЗначення
from_currencystringтакВалюта, з якої конвертуємо
to_currencystringтакВалюта, в яку конвертуємо. Має відрізнятися від from_currency
amountdecimalтакСума конвертації, більша за 0
amount_typestringтакДо якої сторони належить amount

🟢 200 OK · application/json

JSON
{
  "state": 0,
  "result": {
    "id": 12345,
    "type": "manual",
    "status": "completed",
    "from_currency": "BTC",
    "to_currency": "USDT",
    "from_amount": "0.01000000",
    "requested_from_amount": "0.01000000",
    "refund_amount": null,
    "to_amount": "947.86690000",
    "exchange_rate": "94786.69000000",
    "fee_amount": "0.00000000",
    "from_amount_usd": "947.87",
    "to_amount_usd": "947.87",
    "processed_at": "2026-01-20T15:30:24Z",
    "created_at": "2026-01-20T15:30:22Z"
  }
}

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

ПолеТипОпис
idintID ордера конвертації, присвоєний системою
typestringЗавжди manual для цього API
statusstringПоточний статус (див. «Статуси конвертації» нижче)
from_currencystringВихідна валюта
to_currencystringЦільова валюта
from_amountstringСписана сума в from_currency
requested_from_amountstring | nullЗапитана вами вихідна сума при amount_type = from. null при amount_type = to
refund_amountstring | nullЧастина попередньо списаної суми, повернена вам після часткового виконання. null, якщо ордер виконано повністю
to_amountstringЗарахована сума в to_currency
exchange_ratestringКурс, фактично застосований до цієї конвертації — 1 одиниця from_currency у to_currency (уже враховує ціноутворення платформи)
fee_amountstringКомісія платформи за цю конвертацію, у from_currency або to_currency залежно від напрямку операції. Вже врахована в exchange_rate — показана для прозорості
from_amount_usdstring | nullЕквівалент from_amount у USD
to_amount_usdstring | nullЕквівалент to_amount у USD
processed_atstring (ISO 8601) | nullКоли конвертація завершила виконання. null, поки вона в обробці
created_atstring (ISO 8601)Коли було створено ордер конвертації

Статуси конвертації

СтатусОпис
pendingСтворено, ще не надіслано на ринок
processingБаланс заблоковано, ордер розміщено на ринку
completedПовністю виконано — to_amount зараховано на ваш баланс
failedНе вдалося виконати — попередньо списану суму автоматично повернуто
partially_completedЛише для валютних пар без прямого ринку (маршрутизація через проміжну валюту): перший етап завершився успішно, але другий — ні. Вам зараховується проміжна валюта замість to_currency — сконвертуйте її ще раз, щоб досягти початкової мети
RequestPOST/v1/convert
curl -X POST https://api.2328.io/api/v1/convert \
  -H "Content-Type: application/json" \
  -H "User-Agent: MyShop/1.0 (+https://myshop.example)" \
  -H "project: YOUR_PROJECT_UUID" \
  -H "sign: YOUR_HMAC_SIGNATURE"
Response
Click Try it to see the response here.

Помилки

У разі помилки відповідь містить state: 1 та error_code — спільні для /v1/convert/price і /v1/convert:

🔴 422 / 400 · application/json

JSON
{
  "state": 1,
  "error_code": "amount_too_small",
  "errors": {
    "amount": "Amount is too small for this conversion. Please increase the amount and try again."
  }
}
error_codeHTTP-статусОпис
validation_failed422Некоректні або відсутні параметри, або відмова через бізнес-правило (наприклад, недостатньо балансу) — деталі в полі errors
amount_too_small422amount менше за мінімальний торговельний розмір для цієї валютної пари
convert_unavailable400Наразі не вдалося виконати конвертацію (дані ринку недоступні або немає маршруту між двома валютами) — спробуйте трохи пізніше
internal_error400Неочікувана внутрішня помилка сервера під час обробки запиту

Автоматичне конвертування вхідних платежів

Автоконвертація — це налаштування проєкту для вхідних рахунків-фактур та кредитів статичного гаманця. Вона налаштовується на панелі управління торговця, а не шляхом додавання полів до /v1/payment. Кожне правило обирає одну або кілька валют-джерел та цільову валюту.

Після завершення конвертації, інформація про платіж та вебхуки торговця можуть включати:

JSON
{
  "payment_amount": "0.14800000",
  "merchant_amount": "0.146520000000000000",
  "payer_currency": "XMR",
  "convert": {
    "to_currency": "USDT",
    "commission": "0.09000000",
    "rate": "323.21000000",
    "amount": "47.262015740000000000"
  }
}

Діапазони сум свідомо розділені:

  • payment_amount — що було зафіксовано в мережі в валюті джерела платежу;
  • merchant_amount — чиста сума джерела, що належить торговцю до конвертації;
  • convert.amount — сума, зарахована у convert.to_currency;
  • convert.rate і convert.commission — виконаний результат конвертації, а не ціна, яку ви повинні перераховувати локально.

Відсутність convert має значення: конвертація могла не завершитися, можливо, не налаштована для цього джерела або повернулася до кредиту у валюті джерела. Ніколи не вигадуйте цільову суму з /exchange-rates або публічної ринкової ціни.

Не вдалося автоматично конвертувати та відбулося повернення

Конвертація відбувається після отримання платежу у блокчейні. Наявність на ринку, мінімальні розміри замовлень, обмеження точності, тайм-аути бірж та недостатня ліквідність для виконання можуть затримати або запобігти конвертації.

  • Депозити нижче глобального/проектного мінімуму обходять конвеєр конвертації та зараховуються у валюті джерела.
  • Перехідні збої можуть бути повторені асинхронно.
  • Великі або неприбуткові депозити можуть повертатися до кредиту у вихідній валюті після вичерпання політики повторних спроб.
  • Отже, платіж може бути дійсним навіть тоді, коли бажане конвертування в цільову валюту не відбулося.

Ваша інтеграція повинна спочатку зберегти підтверджений платіж, а потім узгодити фактично зараховану валюту з інформації про платіж, необов’язкового блоку convert та балансів продавця. Не блокувати підтвердження webhook платежу, очікуючи на власні аналітичні або інформаційні системи.

Тести прийнятності автоматичної конверсії

Перевірте принаймні: успішне пряме конвертування, конвертацію через проміжну валюту/багатоступеневу, пил нижче мінімуму, тимчасова повторна спроба, повернення до вихідної валюти, недоплата, переплата, дубльоване веб-хуків, відсутність convert та звірка після неоднозначного тайм-ауту.

Крайові випадки ручного конвертування

  • /v1/convert/price є орієнтовним переглядом; рух ринку може змінити результат виконання.
  • amount_type: from виправляє запит зі сторони джерела, тоді як amount_type: to запитує суму зі сторони цілі. Не міняйте значення при представленні інтерфейсу підтвердження.
  • Пару без прямого ринку можна провести через проміжну валюту. Якщо завершиться лише одна частина, partially_completed повідомляє про проміжну кредитну суму.
  • Якщо виклик execute перевищує час очікування, виконайте узгодження перед повторною спробою. Ринковий ордер може бути виконаний навіть якщо його HTTP-відповідь втрачена.
  • Ставтеся до failed як до стану для узгодження, а не як до дозволу застосовувати локальний запис компенсуючого балансу; платформа володіє обліком дебету/пільг.