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)
| Поле | Тип | Описание |
|---|---|---|
region | string | Код региона, 2 латинские буквы (например RU) |
in_stock | boolean | Только товары в наличии |
limit | integer | Кол-во записей, 1-500 (по умолчанию 100) |
offset | integer | Смещение для пагинации |
limit/offset/total считают строки «издание × регион», а не количество игр — у игры с несколькими регионами или изданиями может быть несколько строк.
curl "https://nervixy.digital/api.php?action=api_gifts" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"region": "RU", "in_stock": true, "limit": 50, "offset": 0}'
{
"ok": true,
"total": 94,
"limit": 50,
"offset": 0,
"gifts": [
{
"app_id": 620,
"products": [
{
"product_id": 304,
"name": "Portal 2",
"regions": [
{ "region": "RU", "price": 0.75, "currency": "USD", "in_stock": 1 }
]
},
{
"product_id": 305,
"name": "Portal 2 - The Final Hours",
"regions": [
{ "region": "RU", "price": 4.99, "currency": "USD", "in_stock": 1 }
]
}
]
}
]
}
Важно: у одной игры (app_id) может быть несколько изданий. Для покупки используйте product_id конкретного издания из products[], а не app_id.
region — цены сразу по всем регионам.| Поле | Тип | Описание |
|---|---|---|
app_id | integer | Steam AppID игры (обязательно) |
region | string | Код региона, 2 латинские буквы (необязательно — без него цены по всем регионам) |
curl "https://nervixy.digital/api.php?action=api_product_info" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"app_id": 620, "region": "RU"}'
{
"ok": true,
"app_id": 620,
"products": [
{
"product_id": 304,
"name": "Portal 2",
"regions": [
{ "region": "RU", "price": 0.75, "currency": "USD", "in_stock": true }
]
},
{
"product_id": 305,
"name": "Portal 2 - The Final Hours",
"regions": [
{ "region": "RU", "price": 4.99, "currency": "USD", "in_stock": true }
]
}
]
}
Одному app_id может соответствовать несколько изданий — выбирайте нужное по name и используйте его product_id для покупки. Без region массив regions содержит все доступные регионы.
product_id (id конкретного издания игры, из api_gifts или api_product_info) + region. Сумма списывается с баланса сразу.Важно: product_id здесь — это id издания, а НЕ Steam AppID. У одного AppID может быть несколько изданий с разными ценами (см. api_gifts/api_product_info). Указание не того product_id приведёт к покупке другого издания.
| Поле | Тип | Описание |
|---|---|---|
product_id | integer | Id издания (см. product_id внутри products[] в ответе api_gifts или api_product_info) — НЕ Steam AppID |
region | string | Код региона, 2-4 буквы, напр. RU |
invite_url | string | Steam quick-invite ссылка вида https://s.team/p/xxxx-xxxx/XXXXXXXX (профильные ссылки не принимаются) |
partner_id | string | Необязательно — свой ID клиента, вернётся в ответе и в заказе |
curl "https://nervixy.digital/api.php?action=api_gift_buy" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"product_id": 304, "region": "RU", "invite_url": "https://s.team/p/xxxx-xxxx/XXXXXXXX", "partner_id": "ваш_id_клиента"}'
{
"ok": true,
"order_id": "90b22096-9ceb-45ad-880d-6727465ae810",
"product_id": 304,
"name": "Portal 2",
"paid": 0.75,
"partner_id": null,
"status": "processing",
"created_at": "2026-10-09T12:00:00+00:00"
}
{
"error": "Поставщик отклонил заказ: ... . Средства возвращены.",
"order_id": "90b22096-9ceb-45ad-880d-6727465ae810",
"status": "rejected"
}
Прочие ошибки: 404 — гифт не найден; 400 — нет в наличии / некорректная ссылка / недостаточно средств.
⏱ лимит: 20 запросов / 60 сек (IP) + 10 запросов / 60 сек (пользователь)| Поле | Тип | Описание |
|---|---|---|
limit | integer | Кол-во записей, макс 100 |
offset | integer | Смещение для пагинации |
curl "https://nervixy.digital/api.php?action=api_gift_orders" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"limit": 50, "offset": 0}'
{
"ok": true,
"total": 12,
"limit": 50,
"offset": 0,
"orders": [
{
"order_id": "90b22096-9ceb-45ad-880d-6727465ae810",
"product_id": 304,
"app_id": 620,
"name": "Portal 2",
"region": "RU",
"amount": 0.75,
"currency": "USD",
"status": "delivered",
"error": null,
"created_at": "2026-10-09 12:00:00"
}
]
}
Статус заказа также доступен через общий api_status.
⏱ лимит: 1 запрос / 60 секВместо опроса статусов мы сами отправим 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-атакам.