Skip to content

JavaScript-интеграция

Relavio Search можно подключить двумя способами: готовым JavaScript-виджетом или прямыми запросами к API из собственного интерфейса. Отдельный npm SDK пока не требуется: виджет и REST API покрывают основные сценарии интеграции.

Готовый виджет

Самый быстрый способ подключить поиск - вставить контейнер и скрипт.

html
<div
    data-relavio-search-widget
    data-api-key="YOUR_API_KEY"
    data-behavior="suggests"
></div>

<script src="https://relavio.su/js/search-widget.js"></script>

После загрузки скрипт сам найдет все элементы с data-relavio-search-widget и инициализирует поиск.

Режимы виджета

РежимОписание
searchБыстрый поиск с товарами в выпадающем списке.
suggestsПодсказки, история, категории и товары.
catalogКаталоговая сетка с пагинацией.
catalog-with-filtersКаталоговая сетка с фильтрами.

Пример каталога с фильтрами:

html
<div
    data-relavio-search-widget
    data-api-key="YOUR_API_KEY"
    data-behavior="catalog-with-filters"
    data-placeholder="Найти товар"
    data-columns="4"
    data-catalog-rows="4"
></div>

Ручная инициализация

Если контейнер появляется динамически, используйте window.RelavioSearchWidget.init.

html
<div id="relavio-search"></div>

<script src="https://relavio.su/js/search-widget.js"></script>
<script>
    window.RelavioSearchWidget.init(document.getElementById('relavio-search'), {
        apiKey: 'YOUR_API_KEY',
        behavior: 'catalog',
        placeholder: 'Поиск по каталогу',
        columns: 4,
    });
</script>

Для повторной инициализации всех еще не подключенных контейнеров используйте:

js
window.RelavioSearchWidget.initAll();

Возвращаемый объект

init возвращает объект с основными DOM-элементами и методами.

js
const widget = window.RelavioSearchWidget.init(element, {
    apiKey: 'YOUR_API_KEY',
});

widget.input;
widget.dropdown;
widget.catalog;
widget.voiceButton;
widget.search('iphone');
widget.suggests('iph');

Это удобно для кастомных сценариев, когда нужно программно запустить поиск или получить доступ к полю ввода.

Прямой запрос к Search API

Если вы строите собственный интерфейс, можно работать с API напрямую.

js
async function searchProducts(query) {
    const response = await fetch('https://relavio.su/api/v1/search', {
        method: 'POST',
        credentials: 'include',
        headers: {
            Accept: 'application/json',
            'Content-Type': 'application/json',
            'api-key': 'YOUR_API_KEY',
        },
        body: JSON.stringify({
            query,
            page: 1,
            per_page: 20,
            withFilters: true,
        }),
    });

    if (!response.ok) {
        throw new Error(`Relavio Search failed: ${response.status}`);
    }

    return response.json();
}

Подсказки

js
async function loadSuggests(query, sessionId = '') {
    const response = await fetch('https://relavio.su/api/v1/search/suggests', {
        method: 'POST',
        credentials: 'include',
        headers: {
            Accept: 'application/json',
            'Content-Type': 'application/json',
            'api-key': 'YOUR_API_KEY',
        },
        body: JSON.stringify({
            query,
            session_id: sessionId,
        }),
    });

    return response.json();
}

События аналитики

Виджет сам отправляет событие click при клике по товару. Если вы делаете собственный интерфейс, отправляйте события вручную.

js
async function trackClick(product, searchId, sessionId) {
    await fetch('https://relavio.su/api/v1/search/events', {
        method: 'POST',
        credentials: 'include',
        keepalive: true,
        headers: {
            Accept: 'application/json',
            'Content-Type': 'application/json',
            'api-key': 'YOUR_API_KEY',
        },
        body: JSON.stringify({
            event_id: crypto.randomUUID(),
            event_type: 'click',
            search_id: searchId,
            session_id: sessionId,
            external_id: product.id,
            product_name: product.title,
            position: product.position,
            price: product.price,
            currency: product.currency,
            metadata: {
                url: product.url,
                list: 'custom-search',
            },
        }),
    });
}

Рекомендации

  • Используйте готовый виджет, если не нужен полностью кастомный интерфейс.
  • Используйте API напрямую, если поиск должен быть частью собственного frontend-приложения.
  • Передавайте credentials: 'include', чтобы браузер сохранял поисковую сессию.
  • Сохраняйте search_id и session_id из ответов, чтобы связывать клики с запросами.
  • Обрабатывайте ошибки 401, 402 и 422 отдельно.

Связанные разделы