Документация API
С помощью LisansX REST API вы можете загружать список товаров и остатки на свой сайт, оформлять заказы и мгновенно получать коды. Ниже приведены сведения об аутентификации, конечные точки и примеры на PHP, Node.js и Python.
API-ключи выдаются только реселлерам. Документация доступна всем; для отправки запросов необходим активный пакет реселлера. Ваш ключ создаётся после одобрения заявки на получение статуса реселлера.
Аутентификация
Каждый запрос подписывается с помощью трёх заголовков. Поскольку подпись охватывает метку времени, HTTP-метод, путь и необработанное тело запроса, запрос невозможно изменить при передаче или отправить повторно.
| Заголовок | Значение |
|---|---|
X-Api-Key | Ваш API-ключ |
X-Timestamp | Unix-время в секундах — должно отличаться от времени сервера не более чем на ±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- Заказ создан, но товар не удалось выдать (например, он закончился у поставщика в последний момент). Сумма автоматически возвращается на ваш баланс.