Документация API

С помощью LisansX REST API вы можете загружать список товаров и остатки на свой сайт, оформлять заказы и мгновенно получать коды. Ниже приведены сведения об аутентификации, конечные точки и примеры на PHP, Node.js и Python.

API-ключи выдаются только реселлерам. Документация доступна всем; для отправки запросов необходим активный пакет реселлера. Ваш ключ создаётся после одобрения заявки на получение статуса реселлера.

Аутентификация

Каждый запрос подписывается с помощью трёх заголовков. Поскольку подпись охватывает метку времени, HTTP-метод, путь и необработанное тело запроса, запрос невозможно изменить при передаче или отправить повторно.

ЗаголовокЗначение
X-Api-KeyВаш API-ключ
X-TimestampUnix-время в секундах — должно отличаться от времени сервера не более чем на ±300 с
X-SignatureПодпись в шестнадцатеричном формате, сформированная по приведённой ниже формуле
signingKey = sha256_hex(api_secret)
signature  = hmac_sha256_hex(signingKey, timestamp + "\n" + METHOD + "\n" + path + "\n" + rawBody)
  • path: путь и строка запроса, если есть (/api/v1/products?limit=50). Параметры запроса также входят в подпись — подписывайте ровно тот URL, который запрашиваете.
  • rawBody: точная копия отправляемого JSON; для GET-запросов — пустая строка.
  • Не сериализуйте повторно тело после подписи — даже малейшее различие делает подпись недействительной.

Эндпоинты

МетодПутьОписание
GET /api/v1/products Все товары в продаже по дилерским ценам
GET /api/v1/products/{id} Сведения о товаре и наличие на складе
POST /api/v1/order Создать заказ — при успехе возвращает коды доставки
GET /api/v1/order/{order_no} Статус заказа и выданные коды
GET /api/v1/balance Ваш текущий баланс

Лимит запросов в минуту устанавливается для каждого дилерского аккаунта. При превышении возвращается 429 rate_limited. Все ответы об ошибках имеют формат {"success": false, "error": "...", "message": "..."}.

Примеры интеграции

Готовы к копированию и вставке

<?php
final class LisansXClient
{
    public function __construct(
        private string $baseUrl,
        private string $apiKey,
        private string $apiSecret
    ) { $this->baseUrl = rtrim($baseUrl, '/'); }

    public function request(string $method, string $path, ?array $body = null): array
    {
        $method  = strtoupper($method);
        $bodyRaw = $body !== null ? json_encode($body, JSON_UNESCAPED_UNICODE) : '';
        $ts      = (string)time();

        // Ключ подписи = SHA-256 hex-дайджест исходного секрета
        $signingKey = hash('sha256', $this->apiSecret);
        $signature  = hash_hmac('sha256', $ts . "\n" . $method . "\n" . $path . "\n" . $bodyRaw, $signingKey);

        $ch = curl_init($this->baseUrl . $path);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CUSTOMREQUEST  => $method,
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_HTTPHEADER     => [
                'X-Api-Key: '   . $this->apiKey,
                'X-Timestamp: ' . $ts,
                'X-Signature: ' . $signature,
                'Content-Type: application/json',
            ],
        ]);
        if ($body !== null) curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyRaw);

        $raw = curl_exec($ch);
        return json_decode((string)$raw, true) ?: ['success' => false, 'error' => 'invalid_response'];
    }
}

// --- Использование ---
$api = new LisansXClient('https://lisansx.net', 'ВАШ_API_КЛЮЧ', getenv('LISANSX_SECRET'));

$products = $api->request('GET', '/api/v1/products');
$order    = $api->request('POST', '/api/v1/order', ['product_id' => 1, 'qty' => 1]);

if (!empty($order['success'])) {
    foreach ($order['data']['codes'] as $code) {
        echo "Teslim edilen kod: $code\n";
    }
} else {
    error_log('LisansX hatasi: ' . ($order['message'] ?? 'bilinmiyor'));
}

Частые ошибки

401 invalid_signature
Возможно, вы пропустили получение ключа подписи как sha256(secret).
401 invalid_timestamp
Часы вашего сервера рассинхронизированы. Синхронизируйте их через NTP.
403 ip_not_allowed
Задано ограничение по IP, а ваш запрос поступает с IP-адреса, которого нет в списке.
409 replayed_request
Один и тот же подписанный POST-запрос пришёл повторно (защита от повторного воспроизведения). Подписывайте каждый запрос с новой меткой времени; если вы оформляете два заказа на один и тот же товар в одну и ту же секунду, добавьте в тело уникальное поле "nonce" (например, номер вашего собственного заказа).
429 rate_limited
Вы превысили лимит запросов в минуту; распределите запросы во времени.
409 out_of_stock
Товара нет в наличии или нет в запрошенном количестве (поле available показывает оставшееся количество). Заказ не создаётся, средства с баланса не списываются. Проверяйте наличие через GET /api/v1/products/{id}, прежде чем принимать оплату от своего клиента; вебхук stock.changed мгновенно уведомит вас, когда товар закончится или снова появится.
409 price_changed
Если вы передали в заказе необязательный параметр "max_unit_price", а текущая цена за единицу его превышает, заказ не создаётся; unit_price показывает текущую цену.
402 delivery_failed
Заказ создан, но товар не удалось выдать (например, он закончился у поставщика в последний момент). Сумма автоматически возвращается на ваш баланс.
Написать в Telegram Создать запрос в поддержку