Процессинг и эквайринг

Крипто-процессинг и эквайринг для бизнеса

Принимайте оплату в любом из перечисленных активов, а получайте тот, который понимает ваша бухгалтерия. Каждая оплата — это ордер: котировка по всем провайдерам, оплата напрямую от клиента, зачисление на ваш кошелёк.

  • Принимаетсявсё, что есть в /v1/assets
  • Зачислениеваш кошелёк, ваш актив
  • Кастодиальностьнет — SwapZilla не держит средства
  • Сверкаclient_order_id

Собрано на/v1/assets/v1/partner/quotes-sse/v1/partner/orders/v1/partner/orders/{id}

Partner API — это приёмный контур платежей, а не кошелёк. Клиент платит тем активом, который у него есть, обменник конвертирует его, а зачисление приходит в том активе и той сети, которые попросила ваша бухгалтерия — на ваш собственный кошелёк, за один шаг и без чьего-либо остатка посередине.

  • Один запрос котировки уходит сразу во все подключённые обменники.
  • Каждая оплата — это один ордер, помеченный вашим номером заказа.
  • Крипто-платежи не отзываются: резервировать под чарджбэки нечего.
  • Отсутствие кастодиального хранения — это отсутствие остатка клиентских денег и у вас, и у нас.

Оплата, эндпоинт за эндпоинтом

  1. Предлагайте то, чем реально можно заплатить сейчас

    GET /v1/assets возвращает активы и сети, за которыми стоит провайдер. Кэшируйте на несколько минут и рисуйте из этого список «чем платить»: актив, который никто не обслуживает, не должен доходить до клиента.

  2. Считайте корзину в активе зачисления

    Корзина — 149.00 USDT, клиент хочет заплатить в ETH. Котируйте с amount_to=149, и предложение ответит точной суммой FromAmount. rate_type=fixed удержит это число на время оплаты.

  3. Создавайте ордер на ваш расчётный кошелёк

    to_address — адрес вашего казначейства, он не меняется от клиента к клиенту. client_order_id — номер заказа в магазине, именно его потом читает сверка. Передавайте Idempotency-Key: повторно отправленный чекаут не должен превращаться в два ордера.

  4. Рисуйте экран оплаты

    DepositAddress, AmountFrom, сеть, QR-код и таймер. Больше ничего не нужно и ничего лишнего показывать не стоит: неверная сеть — самая частая причина пропавшего крипто-платежа.

  5. Выдавайте товар по финальному статусу

    Опрашивайте GET /v1/partner/orders/{id} раз в 5–10 секунд. В DONE лежат зачисленная сумма AmountToReceived и хеш выплаты TxID — это и есть подтверждение оплаты.

Стриминг цены в чекаут

Чекаут, который ждёт самый медленный обменник, выглядит сломанным. Стримьте: предложения приходят по мере ответа провайдеров, первое обычно за 400 мс.

// Ваш бэкенд. Ключ не попадает в браузер — проксируйте поток клиенту.
const url = new URL("https://api.swapzilla.io/v1/partner/quotes-sse");
url.search = new URLSearchParams({
  from_asset: "ETH", from_network: "ERC20",
  to_asset: "USDT", to_network: "TRC20",
  amount_to: "149", rate_type: "fixed", timeout_ms: "5000",
});

const res = await fetch(url, {
  headers: { "X-API-Key": process.env.SWAPZILLA_KEY, Accept: "text/event-stream" },
});
// события: offer · provider_error · ping · done
// в `done` приходит { deviations: { "<offer_id>": 0.16 } } — итоговый рейтинг.

Дальше ордер, со всем, что понадобится сверке:

curl -s -X POST "https://api.swapzilla.io/v1/partner/orders" \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f1c0b52-6f2a-4d43-9f4a-1a0d64c1f3a2" \
  -d '{
    "offer_id": "0b0c8f0e-2c1a-4f3f-8f57-2a1d1c4e77aa",
    "to_address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
    "refund_address": "0x750c44dB01899176f2e64bD25A2fabAC1140d8e9",
    "client_order_id": "SHOP-88214",
    "expected_to_amount": 149
  }'

Проверяйте до того, как выставили счёт. В каждом предложении есть MinFromAmount и MaxFromAmount; корзина ниже минимума провайдера упадёт при создании ордера, а не на котировке. Сверяйте границы и проверяйте адрес возврата клиента через GET /v1/validate-address до появления экрана оплаты.

Сверка и поддержка

Что нужноОткуда берётся
Платежи за деньGET /v1/partner/orders?page=1&limit=100 — только ваши, свежие первыми, с постраничной выдачей.
К какому заказу относится платёжclient_order_id, который возвращается в ордере.
Подтверждение выплатыTxID и AmountToReceived в ордере со статусом DONE.
Ссылка, которую поймёт поддержка провайдераProviderOrderID — храните рядом со своим идентификатором.
Ответ прямо сейчас, а не через десять секундPOST /v1/partner/orders/{id}/refresh синхронно ходит к провайдеру. Не чаще раза в пять секунд.

Чего API не делает

Не входитЧто это значит для вас
Зачисление в фиатеВывода на банковский счёт нет. Зачисляйте в стейблкоине и выводите своим каналом.
ВебхукиПока нет: статус оплаты берётся опросом или из вашего собственного стрима поверх опрошенного состояния.
Хостинг страницы оплатыСтраница, брендинг и письма — ваши; API даёт сумму, адрес и статус.
Скоринг кошельков, AML и анализ графовЭтого в API нет вообще. Если комплаенс их требует, они приходят от отдельного вендора.
Возврат как операцияНеудавшийся обмен возвращает провайдер на refund_address. Завершённый платёж через API не отменяется.

Кому подходит такой чекаут

  • Магазинам и SaaS, которым нужен остаток в стейблкоине, а не портфель: клиенты платят пятьюдесятью активами, вы получаете один.
  • Цифровым товарам и пополнениям, где неотзывный платёж убирает резерв под фрод целиком.
  • Маркетплейсам, зачисляющим на кошелёк каждого продавца: платформа маршрутизирует платёж, ни разу его не удерживая.
  • Сервисам, которым платят из сетей, поддерживать которые они не собирались: конвертацию делает сеть провайдеров, а не ваше казначейство.

Вопросы

SwapZilla — это платёжный провайдер, который держит мои деньги?

Нет. Обмен некастодиальный: монеты клиента уходят прямо на депозитный адрес обменника, а обменник выплачивает на указанный вами адрес. SwapZilla не владеет средствами, поэтому нет ни остатка для вывода, ни графика выплат, которого нужно ждать.

Как узнать, что платёж завершён?

Опросом GET /v1/partner/orders/{id} раз в 5–10 секунд до финального статуса. Вебхуков пока нет; наш собственный поллер обновляет каждый открытый ордер раз в десять секунд, поэтому чаще опрашивать бессмысленно.

Что защищает от движения курса во время оплаты?

Три вещи: котировка с rate_type=fixed, чтобы провайдер зафиксировал курс; пятиминутный срок жизни предложения как окно оплаты; и expected_to_amount, из-за которого ордер с «уехавшей» выплатой будет отклонён, а не создан.

Можно принимать один актив, а получать другой?

Так работает по умолчанию. Клиент выбирает исходный актив и сеть из /v1/assets, а ваш актив зачисления, сеть и адрес заданы в ордере — конвертацию между ними делает провайдер.

Проверяет ли API кошельки клиентов на AML-риски?

Нет. Partner API считает котировки, исполняет обмены и отдаёт их статус; скоринга кошельков, оценки рисков и анализа графа транзакций в нём нет. В предложениях есть KycRating от A до D, но он описывает навязчивость KYC самого провайдера, а не риск клиента.

Сколькими активами может заплатить клиент?

Актуальный ответ даёт GET /v1/assets: топ-100 активов по капитализации с сетями и провайдерами, которые их сейчас обслуживают. Список меняется вместе с провайдерами, поэтому его стоит читать, а не зашивать в код.

Что ещё собирают на этом же ключе

Как получить ключ

Зарегистрируйтесь в партнёрском кабинете — партнёрский id и api_key для заголовка X-API-Key выпускаются сразу. Ключ становится рабочим после активации: напишите в @swapzilla_support_bot и коротко опишите интеграцию. Все эндпоинты, поля и статусы — в документации partner API.