Як проходить платіж
Схема однакова в усіх режимах. Відрізняються лише місце, куди йдуть гроші, та інструменти довкола.
checkout_url.provider — одразу обраний метод.currency і надсилає USDC (Polygon) на одноразову адресу.paid. З акаунтом ви також отримуєте вебхук і повідомлення в Telegram.Базова URL-адреса для всіх викликів API: https://api.utopay.app. Запити й відповіді — JSON (content-type: application/json). Суми — числа у валюті замовлення; час — мілісекунди Unix.
Швидкий старт
Справжній платіж одним запитом — без реєстрації. Покупця відправлено одразу в PayPal; якщо PayPal не може прийняти цей платіж, відкриється наша сторінка з іншими методами.
curl -X POST https://api.utopay.app/v1/pay \ -H "content-type: application/json" \ -d '{ "amount": 100, "currency": "USD", "payout_wallet": "0xYourPolygonWalletAddress000000000000000000", "provider": "paypal", "success_url": "https://yoursite.com/thanks" }' # → { "id": "ord_…", "checkout_url": "https://api.utopay.app/pay/ord_…/go?provider=paypal", … }
Перенаправте покупця на checkout_url. Після оплати на ваш гаманець надійде близько 95.5 USDC. З акаунтом ви натомість викликали б POST /v1/payments з API-ключем — ті самі поля, плюс історія, вебхуки та баланс.
Порівняння режимів
| Без акаунта | Акаунт · Напряму | Акаунт · Зберігання | |
|---|---|---|---|
| Ендпоінт | POST /v1/pay | POST /v1/payments | |
| Автентифікація | немає | Bearer utopay_sk_… | |
| Ви отримуєте | USDC (Polygon) на гаманець із запиту | USDC (Polygon) на гаманець проєкту | Баланс у валюті замовлення |
Покупець одразу в метод (provider) | ✓ | ✓ | ✓ |
| Усі валюти | ✓ | ✓ | ✓ |
| Кабінет та історія замовлень | — | ✓ | ✓ |
| Вебхуки / сповіщення в Telegram | — | ✓ | ✓ |
| Платіжні посилання з кабінету | — | ✓ | ✓ |
| Тестовий режим (sandbox) | — | ✓ | ✓ |
| Баланс, обмін, конвертація, виведення | — | — | ✓ |
| Реферальна програма | — | ✓ | ✓ |
| Комісія | 4.5% | 4.5% | |
Без акаунта
POST /v1/pay
Без заголовка Authorization. Гроші завжди йдуть напряму на payout_wallet — EVM-адресу, що може приймати USDC у мережі Polygon. Тіло таке саме, як у POST /v1/payments, плюс:
| Поле | Тип | Обов'язкове | Примітки |
|---|---|---|---|
payout_wallet | string | ✓ | 0x + 40 hex-символів. Куди надсилається ваша частка. |
- Завжди
direct:"settlement": "custody"повертає400— без акаунта немає балансу для зарахування. - Фіксована комісія 4.5%, без реферальної програми, без вебхуків (
callback_urlзберігається, але не викликається), без тестового режиму, стандартний дизайн сторінки оплати. - Відстеження: опитуйте публічний
GET /api/checkout/:id/status(без ключа) або стежте за гаманцем.
Акаунт і API-ключі
В акаунті може бути до 20 проєктів (по одному на сайт). У кожного свої ключі, вебхуки, гаманець, брендинг, режим коштів і статистика; баланс спільний для всього акаунта.
Authorization: Bearer utopay_sk_live_xxxxxxxxxxxxxxxxxxxx
| Ключ | Формат | Застосування |
|---|---|---|
| Live secret | utopay_sk_live_… | Лише на сервері. Створює справжні платежі. |
| Test secret | utopay_sk_test_… | Імітація платежів, гроші не рухаються — Тестовий режим. |
| Publishable | utopay_pk_… | Не може створювати платежі (403). Зарезервований для клієнтського коду. |
Ключ показується один раз; ми зберігаємо лише його хеш. Ніколи не розміщуйте секретний ключ у коді браузера чи мобільного застосунку.
Створення платежу
POST /v1/payments Bearer sk
| Поле | Тип | Обов. | Примітки |
|---|---|---|---|
amount | number | ✓ | > 0, у currency, округлюється до 2 знаків. Максимум 1 000 000. |
currency | string | — | ISO-код валюти, якою платить покупець, за замовчуванням USD. Регістр не важливий. Див. Валюти. |
provider | string | — | Відправити покупця одразу в цей спосіб оплати, оминаючи нашу сторінку — напр. paypal, revolut, stripe. Якщо він недоступний — відкриється наша сторінка. Див. Покупець одразу в метод. Псевдонім: payment_option (має пріоритет, якщо передано обидва). |
settlement | string | — | "direct" або "custody". За замовчуванням: режим коштів проєкту. |
payment_methods | string | — | Що бачить покупець на сторінці оплати: "both" (вкладки «картка й гаманці» + «криптовалюта»), "cards" або "crypto". За замовчуванням: налаштування проєкту (Кошти й виплати), інакше "both". З криптою покупець обирає мережу й монету та платить 1.5%; замовлення отримує paid_with: "crypto". З direct монети йдуть одразу на ваші крипто-гаманці, з custody — зараховуються на ваш баланс UTOPAY, гаманці не потрібні. |
email | string | — | Email покупця (перевіряється), передається провайдеру. |
description | string | — | До 500 символів. Показується покупцю, повертається у вебхуках. |
success_url | string | — | Абсолютна http(s) URL-адреса: куди провайдер повертає покупця і куди веде кнопка «Повернутися на сайт» після оплати. |
cancel_url | string | — | Абсолютна http(s) URL-адреса, передається провайдеру для скасованого платежу. |
callback_url | string | — | Абсолютна http(s) URL-адреса. Кожна подія цього замовлення (payment.succeeded, failed, underpaid, expired) надсилається туди POST-запитом у форматі вебхука з підписом x-utopay-signature, ключ HMAC — sha256(секретний ключ) (hex) ключа, що створив замовлення. Використовується плагінами для CMS. Лише для платежів з API-ключем. |
curl -X POST https://api.utopay.app/v1/payments \ -H "Authorization: Bearer utopay_sk_live_xxxxxxxxxxxxxxxxxxxx" \ -H "content-type: application/json" \ -d '{ "amount": 250, "currency": "EUR", "email": "[email protected]", "description": "Invoice #118", "provider": "revolut", "success_url": "https://yoursite.com/thanks" }'
{
"id": "ord_Kd83mQp0aVxY",
"status": "pending",
"amount": 250, "currency": "EUR",
"checkout_url": "https://api.utopay.app/pay/ord_Kd83mQp0aVxY/go?provider=revolut",
"payment_page_url": "https://api.utopay.app/pay/ord_Kd83mQp0aVxY",
"provider": "revolut",
"routing": { "mode": "direct_to_provider", "requested_provider": "revolut", "reason": null },
"settlement": "direct",
"payout_coin": "USDC", "payout_network": "polygon",
… full list in Order object
}
Завжди перенаправляйте покупця на checkout_url. Збережіть payment_page_url, якщо потрібне посилання «обрати інший метод» — воно завжди відкриває нашу сторінку.
Покупець одразу в спосіб оплати
Працює в усіх режимах — з API-ключем, без акаунта, у платіжних посиланнях із кабінету і у формі без коду на /payment-links. Вкажіть provider, і покупець потрапить одразу до цього провайдера (напр. PayPal), не бачачи нашої форми оплати.
400 зі списком допустимих id. Відомий, але зараз недоступний (офлайн, сума нижча за його мінімум, не та валюта) → замовлення все одно створюється, checkout_url веде на нашу сторінку./pay/:id/go?provider=… перевіряє ще раз і перенаправляє покупця на сторінку оплати самого провайдера.routing у відповіді показує, що сталося: mode — direct_to_provider або payment_page; reason — null, provider_offline, provider_below_minimum, provider_currency, provider_disabled або project_routing (обрано з пріоритетних провайдерів вашого проєкту).
GET /v1/providers?amount=¤cy= публічний
Методи, доступні зараз для цієї суми й валюти, з id, name, region, status, minimum_amount і minimum_currency. Список змінюється — перевіряйте його, а не прописуйте в коді.
provider | Метод | Де працює | Мінімум* |
|---|---|---|---|
stripe | Картка, Apple Pay, Google Pay | US / EU | 2 USD |
paypal | PayPal | США | 5 USD |
revolut | Revolut | EU / EEA | 6 EUR |
coinbase | Coinbase Pay | Увесь світ | 2 USD |
cashapp | Cash App | США | 2 USD |
robinhood | Robinhood | США | 5 USD |
klarna | Klarna (Pay Now) | Швеція | 125 SEK |
ideal | iDEAL | Нідерланди | 46 EUR |
banxa | Картка, банківський переказ | Увесь світ | 11 USD |
transak | Картка, банківський переказ, UPI | Увесь світ | 30 USD |
binance, blockchaincom, topper, meld, alchemypay, sardine, particle | Картка через партнера | різниться | 10–30 USD |
* Мінімуми й доступність задає платіжна мережа, і вони змінюються; перед порівнянням сума конвертується у валюту мінімуму. Деякі провайдери можуть попросити покупця пройти швидку одноразову перевірку особи.
Валюти й що ви отримуєте
currency — валюта, якою платить покупець. Хоч би якою вона була, провайдер конвертує гроші, і вони рухаються як USDC у мережі Polygon.
GET /v1/currencies публічний
Коди, що приймаються в currency | Власний підбаланс (custody) |
|---|---|
USD EUR GBP CAD INR SEK | ✓ |
AUD NZD CHF NOK DKK PLN CZK HUF TRY UAH JPY SGD HKD AED MYR THB PHP IDR BRL MXN COP ZAR NGN | зараховується в USD |
Будь-який інший код повертає 400. Провайдер може показати покупцю ціну у своїй валюті (напр. Revolut у EUR) — покупець однаково платить еквівалент вашої суми. Деякі методи приймають лише певні валюти; для них /v1/providers?currency=… їх не показує.
Що й куди надходить
| Режим | Ви отримуєте | Приклад: замовлення на 100 EUR |
|---|---|---|
Без акаунта (/v1/pay) | USDC у мережі Polygon напряму на payout_wallet, 95.5% від USDC, що доставив провайдер | ≈ 100 EUR у USD × 0.955 ≈ 107 USDC (за курсом 1 EUR ≈ 1.12 USD) |
| Акаунт · Напряму | Те саме — USDC у мережі Polygon на гаманець проєкту; кабінет показує замовлення в EUR | ≈ 107 USDC on-chain |
| Акаунт · Зберігання в UTOPAY | Внутрішній баланс у валюті замовлення (сума × 95.5%), якщо в неї є власний підбаланс; інакше USD за поточним курсом | 95.50 EUR на балансі EUR (замовлення на 100 BRL → ≈ 19 USD на балансі USD) |
Точна сума USDC, що надійшла, після оплати є в полі received_amount замовлення; вона може трохи відрізнятися від оцінки, бо курс конвертації встановлює провайдер. Збережені баланси можна обмінювати між валютами й виводити в USDC, USDT, BTC, ETH тощо — див. Зберігання в UTOPAY.
Статус платежу
GET /v1/payments/:id Bearer sk
Замовлення в тому самому форматі. Поки воно не paid, ми також перевіряємо живий статус у провайдера, тож опитування надійне, навіть якщо callback затримується, — зарахування на баланс і ваш вебхук у будь-якому разі відбуваються рівно один раз. Видно лише проєкт самого ключа (інакше 404).
GET /v1/payments?limit=&offset=&status= Bearer sk
Замовлення проєкту, спершу новіші. limit 1–500 (за замовчуванням 50), status = pending | paid | failed.
GET /api/checkout/:id/status публічний
Без ключа: { "id", "status", "amount", "currency", "updated_at" }. Використовуйте для замовлень, створених без акаунта. Не вважайте перехід на success_url доказом оплати — перевіряйте статус.
Крипто-шлюз
Покупець платить напряму криптовалютою — USDT, USDC, ETH, BTC та іншими — на унікальну адресу замовлення. Усе, що надійшло, одразу пересилається on-chain на ваш гаманець — або, з settlement: "custody", зараховується на ваш баланс UTOPAY (гаманці не потрібні). Комісія 1.5%, утримується з отриманої суми; комісія блокчейну — окремо.
GET /v1/crypto/coins публічний
Кожна монета/мережа з ticker (те, що ви передаєте як coin, напр. polygon/usdc, bep20/usdt, erc20/usdt, base/usdc, eth, btc, trc20/usdt), network, family (тип адреси), minimum і available. Працюють EVM-мережі, Tron, Bitcoin, Solana, TON та інші; available: false — мережа тимчасово недоступна.
POST /v1/crypto/payments Bearer sk · POST /v1/crypto/pay без акаунта
| Поле | Примітки |
|---|---|
coin ✓ | Тікер із /v1/crypto/coins |
amount + currency | Ціна у фіаті (будь-яка з валют), конвертується в монету за поточним курсом |
amount_coin | Або точна сума в монеті (замість amount) |
payout_address | Ваш гаманець у цій мережі. Обов'язковий для /v1/crypto/pay; з ключем за замовчуванням беруться гаманці крипто-шлюзу проєкту (для EVM — гаманець виплат). Перевіряється відповідно до мережі. |
email, description, success_url, cancel_url | Як у Створенні платежу |
curl -X POST https://api.utopay.app/v1/crypto/pay \ -H "content-type: application/json" \ -d '{ "coin": "bep20/usdt", "amount": 100, "currency": "USD", "payout_address": "0xYourWallet0000000000000000000000000000000" }' # → { "id": "ord_…", "kind": "crypto", "checkout_url": "https://api.utopay.app/pay/ord_…", # "crypto": { "coin": "bep20/usdt", "network": "BNB Smart Chain (BEP-20)", "symbol": "USDT", # "address": "0x…", "amount_coin": 100.02, "minimum": 1.66, "detected": false, "underpaid": false } }
- Перенаправте покупця на
checkout_url(сума, мережа, адреса, QR, живий статус) — або покажітьcrypto.addressіcrypto.amount_coinна власній сторінці. - Статуси:
pending(зcrypto.detected: true, щойно переказ помічено, до підтверджень) →paid. Якщо надійшло менше за запитане (недостача понад 1%), статус —underpaid, подія —payment.underpaid: гроші вже на вашому гаманці, вирішуйте самі. - Вебхуки,
GET /v1/payments/:idі тестові ключі працюють так само, як для платежів карткою. Перекази нижчеminimumабо в іншій монеті/мережі не обробляються — сторінка оплати попереджає покупця.
Приклади інтеграції
Створюйте замовлення на своєму сервері (ніколи із секретним ключем у браузері), перенаправляйте покупця на checkout_url і позначайте замовлення оплаченим за вебхуком. Покрокова інструкція: прийом криптовалюти на сайті; мережі й тікери Tether: прийом USDT.
const res = await fetch('https://api.utopay.app/v1/crypto/payments', { method: 'POST', headers: { authorization: `Bearer ${process.env.UTOPAY_SK}`, 'content-type': 'application/json' }, body: JSON.stringify({ coin: 'bep20/usdt', amount: 49.9, currency: 'EUR', description: 'Order #1042', success_url: 'https://shop.example/thanks', cancel_url: 'https://shop.example/cart' }) }); const order = await res.json(); if (!res.ok) throw new Error(order.error); // save order.id with your order, then redirect the buyer reply.redirect(order.checkout_url);
import os, requests r = requests.post('https://api.utopay.app/v1/crypto/payments', headers={'Authorization': f'Bearer {os.environ["UTOPAY_SK"]}'}, json={'coin': 'erc20/usdt', 'amount': 120, 'currency': 'USD', 'description': 'Invoice 77'}, timeout=20) order = r.json() r.raise_for_status() print(order['id'], order['checkout_url'], order['crypto']['address'], order['crypto']['amount_coin'])
$ch = curl_init('https://api.utopay.app/v1/crypto/payments'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('UTOPAY_SK'), 'Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode(['coin' => 'polygon/usdt', 'amount' => 25, 'currency' => 'USD']), ]); $order = json_decode(curl_exec($ch), true); header('Location: ' . $order['checkout_url']);
Пряма виплата
Гроші ніколи не залишаються в нас: кожен платіж розподіляється on-chain у момент надходження USDC.
- Увімкнути: кабінет → проєкт → Кошти й виплати → Напряму на гаманець, вставте адресу USDC (Polygon). Або в запиті:
"settlement": "direct". - Ви отримуєте USDC з кожного платежу; зверху — історія, статистика, вебхуки й сповіщення в Telegram. Нічого виводити не треба.
- Один гаманець на проєкт — потрібно кілька гаманців, створіть кілька проєктів.
Зберігання в UTOPAY
USDC надходить на гаманець платформи UTOPAY. Після paid ваша частка зараховується на внутрішній баланс — далі зберігайте, обмінюйте, конвертуйте чи виводьте.
- Увімкнути: Кошти й виплати → Зберігання в UTOPAY (гаманець не потрібен), або
"settlement": "custody"у запиті. - Зарахування:
amount × 95.5%у валюті замовлення (USD, EUR, GBP, CAD, INR, SEK), будь-яка інша валюта — у USD за поточним курсом. Зараховується рівно один раз. - Один баланс на акаунт: усі проєкти в цьому режимі сумуються; у журналі видно проєкт-джерело.
| Ендпоінт (сесія кабінету) | Призначення |
|---|---|
GET /api/merchants/:id/balances | Баланс за валютами |
GET /api/merchants/:id/balances/transactions | Журнал операцій |
POST /api/merchants/:id/balances/exchange | { from_currency, to_currency, amount } — за живим курсом |
POST /api/merchants/:id/balances/withdraw | { currency, amount, network, to_address } |
GET /api/merchants/:id/balances/withdrawals | Заявки на виведення |
Мережі виведення: USDC_POLYGON, USDT_POLYGON, USDT_TRC20, USDT_ERC20, ETH, BTC, BNB, TRX. Сума резервується одразу (pending); переказ надсилає команда UTOPAY, зазвичай протягом одного робочого дня (done з txid). Відхилені заявки повертаються на баланс. Виведення не можна запустити API-ключем.
Платіжні посилання
Без коду: створіть посилання, надішліть у чат чи email — отримайте оплату. Кабінет → проєкт → Платіжні посилання → + Посилання.
- Сума фіксована або порожня — її вводить покупець. Валюта — будь-яка зі списку.
- Метод (необов'язково): закріпіть провайдера. З фіксованою сумою посилання відправляє покупця одразу до нього; з вільною сумою покупець бачить лише поле суми й кнопку «Оплатити через PayPal». Якщо метод недоступний, показується звичайний вибір методів.
- URL повернення — куди покупець потрапляє після оплати. Одноразові посилання стають
usedпісля першого замовлення (повторне відкриття веде до цього замовлення); багаторазові працюють, доки їх не архівують. - Кошти йдуть за режимом коштів проєкту. Замовлення з посилань з'являються в історії й надсилають вебхуки так само, як замовлення з API.
| Ендпоінт (сесія кабінету) | Тіло |
|---|---|
POST /api/merchants/:id/links | { amount?, currency?, description?, provider?, redirect_url?, reusable? } → посилання з url |
GET /api/merchants/:id/links | Список |
PATCH /api/merchants/:id/links/:linkId | { status: "active" | "archived", amount, currency, description, provider, redirect_url, reusable } |
Публічне посилання має вигляд https://api.utopay.app/i/lnk_…. Без акаунта скористайтеся формою на /payment-links — вона створює замовлення /v1/pay з тим самим вибором методу.
Вебхуки та сповіщення
З акаунтом. Коли замовлення змінює стан, UTOPAY надсилає його POST-запитом на кожен ендпоінт проєкту з підписом HMAC-SHA256.
Реєстрація: кабінет → Вебхуки → + Ендпоінт, або POST /api/merchants/:id/webhooks з { "url": "https://you.com/hooks/utopay" }. Секрет whsec_… показано в кабінеті.
| Подія | Коли |
|---|---|
payment.succeeded | Кошти отримано (напряму і зберігання) |
payment.expired | Не оплачено протягом 24 год (надсилається на ендпоінти, підписані на payment.failed; у Telegram не надсилається). Пізня оплата після цього однаково надсилає payment.succeeded. |
payment.underpaid | На крипто-замовлення надійшло менше за запитане (надсилається на ендпоінти, підписані на payment.succeeded) |
payment.failed | Невдалий платіж (наразі — з імітацій у тестовому режимі) |
POST https://you.com/hooks/utopay
content-type: application/json
x-utopay-event: payment.succeeded
x-utopay-signature: t=1759660123,v1=<hex hmac-sha256>
user-agent: UTOPAY-Webhooks/1.0
{
"event": "payment.succeeded",
"created_at": 1759660123456,
"data": { /* the Order object */ }
}
import crypto from 'node:crypto'; // use the RAW body, not re-serialised JSON function verify(rawBody, header, secret) { const { t, v1 } = Object.fromEntries(header.split(',').map(p => p.split('='))); const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex'); const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300; const a = Buffer.from(v1 || ''), b = Buffer.from(expected); return fresh && a.length === b.length && crypto.timingSafeEqual(a, b); }
// raw body + x-utopay-signature header + your whsec_… secret $raw = file_get_contents('php://input'); parse_str(str_replace(',', '&', $_SERVER['HTTP_X_UTOPAY_SIGNATURE'] ?? ''), $sig); $expected = hash_hmac('sha256', ($sig['t'] ?? '') . '.' . $raw, getenv('UTOPAY_WHSEC')); if (!hash_equals($expected, $sig['v1'] ?? '') || abs(time() - (int)($sig['t'] ?? 0)) > 300) { http_response_code(400); exit; } $event = json_decode($raw, true); if ($event['event'] === 'payment.succeeded') { /* mark $event['data']['id'] as paid */ } http_response_code(200);
import hmac, hashlib, time def verify(raw_body: bytes, header: str, secret: str) -> bool: parts = dict(p.split('=', 1) for p in header.split(',')) t, v1 = parts.get('t', ''), parts.get('v1', '') expected = hmac.new(secret.encode(), f'{t}.'.encode() + raw_body, hashlib.sha256).hexdigest() fresh = t.isdigit() and abs(time.time() - int(t)) < 300 return fresh and hmac.compare_digest(expected, v1)
- Відповідайте будь-яким 2xx протягом 10 с. Повтори через 30 с, 2 хв, 15 хв, 1 год, 6 год — 6 спроб. Доставки видно в кабінеті.
- Будьте ідемпотентні — відсіюйте дублікати за
data.id. - Telegram: оплачені замовлення надходять у ваш чат із сумою, описом та id (Сповіщення).
Тестовий режим
- Створіть тестовий секретний ключ (
utopay_sk_test_…) і викликайтеPOST /v1/paymentsяк зазвичай — усі перевірки (валюта, провайдер) ті самі. checkout_urlведе на sandbox-сторінку (/sandbox/ord_test_…). Натисніть Simulate payment або Simulate failure.- Вебхуки й Telegram спрацьовують як у бойовому режимі, з
"is_test": true. Гроші не рухаються, баланс не зараховується.
Команда, брендинг, маршрутизація
Команда: запрошення за email (Команда). Ролі admin, developer, finance, viewer; творець — owner.
Брендинг: назва, логотип, колір фону й кнопки в Налаштуваннях — застосовуються до сторінки оплати, сторінок посилань і екрана успішної оплати.
Маршрутизація проєкту: у Маршрутизації задайте пріоритетних провайдерів за порядком. Для API-платежів без provider береться перший, що онлайн і підходить за сумою та валютою (routing.reason = "project_routing"); жоден не підходить — покупець обирає на нашій сторінці. Явно вказаний provider завжди має пріоритет.
Об'єкт замовлення
Повертається create/get/list і передається у вебхуках.
| Поле | Значення |
|---|---|
id | ord_… (ord_test_… у тестовому режимі) |
status | pending → paid (або failed; крипта: underpaid). Не оплачено протягом 24 год → expired: новий платіж почати не можна, але пізня оплата однаково переводить замовлення в paid. |
is_test | Створено тестовим ключем |
amount, currency | Що платить покупець |
email, description | Як передано |
checkout_url | Куди відправити покупця (до провайдера або на нашу сторінку) |
payment_page_url | Завжди наша сторінка оплати з усіма методами |
provider, routing | Обраний метод і як спрямовується покупець — див. маршрутизацію |
settlement, payout_wallet | direct (ваш гаманець) або custody (гаманець платформи) |
payout_coin, payout_network | USDC, polygon |
fees | Розподіл у частках: merchant (ваша частка, 0.955), platform (комісія UTOPAY), partner, partner2 (реферальні частки, зазвичай 0) |
received_amount, forwarded_amount, received_asset | Скільки фактично надійшло / переслано на ваш гаманець і в якому активі (після оплати) |
tx_hash, payout_tx_hash | Хеші вхідної транзакції та транзакції виплати |
receiving_address | Одноразова адреса отримання цього замовлення |
expires_at | Коли неоплачене замовлення стане expired (мс Unix) |
success_url, cancel_url, created_at, updated_at | Як передано / мс Unix |
Усі публічні ендпоінти
| Ендпоінт | Доступ | Призначення |
|---|---|---|
POST /v1/pay | — | Платіж без акаунта |
POST /v1/payments | sk | Створення платежу |
GET /v1/payments/:id | sk | Один платіж (з перевіркою живого статусу) |
GET /v1/payments | sk | Список платежів |
GET /v1/providers?amount=¤cy= | — | Методи, доступні зараз |
GET /v1/crypto/coins | — | Монети й мережі крипто-шлюзу |
POST /v1/crypto/payments / POST /v1/crypto/pay | sk / — | Крипто-платіж з акаунтом / без |
GET /v1/currencies | — | Валюти, що приймаються |
GET /api/checkout/:id/status | — | Статус будь-якого замовлення |
GET /pay/:id, GET /pay/:id/go?provider= | — | Сторінка оплати / перенаправлення в метод (для покупця) |
GET /i/:linkId | — | Сторінка платіжного посилання (для покупця) |
Комісії
- Ви отримуєте 95.5% — однаково з акаунтом і без, у режимах «напряму» та «зберігання», для будь-якої валюти й методу. Без плати за підключення й абонплати.
- Великі мерчанти можуть отримати індивідуальну ставку — напишіть нам. Точний розподіл кожного замовлення — у
fees.
Реферальна програма
- Рівень 1: 25% нашої комісії з мерчантів, яких запросили ви; рівень 2: 10% з мерчантів, яких запросили вони.
- Виплачується on-chain з кожного платежу на реферальний гаманець, указаний у Рефералах. Береться з нашої комісії — реферали нічого не доплачують.
Помилки
Кожна помилка — { "error": "message" } з відповідним HTTP-статусом.
| Статус | Значення |
|---|---|
400 | Некоректні дані: amount, непідтримувана currency, невідомий provider, недійсний payout_wallet, success_url не http(s), некоректний settlement, режим «напряму» без гаманця, недостатній баланс. |
401 | Ключ відсутній, некоректний або відкликаний; немає сесії кабінету. |
403 | Ключ pk там, де потрібен sk; неактивний проєкт; немає доступу. |
404 | Не знайдено або належить іншому проєкту. |
429 | Забагато спроб входу / реєстрації — повторіть за хвилину. |
503 | Платіжна мережа тимчасово недоступна — повторіть зі зростаючою затримкою. |
500 | Помилка конфігурації сервера — зверніться в підтримку. |