Ανάκτηση · Διακριτικό — Έλεγχος ταυτότητας
Λάβετε διακριτικό 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
{
"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
Πλήρες μοντέλο: ApiResponse_TokenData_
dataTokenDataΥποχρεωτικόΔεδομένα επιτυχούς απόκρισης.
Πεδία ·
dataaccess_tokenΣυμβολοσειράΥποχρεωτικόΔιαπιστευτήριο Bearer μικρής διάρκειας.
expires_atΣυμβολοσειράΥποχρεωτικόΗμερομηνία και ώρα λήξης διαπιστευτηρίου.
format:"date-time"expires_inΑκέραιοςΠροαιρετικόΔιάρκεια ισχύος διαπιστευτηρίου σε δευτερόλεπτα.
rate_limitsTokenRateLimitsDataΥποχρεωτικόΚάθε απάντηση token περιλαμβάνει το data.rate_limits της πολιτικής του καταστήματος κατά την έκδοση. Όλα τα κλειδιά μοιράζονται αυτά τα όρια· ένα νέο token δεν τα επαναφέρει. Αλλαγή προγράμματος μπορεί να ισχύσει πριν λήξει το token.
Πεδία ·
rate_limitsΠλήρες μοντέλο:
TokenRateLimitsDataauth_per_minuteΑκέραιοςΥποχρεωτικόΑιτήματα token ανά λεπτό, μαζί με τις αποτυχημένες προσπάθειες ελέγχου ταυτότητας.
minimum:0maximum:1000000read_per_minuteΑκέραιοςΥποχρεωτικόΑιτήματα ανάγνωσης ανά λεπτό.
minimum:0maximum:1000000write_per_minuteΑκέραιοςΥποχρεωτικόΑιτήματα εγγραφής ανά λεπτό· η τιμή δεν εκχωρεί δικαιώματα εγγραφής.
minimum:0maximum:1000000
token_typeΣυμβολοσειράΠροαιρετικόΣχήμα ελέγχου ταυτότητας για το επιστρεφόμενο διακριτικό.
const:"Bearer"
metaContextPageMetaContextMetaPageMetaRequestMetaΥποχρεωτικόΜεταδεδομένα απόκρισης.
Πεδία ·
metaΠλήρες μοντέλο:
ContextPageMetalocaleΣυμβολοσειράΥποχρεωτικόΓλώσσα που επιλέχθηκε για αυτό το αίτημα.
market_codeΣυμβολοσειράΥποχρεωτικόΚωδικός αγοράς που επιστρέφει το endpoint πλαισίου.
market_idΣυμβολοσειράΥποχρεωτικόΑναγνωριστικό αγοράς που επιστρέφει το endpoint πλαισίου.
paginationPaginationΥποχρεωτικόΜεταδεδομένα σελιδοποίησης με cursor.
request_idΣυμβολοσειράΥποχρεωτικόΑναγνωριστικό αιτήματος· στα μεταδεδομένα απόκρισης ταυτοποιεί το αίτημα HTTP.
minLength:1maxLength:100
localeΣυμβολοσειράΥποχρεωτικόΓλώσσα που επιλέχθηκε για αυτό το αίτημα.
market_codeΣυμβολοσειράΥποχρεωτικόΚωδικός αγοράς που επιστρέφει το endpoint πλαισίου.
market_idΣυμβολοσειράΥποχρεωτικόΑναγνωριστικό αγοράς που επιστρέφει το endpoint πλαισίου.
request_idΣυμβολοσειράΥποχρεωτικόΑναγνωριστικό αιτήματος· στα μεταδεδομένα απόκρισης ταυτοποιεί το αίτημα HTTP.
minLength:1maxLength:100
paginationPaginationΥποχρεωτικόΜεταδεδομένα σελιδοποίησης με cursor.
request_idΣυμβολοσειράΥποχρεωτικόΑναγνωριστικό αιτήματος· στα μεταδεδομένα απόκρισης ταυτοποιεί το αίτημα HTTP.
minLength:1maxLength:100
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