Оглавление
Общая информация
API позволяет автоматизировать загрузку и обновление остатков товаров. Для взаимодействия с API используется авторизация по APIKey, который вы можете получить в личном кабинете, в разделе «Мои остатки товаров».
Получение API-ключа
- Перейдите в раздел «Мои остатки товаров» в личном кабинете.
- Активируйте способ загрузки «API». Способ загрузки «XML-фид» будет деактивирован автоматически.
- Нажмите кнопку «Сгенерировать API-ключ».
- Скопируйте «API-ключ» и используйте его при выполнении запросов.

Авторизация
Для авторизации запросов используется заголовок Authorization:
POST /api/v1/external/stocks HTTP/1.1
Host: https://лд.рф
Content-Type: application/json
Accept: application/json
Authorization: ApiKey <ВАШ_СГЕНЕРИРОВАННЫЙ_API_КЛЮЧ>Эндпоинты API
POST Загрузка остатков
URL: /api/v1/external/stocks/import
Предназначен для загрузки нового набора остатков товаров. Принятый набор заменяет все остатки пользователя. Если все позиции отклонены, остатки не меняются. В минуту можно отправить до 5 запросов.
Если цена не передана, имеет неверный формат или не больше нуля, устанавливается РРЦ товара. Если РРЦ отсутствует или равна нулю, устанавливается «Цена по запросу» независимо от переданной цены. Положительная цена не должна быть ниже РРЦ.
{
"stocks": [
{
"productSku": "LD 47.300.15",
"pointId": "А001",
"quantity": 300,
"price": 298.90,
"name": "Кран шаровой латунный LD Pride 47.15.В-В.Б Ду 15 Ру 40 бабочка"
},
{
"productSku": "11110509402MULD000000000",
"pointId": "А002",
"quantity": 25,
"price": 3000.14,
"name": "Кран шаровый LD КШЦФ из стали 20 Ду50 Ру4,0МПа"
}
]
} PUT Обновление количества товаров
URL: /api/v1/external/stocks/update/quantity
Предназначен для обновления количества товаров на указанном складе. В минуту можно отправить до 5 запросов. Сохранённая цена не меняется.
{
"stocks": [
{
"productSku": "LD 47.300.15",
"pointId": "А001",
"quantity": 300
},
{
"productSku": "11110509402MULD000000000",
"pointId": "А002",
"quantity": 25
}
]
} PUT Обновление цены товара
URL: /api/v1/external/stocks/update/price
Позволяет обновить цену конкретного товара на определённом складе. В минуту можно отправить до 5 запросов.
Поле price обязательно.
{
"stocks": [
{
"productSku": "LD 47.300.15",
"pointId": "А001",
"price": 1298.90
},
{
"productSku": "11110509402MULD000000000",
"pointId": "А002",
"price": 1398.90
}
]
}Пример ответа API
{
"result": [
{
"productSku": "LD 47.300.15",
"pointId": "А001",
"updated": true,
"errors": []
},
{
"productSku": "11110509402MULD000000000",
"pointId": "А002",
"updated": false,
"errors": [
{ "code": "SKU_NOT_FOUND", "message": "Товар с указанным productSku не найден." },
{ "code": "POINT_NOT_FOUND", "message": "Указанная Вами точка продаж не найдена." },
{ "code": "EMPTY_QUANTITY", "message": "Количество товара на складе не указано или равно нулю." },
{ "code": "EMPTY_PRICE", "message": "Цена товара не указана или равна нулю." }
]
}
]
}Пример ответа при ошибках аутентификации
HTTP/1.1 401 Unauthorized
Content-Type: application/json
{
"code": "INVALID_APIKEY_FORMAT",
"message": "Неверный формат API-ключа (ожидается GUID)"
}Поля запроса
Каждый элемент массива stocks должен содержать поля, необходимые для выбранной операции.
| Поле | Тип | Описание |
|---|---|---|
productSku | string | Артикул товара. Используется для идентификации товара в системе. |
pointId | string | Идентификатор торговой точки, на которую выгружается товар. |
quantity | integer | Остаток товара. Обязателен при загрузке и обновлении количества. Значение должно быть больше нуля. |
price | float | Цена товара. Необязательна при загрузке остатков. При обновлении цены требуется положительное значение не ниже РРЦ. |
Возможные статусы ошибок
| Код | Описание | Рекомендации |
|---|---|---|
| 400 Bad Request | Неверный запрос или некорректные данные. |
Проверьте наличие непустого массива stocks и обязательных полей выбранной операции.Убедитесь, что данные отправлены в правильном JSON-формате и соответствуют ожидаемым типам данных. |
| 401 Unauthorized | Отсутствует или некорректный API-ключ. |
Проверьте правильность API-ключа, указанного в заголовке Authorization.
|
| 403 Forbidden | Доступ к ресурсу запрещён. | Убедитесь, что способ загрузки через API активирован в вашем личном кабинете и у вас есть необходимые права доступа. |
| 404 Not Found | Указанный эндпоинт не существует. | Проверьте URL-адрес запроса на корректность и отсутствие опечаток. |
| 429 Too Many Requests | Превышено допустимое количество запросов. | Снизьте частоту отправки запросов. Максимум — 5 запросов в минуту. |
| 500 Internal Server Error | Внутренняя ошибка сервера. | Повторите запрос через некоторое время. Если ошибка сохраняется, свяжитесь с вашим менеджером или отправьте обращение через форму обратной связи. |
| 504 Gateway Timeout | Время ожидания ответа от сервера истекло. |
Сервер не успел обработать запрос в установленный лимит (5 минут). Повторите запрос через некоторое время. Если ошибка сохраняется, свяжитесь с вашим менеджером или отправьте обращение через форму обратной связи. |
Ограничения
- Не более 5 запросов в минуту. В случае превышения, доступ может быть временно заблокирован.
- Максимальное время ожидания ответа от API — 5 минут. Если за это время сервер не ответит, запрос будет завершён с ошибкой таймаута. Пожалуйста, учитывайте это в своих интеграциях.
Список возможных ошибок валидации
| Код ошибки | Описание ошибки | Что делать? |
|---|---|---|
EMPTY_SKU | Не указан обязательный артикул товара (SKU) | Укажите артикул товара (SKU) в соответствии с требованиями API |
SKU_NOT_FOUND | Товар с указанным артикулом не найден | Проверьте правильность артикула и наличие товара в системе |
EMPTY_POINT_ID | Не указан идентификатор точки продаж (pointId) | Укажите идентификатор точки продаж (pointId) в соответствии с требованиями API |
POINT_NOT_FOUND | Указанная точка продаж не найдена | Убедитесь, что выбранная точка продаж существует |
INVALID_POINT_ID | pointId имеет неверный формат (ожидается формат вида A001) | Исправьте формат идентификатора, следуя примеру (например, A001) |
INVALID_FIRST_LETTER | Первая буква pointId должна быть латинской (A–Z) | Исправьте формат идентификатора, следуя примеру (например, A001) |
EMPTY_QUANTITY | Количество товара в точке продаж не указано или равно нулю | Заполните поле количества товара |
INVALID_QUANTITY | Количество должно быть строго больше 0 | Укажите положительное количество, больше 0 |
INVALID_QUANTITY_FORMAT | Количество указано неверно | Введите корректное числовое значение для количества |
INVALID_QUANTITY_TYPE | Количество указано неверно (не является целым числом) | Введите корректное числовое значение для количества |
EMPTY_PRICE | Цена товара не указана или равна нулю | Заполните поле цены, убедившись, что значение больше нуля |
INVALID_PRICE_FORMAT | Цена указана неверно | Введите корректное числовое значение для цены |
PRICE_BELOW_MIN | Указанная цена ниже РРЦ | Проверьте, чтобы цена не была ниже минимально допустимой |
Ошибки аутентификации
При ошибках в заголовке авторизации сервис вернёт HTTP 401 Unauthorized и один из следующих кодов.
| Код ошибки | Описание | Рекомендации |
|---|---|---|
HEADER_MISSING | API-ключ не передан в заголовке Authorization |
Укажите в запросе заголовокAuthorization: ApiKey <ВАШ_КЛЮЧ> |
INVALID_HEADER_FORMAT | Заголовок Authorization имеет неверный формат | Убедитесь, что заголовок начинается с префикса ApiKey |
INVALID_APIKEY_FORMAT | Неверный формат API-ключа (ожидается GUID) | Проверьте, что ключ соответствует GUID |
APIKEY_NOT_FOUND | API-ключ не найден или неактивен | Проверьте, что ключ сгенерирован и активирован в личном кабинете |
USER_NOT_FOUND | Пользователь не найден для переданного API-ключа | Убедитесь, что ключ привязан к существующему пользователю |
Получение списка товаров
Для авторизации запросов используется заголовок Authorization:
POST /api/v1/external/export/products HTTP/1.1
Host: https://лд.рф
Content-Type: application/json
Accept: application/json
Authorization: ApiKey <ВАШ_СГЕНЕРИРОВАННЫЙ_API_КЛЮЧ> POST Получение списка товаров
URL: /api/v1/external/export/products
Данный эндпоинт позволяет получить данные о всех товарах на сайте лд.рф и их связанные атрибуты.
Можно запросить: идентификаторы товаров, цены РРЦ, персональные цены и МОЦ, артикулы, наименования,
свойства, связанные файлы и изображения, а также остатки на доступных складах.
Для оптимизации объёма данных укажите только необходимые поля в массиве SELECT.
Если выполнить запрос без тела запроса, в ответе для каждого товара будет возвращён только
один параметр — productSku.
Тело запроса (опционально):
{
"SELECT": [
"id",
"price",
"prices",
"productSku",
"name",
"properties",
"documents",
"pictures",
"warehouseStocks"
]
} - id — идентификатор товара
- price — цена РРЦ. Если цена отсутствует или на сайте указано «По запросу», возвращается
null - prices — цены товара: персональная цена, МОЦ и РРЦ
- productSku — артикул товара
- name — наименование товара
- properties — свойства товара
- documents — подробная информация о файлах: название, ссылка для скачивания, размер и расширение
- files — файлы. Поле устарело, но оставлено для обратной совместимости; используйте новое поле documents
- pictures — изображения
- warehouseStocks — остатки товара по доступным складам
В ответе будут только те поля, которые вы указали в SELECT.
Поля files и documents возвращаются вместе только при явном указании их
в SELECT.
В поле warehouseStocks возвращаются остатки товара по доступным складам. Показываются только
положительные остатки. Если остатков нет, список будет пустым.
В поле prices возвращаются цены товара, доступные вашей учётной записи на сайте, в порядке:
персональная цена, МОЦ, РРЦ. Персональная цена и МОЦ показываются, только если они установлены.
РРЦ показывается всегда. Если РРЦ отсутствует или на сайте указано «По запросу», для неё возвращается
"price": null.
| Поле | Тип | Описание |
|---|---|---|
priceType | string |
Код типа цены: personal — персональная цена, moc — МОЦ,
retail — РРЦ.
|
priceTypeName | string | Полное название типа цены, например «Рекомендуемая розничная цена». |
priceTypeNameShort | string | Короткое название типа цены, как на сайте, например «РРЦ». |
price | float |
Цена в рублях. Для РРЦ может быть null, если цена отсутствует или на сайте указано
«По запросу».
|
Пример ответа:
{
"products": [
{
"id": 1,
"price": 196378,
"prices": [
{
"priceType": "personal",
"priceTypeName": "Персональная цена",
"priceTypeNameShort": "Ваша цена",
"price": 108007.9
},
{
"priceType": "moc",
"priceTypeName": "Минимальная оптовая цена",
"priceTypeNameShort": "МОЦ",
"price": 137464.6
},
{
"priceType": "retail",
"priceTypeName": "Рекомендуемая розничная цена",
"priceTypeNameShort": "РРЦ",
"price": 196378
}
],
"productSku": "11111509251RGLD000000000",
"name": "Кран шаровый LD КШЦФР Gas 150/125.025.Н/П.01. из стали 12Х18Н10Т Ду150/125 Ру2,5МПа с редуктором",
"properties": [
{
"name":"Тип продукта",
"value":"Кран шаровой"
},
{
"name":"Серия",
"value":"LD"
},
{
"name":"Рабочая среда",
"value":"Газ"
}
],
"documents": [
{
"name": "Технический паспорт.pdf",
"downloadUrl": "https://xn--d1an.xn--p1ai/api/v1/external/document/Zr7upTWBFFWsgbr5/8d1f7e80-997b-11ee-89ce-005056a4b6de.pdf",
"size": 758952,
"formattedSize": "741,16 КБ",
"type": "pdf"
}
],
"pictures": [
"https://xn--d1an.xn--p1ai/api/v1/external/product-images/_pMQnb-CWY4saJem/bbe/bbe018b25a032512e1a03985cb2f0ec8.png"
],
"warehouseStocks": [
{
"warehouseId": 1,
"warehouseName": "Склад Челябинск",
"availableQuantity": 12
},
{
"warehouseId": 2,
"warehouseName": "Склад Москва",
"availableQuantity": 15
}
]
}
]
} Возможные ошибки:
| Код | Описание | Рекомендация |
|---|---|---|
| 400 | Некорректное значение в поле SELECT | Проверьте список доступных полей |
| 401 | Ошибка авторизации | Проверьте API-ключ |
| 403 | Доступ к API запрещён | Проверьте настройки API в личном кабинете |
| 500 | Внутренняя ошибка сервера | Повторите попытку позже |
Получение списка доступных складов
Для авторизации запросов используется заголовок Authorization:
GET /api/v1/external/export/warehouses HTTP/1.1
Host: https://лд.рф
Accept: application/json
Authorization: ApiKey <ВАШ_СГЕНЕРИРОВАННЫЙ_API_КЛЮЧ> GET Получение списка доступных складов
URL: /api/v1/external/export/warehouses
С помощью этого запроса можно получить список доступных складов. Список не зависит от наличия товаров и остатков.
Пример ответа 200 OK:
{
"warehouses": [
{
"warehouseId": 1,
"warehouseName": "Склад Челябинск"
},
{
"warehouseId": 2,
"warehouseName": "Склад Москва"
}
]
} Если доступных складов нет, метод вернёт пустой список.
Возможные ошибки:
| Код | Описание | Рекомендация |
|---|---|---|
| 401 | Ошибка авторизации | Проверьте API-ключ |
| 403 | Доступ к API запрещён | Проверьте настройки API в личном кабинете |