API CryBit
Выставляете счёт, отдаёте покупателю ссылку, получаете webhook когда перевод пришёл. Деньги на баланс USDT. Без карт, без P2P, без кошелька как продукта.
Быстрый старт
- Зарегистрируйтесь в кабинете, добавьте магазин, дождитесь модерации.
- В карточке магазина выберите режим: тестовый или боевой.
- Укажите webhook, если нужен колбек на ваш сервер.
- Выпустите ключ в API-ключах. Он показывается один раз.
- Создайте счёт и откройте
pay_url.
curl -X POST https://api.scr1pto.icu/api/v1/payments \
-H "Authorization: Bearer sk_ваш_ключ" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"amount": 1000, "currency": "RUB", "order_id": "ORD-1048", "purpose": "Заказ 1048"}'
Авторизация
Ключ начинается с sk_ и привязан к одному магазину. Передавайте его в каждом запросе к /api/v1/*.
| Заголовок | Пример |
|---|---|
| Authorization | Bearer sk_… |
| X-Api-Key | sk_… — тот же ключ, если Bearer неудобен |
| Accept | application/json |
| Content-Type | application/json для POST |
Ключ не привязан к сети. Тестовый или боевой режим берётся из настроек магазина в момент создания счёта.
Тестовый и боевой
Переключатель в карточке магазина: Кабинет → Магазины → точка → блок «Режим».
| Режим | Что происходит |
|---|---|
| test | Счёт с sandbox: true. На странице оплаты кнопка «Отметить оплаченным». Баланс не пополняется. |
| live | Ждём реальный перевод. Автопроверка TRC-20, ERC-20, BEP-20, TON, SOL. После paid — зачисление USDT минус комиссия. |
Уже созданные счета не меняют режим, если вы переключили магазин позже. Новый режим действует на новые счета.
Создать счёт
Магазин берётся из ключа, отдельно shop_id передавать не нужно.
| Поле | Тип | Описание | |
|---|---|---|---|
| amount | number | обязательно | Сумма заказа, минимум 0.01 |
| currency | string | обязательно | RUB, USD, EUR или USDT |
| purpose | string | нет | Назначение, до 240 символов |
| order_id | string | нет | Ваш номер заказа, до 80 символов. Если пусто — сгенерируем CB-… |
| ttl_minutes | integer | нет | Жизнь счёта, 5–1440. По умолчанию 30 |
curl -X POST https://api.scr1pto.icu/api/v1/payments \
-H "Authorization: Bearer sk_…" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"amount": 1490,
"currency": "RUB",
"order_id": "ORD-1048",
"purpose": "Оплата заказа 1048",
"ttl_minutes": 30
}'
const res = await fetch('https://api.scr1pto.icu/api/v1/payments', {
method: 'POST',
headers: {
Authorization: 'Bearer sk_…',
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify({
amount: 1490,
currency: 'RUB',
order_id: 'ORD-1048',
purpose: 'Оплата заказа 1048',
}),
})
const invoice = await res.json()
window.location = invoice.pay_url
$ch = curl_init('https://api.scr1pto.icu/api/v1/payments');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer sk_…',
'Content-Type: application/json',
'Accept: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'amount' => 1490,
'currency' => 'RUB',
'order_id' => 'ORD-1048',
'purpose' => 'Оплата заказа 1048',
]),
CURLOPT_RETURNTRANSFER => true,
]);
$invoice = json_decode(curl_exec($ch), true);
Ответ 201
{
"uuid": "28d0ff38-949c-435e-ad41-c81c219b3597",
"order_id": "ORD-1048",
"purpose": "Оплата заказа 1048",
"amount": 1490,
"currency": "RUB",
"amount_crypto": "16.390000",
"crypto": null,
"network": null,
"status": "waiting",
"sandbox": true,
"needs_method": true,
"pay_url": "https://scr1pto.icu/pay/28d0ff38-949c-435e-ad41-c81c219b3597",
"expires_at": "2026-08-19T23:41:42+00:00",
"callback_url": "https://shop.ru/pay/hook",
"merchant_amount": "16.390000"
}
Адрес и сеть появятся, когда покупатель выберет монету на pay_url. До этого needs_method: true.
Получить счёт
Тот же объект, что после создания. Если срок вышел, статус станет expired.
curl https://api.scr1pto.icu/api/v1/payments/28d0ff38-949c-435e-ad41-c81c219b3597 \ -H "Authorization: Bearer sk_…" \ -H "Accept: application/json"
| Поле | Смысл |
|---|---|
| uuid | Идентификатор счёта |
| pay_url | Страница для покупателя |
| status | waiting / paid / expired / cancelled |
| sandbox | true — тест, false — бой |
| address | Адрес для перевода, после выбора сети |
| txid | Хеш транзакции в сети |
| fee_amount | Комиссия шлюза |
| merchant_amount | Сколько уйдёт на баланс |
Страница оплаты
Готовая страница https://scr1pto.icu/pay/{uuid}. Покупатель выбирает USDT или USDC и сеть, получает QR и адрес. Статус обновляется сам по WebSocket.
Интеграция с вашей стороны: создать счёт и редирект на pay_url. Сеть за покупателя выбирать не нужно.
Публичные методы
Без API-ключа — ими пользуется страница оплаты. Можно вызывать сами, если рисуете свой UI.
Список монет и сетей с типом комиссии.
Публичные данные счёта: сумма, статус, адрес, QR-данные.
curl -X POST https://api.scr1pto.icu/api/payments/{uuid}/method \
-H "Content-Type: application/json" \
-d '{"crypto":"USDT","network":"TRC-20"}'
В ответе появятся address, amount_crypto, комиссия. Если сеть недоступна — 422.
Только тестовые счета. Помечает оплату без перевода. На боевом режиме вернёт 422 «Песочница выключена».
Баланс
curl https://api.scr1pto.icu/api/v1/wallet \ -H "Authorization: Bearer sk_…" \ -H "Accept: application/json"
{
"available_usdt": 12.48,
"pending_usdt": 0,
"currency": "USDT",
"network": "TRC-20",
"ledger": [],
"payouts": []
}
Баланс один на мерчанта, не на магазин. Тестовые оплаты сюда не падают. Вывод — из кабинета, сейчас на TRC-20.
Webhook
URL задаётся в настройках магазина, не в запросе на счёт. Мы отправим POST, когда счёт станет paid.
| Заголовок | Значение |
|---|---|
| Content-Type | application/json |
| X-Scr1pto-Event | payment.paid |
{
"uuid": "28d0ff38-949c-435e-ad41-c81c219b3597",
"order_id": "ORD-1048",
"status": "paid",
"txid": "0x… или подпись сети",
"amount": 1490,
"currency": "RUB",
"amount_crypto": "16.390000",
"crypto": "USDT",
"network": "TRC-20",
"sandbox": false
}
Таймаут 8 секунд, повторно не шлём. Проверяйте статус ещё и через GET, если хук не дошёл.
Статусы
| status | Когда |
|---|---|
| waiting | Ждём оплату, счёт жив |
| paid | Перевод найден или тест отмечен |
| expired | Вышло время ttl |
| cancelled | Отменён из кабинета |
Монеты и сети
Суммы в API — человеческие единицы (1 USDT = 1.000000). На BEP-20 в сети у токена 18 decimals, мы это учитываем сами.
| Монета | Сеть | Автопроверка в бою |
|---|---|---|
| USDT | TRC-20 | да |
| USDT | ERC-20 | да |
| USDT | BEP-20 | да |
| USDT | TON | да |
| USDT | SOL | да |
| USDC | TRC-20 | да |
| USDC | ERC-20 | да |
Комиссию шлюза правите в админке по монете и сети: процент или фикс. Если комиссия ≥ суммы счёта, выбор сети вернёт 422.
Ошибки
| Код | Когда |
|---|---|
| 401 | Нет ключа, ключ отозван, магазин не одобрен |
| 404 | Счёт не найден или чужой |
| 422 | Валидация, магазин на модерации, счёт закрыт, сеть недоступна |
| 429 | Больше 60 запросов в минуту на ключ |
{
"message": "API-ключ недействителен."
}
{
"message": "The amount field is required.",
"errors": {
"amount": ["The amount field is required."]
}
}
Готово. Выпустите ключ в кабинете и пробейте тестовый счёт на 1 USDT — на странице оплаты его можно закрыть без перевода.