При интеграции учётных систем с маркетплейсом Яндекс Маркет разработчики нередко сталкиваются с ситуацией, когда типовые запросы к API успешно отрабатывают на большинстве магазинов, но на одном из подключенных кабинетов вызывают ошибку с кодом состояния 403 Forbidden. Чаще всего это происходит при обращении к методу получения статистики по заказам POST v2/campaigns/{campaignId}/stats/orders.
Разберем детально, почему сервер отклоняет авторизованный запрос, как устроена система прав у современных API-ключей Маркета, на что обратить внимание при диагностике и какие альтернативные способы выгрузки заказов можно применить.
Ранее авторизация в партнерском API Яндекс Маркета строилась на базе протокола OAuth 2.0 и токенов авторизации. В настоящее время основным и рекомендуемым методом аутентификации стал API-key, который передается в заголовке Api-Key. Однако, в отличие от простых статических ключей, в кабинете продавца Яндекс Маркета реализована система гранулярных прав доступа (областей видимости или scopes).
Проанализируем механизм создания ключа: при генерации API-ключа администратор кабинета явно выбирает уровень разрешений. Если ключ был выпущен исключительно для работы с каталогом (например, изменение цен или остатков), попытка вызвать метод статистики заказов немедленно вернет ошибку 403.
Для успешного выполнения запроса к статистике заказов у используемого ключа обязательно должно быть активно одно из следующих прав:
inventory-and-order-processing или inventory-and-order-processing:read-only (для режима только чтение).all-methods или all-methods:read-only.Если для конкретного кабинета ключ был создан с ограниченным набором ролей, его необходимо перевыпустить в кабинете продавца в разделе настроек интеграции API с предоставлением соответствующих прав.
Выясним частую техническую ошибку, связанную с подстановкой параметров в URL запроса. В пути метода v2/campaigns/{campaignId}/stats/orders используется числовой идентификатор кампании. Ошибка 403 при корректном ключе может возникать в следующих случаях:
campaignId в запрос передается номер бизнеса (businessId), номер клиента (clientId) или номер магазина из адресной строки браузера. Идентификатор кампании формируется платформой отдельно. Точный список идентификаторов магазинов рекомендуется получать через служебный метод GET v2/campaigns.Рассмотрим зависимость ключа от прав создавшего его сотрудника. Права API-ключа не могут превышать полномочия той учетной записи на Яндексе, под которой он был сгенерирован в личном кабинете. Сервер возвращает 403 в следующих ситуациях:
Посмотрим на параметры тела самого запроса. Метод POST v2/campaigns/{campaignId}/stats/orders накладывает строгие ограничения на фильтрацию по времени:
fromDate и toDate в рамках одного запроса не может превышать 30 дней.Разберем по шагам, как локализовать причину запрета, не имея прямого доступа к настройкам кабинета:
errors поле message содержит текстовое пояснение, а поле code — конкретный код системной ошибки (например, прямое указание на отсутствие требуемого скоупа или доступ к чужому ресурсу). Не отбрасывайте тело ответа при получении ошибки.Если для бизнес-процесса необходима выгрузка информации о заказах, рассмотрим другие штатные методы API Яндекс Маркета, которые могут быть удобнее:
POST v1/businesses/{businessId}/orders позволяет получать список заказов сразу по всем связанным магазинам компании. Важным преимуществом этого метода является отсутствие 40-минутной задержки обновления данных, характерной для метода аналитической статистики stats/orders.POST v2/reports/united-orders/generate запускает фоновую генерацию полного отчета по заказам с расширенными финансовыми и логистическими полями.