Pereiti prie turinio
ShopentlyLearn

Gauti · Prieigos raktas — Tapatybės patvirtinimas

Gaukite 900 sekundžių galiojantį Shopently API žetoną. Peržiūrėkite ApiKey antraštę, atsakymą ir Bearer naudojimą kitose užklausose.

POST/api/v1/auth/token

Tapatybės patvirtinimas
ApiKey
Prieinama nuo plano
BASIC
Būtinos teisės
Netaikoma

Kodo pavyzdžiai

Užklausos pavyzdys

cURL

: "${SHOPENTLY_SHOP_URL:?}"

curl --disable --globoff --fail-with-body --silent --show-error \
  --proto '=https' --connect-timeout 5 --max-time 30 \
  --request POST \
  --header "Authorization: ApiKey ${SHOPENTLY_API_KEY:?}" \
  --header 'Content-Type: application/json' \
  --data-raw '{}' \
  --url "${SHOPENTLY_SHOP_URL%/}"/api/v1/auth/token

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_API_KEY') ?: '';
if ($credential === '' || strpbrk($credential, "\r\n") !== false) {
    throw new RuntimeException('Invalid credential');
}
$headers = ['Content-Type: application/json'];
$headers[] = 'Authorization: ApiKey ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/auth/token');
curl_setopt_array($handle, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    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);
    },
]);
curl_setopt($handle, CURLOPT_POSTFIELDS, '{}');
$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_API_KEY']
if not credential or "\r" in credential or "\n" in credential:
    raise ValueError("Invalid credential")
headers = {}
headers["Authorization"] = 'ApiKey' + " " + credential
body = '{}'
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(
        'POST', base_url + '/api/v1/auth/token', 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))

Atsakymo pavyzdys 200

JSON
{
  "data": {
    "access_token": "EXAMPLE_ACCESS_TOKEN",
    "expires_at": "2026-01-01T12:00:00Z",
    "expires_in": 900,
    "rate_limits": {
      "auth_per_minute": 10,
      "read_per_minute": 60,
      "write_per_minute": 10
    },
    "token_type": "Bearer"
  },
  "meta": {
    "request_id": "example"
  }
}

Tapatybės patvirtinimas

  • API raktas siunčiamas tik POST /api/v1/auth/token užklausos Authorization antraštėje.
  • Nedėkite jo į JSON, URL ar užklausos parametrus.
  • Grąžintą žetoną naudokite išteklių užklausoms ir atnaujinkite pagal expires_at; expires_in nurodomas sekundėmis.
  • Prieigos žetonas neapeina dabartinių rakto teisių, parduotuvės teisių, atšaukimo ar IP apribojimų.

Kiek laiko galioja žetonas?

  • expires_in: 900 sekundžių, arba 15 minučių nuo išdavimo. Užklausos nepratęsia galiojimo.
  • expires_at: Galiojimo pabaigos laikas UTC. Dabartiniai prieigos apribojimai gali užblokuoti žetoną anksčiau.

Tą patį žetoną naudokite kelioms užklausoms ir naują gaukite prieš expires_at. Nereikia gauti žetono prieš kiekvieną operaciją. Naujam žetonui gauti naudokite API raktą.

Užklausų dažnio ribos

Engine ≥ 4.143.0. Kiekviename žetono atsakyme pateikiami išdavimo metu galiojančios parduotuvės politikos data.rate_limits. Visi raktai dalijasi šiais limitais; naujas žetonas jų neatkuria. Plano pakeitimas gali įsigalioti dar nepasibaigus žetonui.

Parametrai

Nėra kelio, užklausos ar papildomų antraščių parametrų.

Užklausos turinys

application/json · Neprivalomas

TokenRequest null

Atsakymai

Atsakymas 200

dataTokenData Privalomas

Sėkmingo atsakymo duomenys.

Laukai · data
access_tokenEilutėPrivalomas

Trumpalaikė Bearer prieigos priemonė.

expires_atEilutėPrivalomas

Prieigos duomenų galiojimo pabaigos data ir laikas.

format: "date-time"
expires_inSveikasis skaičiusNeprivalomas

Prieigos duomenų galiojimo trukmė sekundėmis.

Numatytoji reikšmė: 900

rate_limitsTokenRateLimitsData Privalomas

Kiekviename žetono atsakyme pateikiami išdavimo metu galiojančios parduotuvės politikos data.rate_limits. Visi raktai dalijasi šiais limitais; naujas žetonas jų neatkuria. Plano pakeitimas gali įsigalioti dar nepasibaigus žetonui.

Laukai · rate_limits
auth_per_minuteSveikasis skaičiusPrivalomas

Žetono užklausos per minutę, įskaitant nepavykusius autentifikavimo bandymus.

minimum: 0maximum: 1000000
read_per_minuteSveikasis skaičiusPrivalomas

Skaitymo užklausos per minutę.

minimum: 0maximum: 1000000
write_per_minuteSveikasis skaičiusPrivalomas

Rašymo užklausos per minutę; ši reikšmė nesuteikia rašymo teisių.

minimum: 0maximum: 1000000
token_typeEilutėNeprivalomas

Grąžinto žetono tapatybės patvirtinimo schema.

const: "Bearer"

Numatytoji reikšmė: "Bearer"

metaContextPageMeta ContextMeta PageMeta RequestMeta Privalomas

Atsakymo metaduomenys.

Laukai · meta

ContextPageMeta

localeEilutėPrivalomas

Šiai užklausai pasirinkta kalba.

market_codeEilutėPrivalomas

Konteksto prieigos taško grąžintas rinkos kodas.

market_idEilutėPrivalomas

Konteksto prieigos taško grąžintas rinkos identifikatorius.

paginationPagination Privalomas

Skaidymo į puslapius pagal žymeklį metaduomenys.

request_idEilutėPrivalomas

Prašymo identifikatorius; atsakymo metaduomenyse nurodo HTTP užklausą.

minLength: 1maxLength: 100

ContextMeta

localeEilutėPrivalomas

Šiai užklausai pasirinkta kalba.

market_codeEilutėPrivalomas

Konteksto prieigos taško grąžintas rinkos kodas.

market_idEilutėPrivalomas

Konteksto prieigos taško grąžintas rinkos identifikatorius.

request_idEilutėPrivalomas

Prašymo identifikatorius; atsakymo metaduomenyse nurodo HTTP užklausą.

minLength: 1maxLength: 100

PageMeta

paginationPagination Privalomas

Skaidymo į puslapius pagal žymeklį metaduomenys.

request_idEilutėPrivalomas

Prašymo identifikatorius; atsakymo metaduomenyse nurodo HTTP užklausą.

minLength: 1maxLength: 100

RequestMeta

request_idEilutėPrivalomas

Prašymo identifikatorius; atsakymo metaduomenyse nurodo HTTP užklausą.

minLength: 1maxLength: 100
Atsakymo pavyzdys

HTTP būsena

200
Sėkmingas atsakymas Schema
400
Netinkama užklausa
401
Būtinas tapatybės patvirtinimas
403
Prieiga uždrausta
404
Išteklius nerastas
409
Versijų konfliktas
422
Tikrinimo klaida
429
Viršytas užklausų limitas
Kitos HTTP būsenos (7)
405
Metodas neleidžiamas
413
Užklausa per didelė
415
Nepalaikomas formatas
500
Serverio klaida
502
API tinklų sietuvo klaida
503
Paslauga nepasiekiama
504
Baigėsi laukimo laikas

Klaidų katalogas: ErrorResponse

Antraštės

401

WWW-AuthenticateEilutėNeprivalomas

Serverio reikalaujama tapatybės patvirtinimo schema.

405

AllowEilutėNeprivalomas

Šio ištekliaus palaikomi HTTP metodai.

429, 503

Retry-AfterSveikasis skaičiusNeprivalomas

Mažiausias laukimo laikas prieš kartojant, sekundėmis.

minimum: 0.0