Preskočiť na obsah
ShopentlyLearn

Načítať · Vyhľadávacie dopyty — Analytika a pravidlá vyhľadávania

Načítajte údaje z „Analytika a pravidlá vyhľadávania“. Výsledok závisí od parametrov tejto operácie.

GET/api/v1/search/queries/{query_hash}

Overovanie
Bearer
Dostupné od plánu
STANDARD
Požadované oprávnenia
search.analytics:read

Príklady kódu

Príklad požiadavky

cURL

: "${SHOPENTLY_SHOP_URL:?}"

curl --disable --globoff --fail-with-body --silent --show-error \
  --proto '=https' --connect-timeout 5 --max-time 30 \
  --request GET \
  --header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
  --url "${SHOPENTLY_SHOP_URL%/}"'/api/v1/search/queries/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?limit=20'

PHP

<?php
declare(strict_types=1);

$baseUrl = rtrim(getenv('SHOPENTLY_SHOP_URL') ?: '', '/');
$origin = parse_url($baseUrl);
if (!$origin || ($origin['scheme'] ?? '') !== 'https' || empty($origin['host']) ||
    isset($origin['user'], $origin['pass']) || isset($origin['user']) || isset($origin['path']) ||
    isset($origin['query']) || isset($origin['fragment'])) {
    throw new RuntimeException('SHOPENTLY_SHOP_URL must be an HTTPS origin');
}
$credential = getenv('SHOPENTLY_ACCESS_TOKEN') ?: '';
if ($credential === '' || strpbrk($credential, "\r\n") !== false) {
    throw new RuntimeException('Invalid credential');
}
$headers = [];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/search/queries/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?limit=20');
curl_setopt_array($handle, [
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => 2,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HEADERFUNCTION => static function ($handle, string $line) use (&$responseHeaders): int {
        if (str_contains($line, ':')) {
            [$name, $value] = explode(':', $line, 2);
            $responseHeaders[strtolower(trim($name))] = trim($value);
        }
        return strlen($line);
    },
]);
$raw = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
$error = curl_error($handle);
curl_close($handle);
if ($raw === false) {
    throw new RuntimeException('Transport error: ' . $error);
}
if ($status < 200 || $status >= 300) {
    throw new RuntimeException('HTTP ' . $status . '; request_id=' .
        ($responseHeaders['x-request-id'] ?? '') . '; retry_after=' . ($responseHeaders['retry-after'] ?? ''));
}
$result = $raw === '' ? null : json_decode($raw, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
echo json_encode($result, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), PHP_EOL;

Python

from contextlib import ExitStack
import json
import os
from urllib.parse import urlsplit

import requests  # python -m pip install requests

base_url = os.environ["SHOPENTLY_SHOP_URL"].rstrip("/")
origin = urlsplit(base_url)
if origin.scheme != "https" or not origin.hostname or origin.username or origin.password or origin.path or origin.query or origin.fragment:
    raise ValueError("SHOPENTLY_SHOP_URL must be an HTTPS origin")
credential = os.environ['SHOPENTLY_ACCESS_TOKEN']
if not credential or "\r" in credential or "\n" in credential:
    raise ValueError("Invalid credential")
headers = {}
headers["Authorization"] = 'Bearer' + " " + credential
body = None
if body is not None:
    headers["Content-Type"] = "application/json"

with ExitStack() as stack:
    session = stack.enter_context(requests.Session())
    files = None
    if False:
        image = stack.enter_context(open(os.environ["SHOPENTLY_IMAGE_FILE"], "rb"))
        if os.fstat(image.fileno()).st_size > 5242880:
            raise ValueError("Image exceeds 5 MiB")
        files = {"file": ("article.png", image, "image/png")}
    response = session.request(
        'GET', base_url + '/api/v1/search/queries/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?limit=20', headers=headers,
        data=body.encode("utf-8") if body is not None else None, files=files,
        timeout=(5, 30), allow_redirects=False,
    )
    if not 200 <= response.status_code < 300:
        raise RuntimeError(f"HTTP {response.status_code}; request_id={response.headers.get('X-Request-ID', '')}; retry_after={response.headers.get('Retry-After', '')}")
    if False:
        if response.headers.get("Content-Type") != "image/webp" or len(response.content) > 5242880:
            raise ValueError("Unexpected image response")
        with open(os.environ["SHOPENTLY_OUTPUT_FILE"], "xb") as output:
            output.write(response.content)
    else:
        result = response.json() if response.content else None
        print(json.dumps(result, ensure_ascii=False, indent=2))

Príklad odpovede 200

JSON
{
  "data": [
    {
      "category_id": "example",
      "category_result_count": 1,
      "currency_code": "PLN",
      "is_zero_results": false,
      "locale_code": "en",
      "market_id": "example",
      "max_price": "0.00",
      "min_price": "0.00",
      "occurred_at": "2026-01-01T12:00:00Z",
      "page": 1,
      "product_result_count": 1,
      "query_display": "example",
      "request_id": "example",
      "results": [
        {
          "clicked": false,
          "entity_id": "example",
          "entity_type": "product",
          "image_url": "https://example.invalid/product.jpg",
          "number": "example",
          "placement_source": "organic",
          "position": 1,
          "sku": "example",
          "slug": "example",
          "title": "example"
        }
      ],
      "sort_key": "example",
      "source": "results"
    }
  ],
  "meta": {
    "pagination": {
      "has_more": false,
      "limit": 20,
      "next_cursor": null
    },
    "period": {
      "as_of": "2026-01-02T00:00:00Z",
      "days": 1,
      "started_at": "2026-01-01T00:00:00Z"
    },
    "request_id": "example"
  }
}

Ako to funguje

  • GET /api/v1/search/overview a /api/v1/search/queries sprístupňujú súhrnné štatistiky a zoskupené dopyty.
  • Jednotlivé výskyty dopytu načítajte pomocou query_hash.
  • Obdobie prehľadu môže mať 7, 30 alebo 90 dní s filtrami uvedenými pri jednotlivých koncových bodoch.
  • Pravidlá vyhľadávania prepájajú frázy s vybranými produktmi a kategóriami a možno ich vytvárať, čítať, upravovať aj mazať.
  • Pravidlá a analytika majú oddelené oprávnenia; čítanie štatistík vyhľadávania neudeľuje prístup k nastaveniam.

Parametre

Parametre cesty

query_hashReťazecPovinné

Stabilný identifikátor zoskupenej vyhľadávacej frázy.

Obmedzenia
pattern
"^[a-f0-9]{64}$"
Príklad: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

Parametre dopytu

limitCelé čísloVoliteľné

Maximálny počet záznamov na tejto stránke.

minimum: 1maximum: 100
Predvolená hodnota: 50Príklad: 20
cursorReťazec nullVoliteľné

Nepriehľadná hodnota na pokračovanie vrátená predchádzajúcou stránkou.

Reťazec:minLength: 1maxLength: 1024
daysCelé čísloVoliteľné

Obdobie prehľadu v dňoch.

Obmedzenia
enum
[7, 30, 90]
Predvolená hodnota: 30
localeReťazec nullVoliteľné

Jazyk vybraný pre túto požiadavku.

Reťazec:minLength: 2maxLength: 20
Obmedzenia · Reťazec 1
pattern
"^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
sourceReťazec nullVoliteľné

Zdroj zaznamenanej aktivity.

Obmedzenia · Reťazec 1
enum
["results", "autocomplete"]
market_idReťazec nullVoliteľné

Identifikátor trhu vrátený koncovým bodom kontextu.

Obmedzenia · Reťazec 1
pattern
"^[a-z0-9][a-z0-9_-]{0,62}$"

Táto operácia neprijíma telo JSON.

Odpovede

Odpoveď 200

dataPole <OccurrenceData > Povinné

Obsah úspešnej odpovede.

Polia · data

OccurrenceData

category_idReťazec nullPovinné

Identifikátor kategórie.

category_result_countCelé čísloPovinné

Počet výsledkov v kategóriách.

currency_codeReťazecPovinné

Kód meny.

is_zero_resultsLogická hodnotaPovinné

Či vyhľadávanie nevrátilo žiadne výsledky.

locale_codeReťazecPovinné

Kód jazyka.

market_idReťazecPovinné

Identifikátor trhu vrátený koncovým bodom kontextu.

max_priceReťazec nullPovinné

Najvyššia cena vo vykázanom rozmedzí.

min_priceReťazec nullPovinné

Najnižšia cena vo vykázanom rozmedzí.

occurred_atReťazecPovinné

Dátum a čas udalosti.

format: "date-time"
pageCelé čísloPovinné

Informácie o stránke CMS.

product_result_countCelé čísloPovinné

Počet výsledkov vyhľadávania produktov.

query_displayReťazecPovinné

Vyhľadávacia fráza zobrazená správcovi.

request_idReťazecPovinné

Identifikátor požiadavky; v metaúdajoch odpovede označuje požiadavku HTTP.

resultsPole <ResultSnapshotData > nullPovinné

Zaznamenané výsledky vyhľadávania.

sort_keyReťazecPovinné

Kľúč zoradenia.

sourceReťazecPovinné

Zdroj zaznamenanej aktivity.

Obmedzenia
enum
["results", "autocomplete"]
metaAnalyticsPageMeta AnalyticsMeta Povinné

Metaúdaje odpovede.

Polia · meta

AnalyticsPageMeta

paginationPagination Povinné

Metaúdaje stránkovania pomocou kurzora.

periodAnalyticsPeriodData Povinné

Obdobie prehľadu a jeho hranice.

request_idReťazecPovinné

Identifikátor požiadavky; v metaúdajoch odpovede označuje požiadavku HTTP.

minLength: 1maxLength: 100

AnalyticsMeta

periodAnalyticsPeriodData Povinné

Obdobie prehľadu a jeho hranice.

request_idReťazecPovinné

Identifikátor požiadavky; v metaúdajoch odpovede označuje požiadavku HTTP.

minLength: 1maxLength: 100
Príklad odpovede

Stav HTTP

200
Úspešná odpoveď Schéma
400
Neplatná požiadavka
401
Vyžaduje sa overenie
403
Prístup zamietnutý
404
Zdroj sa nenašiel
409
Konflikt verzií
422
Chyba validácie
429
Prekročený limit požiadaviek
Ďalšie stavy HTTP (7)
405
Metóda nie je povolená
413
Príliš veľká požiadavka
415
Nepodporovaný formát
500
Chyba servera
502
Chyba brány API
503
Služba nedostupná
504
Vypršal časový limit

Katalóg chýb: ErrorResponse

Hlavičky

401

WWW-AuthenticateReťazecVoliteľné

Spôsob overenia požadovaný serverom.

405

AllowReťazecVoliteľné

Metódy HTTP podporované týmto zdrojom.

429, 503

Retry-AfterCelé čísloVoliteľné

Minimálne oneskorenie pred opakovaním v sekundách.

minimum: 0