AACSearch
Справочник API

Сессия встраивания

POST /api/v1/embed/session — обмен API-ключа на сервере на короткоживущий токен сессии только для поиска, который безопасно класть на страницу. А также браузерные эндпоинты /embed/*, принимающие этот токен.

POST /api/v1/embed/session
Authorization: Bearer aac_live_…

Ключ aac_live_… не должен попадать в браузер. Этот эндпоинт решает именно эту задачу: он обменивает ключ на токен сессии встраивания, привязанный к одному индексу, одному действию (search:read) и сроку жизни. На страницу попадает токен (data-aac-token), ключ остаётся на вашем сервере.

Эндпоинта GET /embed/bootstrap и формы ?key= не существует. Ключ в строке запроса, data--атрибуте или HTML страницы — это именно та утечка, которую эта схема устраняет: эндпоинт читает ключ только из заголовка Authorization, в остальных случаях отвечает 401 UNAUTHORIZED.

Вызывайте его из собственного бэкенда — обработчика маршрута, SSR-прохода или шага сборки — и передавайте полученный token на страницу.

Выпуск сессии

curl -sS -X POST "$AAC_API/embed/session" \
  -H "Authorization: Bearer $AAC_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "index": "documentation", "expires_in": 900 }'
Поле телаТипПо умолчаниюЗначение
indexstring ≤ 64индекс ключа или самый старый индекс тенантаСлаг индекса, к которому привязывается сессия. Ключ, привязанный к одному индексу, не может выпустить сессию для соседнего
expires_inцелое, секунды900 (15 минут)Запрошенный срок жизни, ограничивается диапазоном 60–3600

Тело необязательно. Нечисловой expires_in или слишком длинный index — это 422 VALIDATION_ERROR.

{
	"ok": true,
	"token": "aac_sess_…",
	"token_type": "embed_session",
	"scope": ["search:read"],
	"index": { "slug": "documentation", "name": "Documentation" },
	"expires_at": "2026-10-23T11:15:02.000Z",
	"expires_in": 900,
	"settings": {
		"placeholder": "Поиск по документации…",
		"perPage": 8,
		"queryBy": "title,content",
		"facets": ["category"],
		"showStats": true,
		"showRecent": true,
		"showVoice": false,
		"showImage": false,
		"showRelated": false,
		"accent": "#2563eb",
		"dark": false,
		"sortOptions": [
			{ "label": "По релевантности", "value": "default" },
			{ "label": "Сначала новые", "value": "created_at:desc" }
		]
	},
	"ui": { "name": "AACSearch UI", "version": "1.0.0" },
	"request_id": "req_4a6c8e0b2d4f6a8c0e2b4d6f"
}

Что гарантирует ответ:

  • Токен только для поиска. Он несёт search:read и ничего больше, поэтому не может писать, удалять или переиндексировать. Компрометация страницы даёт креденшл, который истекает сам и читает только то, что страница и так показывает.
  • Токен привязан к одному индексу и тенанту. Фильтр тенанта применяется на сервере в каждом запросе; браузер не видит ни инфраструктурного ключа, ни хоста, ни имени коллекции.
  • Токен истекает. По умолчанию 900 секунд, максимум 3600. Для долгоживущих страниц выпускайте новый заранее; истёкший токен — 401 EMBED_SESSION_EXPIRED.
  • Ответ не кешируется. Заголовок cache-control: no-store; каждый выпуск записывается в журнал аудита (embed.session.issue).
  • Настройки живые. settings берутся из SearchIndex.settings.embed, поэтому изменения в панели оформления консоли применяются при следующей загрузке страницы — без передеплоя.

Список разрешённых origin

Если у ключа заданы allowedOrigins, браузерный вызов с любого другого origin получает 403 ORIGIN_NOT_ALLOWED и не получает CORS-заголовков. Пустой список означает «любой origin». Поскольку эндпоинт сессии предназначен для вызова из вашего бэкенда, серверный вызов не несёт заголовка Origin и проверке не подвергается.

Настройки

КлючТипПо умолчаниюДействие
placeholderstringSearch the docs…Подсказка в поле ввода
perPagenumber8Результатов на страницу
queryBystringtitle,contentquery_by в каждом поисковом запросе
facetsstring[][]Поля фасетов в виде списков с чекбоксами (в консоли — не более 6)
showStatsbooleantrueСтрока с числом результатов
showRecentbooleantrueЧипы недавних запросов, хранятся локально по индексу
showVoicebooleanfalseГолосовой ввод браузера через voiceSearch из InstantSearch
showImagebooleanfalseПоказывать изображение результата, если оно есть в документе
showRelatedbooleanfalseБлок «Для вас» под результатами (нужны включённые рекомендации в индексе)
accentstring#2563ebАкцентный цвет кнопок, обводки и ссылок
darkbooleanfalseТёмная палитра
sortOptionsarrayрелевантность + created_at:descВыпадающий список сортировки; первая запись должна иметь default

Ошибки

{
	"error": {
		"code": "UNAUTHORIZED",
		"message": "Send the API key as an Authorization header; embed sessions cannot be minted from a query parameter",
		"request_id": "req_7b9d1f3a5c7e9b1d3f5a7c9e"
	}
}
СтатусКодКогда
401UNAUTHORIZEDКлюч отсутствует, некорректен, неизвестен или отозван; ключ передан параметром запроса
403ORIGIN_NOT_ALLOWEDБраузерный origin вне allowedOrigins ключа
404INDEX_NOT_FOUNDДля ключа нет доступного индекса или index указывает на недоступный ключу индекс
422VALIDATION_ERRORНекорректное тело
429RATE_LIMITEDЛимит по адресу на /embed/* (у анонимного embed-трафика бюджет меньше)

Эндпоинты, принимающие токен

Когда на странице есть токен, виджет обращается только к этим эндпоинтам. Все они аутентифицируются токеном — в JSON-теле (token) или, где указано, заголовком Authorization: Bearer aac_sess_… — и никогда API-ключом. Каждый также отвечает на CORS-preflight (OPTIONS) кодом 204.

ЭндпоинтНазначение
POST /api/v1/embed/configНастройки для уже выпущенного токена: { "token": "…" } возвращает index, scope, expires_at и settings
POST /api/v1/embed/searchПрокси поиска. Тело { token, index, client_id?, personalize?, searches: [...] }, до 5 запросов; токен можно передать и заголовком Bearer. page ≤ 20, per_page обрезается до 50
POST /api/v1/embed/eventsСобытия поведения: type — view, click, conversion, add_to_cart или impression (сам виджет шлёт view, click и conversion), с document_id, position, query, query_id, session_id, value_cents, items
POST /api/v1/embed/recommendationsПохожие и персональные элементы для посетителя: client_id, seed_document_id, seed_query, limit (≤ 40)
POST /api/v1/embed/widget-sessionДля сохранённых виджетов из консоли: публичный id виджета (wgt_…) и разрешённый origin дают сессию, ключа на странице нет вообще

Поиск через прокси проходит тот же конвейер, что и публичный API (журнал запросов, правила, значения по умолчанию, ослабление запроса, did-you-mean), поэтому аналитика видит трафик виджета. Каждый embed-поиск списывается с квоты searches тенанта.

Ошибки токена на этих эндпоинтах:

СтатусКодЗначение
401EMBED_SESSION_REQUIREDТокен не передан
401EMBED_SESSION_EXPIREDСрок токена истёк — выпустите новый
401EMBED_SESSION_INVALIDПовреждённый или подделанный токен
403FORBIDDENУ токена нет права search:read
403INDEX_MISMATCHВ запросе указан индекс, отличный от индекса токена

Доступ из браузера

Для виджета и собственного браузерного интерфейса используйте POST /embed/session и /embed/search. Ваш сервер обменивает API-ключ на короткоживущий токен; браузер не получает инфраструктурных ключей и имён хранилищ. Расширенный эндпоинт /scoped-key не используется виджетом и не заменяет поисковый API платформы.

On this page