Новость на модерации
Содержание статьи
<p>Lamoda использует OAuth 2.0 с типом гранта <code>client_credentials</code>. Для доступа к API необходимо получить токен и передавать его в заголовке каждого запроса.</p><br />
<br />
<b> Важно: единые credentials, единый TTL</b><br />
<ul><br />
<li>Один набор <code>client_id</code> / <code>client_secret</code> для обоих API</li><br />
<li>Время жизни токена: <b>15 минут (900 секунд)</b> для обоих API</li><br />
<li>Endpoints авторизации разные для каждого API</li><br />
</ul><br />
<h2>Endpoints авторизации</h2><br />
<br />
<table style="border-collapse: collapse; width: 100%;"><br />
<tbody><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>API</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Endpoint</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>TTL токена</b></td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;">Seller API</td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code><a class="txttohtmllink" href="https://public-api-seller.lamoda.ru/jsonrpc">https://public-api-seller.lamoda.ru/jsonrpc</a></code><br>метод: <code>v1.tokens.create</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">15 минут</td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;">B2B Platform API</td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code><a class="txttohtmllink" href="https://api-b2b.lamoda.ru/auth/token">https://api-b2b.lamoda.ru/auth/token</a></code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">15 минут</td><br />
</tr><br />
</tbody><br />
</table><br />
<br />
<h2>Получение токена</h2><br />
<br />
<h3>Seller API (JSON-RPC)</h3><br />
<br />
<pre><code>curl -X POST <a class="txttohtmllink" href="https://public-api-seller.lamoda.ru/jsonrpc">https://public-api-seller.lamoda.ru/jsonrpc</a> \<br />
-H "Content-Type: application/json" \<br />
-d '{<br />
"jsonrpc": "2.0",<br />
"id": "550e8400-e29b-41d4-a716-446655440000",<br />
"method": "v1.tokens.create",<br />
"params": {<br />
"client_id": "your_client_id",<br />
"client_secret": "your_client_secret",<br />
"grant_type": "client_credentials"<br />
}<br />
}'</code></pre><br />
<br />
<p><b>Успешный ответ Seller API:</b></p><br />
<br />
<pre><code>{<br />
"jsonrpc": "2.0",<br />
"id": "550e8400-e29b-41d4-a716-446655440000",<br />
"result": {<br />
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",<br />
"token_type": "bearer",<br />
"expires_in": 900<br />
}<br />
}</code></pre><br />
<br />
<h3>B2B Platform API (REST)</h3><br />
<br />
<pre><code>curl -X POST <a class="txttohtmllink" href="https://api-b2b.lamoda.ru/auth/token">https://api-b2b.lamoda.ru/auth/token</a> \<br />
-H "Content-Type: application/json" \<br />
-d '{<br />
"client_id": "your_client_id",<br />
"client_secret": "your_client_secret",<br />
"grant_type": "client_credentials"<br />
}'</code></pre><br />
<br />
<p><b>Успешный ответ B2B API:</b></p><br />
<br />
<pre><code>{<br />
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",<br />
"token_type": "Bearer",<br />
"expires_in": 900<br />
}</code></pre><br />
<br />
<table style="border-collapse: collapse; width: 100%;"><br />
<tbody><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Поле</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Тип</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Описание</b></td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>access_token</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">string</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">JWT-токен для авторизации запросов</td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>token_type</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">string</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Всегда <code>Bearer</code></td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>expires_in</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">integer</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Время жизни в секундах (900 = 15 минут)</td><br />
</tr><br />
</tbody><br />
</table><br />
<br />
<b> TTL = 15 минут!</b><br><br><br />
Токен живёт только <b>15 минут</b>. Если ваша интеграция выполняет длительные операции (загрузка большого каталога, batch-обновление цен), необходимо:<br />
<ul><br />
<li>Обновлять токен заранее (за 1-2 минуты до истечения)</li><br />
<li>Или запрашивать новый токен при получении ошибки <code>401 Unauthorized</code></li><br />
</ul><br />
<h2>Использование токена</h2><br />
<br />
<p>Передавайте токен в заголовке <code>Authorization</code>:</p><br />
<br />
<pre><code>curl -X GET <a class="txttohtmllink" href="https://api-b2b.lamoda.ru/api/v1/orders">https://api-b2b.lamoda.ru/api/v1/orders</a> \<br />
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."</code></pre><br />
<br />
<h2>Стратегии обновления токена</h2><br />
<br />
<h3>Вариант 1: Проактивное обновление (рекомендуется)</h3><br />
<br />
<p>Обновляйте токен за 1-2 минуты до истечения:</p><br />
<br />
<pre><code>import time<br />
import requests<br />
<br />
class LamodaAPI:<br />
def __init__(self, client_id, client_secret, base_url):<br />
self.client_id = client_id<br />
self.client_secret = client_secret<br />
self.base_url = base_url<br />
self.token = None<br />
self.token_expires_at = 0<br />
<br />
def get_token(self):<br />
# Обновляем токен за 60 секунд до истечения<br />
if self.token and time.time() < self.token_expires_at - 60:<br />
return self.token<br />
<br />
response = requests.post(<br />
f"{self.base_url}/auth/token",<br />
json={<br />
"client_id": self.client_id,<br />
"client_secret": self.client_secret,<br />
"grant_type": "client_credentials"<br />
}<br />
)<br />
data = response.json()<br />
<br />
self.token = data["access_token"]<br />
self.token_expires_at = time.time() + data["expires_in"]<br />
<br />
return self.token<br />
<br />
def request(self, method, endpoint, **kwargs):<br />
headers = kwargs.pop("headers", {})<br />
headers["Authorization"] = f"Bearer {self.get_token()}"<br />
<br />
return requests.request(<br />
method,<br />
f"{self.base_url}{endpoint}",<br />
headers=headers,<br />
**kwargs<br />
)</code></pre><br />
<br />
<h3>Вариант 2: Реактивное обновление</h3><br />
<br />
<p>При получении <code>401 Unauthorized</code> — запросите новый токен и повторите запрос:</p><br />
<br />
<pre><code>def request_with_retry(api, method, endpoint, data=None):<br />
try:<br />
return api.request(method, endpoint, json=data)<br />
except requests.HTTPError as e:<br />
if e.response.status_code == 401:<br />
# Сбрасываем токен и пробуем снова<br />
api.token = None<br />
return api.request(method, endpoint, json=data)<br />
raise</code></pre><br />
<br />
<h2>Ошибки авторизации</h2><br />
<br />
<table style="border-collapse: collapse; width: 100%;"><br />
<tbody><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Код</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Сообщение</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Причина</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Решение</b></td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>50401</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Unauthorized</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Токен истёк или невалиден</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Запросите новый токен</td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>50400</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Партнер не найден / Partner not found</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Неверный <code>client_id</code> или <code>client_secret</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Проверьте учётные данные у менеджера</td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>50403</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Forbidden</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Нет прав на ресурс</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Проверьте права доступа у менеджера</td><br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p>Полный список ошибок: <a href="17_2_error_codes.html">Справочник кодов ошибок</a></p><br />
<br />
<h2>Частые проблемы</h2><br />
<br />
<b> "Партнер не найден" (50400)</b><br><br><br />
<b>Причины:</b><br />
<ul><br />
<li>Неверный <code>client_id</code> или <code>client_secret</code></li><br />
<li>Партнёр не активирован в системе</li><br />
</ul><br />
<b>Решение:</b> Уточните credentials у вашего менеджера Lamoda<br />
<b> Токен перестаёт работать через 15 минут</b><br><br><br />
Это нормальное поведение! TTL токена = 900 секунд = 15 минут.<br><br />
Реализуйте автоматическое обновление токена (см. примеры выше).<br />
<h2>См. также</h2><br />
<br />
<ul><br />
<li><a href="1_4_auth_errors.html">Типичные ошибки авторизации</a></li><br />
<li><a href="17_2_error_codes.html">Справочник кодов ошибок</a></li><br />
<li><a href="16_1_postman_collection.html">Postman-коллекции</a></li><br />
</ul>
<br />
<b> Важно: единые credentials, единый TTL</b><br />
<ul><br />
<li>Один набор <code>client_id</code> / <code>client_secret</code> для обоих API</li><br />
<li>Время жизни токена: <b>15 минут (900 секунд)</b> для обоих API</li><br />
<li>Endpoints авторизации разные для каждого API</li><br />
</ul><br />
<h2>Endpoints авторизации</h2><br />
<br />
<table style="border-collapse: collapse; width: 100%;"><br />
<tbody><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>API</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Endpoint</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>TTL токена</b></td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;">Seller API</td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code><a class="txttohtmllink" href="https://public-api-seller.lamoda.ru/jsonrpc">https://public-api-seller.lamoda.ru/jsonrpc</a></code><br>метод: <code>v1.tokens.create</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">15 минут</td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;">B2B Platform API</td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code><a class="txttohtmllink" href="https://api-b2b.lamoda.ru/auth/token">https://api-b2b.lamoda.ru/auth/token</a></code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">15 минут</td><br />
</tr><br />
</tbody><br />
</table><br />
<br />
<h2>Получение токена</h2><br />
<br />
<h3>Seller API (JSON-RPC)</h3><br />
<br />
<pre><code>curl -X POST <a class="txttohtmllink" href="https://public-api-seller.lamoda.ru/jsonrpc">https://public-api-seller.lamoda.ru/jsonrpc</a> \<br />
-H "Content-Type: application/json" \<br />
-d '{<br />
"jsonrpc": "2.0",<br />
"id": "550e8400-e29b-41d4-a716-446655440000",<br />
"method": "v1.tokens.create",<br />
"params": {<br />
"client_id": "your_client_id",<br />
"client_secret": "your_client_secret",<br />
"grant_type": "client_credentials"<br />
}<br />
}'</code></pre><br />
<br />
<p><b>Успешный ответ Seller API:</b></p><br />
<br />
<pre><code>{<br />
"jsonrpc": "2.0",<br />
"id": "550e8400-e29b-41d4-a716-446655440000",<br />
"result": {<br />
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",<br />
"token_type": "bearer",<br />
"expires_in": 900<br />
}<br />
}</code></pre><br />
<br />
<h3>B2B Platform API (REST)</h3><br />
<br />
<pre><code>curl -X POST <a class="txttohtmllink" href="https://api-b2b.lamoda.ru/auth/token">https://api-b2b.lamoda.ru/auth/token</a> \<br />
-H "Content-Type: application/json" \<br />
-d '{<br />
"client_id": "your_client_id",<br />
"client_secret": "your_client_secret",<br />
"grant_type": "client_credentials"<br />
}'</code></pre><br />
<br />
<p><b>Успешный ответ B2B API:</b></p><br />
<br />
<pre><code>{<br />
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",<br />
"token_type": "Bearer",<br />
"expires_in": 900<br />
}</code></pre><br />
<br />
<table style="border-collapse: collapse; width: 100%;"><br />
<tbody><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Поле</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Тип</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Описание</b></td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>access_token</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">string</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">JWT-токен для авторизации запросов</td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>token_type</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">string</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Всегда <code>Bearer</code></td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>expires_in</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">integer</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Время жизни в секундах (900 = 15 минут)</td><br />
</tr><br />
</tbody><br />
</table><br />
<br />
<b> TTL = 15 минут!</b><br><br><br />
Токен живёт только <b>15 минут</b>. Если ваша интеграция выполняет длительные операции (загрузка большого каталога, batch-обновление цен), необходимо:<br />
<ul><br />
<li>Обновлять токен заранее (за 1-2 минуты до истечения)</li><br />
<li>Или запрашивать новый токен при получении ошибки <code>401 Unauthorized</code></li><br />
</ul><br />
<h2>Использование токена</h2><br />
<br />
<p>Передавайте токен в заголовке <code>Authorization</code>:</p><br />
<br />
<pre><code>curl -X GET <a class="txttohtmllink" href="https://api-b2b.lamoda.ru/api/v1/orders">https://api-b2b.lamoda.ru/api/v1/orders</a> \<br />
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."</code></pre><br />
<br />
<h2>Стратегии обновления токена</h2><br />
<br />
<h3>Вариант 1: Проактивное обновление (рекомендуется)</h3><br />
<br />
<p>Обновляйте токен за 1-2 минуты до истечения:</p><br />
<br />
<pre><code>import time<br />
import requests<br />
<br />
class LamodaAPI:<br />
def __init__(self, client_id, client_secret, base_url):<br />
self.client_id = client_id<br />
self.client_secret = client_secret<br />
self.base_url = base_url<br />
self.token = None<br />
self.token_expires_at = 0<br />
<br />
def get_token(self):<br />
# Обновляем токен за 60 секунд до истечения<br />
if self.token and time.time() < self.token_expires_at - 60:<br />
return self.token<br />
<br />
response = requests.post(<br />
f"{self.base_url}/auth/token",<br />
json={<br />
"client_id": self.client_id,<br />
"client_secret": self.client_secret,<br />
"grant_type": "client_credentials"<br />
}<br />
)<br />
data = response.json()<br />
<br />
self.token = data["access_token"]<br />
self.token_expires_at = time.time() + data["expires_in"]<br />
<br />
return self.token<br />
<br />
def request(self, method, endpoint, **kwargs):<br />
headers = kwargs.pop("headers", {})<br />
headers["Authorization"] = f"Bearer {self.get_token()}"<br />
<br />
return requests.request(<br />
method,<br />
f"{self.base_url}{endpoint}",<br />
headers=headers,<br />
**kwargs<br />
)</code></pre><br />
<br />
<h3>Вариант 2: Реактивное обновление</h3><br />
<br />
<p>При получении <code>401 Unauthorized</code> — запросите новый токен и повторите запрос:</p><br />
<br />
<pre><code>def request_with_retry(api, method, endpoint, data=None):<br />
try:<br />
return api.request(method, endpoint, json=data)<br />
except requests.HTTPError as e:<br />
if e.response.status_code == 401:<br />
# Сбрасываем токен и пробуем снова<br />
api.token = None<br />
return api.request(method, endpoint, json=data)<br />
raise</code></pre><br />
<br />
<h2>Ошибки авторизации</h2><br />
<br />
<table style="border-collapse: collapse; width: 100%;"><br />
<tbody><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Код</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Сообщение</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Причина</b></td><br />
<td style="border: 1px solid #ddd; padding: 8px;"><b>Решение</b></td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>50401</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Unauthorized</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Токен истёк или невалиден</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Запросите новый токен</td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>50400</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Партнер не найден / Partner not found</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Неверный <code>client_id</code> или <code>client_secret</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Проверьте учётные данные у менеджера</td><br />
</tr><br />
<tr><br />
<td style="border: 1px solid #ddd; padding: 8px;"><code>50403</code></td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Forbidden</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Нет прав на ресурс</td><br />
<td style="border: 1px solid #ddd; padding: 8px;">Проверьте права доступа у менеджера</td><br />
</tr><br />
</tbody><br />
</table><br />
<br />
<p>Полный список ошибок: <a href="17_2_error_codes.html">Справочник кодов ошибок</a></p><br />
<br />
<h2>Частые проблемы</h2><br />
<br />
<b> "Партнер не найден" (50400)</b><br><br><br />
<b>Причины:</b><br />
<ul><br />
<li>Неверный <code>client_id</code> или <code>client_secret</code></li><br />
<li>Партнёр не активирован в системе</li><br />
</ul><br />
<b>Решение:</b> Уточните credentials у вашего менеджера Lamoda<br />
<b> Токен перестаёт работать через 15 минут</b><br><br><br />
Это нормальное поведение! TTL токена = 900 секунд = 15 минут.<br><br />
Реализуйте автоматическое обновление токена (см. примеры выше).<br />
<h2>См. также</h2><br />
<br />
<ul><br />
<li><a href="1_4_auth_errors.html">Типичные ошибки авторизации</a></li><br />
<li><a href="17_2_error_codes.html">Справочник кодов ошибок</a></li><br />
<li><a href="16_1_postman_collection.html">Postman-коллекции</a></li><br />
</ul>
Помогла эта информация?
Спасибо за отзыв