Μετάβαση στο περιεχόμενο
ShopentlyLearn

Ανάκτηση · Διακριτικό — Έλεγχος ταυτότητας

Λάβετε διακριτικό Shopently API διάρκειας 900 δευτερολέπτων. Δείτε την κεφαλίδα ApiKey, την απάντηση και τη χρήση Bearer στα επόμενα αιτήματα.

POST/api/v1/auth/token

Έλεγχος ταυτότητας
ApiKey
Διαθέσιμο από
BASIC
Απαιτούμενα δικαιώματα
Δεν εφαρμόζεται

Παραδείγματα κώδικα

Παράδειγμα αιτήματος

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

Παράδειγμα απόκρισης 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"
  }
}

Έλεγχος ταυτότητας

  • Το κλειδί API αποστέλλεται αποκλειστικά στην κεφαλίδα Authorization του POST /api/v1/auth/token.
  • Μην το τοποθετείτε σε JSON, URL ή παραμέτρους ερωτήματος.
  • Χρησιμοποιήστε το διακριτικό που επιστρέφεται για αιτήματα πόρων και ανανεώστε το σύμφωνα με το expires_at.
  • Το expires_in εκφράζεται σε δευτερόλεπτα.
  • Το διακριτικό πρόσβασης δεν παρακάμπτει τα τρέχοντα δικαιώματα του κλειδιού, τα δικαιώματα του προγράμματος του καταστήματος, την ανάκληση ή τους περιορισμούς IP.

Πόσο διαρκεί ένα διακριτικό;

  • expires_in: 900 δευτερόλεπτα, δηλαδή 15 λεπτά από την έκδοση. Τα αιτήματα δεν παρατείνουν την ισχύ του.
  • expires_at: Χρόνος λήξης σε UTC. Οι τρέχοντες περιορισμοί πρόσβασης μπορεί να αποκλείσουν το διακριτικό νωρίτερα.

Χρησιμοποιήστε το ίδιο διακριτικό για πολλά αιτήματα και λάβετε νέο πριν από το expires_at. Δεν χρειάζεται νέο διακριτικό πριν από κάθε ενέργεια. Χρησιμοποιήστε το κλειδί API για τη λήψη του.

Όρια αιτημάτων

Engine ≥ 4.143.0. Κάθε απάντηση token περιλαμβάνει το data.rate_limits της πολιτικής του καταστήματος κατά την έκδοση. Όλα τα κλειδιά μοιράζονται αυτά τα όρια· ένα νέο token δεν τα επαναφέρει. Αλλαγή προγράμματος μπορεί να ισχύσει πριν λήξει το token.

Παράμετροι

Δεν υπάρχουν παράμετροι διαδρομής, ερωτήματος ή πρόσθετων κεφαλίδων.

Περιεχόμενο αιτήματος

application/json · Προαιρετικό

TokenRequest null

Αποκρίσεις

Απόκριση 200

dataTokenData Υποχρεωτικό

Δεδομένα επιτυχούς απόκρισης.

Πεδία · data
access_tokenΣυμβολοσειράΥποχρεωτικό

Διαπιστευτήριο Bearer μικρής διάρκειας.

expires_atΣυμβολοσειράΥποχρεωτικό

Ημερομηνία και ώρα λήξης διαπιστευτηρίου.

format: "date-time"
expires_inΑκέραιοςΠροαιρετικό

Διάρκεια ισχύος διαπιστευτηρίου σε δευτερόλεπτα.

Προεπιλογή: 900

rate_limitsTokenRateLimitsData Υποχρεωτικό

Κάθε απάντηση token περιλαμβάνει το data.rate_limits της πολιτικής του καταστήματος κατά την έκδοση. Όλα τα κλειδιά μοιράζονται αυτά τα όρια· ένα νέο token δεν τα επαναφέρει. Αλλαγή προγράμματος μπορεί να ισχύσει πριν λήξει το token.

Πεδία · rate_limits
auth_per_minuteΑκέραιοςΥποχρεωτικό

Αιτήματα token ανά λεπτό, μαζί με τις αποτυχημένες προσπάθειες ελέγχου ταυτότητας.

minimum: 0maximum: 1000000
read_per_minuteΑκέραιοςΥποχρεωτικό

Αιτήματα ανάγνωσης ανά λεπτό.

minimum: 0maximum: 1000000
write_per_minuteΑκέραιοςΥποχρεωτικό

Αιτήματα εγγραφής ανά λεπτό· η τιμή δεν εκχωρεί δικαιώματα εγγραφής.

minimum: 0maximum: 1000000
token_typeΣυμβολοσειράΠροαιρετικό

Σχήμα ελέγχου ταυτότητας για το επιστρεφόμενο διακριτικό.

const: "Bearer"

Προεπιλογή: "Bearer"

metaContextPageMeta ContextMeta PageMeta RequestMeta Υποχρεωτικό

Μεταδεδομένα απόκρισης.

Πεδία · meta

ContextPageMeta

localeΣυμβολοσειράΥποχρεωτικό

Γλώσσα που επιλέχθηκε για αυτό το αίτημα.

market_codeΣυμβολοσειράΥποχρεωτικό

Κωδικός αγοράς που επιστρέφει το endpoint πλαισίου.

market_idΣυμβολοσειράΥποχρεωτικό

Αναγνωριστικό αγοράς που επιστρέφει το endpoint πλαισίου.

paginationPagination Υποχρεωτικό

Μεταδεδομένα σελιδοποίησης με cursor.

request_idΣυμβολοσειράΥποχρεωτικό

Αναγνωριστικό αιτήματος· στα μεταδεδομένα απόκρισης ταυτοποιεί το αίτημα HTTP.

minLength: 1maxLength: 100

ContextMeta

localeΣυμβολοσειράΥποχρεωτικό

Γλώσσα που επιλέχθηκε για αυτό το αίτημα.

market_codeΣυμβολοσειράΥποχρεωτικό

Κωδικός αγοράς που επιστρέφει το endpoint πλαισίου.

market_idΣυμβολοσειράΥποχρεωτικό

Αναγνωριστικό αγοράς που επιστρέφει το endpoint πλαισίου.

request_idΣυμβολοσειράΥποχρεωτικό

Αναγνωριστικό αιτήματος· στα μεταδεδομένα απόκρισης ταυτοποιεί το αίτημα HTTP.

minLength: 1maxLength: 100

PageMeta

paginationPagination Υποχρεωτικό

Μεταδεδομένα σελιδοποίησης με cursor.

request_idΣυμβολοσειράΥποχρεωτικό

Αναγνωριστικό αιτήματος· στα μεταδεδομένα απόκρισης ταυτοποιεί το αίτημα HTTP.

minLength: 1maxLength: 100

RequestMeta

request_idΣυμβολοσειράΥποχρεωτικό

Αναγνωριστικό αιτήματος· στα μεταδεδομένα απόκρισης ταυτοποιεί το αίτημα HTTP.

minLength: 1maxLength: 100
Παράδειγμα απόκρισης

Κατάσταση HTTP

200
Επιτυχής απόκριση Σχήμα
400
Μη έγκυρο αίτημα
401
Απαιτείται ταυτοποίηση
403
Δεν επιτρέπεται η πρόσβαση
404
Ο πόρος δεν βρέθηκε
409
Διένεξη έκδοσης
422
Αποτυχία επικύρωσης
429
Υπέρβαση ορίου αιτημάτων
Άλλες καταστάσεις HTTP (7)
405
Η μέθοδος δεν επιτρέπεται
413
Πολύ μεγάλο αίτημα
415
Μη υποστηριζόμενος τύπος
500
Σφάλμα διακομιστή
502
Σφάλμα πύλης API
503
Μη διαθέσιμη υπηρεσία
504
Υπέρβαση χρόνου αναμονής

Κατάλογος σφαλμάτων: ErrorResponse

Κεφαλίδες

401

WWW-AuthenticateΣυμβολοσειράΠροαιρετικό

Σχήμα ελέγχου ταυτότητας που απαιτεί ο διακομιστής.

405

AllowΣυμβολοσειράΠροαιρετικό

Μέθοδοι HTTP που υποστηρίζει αυτός ο πόρος.

429, 503

Retry-AfterΑκέραιοςΠροαιρετικό

Ελάχιστος χρόνος αναμονής πριν από νέα προσπάθεια, σε δευτερόλεπτα.

minimum: 0.0