Простой REST API для сайтов и Telegram-ботов: создайте счёт, отправьте клиента на страницу оплаты и получите подписанный вебхук, когда платёж поступит.
Боевой ключ: реальные платежи, зачисляются на баланс ScarabPay.
sk_test_
Тестовый ключ: тестовые счета, ничего не списывается и не зачисляется.
Никогда не размещайте ключ в мобильном приложении, коде браузера или публичном репозитории. При утечке отзовите ключ во вкладке «Разработчикам» и создайте новый.
Песочница
Используйте ключ sk_test_, чтобы разрабатывать и тестировать без движения денег. Тестовые счета открывают ту же страницу оплаты с плашкой «тест».
Отметьте счёт оплаченным через POST /invoices/{id}/simulate — режим "full" или "partial".
Вебхуки отправляются как обычно, с "sandbox": true в теле.
Постоянные адреса доступны только в боевом режиме.
Соглашения
Запросы и ответы — JSON. Передавайте Content-Type: application/json.
Суммы — строки в USD с двумя знаками. Количество монет — строки без лишних нулей.
Время — ISO 8601 с часовым поясом.
Успешные ответы оборачивают объект в "data". Списки добавляют "meta" с page, pages и total; используйте ?page= и ?per_page= (до 100).
order_id делает повтор создания безопасным: тот же order_id вернёт тот же счёт (200), а не создаст новый (201).
Ошибки
Ошибки возвращают статус не 2xx и JSON со стабильным code, по которому можно ветвиться.
Статус
Код
Значение
401
unauthorized
Ключ отсутствует, неверен или отозван.
403
forbidden
Проект не активен (не подтверждён или приостановлен).
404
not_found
Счёт не найден в этом проекте и режиме.
409
limit_reached
Достигнут лимит вашего уровня.
409
invoice_not_payable
Счёт больше нельзя изменить (оплачен, истёк или отменён).
422
validation_failed
Неверное поле; подробности в "fields".
422
method_not_allowed
Выбранный способ оплаты не включён для проекта.
429
rate_limited
Слишком много запросов. Подождите и повторите.
502
provider_error
Временная ошибка провайдера. Повторите с тем же order_id.
503
coin_unavailable
Монета временно недоступна; предложите другой способ.
422
{
"error": {
"code": "validation_failed",
"message": "Invalid request.",
"fields": { "order_id": ["The order id field is required."] }
}
}
Лимиты запросов
Каждый API-ключ может отправлять до 60 запросов в минуту. После множества неудачных попыток с одного IP этот IP блокируется на 10 минут.
При 429 подождите несколько секунд и повторите. Не опрашивайте счета в цикле — используйте вебхуки.
Ресурсы
Счета
Один счёт на заказ. Клиент выбирает монету на странице оплаты (или вы задаёте её заранее) и платит точную сумму. Неоплаченный счёт истекает через 30 минут.
Создать счёт
POST/invoices
Возвращает 201 с новым счётом или 200 с существующим, если order_id уже использовался.
Поле
Описание
amount
string · обязательно
Сумма в USD, от 1 до 100000.
order_id
string · обязательно
Ваш уникальный номер заказа. Буквы, цифры и _ - : ., до 100 символов.
description
string · необязательно
Показывается клиенту на странице оплаты.
customer_ref
string · необязательно
ID клиента у вас, например tg:55123.
customer_email
string · необязательно
Email клиента для квитанций.
return_url
url · необязательно
Куда ведёт кнопка «Вернуться в магазин» после оплаты.
method
string · необязательно
Заранее выбрать монету и пропустить выбор, например usdt_trc20. См. /currencies.
Укажите URL вебхука и скопируйте секрет подписи во вкладке «Разработчикам». Мы отправляем JSON-событие POST-запросом при каждом изменении. Ответьте любым 2xx в течение 10 секунд.
Заголовки
Описание
X-ScarabPay-Event
Название события.
X-ScarabPay-Delivery
Уникальный id события. Используйте для отсева дублей.
X-ScarabPay-Signature
Метка времени и подпись HMAC-SHA256. t=<unix>,v1=<hex>
Другое обновление платежа по счёту (например, платёж на проверке).
deposit.received
Поступил депозит на постоянный адрес.
address.idle
На постоянный адрес давно не было депозитов.
address.unbound
Постоянный адрес отвязан от клиента.
payout.sent
Выплата с вашего баланса отправлена.
project.suspended
Ваш проект приостановлен.
ping
Тестовое событие с кнопки «Отправить тест».
Проверка подписи
Вычислите HMAC-SHA256 от "t.body" секретом вебхука и сравните с v1 за постоянное время. Используйте сырое тело как есть и отклоняйте метки старше 5 минут.
import hmac, hashlib, os, time
def verify(sig_header: str, body: bytes) -> bool:
parts = dict(p.split("=", 1) for p in sig_header.split(",") if "=" in p)
secret = os.environ["SCARABPAY_WEBHOOK_SECRET"].encode()
expected = hmac.new(secret, parts.get("t", "").encode() + b"." + body, hashlib.sha256).hexdigest()
fresh = abs(time.time() - int(parts.get("t", 0))) < 300
return fresh and hmac.compare_digest(expected, parts.get("v1", ""))
# FastAPI / aiohttp: pass request.headers["X-ScarabPay-Signature"] and the raw body bytes
Повторы
Если сервер не ответил 2xx, мы повторяем до 8 раз: через 1 мин, 5 мин, 15 мин, 1 ч, 3 ч, 6 ч и 12 ч. Любое событие можно переотправить из журнала доставок.
#1+0
#2+1m
#3+5m
#4+15m
#5+1h
#6+3h
#7+6h
#8+12h
Обработчик должен быть идемпотентным: одно событие может прийти несколько раз. Сохраняйте X-ScarabPay-Delivery и пропускайте повторы.
Справочник
Объекты
Счёт
id
ID счёта, начинается с inv_.
order_id
Ваш уникальный номер заказа. Буквы, цифры и _ - : ., до 100 символов.
status
См. статусы счёта.
amount · paid_amount
Получено в USD на данный момент.
method · coin · network
Выбранная монета и сеть, null до выбора.
address · coin_amount
Адрес и точное количество монет к оплате.
checkout_url
Страница оплаты. Отправьте клиента сюда.
sandbox
true для тестовых счетов.
expires_at · paid_at · created_at
Время в ISO 8601.
Платёж
id
ID платежа, начинается с pay_.
invoice_id · order_id · customer_ref
ID клиента у вас, например tg:55123.
coin · network · coin_amount
Выбранная монета и сеть, null до выбора.
amount · fee · net
Сумма в USD, наша комиссия и зачисление вам.
tx_hash
Хеш транзакции в блокчейне.
status
credited, held, review или sandbox.
Постоянный адрес
customer_ref
ID клиента у вас, например tg:55123.
network · address
Адрес и точное количество монет к оплате.
memo
Memo / тег, если сеть его требует (например TON).
total_received
Всего получено на адрес в USD.
last_deposit_at · created_at
Время в ISO 8601.
Статусы счёта
pending
Ожидает оплаты.
paid
Полностью оплачен и зачислен. Выдайте заказ.
underpaid
Поступило меньше суммы. Полученная часть зачислена.
expired
Время вышло без оплаты.
late
Оплачен после истечения. Платёж задерживается для проверки до зачисления.
cancelled
Отменён вами.
Нужна помощь с интеграцией?
Поддержка проверит настройку и протестирует события вместе с вами.