API статистики поиска
Всё, что вы видите в разделе «Статистика» личного кабинета, доступно через API: популярные запросы, запросы без результатов, CTR, выручка от поиска. Данные отдаёт семантический слой Cube — с метриками, разрезами и фильтрами.
- API-ключ. Личный кабинет → Профиль → выпустить ключ.
- Токен статистики проекта (действует 1 сутки):
Токен — в поле
Окно терминала curl 'https://web4.searchbooster.io/api/sources/PROJECT_UUID' \-H 'Accept: application/json' \-H 'Authorization: Bearer API_KEY'data.statJwtответа. Обновляйте его раз в сутки или при ответе403. - Запрос к Cube с заголовком
Authorization: <statJwt>(безBearer):Окно терминала curl -G 'https://cube.searchbooster.net/cubejs-api/v1/load' \-H 'Authorization: STAT_JWT' \--data-urlencode 'query={"measures":["Queries.count"],"timeDimensions":[{"dimension":"Queries.date","dateRange":"last 7 days","granularity":"day"}]}'
Токен ограничен одним проектом: все запросы автоматически фильтруются по нему.
Формат запроса
Заголовок раздела «Формат запроса»{ "measures": ["Queries.count", "Queries.uniqueUser"], "dimensions": ["Queries.lowerQuery"], "filters": [{ "member": "Queries.hits", "operator": "equals", "values": ["0"] }], "timeDimensions": [{ "dimension": "Queries.date", "dateRange": ["2026-10-01", "2026-10-16"] }], "order": { "Queries.count": "desc" }, "limit": 100}measures— что считать,dimensions— разрезы.filters—equals,notEquals,contains,gt,lt,set,notSetи др.timeDimensions.dateRange— массив дат или строка:"last 30 days","this month".granularity—day,week,month, чтобы получить динамику.
Ответ — {"data": [{"Queries.lowerQuery": "самоед", "Queries.count": "1520"}, …]}. Числа приходят строками.
Кубы и метрики
Заголовок раздела «Кубы и метрики»Queries — поисковые запросы
Заголовок раздела «Queries — поисковые запросы»| Метрики | Разрезы |
|---|---|
count — запросовuniqueUser — уникальных пользователейwithResultsCount — с результатамиsearchWithoutClick — без кликаavgHits — среднее число результатовavgDelay — среднее время ответаimageSearchCount — поисков по фото |
query, lowerQuery — текст запросаtype — search / completionshits — число результатовfirstInSession — первый запрос сессииclient — платформаregionIdmerchandisings — сработавшие правилаparams — применённые фильтрыdate |
Events — клики
Заголовок раздела «Events — клики»| Метрики | Разрезы |
|---|---|
count, clickCount, addToCartCount, avgPosHits — средняя позиция клика |
event, entityid — товар, userid, searchid, date |
DataLayerEvents — ecommerce
Заголовок раздела «DataLayerEvents — ecommerce»| Метрики | Разрезы |
|---|---|
purchase_count, revenue, average_bill, unique_sessions, conversion, events_count |
event, date, userId, widgetId, os_family |
DataLayerEventsWithSearch и DataLayerEventsWithoutSearch — то же, но только для посетителей, которые пользовались / не пользовались поиском: так считается вклад поиска в выручку.
Готовые запросы
Заголовок раздела «Готовые запросы»{ "measures": ["Queries.count"], "dimensions": ["Queries.lowerQuery"], "filters": [ { "member": "Queries.firstInSession", "operator": "equals", "values": ["1"] }, { "member": "Queries.type", "operator": "equals", "values": ["search"] } ], "timeDimensions": [{ "dimension": "Queries.date", "dateRange": "last 30 days" }], "order": { "Queries.count": "desc" }, "limit": 1000}{ "measures": ["Queries.count"], "dimensions": ["Queries.lowerQuery"], "filters": [ { "member": "Queries.hits", "operator": "equals", "values": ["0"] }, { "member": "Queries.merchandisings", "operator": "notEquals", "values": ["redirect"] }, { "member": "Queries.query", "operator": "notEquals", "values": [""] }, { "member": "Queries.params", "operator": "equals", "values": ["", "null", "[]"] } ], "timeDimensions": [{ "dimension": "Queries.date", "dateRange": "last 30 days" }], "order": { "Queries.count": "desc" }, "limit": 100}{ "measures": ["Queries.count", "Queries.searchWithoutClick"], "dimensions": ["Queries.lowerQuery"], "filters": [{ "member": "Queries.type", "operator": "equals", "values": ["search"] }], "timeDimensions": [{ "dimension": "Queries.date", "dateRange": "last 7 days" }], "order": { "Queries.searchWithoutClick": "desc" }, "limit": 100}{ "measures": ["DataLayerEventsWithSearch.revenue", "DataLayerEventsWithSearch.purchase_count"], "timeDimensions": [{ "dimension": "DataLayerEventsWithSearch.date", "dateRange": "last 30 days", "granularity": "day" }]}Пример выгрузки в CSV
Заголовок раздела «Пример выгрузки в CSV»import csv, json, requests
API_KEY, UUID = "…", "…"jwt = requests.get(f"https://web4.searchbooster.io/api/sources/{UUID}", headers={"Authorization": f"Bearer {API_KEY}", "Accept": "application/json"}, timeout=10).json()["data"]["statJwt"]
query = { "measures": ["Queries.count"], "dimensions": ["Queries.lowerQuery"], "filters": [{"member": "Queries.hits", "operator": "equals", "values": ["0"]}], "timeDimensions": [{"dimension": "Queries.date", "dateRange": "last 30 days"}], "order": {"Queries.count": "desc"}, "limit": 500,}rows = requests.get("https://cube.searchbooster.net/cubejs-api/v1/load", params={"query": json.dumps(query)}, headers={"Authorization": jwt}, timeout=60).json()["data"]
with open("zero_results.csv", "w", newline="") as f: w = csv.writer(f) w.writerow(["query", "count"]) for r in rows: w.writerow([r["Queries.lowerQuery"], r["Queries.count"]])