Адрес
GET
https://api.perfektpak.ru/v1/metrics
Тот же адрес и в песочнице — режим выбирает ключ: pp_live_… отвечает боевыми данными, pp_test_… — данными песочницы.
Описание метода
Один запрос — четыре блока для дашборда: цепочка владельца (
funnel), хранение (storage), приёмка (receiving) и отгрузка (shipments). Формулы те же, что использует личный кабинет селлера — цифра обязана совпадать. from и to необязательны: если не передать ни одного, период — последние 30 дней до текущего момента; если передать только один, второй достраивается 30-дневным окном от него. from обязан быть раньше to, а сам период — не длиннее 366 дней; иначе 400 bad_request.Авторизация
Authorization: Bearer <ключ>
Ключ выдаёт менеджер (боевой) или песочница (тестовый).
Параметры запроса
from
в строке запроса
Начало периода, включительно. RFC 3339 со смещением +03:00 (МСК), например
2026-08-01T00:00:00+03:00; также принимается короткая дата ГГГГ-ММ-ДД (полночь по Москве). Без параметра — 30 дней до to (или до текущего момента, если to тоже не передан).to
в строке запроса
Конец периода, исключительно. RFC 3339 со смещением +03:00 (МСК), например
2026-08-29T00:00:00+03:00; также принимается короткая дата ГГГГ-ММ-ДД (полночь по Москве). Без параметра — текущий момент (или from + 30 дней, если from передан).Ответы
200 OK
Схема: Metrics
-
periodобъектMetricsPeriodобязательнополя MetricsPeriod
-
fromстрока обязательноНачало периода, включительно. RFC 3339, +03:00 (МСК). -
toстрока обязательноКонец периода, исключительно. RFC 3339, +03:00 (МСК).
-
-
funnelобъектMetricsFunnelобязательноЦепочка владельца: принято → на хранении → отгружено → отсортировано маркетплейсом → доставлено покупателю.поля MetricsFunnel
-
acceptedцелое число обязательноЕдиниц принято по приёмкам за период. -
in_storageцелое число обязательноВычисляемый остаток хранения прямо сейчас (принято минус отгружено минус списано) — это моментальный снимок, а не сумма за период. Должен совпадать с суммойquantityпоGET /stock. -
shippedцелое число обязательноЕдиниц в отгрузках, закрытых за период (поclosed_at). -
sorted_by_marketplaceцелое число обязательноЗаказов за период со статусом маркетплейса из набора: отсортирован маркетплейсом, прибыл в пункт выдачи, получен покупателем, либо отменён покупателем уже при получении. -
deliveredцелое число обязательноЗаказов за период, строго полученных покупателем. -
by_current_statusлогическое обязательноtrue, пока история переходов статусов не накоплена — тогдаsorted_by_marketplaceиdeliveredпосчитаны по текущему статусу заказа на момент запроса, а не по факту попадания в статус внутри периодаfrom/to.
-
-
storageобъектMetricsStorageобязательнополя MetricsStorage
-
unitsцелое число обязательноОстаток на хранении сейчас, в штуках (моментальный снимок). -
boxesцелое число обязательно -
palletsцелое число обязательно -
sku_countцелое число обязательноЧисло уникальных SKU на хранении сейчас. -
in_questionцелое число обязательноЕдиницы под вопросом сейчас (уже включены вunits). -
receivedцелое число обязательноЕдиниц принято за период. -
shippedцелое число обязательноЕдиниц отгружено за период.
-
-
receivingобъектMetricsReceivingобязательнополя MetricsReceiving
-
receiptsцелое число обязательноЧисло приёмок за период. -
expected_unitsцелое число обязательно -
accepted_unitsцелое число обязательно -
fill_rateчисло обязательноaccepted_units/expected_units, от 0 до 1. Равен 0, если за период ничего не ожидалось.0…1 -
discrepancy_unitsцелое число обязательно -
shortages_by_reasonмассив обязательноРасхождения за период по причинам.поля элемента — ReasonCount
-
reasonстрока обязательноМашинный код причины из курируемого списка (не фиксированный enum — значения могут добавляться). -
labelстрока обязательно -
countцелое число обязательно
-
-
-
shipmentsобъектMetricsShipmentsобязательнополя MetricsShipments
-
orders_totalцелое число обязательноВсего заказов за период. -
orders_by_statusмассив обязательноРазбивкаorders_totalпо значениямOrderStatus. Суммаcountпо всем элементам всегда равнаorders_total— набор статусов исчерпывающий по построению.поля элемента — StatusCount
-
statusстрока обязательноОдно из значений соответствующего статус-перечисления (здесь —OrderStatus). -
labelстрока обязательно -
countцелое число обязательно
-
-
shipments_closedцелое число обязательноЧисло отгрузок, закрытых за период. -
units_shippedцелое число обязательно -
cancelledцелое число обязательноЗаказов за период со статусомCANCELLED. -
not_foundцелое число обязательноЕдиниц, которые сборщик не нашёл при подборе за период. -
not_found_by_reasonмассив обязательноРасшифровкаnot_foundпо причинам.поля элемента — ReasonCount
-
reasonстрока обязательноМашинный код причины из курируемого списка (не фиксированный enum — значения могут добавляться). -
labelстрока обязательно -
countцелое число обязательно
-
-
-
notesмассив обязательноОговорки к цифрам выше на русском, рассчитанные на то, чтобы дойти до человека (например, как считаютсяsorted_by_marketplaceиdelivered, пока не накоплена история статусов). Пустой массив, если оговорок нет.
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. Присылайте его в поддержку, чтобы нашли конкретный вызов.
-