Идентификация приложения
Для выбора клиентского окружения передайте выданный ShopStory идентификатор в query-параметре. Имя параметра зависит от семейства API:
/v3/streamsиспользуетapplicationId;/v2/mini-player/*используетapplication.
Оба параметра указывают клиентское окружение и направляют запрос к его данным. Они не заменяют пароль, API-ключ или проверку прав. Для каждого запроса используйте имя параметра из OpenAPI-схемы конкретного эндпоинта.
curl --fail-with-body \
"https://app.shopstory.live/v3/streams?applicationId=<assigned-application-id>&limit=10"
Точное значение выдаёт команда ShopStory при подключении. Не подбирайте идентификатор по названию компании и не переносите его между test и production.
Граница безопасности
applicationId виден в браузерных запросах, мобильном трафике, журналах доступа и ссылках. На его секретности нельзя строить контроль доступа.
- Не используйте
applicationIdдля защиты персональных данных, административных операций или изменения корзины. - Не добавляйте в URL токены, cookies и другие секретные данные.
- Для операций в системе ритейлера используйте её штатную сессию, CSRF-защиту и серверную авторизацию.
- CORS ограничивает браузерные origins, но не заменяет аутентификацию.
В публичном контракте нет Bearer-токена. Не отправляйте произвольный Authorization и не вводите production credentials в сторонние API-консоли.
Где выполнять запрос
Выбор зависит от сценария:
| Сценарий | Рекомендуемый путь |
|---|---|
| Стандартный web-виджет | Web SDK; ShopStory заранее регистрирует домен клиента |
| Собственный web UI | Backend клиента или согласованный origin браузера |
| Нативное приложение с Mobile SDK | SDK выполняет lookup по контракту поставленного пакета |
| Собственный mobile UI поверх Public API | Backend клиента; приложение получает только нужные поля |
| Серверная синхронизация | Backend-to-backend запрос |
Через backend-прокси клиент может кэшировать и нормализовать ответ, а правила повторов задавать в одном месте. Такой прокси не превращает applicationId в учётные данные.
Обработка ответа
Проверяйте транспортный HTTP-код и поле status JSON-конверта. Для части ошибок валидации /v3/streams текущий контракт возвращает HTTP 200 и бизнес-код 400 внутри ответа.
Пример ниже выполняется на backend. Пятисекундный deadline — политика этого клиента, а не SLA ShopStory.
export async function getStreams() {
const applicationId = process.env.SHOPSTORY_APPLICATION_ID;
if (!applicationId) {
throw new Error('SHOPSTORY_APPLICATION_ID is not configured');
}
const url = new URL('https://app.shopstory.live/v3/streams');
url.searchParams.set('applicationId', applicationId);
url.searchParams.set('limit', '10');
const response = await fetch(url, {
headers: { Accept: 'application/json' },
signal: AbortSignal.timeout(5000),
});
if (!response.ok) {
throw new Error(`ShopStory transport error: ${response.status}`);
}
const payload = await response.json();
if (payload.status !== 200) {
throw new Error(payload.body?.message || 'ShopStory API error');
}
return payload.body;
}
Пример ошибки идентификации:
{
"status": 400,
"body": {
"error": "invalid",
"message": "invalid applicationId"
},
"serverTime": "2026-09-04T12:00:00Z"
}
Не повторяйте такой запрос автоматически: сначала исправьте конфигурацию.
Эксплуатационный минимум
- Храните разные значения для test и production в конфигурации приложения.
- Не записывайте полный query string в аналитику и клиентские crash-отчёты без фильтрации.
- Проверяйте
statusв конверте и ограничивайте тайм-аут. - Обрабатывайте временные ошибки по правилам Rate limiting.
- Для кэша используйте рекомендации из раздела Кэширование.
Общая модель ответственности описана в разделе Безопасность.