Gå til indhold
ShopentlyLearn

Oversigt — Søgeanalyse og regler

Læs data fra ”Søgeanalyse og regler”. Resultatet afhænger af handlingens parametre.

GET/api/v1/search/overview

Godkendelse
Bearer
Tilgængelig fra
STANDARD
Nødvendige rettigheder
search.analytics:read

Kodeeksempler

Eksempel på forespørgsel

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/overview

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/overview');
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/overview', 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))

Eksempel på svar 200

JSON
{
  "data": {
    "click_through_rate": 0,
    "clicked_searches": 1,
    "recent": [
      {
        "is_zero_results": false,
        "locale_code": "en",
        "occurred_at": "2026-01-01T12:00:00Z",
        "query_display": "example",
        "query_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
        "request_id": "example",
        "result_count": 1,
        "source": "results"
      }
    ],
    "searches": 1,
    "zero_result_rate": 0,
    "zero_results": 1
  },
  "meta": {
    "period": {
      "as_of": "2026-01-02T00:00:00Z",
      "days": 1,
      "started_at": "2026-01-01T00:00:00Z"
    },
    "request_id": "example"
  }
}

Principper

  • GET /api/v1/search/overview og /api/v1/search/queries viser oversigtsstatistik og grupperede søgninger.
  • Hent forekomster af en søgning med dens query_hash.
  • Rapporteringsperioder understøtter 7, 30 eller 90 dage med de filtre, hvert endepunkt angiver.
  • Søgeregler forbinder fraser med udvalgte produkter og kategorier og kan oprettes, læses, opdateres eller slettes.
  • Regler og analyse har separate rettigheder; læsning af søgestatistik giver ikke adgang til konfiguration.

Parametre

Forespørgselsparametre

daysHeltalValgfrit

Rapporteringsperiode i dage.

Begrænsninger
enum
[7, 30, 90]
Standard: 30

Denne operation accepterer ikke JSON-indhold.

Svar

Svar 200

dataOverviewData Obligatorisk

Indholdet af et vellykket svar.

Felter · data
click_through_rateTalObligatorisk

Klikrate for de valgte søgedata.

clicked_searchesHeltalObligatorisk

Antal søgninger med et klik.

recentArray <RecentSearchData > Obligatorisk

Oplysninger om nylige søgninger.

Felter · recent
searchesHeltalObligatorisk

Antal søgninger.

zero_result_rateTalObligatorisk

Andel af søgninger uden resultater.

zero_resultsHeltalObligatorisk

Antal søgninger uden resultater.

metaAnalyticsPageMeta AnalyticsMeta Obligatorisk

Svarmetadata.

Felter · meta

AnalyticsPageMeta

paginationPagination Obligatorisk

Metadata for markørbaseret sideinddeling.

periodAnalyticsPeriodData Obligatorisk

Rapporteringsperiode og dens grænser.

request_idStrengObligatorisk

Sagsidentifikator; i svarmetadata identificerer den HTTP-forespørgslen.

minLength: 1maxLength: 100

AnalyticsMeta

periodAnalyticsPeriodData Obligatorisk

Rapporteringsperiode og dens grænser.

request_idStrengObligatorisk

Sagsidentifikator; i svarmetadata identificerer den HTTP-forespørgslen.

minLength: 1maxLength: 100
Eksempel på svar

HTTP-status

200
Vellykket svar Skema
400
Ugyldig anmodning
401
Godkendelse påkrævet
403
Adgang nægtet
404
Ressource ikke fundet
409
Versionskonflikt
422
Validering mislykkedes
429
Grænsen for anmodninger er overskredet
Andre HTTP-statusser (7)
405
Metoden er ikke tilladt
413
Anmodningen er for stor
415
Formatet understøttes ikke
500
Serverfejl
502
Fejl i API-gateway
503
Tjenesten er utilgængelig
504
Tidsgrænsen er overskredet

Fejlkatalog: ErrorResponse

Headere

401

WWW-AuthenticateStrengValgfrit

Godkendelsesmetode, som serveren kræver.

405

AllowStrengValgfrit

HTTP-metoder, som denne ressource understøtter.

429, 503

Retry-AfterHeltalValgfrit

Mindste ventetid før næste forsøg, i sekunder.

minimum: 0