API — Интеграция
Публичная документация API Nervixy. Просмотр не требует входа. API-ключ выдаётся в личном кабинете после регистрации — раздел «API» в настройках аккаунта.
Содержание
Все запросы отправляются на базовый URL. Ответы всегда в формате JSON (UTF-8). Признак успеха — поле ok: true.
https://nervixy.digital/api.php
Нужный метод выбирается параметром action в query-строке, например ?action=api_me. Тело POST-запросов — JSON с заголовком Content-Type: application/json.
curl "https://nervixy.digital/api.php?action=api_me" \ -H "X-API-Key: ВАШ_КЛЮЧ"
Дополнительно действует белый список IP: запросы принимаются только с адресов, добавленных в разделе Настройки. Запрос с постороннего IP будет отклонён даже с верным ключом.
{
"ok": false,
"error": "Описание ошибки"
}
{
"ok": true,
"login": "client123",
"balance": 42.50,
"discount": 2.00
}
{
"ok": true,
"base": "USD",
"rates": {
"KZT": 471.45016,
"RUB": 78.57377,
"UAH": 44.68123
},
"updated_at": "2026-07-18 06:23:43"
}
order_id.curl "https://nervixy.digital/api.php?action=api_status" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"order_id": "a1b2c3..."}'
{
"ok": true,
"order": "a1b2c3...",
"status": "delivered",
"created_at": "2026-07-18 12:00:00"
}
Статусы: processing · delivered (успешно, пополнение и гифт) · rejected — если заказ не найден, вернётся код 404
amount — списание.| Поле | Тип | Описание |
|---|---|---|
limit | integer | Кол-во записей, макс 100 |
offset | integer | Смещение для пагинации |
curl "https://nervixy.digital/api.php?action=api_payments" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"limit": 50, "offset": 0}'
{
"ok": true,
"total": 340,
"limit": 50,
"offset": 0,
"payments": [
{
"id": "a1b2c3...",
"amount": "-6.16",
"comment": "API заказ Steam: mylogin (номинал $6.29)",
"created_at": "2026-07-18 12:00:00"
}
]
}
| Поле | Тип | Описание |
|---|---|---|
amount | number | Сумма в выбранной валюте; лимиты: от 15 ₽ до 30 000 ₽ (эквивалент) |
steam_login | string | Логин Steam, 3–64 символа (латиница, цифры, _ - .) |
currency | string | Валюта: USD, RUB, KZT, UAH. По умолчанию USD |
partner_id | string | Необязательно. Ваш внутренний ID клиента, латиница/цифры. Не передан — сгенерируется автоматически |
curl -X POST "https://nervixy.digital/api.php?action=api_order" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"amount": 500,
"currency": "RUB",
"steam_login": "mylogin",
"partner_id": "MYPARTNER01"
}'
{
"ok": true,
"order_id": "a1b2c3...",
"currency": "RUB",
"amount": 6.29,
"paid": 6.16,
"original_amount": 500,
"original_paid": 490,
"steam_login": "mylogin",
"partner_id": "MYPARTNER01",
"created_at": "2026-07-18T12:00:00+03:00"
}
currency — валюта из запроса; amount — номинал заказа в USD, paid — списано с баланса в USD с учётом скидки; original_amount и original_paid — те же суммы в валюте запроса. При нехватке средств вернётся ошибка с полями balance и required.
| Поле | Тип | Описание |
|---|---|---|
limit | integer | Кол-во записей, макс 100 |
offset | integer | Смещение для пагинации |
curl "https://nervixy.digital/api.php?action=api_orders" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"limit": 50, "offset": 0}'
{
"ok": true,
"total": 128,
"limit": 50,
"offset": 0,
"orders": [
{
"id": "a1b2c3...",
"amount": "6.29",
"paid": "6.16",
"currency": "RUB",
"original_amount": "500.00",
"original_paid": "490.00",
"steam_login": "mylogin",
"status": "delivered",
"created_at": "2026-07-18 12:00:00"
}
]
}
amount/paid — в USD; original_amount/original_paid — в валюте заказа (currency).
| Поле | Тип | Описание |
|---|---|---|
steam_login | string | Логин Steam, 3-64 символа (латиница, цифры, _ - .) |
curl -X POST "https://nervixy.digital/api.php?action=api_check_login" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"steam_login": "myLogin"}'
{
"ok": true,
"steam_login": "myLogin",
"valid": true,
"status_message": "Steam account validated"
}
Поле valid: true — аккаунт можно пополнить, false — нельзя (см. status_message)
Вместо опроса статусов мы сами отправим POST-запрос на ваш URL при каждой смене статуса заказа — пополнения и гифта. Укажите URL (только https) в личном кабинете в разделе Настройки → Webhooks — там же вы получите секретный ключ whsec_... (показывается один раз) и сможете отправить тестовое событие.
Content-Type: application/json и X-Nervixy-Signature — подпись HMAC-SHA256 тела запроса вашим секретом.{
"event": "topup.delivered",
"type": "topup",
"order_id": "a1b2c3...",
"status": "delivered",
"amount": 6.29,
"paid": 6.16,
"steam_login": "mylogin",
"game_name": null,
"region": null,
"created_at": "2026-07-19 12:00:00"
}
| Поле | Описание |
|---|---|
event | topup.<статус> / gift.<статус> — тип заказа + статус, напр. topup.delivered, gift.rejected; webhook.test — тест из настроек |
type | topup — пополнение, gift — Steam Gift |
status | processing · delivered (успешно, пополнение и гифт) · rejected |
amount / paid | Номинал и списанная сумма, USD |
game_name / region | Только для type: "gift", иначе null |
Ответьте кодом 2xx в течение 5 секунд — событие считается доставленным. Иначе мы повторим отправку через 1, 5, 15 и 60 минут (всего 5 попыток). Если все попытки неудачны, событие помечается как неотправленное, а вам придёт уведомление в Telegram-бот.
$body = file_get_contents('php://input');
$sig = $_SERVER['HTTP_X_NERVIXY_SIGNATURE'] ?? '';
$calc = hash_hmac('sha256', $body, 'ВАШ_СЕКРЕТ_whsec');
if (!hash_equals($calc, $sig)) { http_response_code(403); exit; }
$data = json_decode($body, true);
// защита от повтора: отклоняем события старше 5 минут
if (abs(time() - strtotime($data['created_at'])) > 300) { http_response_code(403); exit; }
// ... ваша обработка ...
http_response_code(200);
import hmac, hashlib, json
def verify(body_bytes, signature_header, secret):
calc = hmac.new(secret.encode(), body_bytes, hashlib.sha256).hexdigest()
return hmac.compare_digest(calc, signature_header)
# body_bytes — сырое тело запроса, signature_header — заголовок X-Nervixy-Signature
# при несовпадении отвечайте 403, при успехе — 200
Сравнивайте подписи только через hash_equals / compare_digest — обычное сравнение строк уязвимо к timing-атакам.