Appearance
Breaking Changes
Авторизация
GET /auth/token/:login оставлен только для совместимости
В v1 токен выдавался через:
http
GET /auth/token/:login
Authorization: Bearer passwordLegacy endpoint временно поддерживается слоем совместимости, но новый контракт v2 использует:
http
POST /auth/token
Content-Type: application/jsonjson
{
"login": "user@example.com",
"password": "secret"
}Причины изменения:
- выдача токена является действием авторизации и не должна быть
GET-запросом; - логин не должен попадать в URL, access logs, browser history и proxy logs;
Authorization: Bearer ...должен использоваться для уже выданного токена, а не для пароля;- body проще валидировать и расширять без изменения URL-контракта.
Структурированная проверка v2 доступна на GET /auth/v2/check. Исходный GET /auth/check занят legacy-контрактом и возвращает Mongo-документ без password.
Срок действия токена вынесен в data
В v1 дата окончания токена была частью человекочитаемого message. В v2 срок действия токена возвращается структурно:
json
{
"status": true,
"data": {
"token": "JWTToken",
"tokenType": "Bearer",
"expiresAt": "2026-07-09T11:11:16.000Z",
"expiresIn": 86400
},
"error": {},
"message": ""
}Клиенты должны использовать data.expiresAt или data.expiresIn, а не парсить message.
HTTP-коды ошибок
В v1 ошибки авторизации часто отдавались с HTTP 200 и status: false в теле ответа. В v2 API возвращает соответствующий HTTP-код и сохраняет JSON-обертку.
Каталог
Публичный идентификатор раздела
В v2 публичный идентификатор раздела каталога - строковое значение umi_hierarchy_id.
json
{
"id": "37057"
}Клиенты не должны использовать PostgreSQL catalog_sections.id или UMI object id umi_id как публичный идентификатор раздела.
Каталог ограничен витриной nnz-ipc.ru
Публичные catalog routes v2 возвращают только активные разделы с url.host = "nnz-ipc.ru".
Разделы других доменов из общей UMI-базы (iei.ru, axiomtek.pro, cincoze.pro, weintek.pro) и служебные разделы без URL не попадают в публичный каталог v2.
URL отдается структурно
Вместо отдельного строкового поля пути v2 возвращает URL-группу:
json
{
"url": {
"full": "https://nnz-ipc.ru/catalogue/ipc/",
"host": "nnz-ipc.ru",
"path": "/catalogue/ipc/",
"slug": "ipc"
}
}slug является последним сегментом path, но не является уникальным идентификатором раздела.
Счетчики считаются только по публично активным товарам
directProductCount, productCount и availableProductCount считаются только по активным публичным товарам v2.
availableProductCount дополнительно учитывает только товары с положительным остатком хотя бы на одном складе.
Товары
Публичный идентификатор товара
В v2 публичный id товара равен строковому stockNumber. UMI object id из v1 больше не используется как идентификатор товарного endpoint.
http
GET /api/v2/products/6119904Типизированный объект вместо v1 field-оберток
Базовые поля, цена, доступность, vendor и media имеют стабильную структуру. Формат { name, value, field_id, uid } сохранен только внутри PostgreSQL payload и не отдается напрямую.
Характеристики отсутствуют в базовом ответе и подключаются через include=features в виде массива публичных групп с вложенными items. Фасетные значения не смешиваются с характеристиками и доступны отдельно через include=filterValues; SEO подключается через include=seo.
Розница, персональная цена и распродажа
pricing.retail возвращается вместе с разрешенной персональной ценой. Sale отдается отдельно и не перезаписывает уровень пользователя. Валюта исходных цен - USD; автоматической конвертации в RUB нет.
Нулевые и скрытые цены имеют явный onRequest: true, а не требуют от клиента интерпретировать магическое значение 0.