Preskoči na vsebino
ShopentlyLearn

Pridobi · Žeton — Preverjanje pristnosti

Pridobite žeton Shopently API, ki velja 900 sekund. Oglejte si glavo ApiKey, odgovor in uporabo Bearer pri naslednjih zahtevah.

POST/api/v1/auth/token

Preverjanje pristnosti
ApiKey
Na voljo od paketa
BASIC
Zahtevana dovoljenja
Ni relevantno

Primeri kode

Primer zahteve

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))

Primer odgovora 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"
  }
}

Preverjanje pristnosti

  • Ključ API pošljite izključno v glavi Authorization zahteve POST /api/v1/auth/token.
  • Ne vključujte ga v JSON, URL ali parametre poizvedbe.
  • Vrnjeni žeton uporabite za zahteve za vire in ga obnovite glede na expires_at; expires_in je izražen v sekundah.
  • Žeton ne obide trenutnih dovoljenj ključa, upravičenj trgovine, preklica ali omejitev IP.

Kako dolgo velja žeton?

  • expires_in: 900 sekund oziroma 15 minut od izdaje. Pošiljanje zahtev ne podaljša veljavnosti.
  • expires_at: Čas izteka v UTC. Trenutne omejitve dostopa lahko žeton blokirajo prej.

Isti žeton uporabite za več zahtev in novega pridobite pred expires_at. Žetona ne pridobivajte pred vsako operacijo. Za nov žeton uporabite ključ API.

Omejitve pogostosti zahtev

Engine ≥ 4.143.0. Vsak odgovor z žetonom vsebuje data.rate_limits iz pravil trgovine ob izdaji. Vsi ključi si delijo te omejitve; nov žeton jih ne ponastavi. Sprememba paketa lahko začne veljati pred potekom žetona.

Parametri

Ni parametrov poti, poizvedbe ali dodatnih glav.

Telo zahteve

application/json · Izbirno

TokenRequest null

Odgovori

Odgovor 200

dataTokenData Obvezno

Vsebina uspešnega odgovora.

Polja · data
access_tokenNizObvezno

Kratkotrajna poverilnica Bearer.

expires_atNizObvezno

Datum in čas poteka poverilnice.

format: "date-time"
expires_inCelo številoIzbirno

Veljavnost poverilnice v sekundah.

Privzeto: 900

rate_limitsTokenRateLimitsData Obvezno

Vsak odgovor z žetonom vsebuje data.rate_limits iz pravil trgovine ob izdaji. Vsi ključi si delijo te omejitve; nov žeton jih ne ponastavi. Sprememba paketa lahko začne veljati pred potekom žetona.

Polja · rate_limits
auth_per_minuteCelo številoObvezno

Zahteve za žeton na minuto, vključno z neuspešnimi poskusi preverjanja pristnosti.

minimum: 0maximum: 1000000
read_per_minuteCelo številoObvezno

Zahteve za branje na minuto.

minimum: 0maximum: 1000000
write_per_minuteCelo številoObvezno

Zahteve za pisanje na minuto; ta vrednost ne dodeli pravic pisanja.

minimum: 0maximum: 1000000
token_typeNizIzbirno

Shema preverjanja pristnosti vrnjenega žetona.

const: "Bearer"

Privzeto: "Bearer"

metaContextPageMeta ContextMeta PageMeta RequestMeta Obvezno

Metapodatki odgovora.

Polja · meta

ContextPageMeta

localeNizObvezno

Jezik, izbran za to zahtevo.

market_codeNizObvezno

Koda trga, vrnjena s končno točko konteksta.

market_idNizObvezno

Identifikator trga, vrnjen s končno točko konteksta.

paginationPagination Obvezno

Metapodatki straničenja s kazalcem.

request_idNizObvezno

Identifikator zahtevka; v metapodatkih odgovora označuje zahtevo HTTP.

minLength: 1maxLength: 100

ContextMeta

localeNizObvezno

Jezik, izbran za to zahtevo.

market_codeNizObvezno

Koda trga, vrnjena s končno točko konteksta.

market_idNizObvezno

Identifikator trga, vrnjen s končno točko konteksta.

request_idNizObvezno

Identifikator zahtevka; v metapodatkih odgovora označuje zahtevo HTTP.

minLength: 1maxLength: 100

PageMeta

paginationPagination Obvezno

Metapodatki straničenja s kazalcem.

request_idNizObvezno

Identifikator zahtevka; v metapodatkih odgovora označuje zahtevo HTTP.

minLength: 1maxLength: 100

RequestMeta

request_idNizObvezno

Identifikator zahtevka; v metapodatkih odgovora označuje zahtevo HTTP.

minLength: 1maxLength: 100
Primer odgovora

Status HTTP

200
Uspešen odgovor Shema
400
Neveljavna zahteva
401
Potrebna je avtentikacija
403
Dostop zavrnjen
404
Vir ni najden
409
Spor različic
422
Preverjanje ni uspelo
429
Presežena omejitev zahtev
Druga stanja HTTP (7)
405
Metoda ni dovoljena
413
Zahteva je prevelika
415
Nepodprta oblika
500
Napaka strežnika
502
Napaka prehoda API
503
Storitev ni na voljo
504
Časovna omejitev je potekla

Katalog napak: ErrorResponse

Glave

401

WWW-AuthenticateNizIzbirno

Shema preverjanja pristnosti, ki jo zahteva strežnik.

405

AllowNizIzbirno

Metode HTTP, ki jih podpira ta vir.

429, 503

Retry-AfterCelo številoIzbirno

Najkrajši zamik pred ponovitvijo v sekundah.

minimum: 0.0