Sign in
Платежи и выплаты/Payment API

Payment API

Создание и управление крипто-платежами через Payment API 2328.io.

Payment API позволяет создавать платёжные сессии, перенаправлять клиентов на хостед-чекаут и отслеживать статус платежа.

Создать платёж

Создаёт платёжную сессию и возвращает URL для оплаты клиентом.

Параметры запроса

ПолеТипОбязательноеОписаниеЗначения
amountdecimalдаСумма платежа в указанной валюте, например 100.00
currencystringдаФиатная валюта (USD, EUR, RUB, …) или криптовалюта (USDT, TRX, BTC, …)
order_idstringдаВаш ID заказа, например ORDER-12345 (до 128 символов)
to_currencystringнетЗаранее выбранная криптовалюта
networkstringнет*Код сети (обязателен, если задан to_currency или currency — криптовалюта)
url_returnstringнетURL для редиректа после оплаты, например https://your-site.com/return
url_successstringнетАльтернатива url_return
url_callbackstringдаURL для webhook-уведомлений, например https://your-site.com/webhook
invite_codestringнетРеферальный код
fee_splitdecimalнетДоля комиссии мерчанта, перекладываемая на плательщика, 0–100 (%). 0 = мерчант платит полностью, 100 = плательщик платит полностью. Переопределяет настройку проекта. Пример: 30 (плательщик покрывает 30% комиссии).
price_markupdecimalнетНаценка или скидка к сумме счёта, от −99 до 100 (%). Переопределяет настройку проекта. Пример: 5 (+5%) или -10 (скидка 10%).
descriptionstringнетОпциональное описание счёта (до 200 символов). Отображается плательщику на странице оплаты. Пример: Premium plan — Order #12345.
ttl_secondsintнетВремя жизни счёта в секундах, от 300 (5 минут) до 86400 (24 часов). По истечении этого времени счёт истекает и оплатить его больше нельзя. По умолчанию: 3600 (1 час). Пример: 3600.

Ответ

JSON
{
  "state": 0,
  "result": {
    "uuid": "abc123-def456-...",
    "order_id": "ORDER-12345",
    "amount": "100.00",
    "currency": "USD",
    "amount_usd": "100.00",
    "exchange_rate": null,
    "url": "https://2328.io/pay/abc123-def456-...",
    "tg_deeplink": "https://t.me/my2328bot?start=pay_abc123-def456-...",
    "expires_at": "2026-01-11T21:00:00Z",
    "created_at": "2026-01-11T20:00:00Z",
    "payer_currency": "USDT",
    "payer_amount": "100.50",
    "network": "TRX-TRC20",
    "address": "TXYZabc123...",
    "payment_status": "check",
    "txid": null,
    "payment_amount": null,
    "qr": "data:image/png;base64,iVBORw0..."
  }
}
  • Перенаправьте клиента на result.url, чтобы он завершил оплату.
  • tg_deeplink — диплинк Telegram-бота для оплаты через Telegram MiniApp.
  • qr — QR-код адреса депозита в формате data URI (Base64). Присутствует, когда адрес уже назначен (когда network задан вместе с to_currency или когда currency — криптовалюта); иначе null.
  • txid, payment_amountnull, пока клиент не оплатит. Заполняются, как только транзакция обнаружена в блокчейне. Об этом сигнализирует webhook со статусом payment_status: paid.
  • exchange_ratenull, если конвертация ещё не применима (например, курс фиат → крипто пока не зафиксирован). Заполняется, когда выбрана валюта плательщика.
Credentials
RequestPOST/v1/payment
curl -X POST https://api.2328.io/api/v1/payment \
  -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.

Ошибки

Направление недоступно

Если выбранная комбинация to_currency + network (или currency как криптовалюта) временно отключена на платформе, API вернёт:

JSON
{
  "state": 1,
  "error_code": "direction_disabled",
  "errors": {
    "direction": "This direction is temporarily unavailable"
  }
}

HTTP статус: 503 Service Unavailable

Проверить актуальный статус всех направлений можно через GET /v1/directions. Скрывайте недоступные направления в UI заранее, чтобы не показывать пользователю ошибку.

Платёжная страница, H2H и точные суммы в криптовалюте

Один и тот же эндпоинт поддерживает три разных сценария выставления счёта. Выберите нужный сценарий заранее и не смешивайте правила интерпретации суммы.

Платёжная страница с выбором способа оплаты

Передайте amount, currency, order_id и url_callback, но не указывайте to_currency и network. В ответе придёт result.url; поля address, qr, а иногда и данные плательщика останутся null, пока пользователь не выберет направление оплаты на платёжной странице.

JSON
{
  "amount": "125.00",
  "currency": "EUR",
  "order_id": "ORDER-2026-1042",
  "url_callback": "https://merchant.example/webhooks/2328",
  "url_return": "https://merchant.example/orders/ORDER-2026-1042"
}

H2H-счёт с прямым адресом

Передайте to_currency и network. 2328.io создаст блокчейн-счёт прямо во время API-запроса, поэтому данные успешного ответа можно показать в вашей форме оплаты без перенаправления клиента.

JSON
{
  "amount": "100.00",
  "currency": "USD",
  "to_currency": "USDT",
  "network": "TRX-TRC20",
  "order_id": "ORDER-2026-1043",
  "url_callback": "https://merchant.example/webhooks/2328"
}

Показывайте следующие значения без самостоятельного пересчёта:

  • payer_amount и payer_currency — точные реквизиты суммы платежа;
  • network и address — единственное допустимое направление для этого счёта;
  • qr — data URI с тем же адресом;
  • expires_at — срок действия счёта;
  • url — резервная платёжная страница на случай, если пользовательский сценарий не удаётся завершить.

Никогда не создавайте и не подменяйте адрес самостоятельно, не используйте адрес от другого счёта и не рассчитывайте payer_amount по публичной спотовой цене. Единственный источник истины — ответ API.

Счёт на точную сумму в криптовалюте

Если счёт выставляется в криптовалюте, укажите её в currency:

JSON
{
  "amount": "25.000000",
  "currency": "USDT",
  "network": "TRX-TRC20",
  "order_id": "ORDER-2026-1044",
  "url_callback": "https://merchant.example/webhooks/2328"
}

Запрошенная криптовалютная сумма сохраняется в payer_currency и payer_amount. Сервис также может рассчитывать внутренний эквивалент в USD для учёта и курсовых полей; не подменяйте им точные криптовалютные реквизиты. Сохраняйте полученные десятичные строки вместе со всеми знаками после запятой.

Для криптовалюты с единственной поддерживаемой сетью система может выбрать сеть автоматически. Тем не менее для предсказуемого поведения лучше явно передавать network. Для активов в нескольких сетях, например стейблкоинов, сеть указывайте всегда.

Идемпотентность и повторные запросы

order_id уникален в пределах авторизованного проекта мерчанта и служит ключом идемпотентности при создании платежа. Если платёж уже существует, API вернёт существующую сессию с state: 0.

Повторный запрос с тем же order_id не означает «обновить этот счёт». Изменения суммы, валюты, webhook URL, метаданных, срока действия или направления могут быть проигнорированы, потому что API вернёт существующую сессию. Сохраняйте первый запрос и отклоняйте конфликтующие повторы на своей стороне.

Рекомендуемый алгоритм создания:

  1. Вставьте локальную попытку платежа и уникальный order_id в одну транзакцию базы данных.
  2. Отправьте подписанный запрос API.
  3. Сохраните возвращенный uuid и полный ответ.
  4. Если HTTP-ответ потерян, повторите тот же запрос либо запросите /v1/payment/info по order_id.
  5. Не создавайте второй локальный заказ только из-за тайм-аута запроса к API.

Нестандартные ситуации при оплате

СитуацияПравильная обработка
address / qr равны nullНаправление оплаты ещё не выбрано. Перенаправьте клиента на url либо создайте новый корректный H2H-счёт с новым order_id.
Ошибка валидации HTTP 400Прочитайте ошибки отдельных полей в errors; не повторяйте неизменённый запрос вслепую.
HTTP 429Повторяйте запрос с экспоненциальной задержкой, сохраняя тот же order_id.
HTTP 503 / direction_disabledОбновите /v1/directions; временно скройте направление или повторите запрос позже.
Тайм-аут клиентского запросаСчитайте результат неизвестным. Сначала найдите платёж по order_id и только потом решайте, создавать ли что-либо ещё.
underpaid_checkСохраните событие о частичной оплате и дождитесь доплаты либо следующего статуса. Не зачисляйте средства повторно при поступлении дополнительных txid.
underpaidОкончательная недоплата. Примените настроенную политику исполнения или ручной проверки к фактически зачисленной сумме.
overpaidПлатёж успешен, но внесена лишняя сумма. Исполните заказ идемпотентно и сохраните фактические суммы для сверки и возможного возврата.
aml_lockНе исполняйте заказ и не выдавайте средства автоматически; передайте случай в процесс комплаенса или поддержки.
cancelСчёт истёк или отменён. Это не исключает поздний перевод в блокчейне; любое последующее событие сверяйте с поддержкой.

URL возврата в браузере нужен только для навигации. Клиент может открыть его без оплаты, закрыть страницу после оплаты или повторно перейти по ссылке позже. Исполнять заказ мерчанта можно только на основании проверенного статуса из API или webhook.

Информация о платеже

Получение текущего статуса платежа по uuid или order_id.

Параметры запроса

ПолеТипОбязательноеОписаниеЗначения
uuidstringда*UUID платежа (из result.uuid при создании)
order_idstringда*Ваш ID заказа

Хотя бы одно из полей uuid или order_id обязательно.

RequestPOST/v1/payment/info
curl -X POST https://api.2328.io/api/v1/payment/info \
  -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.

Список платежей

Получение списка всех платежей с фильтрацией и пагинацией.

Параметры запроса

ПолеТипОбязательноеОписаниеЗначения
statusstringнетФильтр по статусу платежа (см. References)
date_fromdateнетНачальная дата (YYYY-MM-DD), например 2026-01-01
date_todateнетКонечная дата (YYYY-MM-DD), например 2026-01-31
pageintнетНомер страницы, по умолчанию 1
per_pageintнетЭлементов на странице, по умолчанию 15, максимум 5000
RequestPOST/v1/payment/list
curl -X POST https://api.2328.io/api/v1/payment/list \
  -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.