Виджет
Скрипт ставится один раз перед закрывающим тегом </body>. Идентификатор магазина берётся в личном кабинете, раздел «Подключение».
<script src="https://api.poisk.plus/w.js" data-shop="ВАШ_ID" defer></script>Виджет сам находит поле поиска на странице, открывает выдачу, считает статистику и обновляется вместе с каталогом. Цвет, положение кнопки, подсказка и анимация настраиваются в кабинете, раздел «Внешний вид».
Своё поле поиска и своя кнопка
Если поиск у вас уже вписан в шапку, плавающую кнопку можно выключить и повесить виджет на существующее поле:
<script src="https://api.poisk.plus/w.js" data-shop="ВАШ_ID"
data-target=".header__search input" data-button="off" defer></script>data-target— CSS-селектор вашего поля поиска, клик по нему открывает виджет;data-button="off"— не показывать плавающую кнопку;data-position— угол кнопки:bottom-rightилиbottom-left, если нужно переопределить настройку из кабинета.
Вызов из кода
После загрузки скрипт публикует объект Poisk — им поиск открывается по любому вашему событию: своя кнопка в шапке, пункт меню, горячая клавиша.
// открыть поиск по своей кнопке
document.querySelector('.my-search').addEventListener('click', function () {
Poisk.open()
})
// открыть сразу с запросом
Poisk.open('кран шаровой')
// закрыть и узнать о закрытии
Poisk.close()
Poisk.onClose = function () { /* вернуть фокус, снять оверлей */ }Поисковый API
Нужен, когда выдачу вы рисуете сами: своя вёрстка карточек, свои кнопки, своя логика наличия. Мы отвечаем за релевантность и порядок, вы — за внешний вид.
Доступен с тарифа Бизнес и работает только с выгрузкой YML/XML. Товары возвращаются в том виде, в каком пришли в вашем фиде: подойдёт обычный YML для Яндекс.Маркета, отдельную выгрузку под нас делать не нужно.
Не хватает поля в карточке — добавьте его в тот же фид: YML допускает произвольные теги, и мы вернём их рядом с остальными.
Ключ
Выдаётся в кабинете, раздел «Каталог», и передаётся заголовком X-Api-Key. Ключ принадлежит магазину — идентификатор сайта в запросах не нужен. Повторная выдача заменяет прежний ключ, отзыв выключает интеграцию сразу.
Ключ живёт только на вашем сервере. Не встраивайте его в код страницы или в мобильное приложение: оттуда его забирает кто угодно и получает доступ к каталогу от вашего имени. Схема такая: браузер зовёт ваш бэкенд, бэкенд — нас. По той же причине ключ не принимается параметром в адресе — query-строка попадает в логи и в Referer.
Если поиск нужен на фронте, проксируйте запрос через свой сервер — заодно сможете подмешать свои данные вроде остатков и персональных цен до отдачи в браузер.
Поиск
curl -H "X-Api-Key: КЛЮЧ" \
"https://api.poisk.plus/api/search?q=кран&per_page=20"Ответ:
{
"query": "кран",
"found": 508,
"page": 1,
"per_page": 20,
"has_more": true,
"corrected_query": null,
"offers": [
{
"id": "31006",
"available": true,
"name": "кран шаровой PPRC комбинированный нр 25*3/4",
"price": "717.64",
"picture": ["https://ваш-магазин.ru/upload/a.jpg"],
"param": [{ "name": "Артикул", "value": "50108" }],
"_id": "68ea93d4f8d4d3f8",
"_url": "https://ваш-магазин.ru/catalog/krany/31006/"
}
]
} Поля id, name, price, picture, param — из вашего фида. Служебных полей два: _id — наш идентификатор товара, его нужно вернуть при клике, и _url — канонический адрес карточки.
- повторяющийся тег всегда приходит массивом — если хотя бы у одного товара две
picture, это массив у всех; - атрибуты оффера поднимаются в корень:
id,available; - значения остаются строками, кроме
available— форматирование цены остаётся за вами; - атрибуты вложенных тегов сохраняются рядом со значением:
{ "name": "Ду", "unit": "мм", "value": "25" }.
Клики
POST https://api.poisk.plus/api/click
X-Api-Key: КЛЮЧ
{
"query": "кран",
"product_id": "68ea93d4f8d4d3f8",
"product_name": "кран шаровой PPRC комбинированный нр 25*3/4",
"product_url": "https://ваш-магазин.ru/catalog/krany/31006/"
}Отправляйте при переходе покупателя в карточку. На кликах держатся популярные запросы, конверсия в кабинете и ранжирование товаров: без них статистика покажет поиски без переходов.
Обязательно: запасной поиск
Оставьте свой поиск рабочим и переключайтесь на него, если наш ответ не пришёл: сеть моргнула, лимит исчерпан, идут работы на нашей стороне. Покупатель не должен видеть пустую страницу из-за стороннего сервиса.
async function search(query) {
try {
const res = await fetch(
'https://api.poisk.plus/api/search?q=' + encodeURIComponent(query),
{ headers: { 'X-Api-Key': process.env.POISK_KEY }, signal: AbortSignal.timeout(800) },
)
if (!res.ok) throw new Error('poisk: ' + res.status)
return (await res.json()).offers
} catch (e) {
logger.warn(e) // заметить проблему раньше покупателей
return ownSearch(query) // свой поиск остаётся запасным
}
} Практика простая: таймаут в пределах секунды, любая ошибка или код ответа не 200 — показываем результаты своего поиска. Ошибку стоит писать в лог, чтобы вы заметили проблему раньше покупателей.
Лимиты и ошибки
Лимит зависит от тарифа: 500 запросов в минуту на «Бизнесе» и 1000 на «Корпоративном» и «Индивидуальном». Счётчик у API свой, отдельно от виджета, поэтому интеграция не делит квоту с покупателями. При превышении приходит 429, лимит восстанавливается в течение минуты.
Лимит считается на магазин, а не на адрес: он общий для всех ваших серверов. Если потолка не хватает, напишите нам, поднимем.
404— неизвестный магазин, неверный или отозванный ключ, истёкший тариф;422— тело запроса не разобралось;429— превышен лимит запросов.
Для поиска на ввод ставьте дебаунс от 250 мс, как в виджете: иначе каждое нажатие клавиши уходит запросом и искажает статистику.
Остались вопросы
Напишите нам — support@poisk.plus. Поможем с подключением и разберём нестандартный фид.