Адрес
GET
https://api.perfektpak.ru/v1/stock
Тот же адрес и в песочнице — режим выбирает ключ: pp_live_… отвечает боевыми данными, pp_test_… — данными песочницы.
Описание метода
Список остатков на складе по всем кабинетам клиента. Без фильтров возвращает все SKU (у типового селлера их 11–106 — укладывается в одну страницу). Самая часто опрашиваемая ручка API: поддерживает условные запросы через
ETag/If-None-Match, чтобы не гонять тело ответа, когда остаток не менялся.Авторизация
Authorization: Bearer <ключ>
Ключ выдаёт менеджер (боевой) или песочница (тестовый).
Параметры запроса
barcode
в строке запроса
Точное совпадение по штрихкоду.
search
в строке запроса
Подстрока в названии или артикуле, без учёта регистра.
limit
в строке запроса
Размер страницы. Значение вне диапазона молча округляется до ближайшей границы (0 и меньше — до значения по умолчанию, больше максимума — до максимума); ошибка
400 bad_request — только если значение вообще не целое число.Пример:
100cursor
в строке запроса
Непрозрачный курсор страницы из
next_cursor предыдущего ответа. Не передавайте для первой страницы. Курсор, который мы не выдавали сами, — это 400 bad_cursor, а не тихий возврат к первой странице.If-None-Match
заголовок
Значение заголовка
ETag из предыдущего ответа на этот же запрос. Если остаток не менялся, отвечаем 304 без тела.Ответы
200 OK
Схема: StockItemPage
-
itemsмассив обязательнополя элемента — StockItem
-
barcodeстрока обязательно -
articleстрокаАртикул продавца. Поле опущено, если у товара нет артикула. -
nameстрока обязательно -
quantityцелое число обязательноОстаток по леджеру склада: заморожено на приёмке минус активные отгрузки FBS плюс/минус ручные корректировки — та же цифра, которой живут кладовщик и админка. -
availableцелое число обязательноquantityминусin_question— сколько реально можно продавать. -
in_questionцелое число обязательноЕдиницы под вопросом (расхождение при приёмке, разбор пересорта и т.п.). Уже включены вquantity, вычитать их ещё раз не нужно. -
reservedцелое число обязательноУже заявлено в открытое задание на подбор. Подмножествоquantity, а не дополнительное вычитание из него. -
boxesцелое число обязательноЧисло коробов с этим SKU на хранении. -
palletsцелое число обязательноЧисло паллет с этим SKU на хранении. -
marketplace_stockмассив обязательноОстаток по данным кабинета продавца на каждом маркетплейсе — другая природа числа, чемquantityвыше (см. /docs, «Почему мои остатки не совпадают»). Пустой массив, если ни один кабинет ещё не синхронизировался.поля элемента — MarketplaceStock
-
marketplaceстрокаMarketplaceобязательноМаркетплейс кабинета.WB— Wildberries,OZON— Ozon.Значения:WBOZON -
quantityцелое число обязательноОстаток, который отдаёт API маркетплейса по этому SKU. Мы его только зеркалим и никогда не пересчитываем и не сверяем автоматически сquantityвStockItem— числа разной природы. -
warehouse_idцелое числоИдентификатор склада маркетплейса, если маркетплейс различает свои склады в ответе по остаткам. Поле опущено, когда такой разбивки нет. -
warehouse_nameстрока -
synced_atстрока или null обязательноКогда мы последний раз успешно опросили маркетплейс за этим остатком, илиnull, если ни разу. RFC 3339, +03:00 (МСК).
-
-
updated_atстрока обязательноМомент последнего скана, изменившего остаток. RFC 3339, +03:00 (МСК).
-
-
totalцелое число обязательноЧисло позиций, подходящих под фильтр — не число элементов на этой странице. -
next_cursorстрока или null обязательноКурсор следующей страницы для параметраcursor, илиnull, если это последняя страница.
304
Данные не менялись с прошлого запроса (сверка по ETag/ If-None-Match). Тело ответа пустое.
Тело ответа не возвращается.
400 Параметры запроса не прошли валидацию, либо курсор пагинации не наш или испорчен.
Схема: ErrorResponse
-
errorобъектErrorобязательнополя Error
-
codeстрокаErrorCodeобязательноМашинный, стабильный код ошибки — ветвитесь в коде по нему, а не по текстуmessage(он на русском и может измениться).unauthorized— ключ не передан или не существует;key_revoked— ключ существует, но отозван;bad_request— параметры запроса не прошли валидацию;bad_cursor— курсор не наш или испорчен (в отличие от обычногоbad_request, здесь нужно перезапросить страницу заново, а не повторять тот же курсор);not_found— ресурса нет либо он принадлежит не вашему client_id (специально неразличимо);rate_limited— превышен лимит запросов;internal— ошибка на нашей стороне. С v1.1:validation_error— поле тела запроса не прошло проверку (поле названо вmessage);cabinet_required— у вас несколько кабинетов, укажитеcabinet_id;mixed_marking— в одной заявке позиции и с маркировкой, и без, разделите на две;write_disabled— заявки через API ещё не включены для вашего ключа;warehouse_unavailable— склад временно не принял заявку, повторите через минуту (заявка не создана);webhook_url_unverified— адрес не ответил 2xx на проверочное событие;webhook_limit— больше 10 подписок;webhooks_unavailable— вебхуки временно выключены;sandbox_only— операция только для тестового ключа.Значения:unauthorizedkey_revokedrate_limitednot_foundbad_requestbad_cursorinternalvalidation_errorcabinet_requiredmixed_markingwrite_disabledwarehouse_unavailablewebhook_url_unverifiedwebhook_limitwebhooks_unavailablesandbox_only -
messageстрока обязательноТекст ошибки на русском для лога и для человека — не для ветвления в коде. -
request_idстрока обязательноТот же идентификатор, что и в заголовкеX-Request-Id. Присылайте его в поддержку, чтобы нашли конкретный вызов.
-
401
Ключ не передан или не существует (unauthorized), либо существует, но отозван (key_revoked). Этот ответ единственный, где нет заголовков X-RateLimit-* — они появляются только после того, как ключ прошёл проверку.
Схема: ErrorResponse
-
errorобъектErrorобязательнополя Error
-
codeстрокаErrorCodeобязательноМашинный, стабильный код ошибки — ветвитесь в коде по нему, а не по текстуmessage(он на русском и может измениться).unauthorized— ключ не передан или не существует;key_revoked— ключ существует, но отозван;bad_request— параметры запроса не прошли валидацию;bad_cursor— курсор не наш или испорчен (в отличие от обычногоbad_request, здесь нужно перезапросить страницу заново, а не повторять тот же курсор);not_found— ресурса нет либо он принадлежит не вашему client_id (специально неразличимо);rate_limited— превышен лимит запросов;internal— ошибка на нашей стороне. С v1.1:validation_error— поле тела запроса не прошло проверку (поле названо вmessage);cabinet_required— у вас несколько кабинетов, укажитеcabinet_id;mixed_marking— в одной заявке позиции и с маркировкой, и без, разделите на две;write_disabled— заявки через API ещё не включены для вашего ключа;warehouse_unavailable— склад временно не принял заявку, повторите через минуту (заявка не создана);webhook_url_unverified— адрес не ответил 2xx на проверочное событие;webhook_limit— больше 10 подписок;webhooks_unavailable— вебхуки временно выключены;sandbox_only— операция только для тестового ключа.Значения:unauthorizedkey_revokedrate_limitednot_foundbad_requestbad_cursorinternalvalidation_errorcabinet_requiredmixed_markingwrite_disabledwarehouse_unavailablewebhook_url_unverifiedwebhook_limitwebhooks_unavailablesandbox_only -
messageстрока обязательноТекст ошибки на русском для лога и для человека — не для ветвления в коде. -
request_idстрока обязательноТот же идентификатор, что и в заголовкеX-Request-Id. Присылайте его в поддержку, чтобы нашли конкретный вызов.
-
429 Превышен лимит запросов — 60 в минуту на ключ, с всплеском до 20.
Схема: ErrorResponse
-
errorобъектErrorобязательнополя Error
-
codeстрокаErrorCodeобязательноМашинный, стабильный код ошибки — ветвитесь в коде по нему, а не по текстуmessage(он на русском и может измениться).unauthorized— ключ не передан или не существует;key_revoked— ключ существует, но отозван;bad_request— параметры запроса не прошли валидацию;bad_cursor— курсор не наш или испорчен (в отличие от обычногоbad_request, здесь нужно перезапросить страницу заново, а не повторять тот же курсор);not_found— ресурса нет либо он принадлежит не вашему client_id (специально неразличимо);rate_limited— превышен лимит запросов;internal— ошибка на нашей стороне. С v1.1:validation_error— поле тела запроса не прошло проверку (поле названо вmessage);cabinet_required— у вас несколько кабинетов, укажитеcabinet_id;mixed_marking— в одной заявке позиции и с маркировкой, и без, разделите на две;write_disabled— заявки через API ещё не включены для вашего ключа;warehouse_unavailable— склад временно не принял заявку, повторите через минуту (заявка не создана);webhook_url_unverified— адрес не ответил 2xx на проверочное событие;webhook_limit— больше 10 подписок;webhooks_unavailable— вебхуки временно выключены;sandbox_only— операция только для тестового ключа.Значения:unauthorizedkey_revokedrate_limitednot_foundbad_requestbad_cursorinternalvalidation_errorcabinet_requiredmixed_markingwrite_disabledwarehouse_unavailablewebhook_url_unverifiedwebhook_limitwebhooks_unavailablesandbox_only -
messageстрока обязательноТекст ошибки на русском для лога и для человека — не для ветвления в коде. -
request_idстрока обязательноТот же идентификатор, что и в заголовкеX-Request-Id. Присылайте его в поддержку, чтобы нашли конкретный вызов.
-
500 Ошибка на нашей стороне. request_id стоит передать в поддержку.
Схема: ErrorResponse
-
errorобъектErrorобязательнополя Error
-
codeстрокаErrorCodeобязательноМашинный, стабильный код ошибки — ветвитесь в коде по нему, а не по текстуmessage(он на русском и может измениться).unauthorized— ключ не передан или не существует;key_revoked— ключ существует, но отозван;bad_request— параметры запроса не прошли валидацию;bad_cursor— курсор не наш или испорчен (в отличие от обычногоbad_request, здесь нужно перезапросить страницу заново, а не повторять тот же курсор);not_found— ресурса нет либо он принадлежит не вашему client_id (специально неразличимо);rate_limited— превышен лимит запросов;internal— ошибка на нашей стороне. С v1.1:validation_error— поле тела запроса не прошло проверку (поле названо вmessage);cabinet_required— у вас несколько кабинетов, укажитеcabinet_id;mixed_marking— в одной заявке позиции и с маркировкой, и без, разделите на две;write_disabled— заявки через API ещё не включены для вашего ключа;warehouse_unavailable— склад временно не принял заявку, повторите через минуту (заявка не создана);webhook_url_unverified— адрес не ответил 2xx на проверочное событие;webhook_limit— больше 10 подписок;webhooks_unavailable— вебхуки временно выключены;sandbox_only— операция только для тестового ключа.Значения:unauthorizedkey_revokedrate_limitednot_foundbad_requestbad_cursorinternalvalidation_errorcabinet_requiredmixed_markingwrite_disabledwarehouse_unavailablewebhook_url_unverifiedwebhook_limitwebhooks_unavailablesandbox_only -
messageстрока обязательноТекст ошибки на русском для лога и для человека — не для ветвления в коде. -
request_idстрока обязательноТот же идентификатор, что и в заголовкеX-Request-Id. Присылайте его в поддержку, чтобы нашли конкретный вызов.
-