Preskoči na sadržaj
ShopentlyLearn

Dohvati · Token — Autentifikacija

Dohvatite Shopently API token koji vrijedi 900 sekundi. Pogledajte zaglavlje ApiKey, odgovor i korištenje Bearer u sljedećim zahtjevima.

POST/api/v1/auth/token

Autentifikacija
ApiKey
Dostupno od
BASIC
Potrebne ovlasti
Nije primjenjivo

Primjeri koda

Primjer zahtjeva

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

Primjer 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"
  }
}

Autentifikacija

  • API ključ šalje se isključivo u zaglavlju Authorization zahtjeva POST /api/v1/auth/token.
  • Ne stavljajte ga u JSON, URL ili parametre upita.
  • Dobiveni token koristite za zahtjeve prema resursima i obnavljajte ga prema expires_at; expires_in izražen je u sekundama.
  • Pristupni token ne zaobilazi trenutačne ovlasti ključa, prava trgovine, opoziv ni IP ograničenja.

Koliko dugo token vrijedi?

  • expires_in: 900 sekundi, odnosno 15 minuta od izdavanja. Slanje zahtjeva ne produljuje valjanost.
  • expires_at: Vrijeme isteka u UTC-u. Trenutačna ograničenja pristupa mogu blokirati token ranije.

Koristite isti token za više zahtjeva i dohvatite novi prije expires_at. Ne dohvaćajte token prije svake operacije. Za novi token koristite API ključ.

Ograničenja učestalosti

Engine ≥ 4.143.0. Svaki odgovor s tokenom sadrži data.rate_limits iz pravila trgovine pri izdavanju. Svi ključevi dijele te limite; novi token ih ne obnavlja. Promjena plana može se primijeniti prije isteka tokena.

Parametri

Nema parametara putanje, upita ni dodatnih zaglavlja.

Tijelo zahtjeva

application/json · Neobavezno

TokenRequest null

Odgovori

Odgovor 200

dataTokenData Obvezno

Podaci uspješnog odgovora.

Polja · data
access_tokenNiz znakovaObvezno

Kratkotrajna Bearer vjerodajnica.

expires_atNiz znakovaObvezno

Datum i vrijeme isteka vjerodajnice.

format: "date-time"
expires_inCijeli brojNeobavezno

Trajanje vjerodajnice u sekundama.

Zadano: 900

rate_limitsTokenRateLimitsData Obvezno

Svaki odgovor s tokenom sadrži data.rate_limits iz pravila trgovine pri izdavanju. Svi ključevi dijele te limite; novi token ih ne obnavlja. Promjena plana može se primijeniti prije isteka tokena.

Polja · rate_limits
auth_per_minuteCijeli brojObvezno

Zahtjevi za token u minuti, uključujući neuspjele pokušaje autentifikacije.

minimum: 0maximum: 1000000
read_per_minuteCijeli brojObvezno

Zahtjevi za čitanje u minuti.

minimum: 0maximum: 1000000
write_per_minuteCijeli brojObvezno

Zahtjevi za pisanje u minuti; ta vrijednost ne daje prava pisanja.

minimum: 0maximum: 1000000
token_typeNiz znakovaNeobavezno

Shema autentifikacije za vraćeni token.

const: "Bearer"

Zadano: "Bearer"

metaContextPageMeta ContextMeta PageMeta RequestMeta Obvezno

Metapodaci odgovora.

Polja · meta

ContextPageMeta

localeNiz znakovaObvezno

Jezik odabran za ovaj zahtjev.

market_codeNiz znakovaObvezno

Kod tržišta vraćen s krajnje točke konteksta.

market_idNiz znakovaObvezno

Identifikator tržišta vraćen s krajnje točke konteksta.

paginationPagination Obvezno

Metapodaci straničenja pomoću kursora.

request_idNiz znakovaObvezno

Identifikator zahtjeva; u metapodacima odgovora označava HTTP zahtjev.

minLength: 1maxLength: 100

ContextMeta

localeNiz znakovaObvezno

Jezik odabran za ovaj zahtjev.

market_codeNiz znakovaObvezno

Kod tržišta vraćen s krajnje točke konteksta.

market_idNiz znakovaObvezno

Identifikator tržišta vraćen s krajnje točke konteksta.

request_idNiz znakovaObvezno

Identifikator zahtjeva; u metapodacima odgovora označava HTTP zahtjev.

minLength: 1maxLength: 100

PageMeta

paginationPagination Obvezno

Metapodaci straničenja pomoću kursora.

request_idNiz znakovaObvezno

Identifikator zahtjeva; u metapodacima odgovora označava HTTP zahtjev.

minLength: 1maxLength: 100

RequestMeta

request_idNiz znakovaObvezno

Identifikator zahtjeva; u metapodacima odgovora označava HTTP zahtjev.

minLength: 1maxLength: 100
Primjer odgovora

HTTP status

200
Uspješan odgovor Shema
400
Nevaljan zahtjev
401
Potrebna je autentikacija
403
Pristup odbijen
404
Resurs nije pronađen
409
Sukob verzija
422
Provjera nije uspjela
429
Prekoračeno ograničenje zahtjeva
Ostali HTTP statusi (7)
405
Metoda nije dopuštena
413
Zahtjev je prevelik
415
Nepodržan format
500
Pogreška poslužitelja
502
Pogreška API pristupnika
503
Usluga nije dostupna
504
Istek vremena

Katalog pogrešaka: ErrorResponse

Zaglavlja

401

WWW-AuthenticateNiz znakovaNeobavezno

Shema autentifikacije koju zahtijeva poslužitelj.

405

AllowNiz znakovaNeobavezno

HTTP metode koje ovaj resurs podržava.

429, 503

Retry-AfterCijeli brojNeobavezno

Najkraće čekanje prije ponavljanja, u sekundama.

minimum: 0.0