Документация для мерчантов NullSwap¶
NullSwap позволяет вашему бэкенду принимать криптоплатежи. Вы запрашиваете адрес для пополнения, показываете его клиенту, а когда деньги дойдут и пройдут скрининг, мы присылаем вебхук.
Весь этот сайт описывает API мерчанта — серверный HTTP-API, где аутентификация сводится к одному API-ключу. Ни браузерных редиректов, ни OAuth, ни сессий здесь нет.
У этого же API есть интерактивный справочник Swagger по адресу api.pay.nullswap.com/docs, собранный из самого API. Там удобно свериться с точным именем поля или отправить пробный запрос; понять сами сценарии помогает этот сайт. См. Вне префикса версии.
Два способа принимать деньги¶
В API есть две модели приёма средств. Они независимы — используйте одну или обе сразу.
| Инвойс | Статический кошелёк | |
|---|---|---|
| За чем закреплён адрес | за одним заказом | за одним клиентом, навсегда |
| Ожидаемая сумма | известна заранее | не задаётся — вы сверяете всё, что придёт |
| Срок жизни | ограничен: 60–604800 секунд |
не ограничен |
| Как узнать об оплате | из вебхука | вебхуков нет, нужно опрашивать API |
| Скрининг | каждого платежа, до его зачисления | каждого платежа, до свипа средств |
| Попадает на баланс | свипом автоматически или вами при autoSweep: false |
свипом автоматически |
| Для чего подходит | оплата конкретного заказа | пополнение счёта, регулярные депозиты |
Начните с инвойсов. Статические кошельки пригодятся тогда, когда адрес нужен под клиента, а не под заказ.
Полный путь инвойса¶
sequenceDiagram
autonumber
participant B as Ваш бэкенд
participant N as NullSwap
participant C as Клиент
participant W as Ваш эндпоинт вебхука
B->>N: POST /api/v1/invoices (chain, token, expectedAmount)
N-->>B: 201 { id, depositAddress, expiresAt, status: WAITING }
B->>C: показать depositAddress и точную сумму, до expiresAt
C->>N: отправляет токены в сети
N->>W: invoice.payment_detected · статус PAYMENT_DETECTED
Note over W: не подтверждён — покажите прогресс, ничего не отгружайте
N->>N: достигнута глубина подтверждений, выполняется AML-скрининг
N->>W: invoice.payment_confirmed · платёж CONFIRMED
N->>W: invoice.paid · статус PAID, paidAmount >= expectedAmount
Note over W: это сигнал к исполнению заказа
W-->>N: 2xx
Шаги 5, 7 и 8 — это доставки вебхуков. Запрос GET /api/v1/invoices/{invoiceId} вернёт ровно то же
состояние, но опрос — это способ восстановиться после простоя вашего эндпоинта, а не способ
интеграции.
После invoice.paid деньги всё ещё лежат на депозитном адресе. Они свипаются на ваш
баланс — автоматически или по вашему запросу, если инвойс создан с
autoSweep: false, — и выводите вы их уже оттуда. См.
перевод средств на баланс. Свип зачисляется за вычетом
комиссии мерчанта, а для токена — ещё и сетевой
комиссии за его перемещение. Свип к тому же переводит инвойс в SWAPPING, а затем в COMPLETED
с событиями invoice.swapping и invoice.completed.
С чего начать¶
- Получите API-ключ. В кабинете владелец мерчанта нажимает Выпустить ключ в разделе
Настройки → API-ключ и сразу копирует ключ: он показывается только один раз. Ключ
начинается с
sk_live_. Ключи, белые списки IP и подписки на вебхуки заводятся вручную в кабинете — через API их не создать и не изменить. См. Аутентификацию. - Определите сеть и токен.
GET /api/v1/chainsиGET /api/v1/tokensвернут UUID, по которым потом адресуется инвойс. Закешируйте их. См. Сети и токены. - Создайте инвойс.
POST /api/v1/invoices. В ответе придётdepositAddress— покажите его клиенту или отрисуйте QR-код. НаRIPPLEпокажите вместе с ним обязательныйdepositTag. См. Инвойсы. - Обработайте вебхук. Проверьте HMAC-подпись, отбросьте повторы по id доставки, быстро
ответьте
2xxи исполняйте заказ поinvoice.paid. См. Вебхуки.
Исполняйте заказ по invoice.paid, никогда по invoice.payment_detected
invoice.payment_detected означает лишь то, что транзакция видна в сети. Подтверждений ещё нет,
скрининг ещё не пройден, так что транзакцию может откатить реорганизация цепочки, а платёж может
оказаться помеченным. Товар, отгруженный по этому событию, вполне может остаться неоплаченным.
Частые ошибки¶
Суммы приходят строками, а не JSON-числами. Каждая сумма — это десятичная строка с целым числом
базовых единиц токена, а рядом лежит decimals этого токена. 25.50 USDT в TRON записывается как
"25500000" при decimals: 6. См. Суммы.
Ошибку определяет её код, а не текст. В поле message приходит стабильный машиночитаемый код —
разбирайте именно его, а не HTTP-статус сам по себе и не формулировку.
Полный список см. в Ошибках.
Что читать дальше¶
-
API-ключ, белый список IP и то, что остаётся доступным заблокированному мерчанту.
-
Суммы, пагинация, фильтрация, отметки времени и то, какие запросы можно повторять без риска.
-
Создание инвойса, жизненный цикл статусов, недоплата и переплата, истечение срока, перевод средств на баланс.
-
Отдельные поступления, скрининг и что делать с платежом, которого вы не ждали.
-
Постоянные адреса под конкретного клиента и приходящие на них платежи.
-
Список событий, формат тела запроса, проверка подписи, повторы и порядок доставки.
-
Справочник идентификаторов, на которые ссылаются все остальные маршруты.
-
Как посмотреть баланс, какую комиссию мерчанта мы удерживаем, сколько стоит вывод и как вывести средства на свой адрес.
-
Все имена ошибок, их причины и то, стоит ли повторять запрос.