Lister — Commandes
Consultez les données de « Commandes ». Le résultat dépend des paramètres de cette opération.
GET/api/v1/orders
- Authentification
Bearer- Disponible à partir de
- BASIC
- Autorisations requises
orders.order:read
Exemples de code
Exemple de requête
cURL
: "${SHOPENTLY_SHOP_URL:?}"
curl --disable --globoff --fail-with-body --silent --show-error \
--proto '=https' --connect-timeout 5 --max-time 30 \
--request GET \
--header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
--url "${SHOPENTLY_SHOP_URL%/}"'/api/v1/orders?limit=20'
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_ACCESS_TOKEN') ?: '';
if ($credential === '' || strpbrk($credential, "\r\n") !== false) {
throw new RuntimeException('Invalid credential');
}
$headers = [];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/orders?limit=20');
curl_setopt_array($handle, [
CURLOPT_CUSTOMREQUEST => 'GET',
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);
},
]);
$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_ACCESS_TOKEN']
if not credential or "\r" in credential or "\n" in credential:
raise ValueError("Invalid credential")
headers = {}
headers["Authorization"] = 'Bearer' + " " + credential
body = None
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(
'GET', base_url + '/api/v1/orders?limit=20', 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))
Exemple de réponse 200
{
"data": [
{
"created_at": "2026-10-19T10:00:00Z",
"customer": {
"email": "customer@example.invalid",
"first_name": "Example",
"last_name": "Example",
"phone": null
},
"delivery": {
"amount": {
"amount": "0.00",
"currency": "PLN",
"minor_units": 2
},
"dates": {
"dispatch_timezone": "Europe/Warsaw",
"estimated_delivery_from": "2026-10-20",
"estimated_delivery_to": "2026-10-21",
"planned_dispatch_on": "2026-10-19"
},
"method_code": "shipping-old",
"method_name": "Historic carrier",
"pickup_point": null,
"recipient_mode": "full_address"
},
"discount_amount": {
"amount": "24.60",
"currency": "PLN",
"minor_units": 2
},
"id": "order-0000",
"lifecycle_state": "placed",
"locale": "pl",
"market_id": "market-pl",
"number": "0001",
"payment": {
"amount": {
"amount": "329.40",
"currency": "PLN",
"minor_units": 2
},
"environment": "live",
"method_code": "payment-old",
"method_name": "Historic method",
"paid_at": null,
"status": "unpaid",
"updated_at": "2026-10-19T10:00:00Z",
"version": 0
},
"prices_include_tax": true,
"shipping_discount_amount": {
"amount": "24.60",
"currency": "PLN",
"minor_units": 2
},
"status": {
"id": "status-0",
"name": "Status 0",
"updated_at": "2026-10-19T10:00:00Z",
"version": 1
},
"subtotal": {
"amount": "329.40",
"currency": "PLN",
"minor_units": 2
},
"tax": {
"amount": "49.40",
"currency": "PLN",
"minor_units": 2
},
"tax_country_code": "PL",
"total": {
"amount": "329.40",
"currency": "PLN",
"minor_units": 2
}
}
],
"meta": {
"pagination": {
"has_more": false,
"limit": 20,
"next_cursor": null
},
"request_id": "example"
}
}
Fonctionnement
- La collection fournit des résumés et des filtres par numéro, statut, statut de paiement et date de création.
- La liste et le détail des commandes incluent delivery.dates. Les dates YYYY-MM-DD sont prévues et ne confirment pas l’expédition. Les dates actuelles sont prioritaires ; les anciennes commandes utilisent l’estimation enregistrée. Les valeurs effacées ou inconnues sont null. Le détail inclut aussi toutes les lignes et images des produits.
- Obtenez les identifiants de statut valides via /api/v1/order-statuses.
- Le statut de commande et celui du paiement ont des opérations PATCH et des autorisations distinctes.
- Modifier le statut de paiement enregistré ne débite pas de carte et ne déclenche pas de remboursement chez un prestataire de paiement.
Commande · Totaux
Les montants et taux proviennent de la commande enregistrée, corrections de lignes comprises. Les données historiques manquantes valent null et ne sont pas remplacées par les taux actuels du catalogue. Les montants restent des chaînes décimales.
La liste fournit des résumés. Appelez GET /api/v1/orders/{order_id} pour chaque résultat afin d’exporter les détails financiers. Les nouvelles tentatives GET sont limitées et respectent Retry-After. Un export par date de création ne synchronise pas les corrections ultérieures.
Paramètres
Paramètres de requête
limitEntierFacultatifNombre maximal d'enregistrements sur cette page.
minimum:1maximum:100cursorChaîne nullFacultatifValeur opaque de continuation renvoyée par la page précédente.
Chaîne:minLength:1maxLength:1024numberChaîne nullFacultatifNuméro de commande ou de demande visible par l'utilisateur.
Chaîne:minLength:1maxLength:48status_idChaîne nullFacultatifIdentifiant obtenu dans le répertoire de statuts correspondant.
Contraintes · Chaîne 1
pattern"^[a-z0-9][a-z0-9_-]{0,62}$"
payment_statusChaîne nullFacultatifStatut du paiement enregistré.
Contraintes · Chaîne 1
enum["unpaid", "paid", "failed", "refunded"]
created_fromChaîne nullFacultatifDébut du filtre par date de création.
Chaîne:format:"date-time"created_toChaîne nullFacultatifFin du filtre par date de création.
Chaîne:format:"date-time"
Cette opération n'accepte pas de corps JSON.
Réponses
Réponse 200
Modèle complet: ApiResponse_list_OrderSummaryData__
dataTableau <OrderSummaryData> ObligatoireDonnées d'une réponse réussie.
Champs ·
dataModèle complet:
OrderSummaryDatacreated_atChaîneObligatoireDate et heure de création.
format:"date-time"customerCustomerDataObligatoireDonnées du client enregistrées pour cette ressource.
deliveryShippingDataObligatoireMode de livraison et informations associées.
discount_amountMoneyDataObligatoireMontant décimal sous forme de chaîne JSON ; null uniquement lorsque cela est autorisé.
idChaîneObligatoireIdentifiant de ressource ; conserver la valeur renvoyée.
lifecycle_stateOrderLifecycleStateObligatoireÉtat du cycle de vie métier.
localeChaîneObligatoireLangue sélectionnée pour cette requête.
market_idChaîneObligatoireIdentifiant de marché renvoyé par le point d'accès au contexte.
numberChaîneObligatoireNuméro de commande ou de demande visible par l'utilisateur.
paymentPaymentDataObligatoireDétails du paiement enregistrés pour la commande.
prices_include_taxBooléenObligatoireIndique si les prix de la liste comprennent les taxes.
shipping_discount_amountMoneyDataObligatoireMontant décimal sous forme de chaîne JSON ; null uniquement lorsque cela est autorisé.
statusOrderStatusDataObligatoireStatut accepté par cette opération précise.
subtotalMoneyDataObligatoireMontant avant les composantes supplémentaires indiquées dans la réponse.
taxMoneyDataObligatoireInformations sur les taxes.
tax_country_codeChaîne nullObligatoirePays fiscal · Données enregistrées de la commande · ISO 3166-1 alpha-2; null.
totalMoneyDataObligatoireMontant total.
metaContextPageMetaContextMetaPageMetaRequestMetaObligatoireMétadonnées de la réponse.
Champs ·
metaModèle complet:
ContextPageMetalocaleChaîneObligatoireLangue sélectionnée pour cette requête.
market_codeChaîneObligatoireCode de marché renvoyé par le point d'accès au contexte.
market_idChaîneObligatoireIdentifiant de marché renvoyé par le point d'accès au contexte.
paginationPaginationObligatoireMétadonnées de pagination par curseur.
request_idChaîneObligatoireIdentifiant de demande ; dans les métadonnées, identifiant de la requête HTTP.
minLength:1maxLength:100
localeChaîneObligatoireLangue sélectionnée pour cette requête.
market_codeChaîneObligatoireCode de marché renvoyé par le point d'accès au contexte.
market_idChaîneObligatoireIdentifiant de marché renvoyé par le point d'accès au contexte.
request_idChaîneObligatoireIdentifiant de demande ; dans les métadonnées, identifiant de la requête HTTP.
minLength:1maxLength:100
paginationPaginationObligatoireMétadonnées de pagination par curseur.
request_idChaîneObligatoireIdentifiant de demande ; dans les métadonnées, identifiant de la requête HTTP.
minLength:1maxLength:100
request_idChaîneObligatoireIdentifiant de demande ; dans les métadonnées, identifiant de la requête HTTP.
minLength:1maxLength:100
Statut HTTP
200- Réponse réussie Schéma
400- Requête invalide
401- Authentification requise
403- Accès refusé
404- Ressource introuvable
409- Conflit de version
422- Échec de validation
429- Limite de requêtes dépassée
Autres statuts HTTP (7)
405- Méthode non autorisée
413- Requête trop volumineuse
415- Format non pris en charge
500- Erreur du serveur
502- Erreur de passerelle API
503- Service indisponible
504- Délai de passerelle dépassé
Catalogue des erreurs: ErrorResponse
En-têtes
401
WWW-AuthenticateChaîneFacultatifSchéma d'authentification exigé par le serveur.
405
AllowChaîneFacultatifMéthodes HTTP prises en charge par cette ressource.
429, 503
Retry-AfterEntierFacultatifDélai minimal avant une nouvelle tentative, en secondes.
minimum:0