Содержание
Введение

Все запросы отправляются на базовый 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 будет отклонён даже с верным ключом.

Коды ответов и ошибки
200Успешный запрос. 400Неверные параметры. 401Неверный API-ключ или IP не в белом списке. 403Аккаунт заблокирован. 404Объект не найден. 429Превышен лимит запросов. 500Внутренняя ошибка сервера. 502Поставщик отклонил заказ.
Формат ошибки
{
  "ok": false,
  "error": "Описание ошибки"
}
Информация об аккаунте
POST/api.php?action=api_me
Логин, текущий баланс и персональная скидка.
Ответ
{
  "ok": true,
  "login": "client123",
  "balance": 42.50,
  "discount": 2.00
}
Курсы валют
GET/api.php?action=api_rates
Актуальные курсы валют.
Ответ
{
  "ok": true,
  "base": "USD",
  "rates": {
    "KZT": 471.45016,
    "RUB": 78.57377,
    "UAH": 44.68123
  },
  "updated_at": "2026-07-18 06:23:43"
}
Статус заказа
POST/api.php?action=api_status
Текущий статус любого заказа — пополнения или гифта — по его 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

История платежей
POST/api.php?action=api_payments
Все движения по балансу: пополнения, списания за заказы, возвраты. Отрицательный amount — списание.
Параметры
ПолеТипОписание
limitintegerКол-во записей, макс 100
offsetintegerСмещение для пагинации
Пример запроса
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"
    }
  ]
}
Создать заказ на пополнение
POST/api.php?action=api_order
Пополнение баланса Steam по логину. Средства списываются с вашего баланса с учётом скидки.
Параметры
ПолеТипОписание
amountnumberСумма в выбранной валюте; лимиты: от 15 ₽ до 30 000 ₽ (эквивалент)
steam_loginstringЛогин Steam, 3–64 символа (латиница, цифры, _ - .)
currencystringВалюта: USD, RUB, KZT, UAH. По умолчанию USD
partner_idstringНеобязательно. Ваш внутренний 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.

Список заказов
POST/api.php?action=api_orders
История ваших заказов на пополнение, новые первыми.
Параметры
ПолеТипОписание
limitintegerКол-во записей, макс 100
offsetintegerСмещение для пагинации
Пример запроса
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-логина
POST/api.php?action=api_check_login
Проверяет, можно ли пополнить указанный Steam-аккаунт, до создания заказа.
Параметры
ПолеТипОписание
steam_loginstringЛогин 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/api.php?action=api_gifts
Список доступных гифтов (игр) по регионам — цена и наличие. Все параметры необязательные.
Параметры
ПолеТипОписание
regionstringКод региона, 2 латинские буквы (например RU)
in_stockbooleanТолько товары в наличии
limitintegerКол-во записей, 1-500 (по умолчанию 100)
offsetintegerСмещение для пагинации

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.

⏱ лимит: 10 запросов / 60 сек
Информация о товаре
POST/api.php?action=api_product_info
Данные по играм с данным Steam AppID — все издания, цены и наличие. Без region — цены сразу по всем регионам.
Параметры
ПолеТипОписание
app_idintegerSteam AppID игры (обязательно)
regionstringКод региона, 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 содержит все доступные регионы.

лимит: 10 запросов / 60 сек
Купить гифт
POST/api.php?action=api_gift_buy
Покупка гифта по product_id (id конкретного издания игры, из api_gifts или api_product_info) + region. Сумма списывается с баланса сразу.

Важно: product_id здесь — это id издания, а НЕ Steam AppID. У одного AppID может быть несколько изданий с разными ценами (см. api_gifts/api_product_info). Указание не того product_id приведёт к покупке другого издания.

Параметры
ПолеТипОписание
product_idintegerId издания (см. product_id внутри products[] в ответе api_gifts или api_product_info) — НЕ Steam AppID
regionstringКод региона, 2-4 буквы, напр. RU
invite_urlstringSteam quick-invite ссылка вида https://s.team/p/xxxx-xxxx/XXXXXXXX (профильные ссылки не принимаются)
partner_idstringНеобязательно — свой 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"
}
Пример ответа (отказ поставщика, HTTP 502)
{
  "error": "Поставщик отклонил заказ: ... . Средства возвращены.",
  "order_id": "90b22096-9ceb-45ad-880d-6727465ae810",
  "status": "rejected"
}

Прочие ошибки: 404 — гифт не найден; 400 — нет в наличии / некорректная ссылка / недостаточно средств.

⏱ лимит: 20 запросов / 60 сек (IP) + 10 запросов / 60 сек (пользователь)
Список гифт-заказов
POST/api.php?action=api_gift_orders
История заказов на гифты текущего клиента.
Параметры
ПолеТипОписание
limitintegerКол-во записей, макс 100
offsetintegerСмещение для пагинации
Пример запроса
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 сек
Webhooks

Вместо опроса статусов мы сами отправим POST-запрос на ваш URL при каждой смене статуса заказа — пополнения и гифта. Укажите URL (только https) в личном кабинете в разделе Настройки → Webhooks — там же вы получите секретный ключ whsec_... (показывается один раз) и сможете отправить тестовое событие.

POSTваш URL
Тело запроса — JSON (UTF-8), заголовки: 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"
}
Поля
ПолеОписание
eventtopup.<статус> / gift.<статус> — тип заказа + статус, напр. topup.delivered, gift.rejected; webhook.test — тест из настроек
typetopup — пополнение, gift — Steam Gift
statusprocessing · delivered (успешно, пополнение и гифт) · rejected
amount / paidНоминал и списанная сумма, USD
game_name / regionТолько для type: "gift", иначе null
Подтверждение и повторы

Ответьте кодом 2xx в течение 5 секунд — событие считается доставленным. Иначе мы повторим отправку через 1, 5, 15 и 60 минут (всего 5 попыток). Если все попытки неудачны, событие помечается как неотправленное, а вам придёт уведомление в Telegram-бот.

Проверка подписи — PHP
$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);
Проверка подписи — Python
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-атакам.