RugWard Pay
Справочник REST API
Все эндпоинты продавца RugWard Pay с примерами запросов и ответов, аутентификацией по ключу API, ошибками, лимитами и кодом на curl, Node.js, Python и PHP.
На этой странице
Основы#
| Базовый URL | https://rugward.com |
| Формат | JSON на входе и на выходе. Отправляйте Content-Type: application/json с каждым телом запроса (иначе 415). Размер тела ограничен несколькими КБ. |
| Аутентификация | ключ API в Authorization: Bearer rwp_… или x-api-key: rwp_… |
| Суммы | USD строкой, до 2 знаков после запятой ("25", "25.50"); суммы в монетах — десятичные строки |
| Время | миллисекунды Unix (createdAt, expiresAt, paidAt) |
| Ошибки | {"error": "human readable message"}, иногда с "retry": true |
Только сервер-сервер. Храните ключ API на своём сервере. Браузеры не могут вызывать API продавца с ключом (кросс-доменные запросы запрещены), а ключ на веб-странице стал бы публичным.
Ключи API#
Создавайте ключи в панели в разделе API keys (нужен вход). Ключ имеет вид rwp_ и 40 букв и цифр и показывается один раз: сразу скопируйте его в хранилище секретов сервера. RugWard хранит только хэш SHA-256, поэтому потерянный ключ нельзя показать снова: создайте новый и отзовите старый. До 10 ключей на продавца; панель показывает префикс каждого ключа и время последнего использования.

Что ключ может и чего не может:
| Ключ может | Ключ не может |
|---|---|
| создавать, перечислять, читать и отменять счета | менять настройки или адреса получения |
| создавать, перечислять и отключать платёжные ссылки | создавать, перечислять или отзывать ключи API |
| менять или читать вебхук и его секрет | |
| создавать тестовые счета |
Поэтому утёкший ключ не может перенаправить ваши деньги: адреса получения меняются только после входа с вашим кошельком.
Эндпоинты#
| Метод и путь | Аутентификация | Назначение |
|---|---|---|
POST /api/pay/merchant/invoices | ключ или сессия | Создать счёт |
GET /api/pay/merchant/invoices | ключ или сессия | Список счетов, сначала новые, 50 на страницу |
GET /api/pay/merchant/invoices/:id | ключ или сессия | Прочитать один счёт с котировками и платежами (заодно перепроверяет сеть) |
POST /api/pay/merchant/invoices/:id/cancel | ключ или сессия | Отменить открытый счёт без платежей |
GET /api/pay/merchant/links | ключ или сессия | Список платёжных ссылок |
POST /api/pay/merchant/links | ключ или сессия | Создать платёжную ссылку или отключить её |
GET /api/pay/proof/:id | публичный | Доказательство оплаты (только счета paid или overpaid) |
Настройки, ключи API, вебхук и несопоставленные платежи управляются в панели (только с сессией кошелька).
Создание счёта#
POST /api/pay/merchant/invoices
| Поле | Тип | Обязательно | Правила |
|---|---|---|---|
amountUsd | строка или число | да | от 1 до 50000, не более 2 знаков после запятой |
orderId | строка | нет | 1–64 символа: буквы, цифры, . _ - : # / |
description | строка | нет | до 200 символов, показывается покупателю |
redirectUrl | строка | нет | URL https:// (до 500 символов), показывается после оплаты |
expiresMin | целое | нет | от 15 до 10080 (7 дней); по умолчанию 60 |
curl -X POST https://rugward.com/api/pay/merchant/invoices \
-H "Authorization: Bearer $RUGWARD_PAY_KEY" \
-H "Content-Type: application/json" \
-d '{
"amountUsd": "25.00",
"orderId": "1234",
"description": "1 x T-shirt, size M",
"redirectUrl": "https://shop.example/thanks?order=1234",
"expiresMin": 60
}'{
"id": "Zx3kQ8pL2mN7vR1tY5wB9c",
"url": "https://rugward.com/pay/i/Zx3kQ8pL2mN7vR1tY5wB9c",
"status": "open",
"expiresAt": 1793326882069,
"assets": ["BTC", "ETH-8453", "USDC-8453", "USDT-56", "SOL", "USDC-SOL"]
}Отправьте покупателя на url. assets перечисляет id активов, из которых может выбирать покупатель (ваши включённые монеты, для которых есть адрес получения).
Тот же запрос на других языках:
// Never put the API key in a browser page: call RugWard Pay from your server.
const res = await fetch("https://rugward.com/api/pay/merchant/invoices", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RUGWARD_PAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ amountUsd: "25.00", orderId: "1234", expiresMin: 60 }),
});
const body = await res.json();
if (!res.ok) throw new Error(body.error);
// Save body.id with your order, then send the buyer to body.url
console.log(body.id, body.url);import os, requests
r = requests.post(
"https://rugward.com/api/pay/merchant/invoices",
headers={"Authorization": f"Bearer {os.environ['RUGWARD_PAY_KEY']}"},
json={"amountUsd": "25.00", "orderId": "1234", "expiresMin": 60},
timeout=15,
)
data = r.json()
if r.status_code != 201:
raise RuntimeError(data.get("error"))
print(data["id"], data["url"]) # store the id, redirect the buyer to the url<?php
$ch = curl_init("https://rugward.com/api/pay/merchant/invoices");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("RUGWARD_PAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["amountUsd" => "25.00", "orderId" => "1234", "expiresMin" => 60]),
]);
$data = json_decode(curl_exec($ch), true);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code !== 201) { throw new Exception($data["error"] ?? "RugWard Pay error"); }
header("Location: " . $data["url"]); // send the buyer to the hosted checkoutЧтение счёта#
GET /api/pay/merchant/invoices/:id. Чтение счёта также проверяет блокчейны на новые платежи, поэтому именно этот вызов нужен для подтверждения оплаты перед отправкой товара (вместе с вебхуками).
curl https://rugward.com/api/pay/merchant/invoices/Zx3kQ8pL2mN7vR1tY5wB9c \
-H "Authorization: Bearer $RUGWARD_PAY_KEY"{
"invoice": {
"id": "Zx3kQ8pL2mN7vR1tY5wB9c",
"status": "paid",
"amountUsd": "25.00",
"orderId": "1234",
"description": "1 x T-shirt, size M",
"redirectUrl": "https://shop.example/thanks?order=1234",
"createdAt": 1793323282069,
"expiresAt": 1793326882069,
"paidAt": 1793324100512,
"assets": ["BTC", "ETH-8453", "USDC-8453", "USDT-56", "SOL", "USDC-SOL"],
"test": false,
"quotes": [
{
"id": 4711,
"asset": "USDC-8453",
"amount": "25.000629",
"rateUsd": "1",
"address": "0xYourMerchantAddress…",
"expiresAt": 1793325082069
}
],
"payments": [
{
"txid": "0x…",
"asset": "USDC-8453",
"amount": "24.875626",
"confirmations": 30,
"required": 30,
"confirmed": true,
"seenAt": 1793324012000,
"explorer": "https://basescan.org/tx/0x…"
}
]
}
}quotes: по одной записи на каждую выбранную покупателем монету (сумма, курс, адрес получения, окончание фиксации курса).payments: каждая замеченная по счёту транзакция сconfirmations, нужным числомrequiredиconfirmed.- Для платежей через сплиттер в Base
amount— это то, что дошло до вас (99,5%).
Список счетов#
GET /api/pay/merchant/invoices?before=<createdAt>: 50 на страницу, сначала новые. Чтобы получить следующую страницу, передайте createdAt последнего полученного счёта.
curl "https://rugward.com/api/pay/merchant/invoices" \
-H "Authorization: Bearer $RUGWARD_PAY_KEY"
# next page: pass the createdAt of the last invoice you received
curl "https://rugward.com/api/pay/merchant/invoices?before=1793323282069" \
-H "Authorization: Bearer $RUGWARD_PAY_KEY"{
"invoices": [
{
"id": "Zx3kQ8pL2mN7vR1tY5wB9c",
"status": "open",
"amountUsd": "25.00",
"orderId": "1234",
"description": "1 x T-shirt, size M",
"createdAt": 1793323282069,
"expiresAt": 1793326882069,
"paidAt": null
}
]
}Отмена счёта#
POST /api/pay/merchant/invoices/:id/cancel (без тела). Работает только пока счёт в статусе open и платежей не замечено; иначе 409.
curl -X POST https://rugward.com/api/pay/merchant/invoices/Zx3kQ8pL2mN7vR1tY5wB9c/cancel \
-H "Authorization: Bearer $RUGWARD_PAY_KEY"
# 200 {"ok":true}
# 409 {"error":"Only your open invoices without payments can be canceled."}Платёжные ссылки#
POST /api/pay/merchant/links с {amountUsd, description?, redirectUrl?} создаёт многоразовую ссылку; {"deactivate": "<link id>"} отключает её. GET возвращает до 100 ссылок с uses, active и createdAt. Сначала нужно принять условия для продавцов. См. Платёжные ссылки.
curl -X POST https://rugward.com/api/pay/merchant/links \
-H "Authorization: Bearer $RUGWARD_PAY_KEY" \
-H "Content-Type: application/json" \
-d '{"amountUsd": "15", "description": "Monthly membership", "redirectUrl": "https://shop.example/welcome"}'
# 201 {"id":"k33JZ0ij5F2yLDprwrQgjN","url":"https://rugward.com/pay/l/k33JZ0ij5F2yLDprwrQgjN"}
# list your links
curl https://rugward.com/api/pay/merchant/links -H "Authorization: Bearer $RUGWARD_PAY_KEY"
# turn one off
curl -X POST https://rugward.com/api/pay/merchant/links \
-H "Authorization: Bearer $RUGWARD_PAY_KEY" -H "Content-Type: application/json" \
-d '{"deactivate": "k33JZ0ij5F2yLDprwrQgjN"}'Ошибки#
{ "error": "Amount in USD, e.g. 25 or 25.50." }
// some temporary errors also carry "retry": true| HTTP | Значение | Что делать |
|---|---|---|
| 400 | неверные входные данные (в сообщении указано поле) | исправьте запрос |
| 401 | ключ API отсутствует или недействителен | проверьте ключ; возможно, он отозван |
| 403 | межсайтовый запрос отклонён, условия продавца не приняты, аккаунт приостановлен или действие запрещено для ключей | прочитайте сообщение |
| 404 | не найдено или принадлежит не вам | проверьте id |
| 409 | конфликт (например, отмена оплаченного счёта или уже 100 активных ссылок) | прочитайте сообщение |
| 415 | тело не в формате JSON | отправьте Content-Type: application/json |
| 429 | лимит частоты или 500 счетов за последний час | подождите и повторите с нарастающей задержкой |
| 451 | недоступно в вашем регионе | — |
503 с "retry": true | блокчейн или источник цен временно недоступен | повторите через несколько секунд |
Лимиты#
- Частота запросов: около 20 запросов в минуту с одного IP-адреса на все эндпоинты
/api/pay/*, плюс потолок 30 в минуту на группу эндпоинтов. Используйте вебхуки вместо опроса; если опрашиваете, раза в минуту на открытый счёт более чем достаточно. - Счета: 500 на продавца в час.
- Платёжные ссылки: 100 активных на продавца; каждая ссылка создаёт не более 100 счетов в час.
Чек-лист интеграции#
- Создавайте счёт со своего сервера, когда клиент оформляет заказ; сохраните
idвместе с заказом. - Перенаправьте клиента на
url. - При
invoice.paidилиinvoice.overpaid(вебхук) проверьте подпись, затем перечитайте счёт черезGET /api/pay/merchant/invoices/:idи проверьтеstatusиamountUsdперед отправкой товара. - Обрабатывайте
underpaid,lateиexpired(см. Статусы). - Сделайте обработчик идемпотентным: одно и то же событие может прийти несколько раз.
Обновлено: 30 октября 2026 г.