Перейти к содержимому

API статистики поиска

Всё, что вы видите в разделе «Статистика» личного кабинета, доступно через API: популярные запросы, запросы без результатов, CTR, выручка от поиска. Данные отдаёт семантический слой Cube — с метриками, разрезами и фильтрами.

  1. API-ключ. Личный кабинет → Профиль → выпустить ключ.
  2. Токен статистики проекта (действует 1 сутки):
    Окно терминала
    curl 'https://web4.searchbooster.io/api/sources/PROJECT_UUID' \
    -H 'Accept: application/json' \
    -H 'Authorization: Bearer API_KEY'
    Токен — в поле data.statJwt ответа. Обновляйте его раз в сутки или при ответе 403.
  3. Запрос к 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"}, …]}. Числа приходят строками.

Метрики Разрезы
count — запросов
uniqueUser — уникальных пользователей
withResultsCount — с результатами
searchWithoutClick — без клика
avgHits — среднее число результатов
avgDelay — среднее время ответа
imageSearchCount — поисков по фото
query, lowerQuery — текст запроса
type — search / completions
hits — число результатов
firstInSession — первый запрос сессии
client — платформа
regionId
merchandisings — сработавшие правила
params — применённые фильтры
date
Метрики Разрезы
count, clickCount, addToCartCount, avgPosHits — средняя позиция клика event, entityid — товар, userid, searchid, date
Метрики Разрезы
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
}
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"]])