Документация API
Базовый адрес — https://api.a1b2.io. Все тела запросов и ответов в JSON.
Быстрый старт
Заведите проект в кабинете и выпустите ключ. Ключей два типа, и они не взаимозаменяемы: payment открывает приём средств, payout — отправку. Разделение намеренное: ключ, лежащий на витрине сайта, не должен уметь выводить деньги.
Полный ключ показывается один раз при создании — дальше в кабинете видна только маска.
Подпись запросов
Каждый запрос несёт два заголовка:
| Заголовок | Значение |
|---|---|
| project | UUID проекта |
| sign | hex(HMAC-SHA256(base64(body), api_key)) |
Подписывается base64 от тела, а не само тело. Для запросов без тела подписывается пустая строка. Подпись принимается только в нижнем регистре.
// Node.js
import { createHmac } from 'node:crypto';
const sign = (body, key) =>
createHmac('sha256', key)
.update(Buffer.from(body).toString('base64'))
.digest('hex');
const body = JSON.stringify({ order_id: 'ORD-1', amount: '100.00', base_currency: 'USD' });
await fetch('https://api.a1b2.io/v1/payment', {
method: 'POST',
headers: {
'content-type': 'application/json',
project: PROJECT_ID,
sign: sign(body, API_KEY),
},
body,
});
body для подписи и отдельно передать объект в HTTP-клиент — порядок ключей может отличиться, и подпись не сойдётся.Приём платежей
Создаёт счёт в фиате. Криптовалюту и сеть выбирает плательщик на платёжной странице — курс фиксируется в момент выбора.
| Поле | Тип | Описание |
|---|---|---|
| order_id | string | Ваш идентификатор заказа. Должен быть уникален в проекте. |
| amount | string | Сумма в фиате. Строкой, чтобы не терять точность. |
| base_currency | string | Валюта суммы, например USD. |
| invoice_ttl_seconds | number | Необязательно. Срок жизни счёта. |
| success_url | string | Необязательно. Куда вернуть плательщика после оплаты. |
{
"uuid": "62a37ad7-d0c3-4a4d-a103-f70d4e34b836",
"order_id": "ORD-901",
"status": "awaiting_selection",
"currency": "", "network": "", "address": "",
"pay_amount": "0",
"expires_at": "2026-08-31T09:43:28Z"
}
Отправьте плательщика на https://pay.a1b2.io/pay/{uuid}. Как только он выберет сеть, счёт получит адрес, точную сумму в крипте и перейдёт в pending.
Статус счёта по uuid или order_id. Если переданы оба, приоритет у order_id.
Список счетов проекта. Поле limit ограничивает выдачу.
Балансы по валютам: доступно и в резерве.
Постоянные адреса
Адрес закрепляется за парой «заказ + валюта/сеть» и принимает переводы неограниченно. Подходит для пополнения счёта и донатов, где выставлять счёт на каждый перевод неудобно.
| Поле | Описание |
|---|---|
| currency | Обязательно. Например USDT. |
| network | Обязательно. Например TRX-TRC20. |
| order_id | Обязательно. Ваш идентификатор пользователя или счёта. |
| label | Необязательно. Пометка для кабинета. |
| url_callback | Необязательно. Адрес для вебхуков по этому кошельку. |
Повторный вызов с теми же параметрами вернёт существующий адрес, а не создаст новый. Остальные операции: /v1/static-wallet/info, /list, /transactions, /enable, /disable.
Выплаты
| Поле | Описание |
|---|---|
| order_id | Ваш идентификатор выплаты. |
| currency | Валюта, например USDT. |
| network | Сеть, например TRX-TRC20. |
| to_address | Адрес получателя. |
| amount | Сумма. |
| fee_option | deduct — комиссия из суммы, add — сверх неё. |
Крупные суммы и выплаты в TRON уходят в статус pending_approval и ждут подтверждения оператором. Это защита от увода баланса при утечке ключа.
Расчёт без создания выплаты: сколько получит получатель и сколько спишется с баланса.
Вебхуки
На адрес из настроек проекта уходит POST при каждой смене статуса. Тело подписано тем же алгоритмом, заголовок — sign.
{
"event": "payment.paid",
"uuid": "62a37ad7-d0c3-4a4d-a103-f70d4e34b836",
"status": "paid",
"pay_amount": "665.065842",
"received_amount": "665.065842"
}
События: payment.* (по статусу платежа), static_wallet.deposit, payout.completed, payout.failed.
Повторы идут с нарастающей паузой. Исчерпав попытки, доставка переходит в dead — такие видны в разделе «Вебхуки» кабинета.
Статусы
Платежи
| Статус | Значение |
|---|---|
| awaiting_selection | Счёт создан, плательщик ещё не выбрал сеть |
| pending | Ожидается перевод на адрес |
| check | Перевод виден, ждём подтверждений сети |
| paid | Оплачен полностью |
| underpaid | Пришло меньше суммы счёта |
| overpaid | Пришло больше суммы счёта |
| cancel | Отменён или истёк |
| aml_lock | Задержан проверкой |
Выплаты
| Статус | Значение |
|---|---|
| pending | Принята в обработку |
| pending_approval | Ждёт подтверждения оператором |
| processing | Отправляется в сеть |
| completed | Отправлена |
| failed | Не удалась, средства возвращены на баланс |
| cancelled | Отменена |
Ошибки
Не-2xx ответ содержит код и описание:
{ "error": { "code": "insufficient_balance", "message": "..." } }
| Код | Когда возникает |
|---|---|
| unauthorized | Неверная подпись или проект |
| bad_request | Не хватает обязательного поля или тело не разобрать |
| not_found | Объект не найден в вашем проекте |
| duplicate_order_id | Такой order_id уже есть в проекте |
| insufficient_balance | Недостаточно средств для выплаты |
| network_not_allowed | Направление не включено в проекте |
| no_networks_enabled | В проекте не включено ни одно направление |
| amount_out_of_range | Сумма вне допустимых границ направления |
| invoice_expired | Срок счёта истёк |
| selection_locked | Сеть уже выбрана и не меняется |
| rates_unavailable | Курсы временно недоступны |