GET · Export · Lecture · v2.1.0API d'exportation
Exportez les données de la boutique. Depuis la version 2.1.0, avec des chemins d'URL RESTful : /categories/{id} renvoie la catégorie elle-même.
GET /Export/JSON/categories # Alle
GET /Export/JSON/categories/128 # ID 128
GET /Export/JSON/categories?parent_id=128 # Kinder
/categories/{id} = ressource unique
La catégorie avec cet ID
GET /Export/JSON/categories/128
→ Kategorie 128 ("xoPort REST API")
?parent_id={id} = Enfants
Les enfants de la catégorie parente
GET /Export/JSON/categories?parent_id=128
→ Unterkategorien von 128
Changement majeur dans la version 2.1.0 : auparavant, /categories/{id} renvoyait les enfants. Désormais, utilisez ?parent_id={id} pour les enfants.
| Point de terminaison | Description | Exemple |
|---|
GET /categories | Toutes les catégories | Arborescence complète des catégories |
GET /categories/{id} | Catégorie unique | /categories/128 → ID 128 |
GET /categories?id={id} | Sans effet depuis la v2.23.0 : renvoie toutes les catégories. Une catégorie via /categories/{id} | – |
GET /categories?parent_id={id} | Enfants directs | ?parent_id=128 |
GET /categories?parent_id={id}&recursive=1 | Sous-arbre complet | Tous les descendants |
GET /categories?status=1 | Uniquement les actifs | Filtrage |
GET /categories?seo_string={pfad} | Catégorie sous une adresse de boutique, chemin d'accès complet exact NOUVEAU v2.122.11 | ?seo_string=angelruten/spinnruten&language=de |
GET /categories?language=de | Uniquement en allemand | Filtre par langue |
GET /categories/productlist | Légère : mise en correspondance catégorie→produit NOUVEAU v2.12.0 | Par catégorie : ID + modèles |
GET /categories/productlist?categories_id={id} | Produits d'une catégorie | ?categories_id=73 |
| Médias NOUVEAU v2.16.0 | GET /Export/JSON/medias | media:read |
| Entité | Tous | Unique | Portée |
|---|
| Produits Pagination SQL v2.12.0 | GET /products | GET /product/{id} | products:read |
| Clients | GET /customers | GET /customer/{id} | customers:read |
| Paniers NOUVEAU v2.122.10 | GET /customers_baskets | GET /customers_basket/{customers_id} | customers:read |
| Fabricants | GET /manufacturers | GET /manufacturer/{id} | manufacturers:read |
| Commandes | GET /orders | GET /order/{id} | orders:read |
| Statut de la commande NOUVEAU v2.122.10 | GET /order_statuses | GET /order_status/{id} | orders:read |
Documents justificatifs NOUVEAU v2.61.0 PDF au format « content_base64 » – directement utilisable comme pièce jointe à un ticket | – | GET /order_document/{id}?type=rg | orders:read |
| Actualités | GET /newsdesks | GET /newsdesk/{id} | news:read |
| Catégories d'actualités | GET /newsdeskcats | GET /newsdeskcat/{id} | newscategories:read |
| FAQ | GET /faqs | GET /faq/{id} | faq:read |
| Catégories de FAQ | GET /faqcats | GET /faqcat/{id} | faqcategories:read |
Historique SEO Rechercher l'ancienne adresse : ?seo_string= (v2.122.11) | GET /seohistorys | GET /seohistory/{id} | seohistory:read |
| Contrats | GET /contracts | GET /contract/{id} | contracts:read |
| Abonnés à la newsletter | GET /newsletter_subscribers | GET /newsletter_subscriber/{id} | newsletter:read |
| Campagnes de newsletter | GET /newsletters | GET /newsletter/{id} | newsletters:read |
Tickets CRUD v2.11.0 Avec claim et edit_lock (v2.118.0) | GET /tickets | GET /ticket/{id} | tickets:read |
Pièces jointes aux tickets Écrire : attachments[] à POST/PUT /Import/JSON/tickets (v2.60.0) | GET /ticket_attachments/{id} | GET /ticket_attachment/{id}?file=name | tickets:read |
| Curseur NOUVEAU v2.22.0 | GET /sliders | GET /slider/{id} | slider:read |
| Projets (xoCRM) NOUVEAU v2.35.0 | GET /projects | GET /project/{id} | projects:read |
| Tâches de projet NOUVEAU v2.35.0 | GET /project_tasks | GET /project_task/{id} | project_tasks:read |
| Rendez-vous (xoCRM) NOUVEAU v2.44.0 | GET /appointments | GET /appointment/{id} | appointments:read |
| Caractéristiques et valeurs d'option NOUVEAU v2.96.0 | GET /products_options
GET /products_options_values | GET /products_option/{id} | products:read |
| Profils de délais de livraison NOUVEAU v2.94.0 | GET /shipping_profiles | GET /shipping_profile/{id} | products:read |
| Classes d'imposition NOUVEAU v2.90.0 | GET /tax_classes | GET /tax_class/{id} | products:read |
| Filtres des pages de catégories NOUVEAU v2.100.0 | GET /products_filters | GET /products_filter/{fid} | products:read |
| Bons d'achat et coupons NOUVEAU v2.102.0 | GET /coupons | GET /coupon/{id} | orders:read |
| Services de billetterie NOUVEAU v2.103.0 | GET /ticket_departments | GET /ticket_department/{id} | tickets:read |
| Paramètres NOUVEAU v2.108.0 | GET /configuration | – | configuration:read |
| Importateur CSV/XLS NOUVEAU v2.109.0 | GET /porters | GET /porter/{id} | porters:read |
| Avis NOUVEAU v2.122.6 | GET /reviews | GET /review/{id} | products:read |
Les avis individuels de la page produit avec note par étoiles, titre, texte et réponse de la boutique pour chaque langue. Sans filtre, la liste ne fournit que les avis validés, c'est-à-dire les mêmes que ceux affichés sur la page produit. La requête individuelle /review/{id} fournit un avis même avant sa validation.
| Paramètres | Fonction | Exemple |
|---|
products_id | Avis sur un ou plusieurs articles | ?products_id=104648,104650 |
status | 1 publiés (par défaut), 0 en attente de publication, all les deux | ?status=all |
since | créés ou modifiés pour la dernière fois à partir du | ?since=2026-10-05 |
Exemple – synchronisation quotidienne, y compris les validations annulées :
GET /reviews?status=all&since=2026-10-05&limit=250&page=1
Pas de données client. author est le nom qui s'affiche également sur la page du produit. Le point de terminaison ne fournit pas l'identifiant client, l'e-mail ni le numéro de commande, mais uniquement verified_purchase (avis sur une commande). C'est pourquoi la portée products:read suffit. Les avis supprimés n'apparaissent plus dans la liste. Lorsqu'on synchronise un stock, il faut donc vérifier de temps en temps tous les identifiants.
GET /Export/JSON/categories/128?language=de
{
"success": true,
"api_version": "2.122.12",
"type": "categories",
"data": [
{
"categories_id": 128,
"parent_id": 97,
"status": 1,
"languages": {
"de": {
"categories_name": "xoPort REST API",
"categories_description": "..."
}
},
"restricted_customer_groups": []
}
],
"stats": {
"total": 1,
"count": 1,
"timestamp": "2026-10-18 14:00:00"
}
}
stats indique le nombre de résultats, le nombre d’enregistrements et l’heure de la réponse ; en cas de pagination, il indique également la taille de la page et la position. Toutes les clés et les moments où la pagination s’effectue : voir la section « Pagination » ci-dessous.warnings[] N’apparaît que s’il y a des remarques, par exemple UNKNOWN_FILTER pour un paramètre inconnu.
Lancer l’exportation
Créez un client OAuth2 avec les champs d'application :read.
Créer un client OAuth2
Tous les points de terminaison d'exportation utilisent les mêmes paramètres de requête :
| Paramètres | Par défaut | Max | Description |
|---|
limit | 50 ou aucun (voir ci-dessous) | 250 | enregistrements par page. Une valeur supérieure est limitée à 250, ce qui entraîne l'affichage de l'avertissement LIMIT_CAPPED |
offset | 0 | — | Position de départ dans les résultats |
page | — | — | Numéro de page à partir de 1, correspond à offset = (page − 1) × limit. Ne pas envoyer conjointement avec offset (HTTP 400 INVALID_PAGINATION) |
Sans limit, le défilement dépend du point de terminaison :
| Point de terminaison | sans limit | page sans limit |
|---|
| Listes des produits, clients, commandes, caractéristiques et valeurs de caractéristiques (sans ID dans le chemin) ; évaluations, même avec ID ou plage dans le chemin ; paniers, même avec plage dans le chemin | défilement toujours activé, 50 éléments par page ; stats contient toujours limit, offset et has_more | 50 par page |
| tous les autres, y compris les identifiants et les plages dans le chemin d'accès des produits, des clients, des commandes, des caractéristiques et des valeurs de caractéristiques, ainsi que le panier d'un client | jusqu’à 250 résultats non triés dans une réponse, sans limit, offset et has_more dans stats; s’il y a plus de résultats, les 50 premiers et stats.has_more | 250 par page ; en cas d’ID ou de segment dans le chemin d’accès, code HTTP 400 (voir ci-dessous) |
Exemple : GET /products?limit=50&offset=100
La réponse contient dans l'objet ` stats` :
total — Nombre de résultats avant le défilement (toujours)count — Nombre d’enregistrements dans cette réponse (toujours)timestamp — Heure de la réponse, par exemple 2026-10-18 14:00:00 (toujours)limit, offset — la taille de page appliquée et la position de départ, uniquement en cas de défilementhas_more — true, si d’autres résultats suivent cette page ; uniquement en cas de défilementpage — uniquement après ?page=
Les documents justificatifs (/order_document/{id}) et le téléchargement d’une pièce jointe à un ticket (?file=) ne comportent pas de « stats » ; aucun des deux ne permet de faire défiler les pages.
- Lorsque la page est fournie sans «
limit » et sans pagination, un « offset » seul ne fonctionne qu’à partir de plus de 250 résultats. Pour une pagination ciblée, il faut donc toujours envoyer « limit ». - Si le chemin contient un ID ou une plage,
?page= renvoie un code HTTP 400 INVALID_PAGINATION, car le chemin désigne déjà les enregistrements. Seules les évaluations (y compris celles avec un ID) et les paniers contenant une plage {a}:{b} permettent de faire défiler la liste via page. - La liste s'affiche dans son intégralité lorsque l'on fait défiler les pages via
limit et page ou offset, jusqu'à ce que has_more devienne false.
L'exportation des produits peut être limitée côté serveur, au lieu de récupérer l'intégralité du catalogue page par page. Une virgule sépare une liste d'inclusion (100 valeurs au maximum) ; plusieurs filtres sont combinés par une opération « ET ».
| Paramètres | Effet | Exemple |
|---|
status | Statut de l'article | ?status=1 |
tax_class_id | Classe fiscale | ?tax_class_id=0,1 |
categories_id | L'article appartient à l'une des catégories suivantes | ?categories_id=10039,10104 |
ean_prefix | Le code EAN commence par… | ?ean_prefix=978,979,977 |
model_prefix | Le numéro d'article commence par… | ?model_prefix=166- |
products_model, products_ean | le numéro d'article ou l'EAN, exactement | ?products_model=KB |
last_modified | modifié depuis… ; une valeur composée uniquement de signes de ponctuation (?last_modified=.) génère une erreur HTTP 400 depuis la version v2.122.11 | ?last_modified=2026-08-19 |
seo_name | Adresse boutique d’un article : slug valide, exact, toutes langues NOUVEAU v2.122.11 | ?seo_name=angelrute-xy |
marketplace avec marketplace_status, marketplace_upload_status ou marketplace_sync_state | Filtre de place de marché : canal (ID ou code) et au moins une condition, toutes sur le même canal NOUVEAU v2.122.11 | ?marketplace=idealo&marketplace_sync_state=pending |
fields | Aucun filtre : uniquement ces clés par produit (sélection de champs) NOUVEAU v2.122.11 | ?fields=products_model,products_price |
Exemple – tous les articles disponibles à la vente avec un code EAN « livre » qui ne bénéficient pas d’un taux réduit :
GET /products?ean_prefix=978,979,977&tax_class_id=0,1&status=1&limit=250
stats.total indique le nombre de résultats du filtre, et non la taille du catalogue.
Depuis la v2.122.11, une valeur composée uniquement de virgules envoyée à products_model, products_ean ou seo_name (?products_model=,) génère une erreur HTTP 400 INVALID_FILTER_VALUE; auparavant, le filtre n’était pas appliqué à cet endroit et le catalogue non filtré était renvoyé. Les autres listes de filtres rejetaient déjà auparavant les valeurs composées uniquement de virgules. Un élément vide entre deux valeurs (A,,B) continue d’être ignoré ; une valeur entièrement vide signifie « non défini ». Filtres de la place de marché et sélection des champs en détail : Products.
Il n’y a délibérément pas d’opérateur « différent de ». « Tout sauf la classe d’imposition 2 » s’écrit sous forme de liste d’inclusion des autres classes (?tax_class_id=0,1). Une valeur de filtrage invalide est rejetée avec le message « HTTP 400 » et n’est pas ignorée en silence – sinon, le catalogue non filtré serait renvoyé. Les filtres appliqués à une ressource unique (/products/{id}) ou à une plage d’identifiants sont rejetés pour la même raison.
GET /coupons fournit des bons d’achat et des coupons, dont l’un est accessible via GET /coupon/{id}. La portée est orders:read; il n’existe pas de portée spécifique. Les filtres multiples sont combinés par une opération « ET ».
| Paramètres | Effet | Exemple |
|---|
code | Code de coupon, exact (sensible ou non à la casse) | ?code=SOMMER10 |
type | P Pourcentage, S livraison gratuite, F montant fixe, G/N crédit ; liste séparée par des virgules | ?type=P,F |
active | 1 actif, 0 inactif | ?active=1 |
kind | discount ou credit | ?kind=credit |
valid_on | uniquement les coupons valables ce jour-là | ?valid_on=2026-09-13 |
last_modified | Delta : coupons créés ou modifiés à partir de cette date NOUVEAU v2.122.10 | ?last_modified=2026-10-12%2005:00:00 |
last_modified accepte les formats fixes des filtres Delta : YYYY-MM-DD, YYYY-MM-DD HH:MM ou YYYY-MM-DD HH:MM:SS (séparateur : espace, T ou +), éventuellement des fractions de seconde et, après l’heure, un fuseau horaire (Z, ±HH:MM, ±HHMM). Un coupon sans date de modification ni de création n’apparaît dans aucun Delta. Une valeur vide signifie « non défini ».- Une valeur de liste (
?type[]=P, ?code[a]=…, y compris vide) génère une erreur HTTP 400 « INVALID_FILTER_VALUE » pour chaque filtre de coupon ; plusieurs types peuvent être indiqués sous forme de liste séparée par des virgules. Toutes les erreurs d’une requête sont regroupées dans details[]; la validation s’effectue avant l’interrogation. - Uniquement des virgules à l'adresse
?type= et une date vide à l'adresse ?valid_on=: voir « Uniquement des séparateurs, UTF-8 non valide » et « Filtre de date vide » ci-dessous.
Modifié dans la version v2.122.10 :?last_modified= fait désormais partie des filtres du point de terminaison : plus d’avertissement UNKNOWN_FILTER, et le delta peut également être récupéré avec ?_strict=true. Le filtrage existait déjà auparavant, mais l’avertissement indiquait que le filtre avait été ignoré, et ?_strict=true renvoyait un code HTTP 400.- Les requêtes qui recevaient un code HTTP 200 jusqu’à la version v2.122.9 renvoient désormais un code HTTP 400
INVALID_FILTER_VALUE sans données : une valeur de liste au niveau d’un filtre de bons (jusqu’à présent « non défini », c’est-à-dire la liste complète des bons, y compris les codes de crédit) et, sur ?last_modified=, une date hors des formats fixes. Les formats libres tels que 12.10.2026, yesterday ou -1 day fonctionnaient jusqu’à la version v2.122.9 ; une valeur illisible permettait d’obtenir tous les coupons. Vérifiez le format de vos propres requêtes avant la mise à jour. - Dans le backend, les coupons copiés ne portent plus, à partir de la version 4.9.169 de la boutique, la date de modification du modèle et apparaissent donc dans le delta. Les copies plus anciennes restent inchangées.
Modification apportée dans la version v2.122.9 :coupon_code le texte est conservé, même pour les codes purement numériques ("4711", "0123456789"). Jusqu’à présent, ces codes étaient traités comme des nombres : les zéros non significatifs étaient supprimés, et des codes tels que "0e123456" étaient réécrits (en 0). Vérifiez les comparaisons de type exact ; pour les boutiques plus anciennes, effectuez la requête avec ?numeric_check=false.restrictions.categories contient également les catégories enregistrées avec leurs sous-catégories ; celles-ci sont répertoriées dans le nouveau champ restrictions.categories_with_subcategories. Jusqu’à présent, une restriction portant uniquement sur ces catégories était représentée par une liste vide, c’est-à-dire « aucune restriction ».
Chaque paramètre de requête de chaque point de terminaison JSON est soumis à une règle, qu’il s’agisse d’exportation, d’importation ou de suppression. La vérification s’effectue avant que le point de terminaison ne lise, n’écrive ou ne supprime quoi que ce soit : une valeur invalide renvoie un code HTTP 400 « INVALID_FILTER_VALUE », et « details[] » renvoie respectivement les codes d’erreur « param » et « message ». Les opérations d’importation et de suppression renvoient la même réponse (« … Nothing was written » ou « … Nothing was deleted »). Les formats XML, CSV et TXT restent inchangés.
GET /Export/JSON/tickets?status=abc&priority[]=2
HTTP 400
{
"success": false,
"error": {
"code": "INVALID_FILTER_VALUE",
"message": "One or more filter values could not be used. No data was returned — see \"details\"."
},
"details": [
{ "param": "status", "message": "Value \"abc\" is not an integer." },
{ "param": "priority",
"message": "Value must be a single value, not a list (param[]=… or param[key]=…). …" }
]
}
- Les valeurs de liste (
?param[]=…, ?param[key]=…) génèrent une erreur pour chaque paramètre. Les valeurs multiples sont acceptées sous forme de liste séparée par des virgules lorsqu’un filtre les prend en charge (produits, clients, delivery_country …). - Une valeur vide (
?status=) signifie « non défini ». Depuis la version 2.122.12, les espaces en bordure ne sont plus pris en compte (voir « Espaces en bordure » ci-dessous) ; dans les boutiques antérieures à la version 4.9.173, envoyez les valeurs sans espaces en bordure et omettez les paramètres vides. Les valeurs valides sans espace en bordure fonctionnent comme auparavant, avec le même nombre de résultats. - Toutes les erreurs d’une requête sont répertoriées dans un
details[]. Le défilement et le tri (limit, offset, page, sort, order) signalent INVALID_PAGINATION, désormais également pour les formes de chemin et les points de terminaison qui ne permettent pas le défilement. - Signaler les noms de paramètres inconnus lors de l’exportation comme auparavant avec l’avertissement
UNKNOWN_FILTER, et avec ?_strict=true, renvoyer une erreur HTTP 400. Lors de l’importation et de la suppression, les noms inconnus sont ignorés sans message. /orders N'accepte plusieurs valeurs que pour « delivery_country » : « ?status=3,4 » renvoie un code HTTP 400 ; il faut envoyer une requête distincte pour chaque statut.
Modifié dans la v2.122.10 : jusqu’à la v2.122.9, chaque point de terminaison effectuait sa propre vérification. Une valeur qui ne passait pas le test était généralement ignorée par le filtre (HTTP 200 avec le contenu non filtré, même avec ?_strict=true), tronquée ou réinterprétée. Si vous envoyez des listes sous la forme param[]=, des listes séparées par des virgules à des filtres avec exactement une valeur, du texte à des filtres numériques, true/yes aux commutateurs 0/1 ou des créneaux horaires libres à last_modified des points de terminaison CRM, vous obtenez désormais un code HTTP 400. Avant la mise à jour, vérifiez vos propres requêtes par rapport aux tableaux ci-dessous.
| Requête | jusqu'à la v2.122.9 | à partir de la v2.122.10 |
|---|
/orders?status=abc, ?customer_id=7,8,9, ?status=3,4 | Pas de filtre : toutes les commandes de tous les clients | HTTP 400 INVALID_FILTER_VALUE |
/orders?status=1.5, ?products_id=1e3 | interprété comme 1 ou 1 000 | HTTP 400 |
/tickets?status=abc, /contracts?interval=5, /medias?since=quatsch | filtre non applicable | HTTP 400 |
/tickets?date_from=quatsch (il en va de même pour les contrats, les projets, les tâches, les rendez-vous et les crédits) | à partir du 01/01/1970, c'est-à-dire tout | HTTP 400 |
/products?status[]=1, /faqs?status[]=1, /cms?module[]=stripe | pas de filtre : l'intégralité du catalogue, c'est-à-dire toutes les FAQ ou pages | HTTP 400 |
?language=xx | une liste vide par point de terminaison, toutes les langues ou implicitement la langue par défaut | HTTP 400 |
?language[]=de à chaque point de terminaison | HTTP 500 | HTTP 400 |
/orders/{a}:{b}?sort=foo (toutes les formes de chemin) | sort/ «order » toujours ignoré | HTTP 400 INVALID_PAGINATION |
DELETE /seohistorys?type=p&base_id[]=42 (de même que base_id=abc, expired=yes) | a supprimé toutes les entrées de type p | HTTP 400, rien n'a été supprimé |
DELETE /ticket_department/{id}?reassign_to[]=5 | a déplacé les tickets vers le service 1 | HTTP 400, rien n'a été supprimé |
POST/PUT /Import/JSON/…?_strict=1 | mode strict désactivé, l'importation a partiellement écrit | HTTP 400, rien n'a été écrit |
Règles
| Règle | valide | non valide (exemples) |
|---|
| nombre entier | exactement un nombre : 5, -3, 007 | abc, 1.5, 1e3, +5, 7,8,9 |
| ID | nombre entier à partir de 1 | 0, -4 |
| Commutateur | 0, 1 | true, yes, on, 2, 1abc |
| Date | données libres, telles que le point de terminaison les lisait jusqu’à présent (2026-10-01, 01.10.2026, yesterday) | quatsch, 0; depuis la version v2.122.11, toute valeur ne contenant ni lettres ni chiffres (voir « Filtre de date sans contenu ») |
| Heure | Formats fixes : YYYY-MM-DD, YYYY-MM-DD HH:MM[:SS] (séparateur : espace, T ou +), fractions d'heure, fuseau horaire | yesterday, 01.10.2026, 2026-02-31, 2026/10/01 |
| code de langue | (insensible à la casse) ou l'identifiant d'une langue de la boutique, y compris un | code inconnu, 02, 2.0, 99 |
| Quantité | exactement l'une des valeurs mentionnées | tout autre cas |
| Texte | chaque valeur individuelle | uniquement les valeurs de la liste |
| Classe de filtre | le point de terminaison vérifie la valeur lui-même (déjà le cas avec HTTP 400, voir la section correspondante) | Valeurs de la liste (jusqu’à présent parfois ignorées) |
| non appliqué (depuis la v2.122.11) | – | n'importe quelle valeur ; le nom appartient à un autre point de terminaison, le message indique où il s'applique |
L'heure s'applique à last_modified vers /tickets, /projects, /project_tasks et /appointments: jusqu'à présent, la base de données interprétait les formats libres tels que yesterday comme une date nulle, et la réponse n'était pas filtrée. Envoyez les heures sous la forme 2026-10-01 06:00:00.
Paramètres par point d'extrémité
| Point d'extrémité | Paramètres et règle |
|---|
| chaque point d'extrémité | limit, offset, page Défilement · _strict true /false · language Langue · numeric_check 0 /1/true/false/yes/no/on/off · format Texte (n'est pas évalué) |
/orders | status, customer_id, marketplace_id, products_id, categories_id nombre entier · external_id, po_number, products_model, source texte · date_from, date_to, since, last_modified, delivery_country classe de filtre · sort, order tri |
/products | status, tax_class_id, categories_id, products_id, manufacturers_id, ean_prefix, model_prefix, products_model, products_ean, seo_name (depuis la v2.122.11), last_modified Classe de filtres (listes séparées par des virgules) · marketplace, marketplace_status, marketplace_upload_status, marketplace_sync_state Classe de filtres (depuis la v2.122.11) · bonus_free_features, bundles, marketplaces (tous deux depuis la v2.122.11) Commutateur · fields Sélection de champ (depuis la v2.122.11) · sort, order |
/customers | tous les filtres Classe de filtres · sort, order |
/categories | parent_id, status, id nombre entier (id n'a plus d'effet depuis la v2.23.0) · recursive commutateur · seo_string classe de filtre (depuis la v2.122.11) |
/categories/productlist | categories_id, status nombre entier (categories_id uniquement sans ID ni plage dans le chemin, sinon HTTP 400 FILTER_NOT_APPLICABLE, sauf si la valeur est identique à celle de l'ID de chemin unique ; à partir de la v2.122.13) · include_inactive_products commutateur |
/tickets | status, priority, department, customer_id, admin_id, created_by_admin_id, order_id nombre entier · type ticket /job · date_from, date_to date · last_modified heure · ticket_link_id lettres et chiffres uniquement |
/contracts | status, customer_id, product_id nombre entier · interval 1 , 2, 3, 4, 6, 12 · date_from, date_to date · active commutateur |
/projects | status, customer_id, category_id, leader_admin_id nombre entier · is_private, include_tasks commutateur · date_from, date_to date · last_modified heure |
/project_tasks | project_id, status, priority, admin_id, customer_id, category_id, progress_min, progress_max nombre entier · due_from, due_to date · last_modified heure |
/appointments | done, vacation, private, allday, include_deleted commutateur · admin_id nombre entier · ticket_id, customer_id, order_id, project_id, target_id identifiant · target_type orders_id , orders_products_id, ticket_id, customers_id, admin_note_id, project_id · date_from, date_to date · last_modified heure |
/wallet_logs | customer_id, order_id, coupon_id nombre entier · source texte · date_from, date_to date · include_historic commutateur |
/medias | entity_type product, , , , , , , (insensible à la casse) · nombre entier · date products_images category manufacturer static option product_video download entity_id since |
/newsletters | status, language_id nombre entier |
/porters | status, with_columns commutateur · rubric texte |
/ticket_departments | active commutateur |
/products_filters | options_id nombre entier (négatif = filtres intégrés) · categories_id ID |
/products_options | listing_status entier · with_values commutateur · name, name_prefix texte · sort, order |
/products_options_values | option_id nombre entier · orphaned true /1/false/0 · name, name_prefix texte · sort, order |
/seohistorys | type c, , , , , · nombre entier · classe de filtre (depuis la v2.122.11) s m p n o base_id seo_string |
/sliders | status, type, categories_id, content_id nombre entier |
/faqs, /faqcats | status entier |
/cms | status entier · module texte |
/ticket_attachment/{id} | file Nom de fichier sans chemin d'accès |
/order_document/{id} | type Texte (le type de justificatif est vérifié par le point de terminaison lui-même : INVALID_DOCUMENT_TYPE) |
/newsletter_subscribers, /coupons, /customers_baskets, /reviews | tous les filtres Classe de filtres |
/manufacturers, /suppliers, /customer_groups, /tax_classes, /shipping_profiles, /configuration, /newsdesks, /newsdesk_authors, /newsdeskcats, /ticket_attachments, /order_statuses | uniquement les paramètres de chaque point d'extrémité |
- La forme au singulier d’un point de terminaison (
/ticket/{id}, /order/{id} …) est vérifiée selon les mêmes règles que la forme au pluriel. /categories/productlist dispose de ses propres filtres : ?categories_id= et ?include_inactive_products= y fonctionnaient déjà, mais renvoyaient jusqu’à la version v2.122.9 le message « UNKNOWN_FILTER ». À l’inverse, ?parent_id= et ?recursive= renvoient désormais « UNKNOWN_FILTER » (avec « ?_strict=true HTTP 400 »), car ils n’ont jamais fonctionné./categories?id= est sans effet depuis la v2.23.0 ; un nombre valide continue d'être ignoré. Vous pouvez récupérer une seule catégorie via /categories/{id}.
Le format de chemin new:{datum} n'évalue que /customer(s) et /order(s), tant dans l'exportation JSON que dans l'exportation XML. Tout autre point de terminaison d'exportation répond par un code HTTP 400 INVALID_RANGE, et le message indique le filtre de date du point de terminaison, s'il en existe un.
GET /Export/JSON/products/new:2026-10-01
HTTP 400
{
"success": false,
"api_version": "2.122.10",
"error": {
"code": "INVALID_RANGE",
"message": "The new:{date} path form is not supported on /products. It is available on /customer, /customers, /order, /orders only. Filter by date with ?last_modified= instead."
}
}
# stattdessen
GET /Export/JSON/products?last_modified=2026-10-01
| Points de terminaison | Filtres de date à la place de new: |
|---|
/products, /newsletter_subscribers, /tickets, /projects, /project_tasks, /appointments, /coupons | ?last_modified= |
/medias, /customers_baskets, /reviews | ?since= |
/contracts, /wallet_logs | ?date_from= |
Modifié dans la v2.122.10 : jusqu’à la v2.122.9, l’API acceptait new: sur chaque point de terminaison. Selon le point de terminaison, une erreur serveur (HTTP 500, par exemple sur les produits, les fabricants, la consultation individuelle d’une catégorie, les actualités, la FAQ, les pages CMS, les diaporamas et les bons de réduction) ; une sélection par ID plutôt que par date (/tickets/new:2026-10-01 renvoyait les billets de 0 à 2026) ; ou, avec un statut HTTP 200, la liste complète (notamment les abonnés à la newsletter, les projets, les rendez-vous, les médias). Les utilisateurs qui se connectaient à new: sur un autre point de terminaison et traitaient la réponse reçoivent désormais un code HTTP 400 à la place de la liste erronée. Inchangé : new:{datum} pour les clients et les commandes, les identifiants, les sections {a}:{b} et la forme ouverte {a}:.
Dans l’exportation JSON, le segment suivant le point de terminaison (/Export/JSON/{endpunkt}/{segment}) est un ID, une plage, le format de date ou une sous-route. Cela s’applique à chaque point de terminaison d’exportation, y compris aux tickets, aux rendez-vous et aux contrats.
| Segment | Signification |
|---|
{id}: nombre entier comportant au maximum 18 chiffres | Consultation individuelle ou début de plage, selon le point de terminaison comme auparavant |
{a}:{b}, {a}:: les deux limites sont des nombres entiers | Plage ou plage ouverte |
new:{datum} | uniquement pour les clients et les commandes (voir « Forme de chemin new :{datum}») |
productlist à /categories, écrit exactement ainsi | Sous-route /categories/productlist |
| tout le reste | HTTP 400 INVALID_RANGE, le message indique le segment |
GET /Export/JSON/product/42x
HTTP 400
{
"success": false,
"api_version": "2.122.12",
"error": {
"code": "INVALID_RANGE",
"message": "Malformed path segment \"42x\": not an id. Valid: {id}, {int}:{int}, {int}: or new:{date}."
}
}
- Les espaces à la fin d’un identifiant ou à la limite d’une plage ne comptent pas (espace
%20, tabulation %09, saut de ligne %0A/%0D, %00, %0B) : /product/42%20 correspond à l’article 42, tout comme ?customers_id=42%20 désigne le client 42. Un segment composé uniquement d’espaces génère une erreur HTTP 400. Un + dans le chemin d’accès n’est pas un espace. - Un identifiant ou une plage est suivi au maximum de la sous-route :
/categories/{id}/productlist. Tout autre segment ou segment supplémentaire génère un code HTTP 400. Depuis la version v2.122.13, l'identifiant ou la plage précédant le filtre de catégorie est : /categories/5/productlist renvoie la catégorie 5, /categories/5:10/productlist les catégories 5 à 10, /categories/5:/productlist les catégories à partir de 5 (encadré « Modifié dans la v2.122.13 » ci-dessous, détails sous Catégories). - Inchangé : exportation au format XML, CSV et TXT (dans ce cas, un segment sans chiffre correspond au nom d’un modèle, par exemple
/Export/XML/order/{id}/opentrans), importation et suppression. Envoyez également les identifiants sous forme de nombres entiers, sans caractères supplémentaires.
Modifié dans la v2.122.12 : jusqu’à la v2.122.11, un segment qui n’était pas un nombre et ne comportait pas de deux-points était ignoré, et la réponse était la liste paginée sous HTTP 200. Les formes telles que 1e3, 4.2 ou +5 étaient considérées respectivement comme les identifiants 1000, 4 et 5.
| Requête | jusqu’à la version v2.122.11 | à partir de la v2.122.12 |
|---|
/product/42%20, /order/42%20, /customer/%0942 | HTTP 200, la liste | Enregistrement 42 (article sans résultat : HTTP 404) |
/customers/100%20:200, /products/42%20: | HTTP 400 INVALID_RANGE | Plage de 100 à 200 ou à partir de 42 |
/product/42x, /order/42%2B, /product/%20, /product//42 | HTTP 200, la liste | HTTP 400 INVALID_RANGE |
⚠️ /product/1e3, /customer/4.2, /order/+5 | Enregistrement 1 000, 4 ou 5 | HTTP 400 INVALID_RANGE |
⚠️ /product/42.0, /orders/100.0:200.0 (nombre entier sous forme décimale) | Enregistrement 42 ou plage de 100 à 200 | HTTP 400 INVALID_RANGE |
/products/1.5:3, /orders/1:1e3 | plage de 1 à 3 ou de 1 à 1 000 | HTTP 400 INVALID_RANGE |
/orders/ avec 19 chiffres ou plus | une limite au-delà de tout identifiant ; à partir de 309 chiffres, la liste complète | HTTP 400 INVALID_RANGE |
/orders/5%3A10 (codé par deux points) | HTTP 200, la liste | HTTP 400 INVALID_RANGE |
⚠️ /orders/new%3A2026-10-01 (format de date encodé, par exemple avec urlencode()) | HTTP 200, la liste complète au lieu du delta | HTTP 400 INVALID_RANGE: envoyer le deux-points après new sans l'encoder |
⚠️ /contracts/10/20 | Contrats à partir de 10 sans limite maximale | HTTP 400 INVALID_RANGE; la plage est /contracts/10:20 |
/categories/5/Productlist, /product/42/x | catégorie 5 ou article 42, le segment suivant a été ignoré | HTTP 400 INVALID_RANGE |
/products/productlist, /categories/Productlist | HTTP 200, la liste | HTTP 400 INVALID_RANGE |
/categories/5/productlist | sous-route, la 5 est ignorée | inchangée ; depuis la v2.122.13, uniquement la catégorie 5 |
- Quiconque envoie un identifiant comportant des caractères restants et a accepté la liste reçoit désormais un HTTP 400. La liste n’a jamais été la réponse attendue : corrigez l’encodage ou la valeur tronquée dans la connexion.
- ⚠️ Même les connexions qui recevaient jusqu’à présent l’enregistrement souhaité reçoivent désormais un code HTTP 400 (lignes marquées d’un ⚠️). Envoyez l'ID sous forme de nombre entier sans décimales et sans signe, comme indiqué dans les paramètres de requête depuis la version v2.122.10 ; les valeurs issues des tableaux se présentent souvent sous la forme
42.0. - La notification est envoyée après vérification du point de terminaison : un point de terminaison inconnu renvoie toujours un code HTTP 501.
Modification dans la v2.122.13 : jusqu’à la v2.122.12, les requêtes /categories/{id}/productlist, /categories/{a}:{b}/productlist et /categories/{a}:/productlist ignoraient l’ID ou la plage : une réponse HTTP 200 renvoyait les listes de produits de toutes les catégories. Désormais, elles ne renvoient plus que la catégorie mentionnée ou les catégories de la section. ⚠️ ?categories_id= associé à un ID ou à une section dans le chemin d’accès renvoie une erreur HTTP 400 FILTER_NOT_APPLICABLE; seule la même valeur que l’ID du chemin d’accès unique est autorisée (/categories/5/productlist?categories_id=5). Cela interrompt les appels qui fonctionnaient jusqu’à présent : /categories/5/productlist?categories_id=7 et /categories/5:10/productlist?categories_id=5 renvoyaient la catégorie du paramètre jusqu’à la version v2.122.12 ; désormais, ils renvoient une erreur HTTP 400. Envoyez la catégorie soit dans le chemin d’accès, soit en tant que paramètre. Dans les boutiques antérieures à la version 4.9.174, seul le paramètre (/categories/productlist?categories_id={id}) fonctionne ; la forme avec le chemin d'accès renvoie toutes les catégories.
Pour une adresse connue de la boutique (Search Console, ancien plan du site, e-mail client), trois filtres précis permettent d’obtenir la catégorie, l’article ou la destination d’une redirection. Jusqu’à la version v2.122.10, les noms « UNKNOWN_FILTER » étaient indiqués et la liste s’affichait sans filtrage.
| Filtres | Correspond à | Valeur |
|---|
GET /categories?seo_string= | Catégories situées exactement sous ce chemin ; ?language= ne recherche que dans cette langue, sans tenir compte du paramètre dans tous les | chemin, sans hôte et sans lng/xx/, les barres obliques externes n’ont pas d’importance : angelruten/spinnruten |
GET /products?seo_name= | articles avec ce slug (seo_name; s'il est vide, celui formé à partir du nom de l'article), toutes les langues | dernier segment du chemin sans .html; liste séparée par des virgules, 100 valeurs au maximum |
GET /seohistorys?seo_string= | Redirections de cette ancienne adresse ; la destination est indiquée dans sh_item_type et sh_item_id | chemin sans hôte et sans lng/xx/, barres obliques à l’extérieur et .html indifférent ; tel qu’il apparaît dans la barre d’adresse |
- Exact : pas de préfixe ni de modèle, «
% » et « _ » font partie de l'adresse. La casse n'a pas d'importance. - Siplusieurs résultats correspondent, ils sont tous affichés, par exemple deux catégories sous la même adresse ou le même slug sur deux articles. Si deux catégories partagent une adresse, la boutique effectue une sélection sans ordre défini : le premier résultat n’est pas nécessairement la page qui sera affichée.
- Les filtres ne déterminent passi la boutique affiche la page : le statut, le blocage par groupe de clients ou l’affectation à la boutique figurent comme auparavant dans les champs de l’enregistrement.
/categories?seo_string= Cela fonctionne également avec ?parent_id=, ?status= et ?language=, /products?seo_name= avec tous les filtres de produits, ainsi qu’avec ?fields=, /seohistorys?seo_string= avec ?type= et ?base_id=.
Étape par étape, de l'adresse à l'identifiant, avec des exemples : SEO History.
Erreur
| Saisie | Réponse |
|---|
| valeur vide | non défini, comme pour tous les filtres |
uniquement des barres obliques (sur /seohistorys, uniquement .html) | HTTP 400 INVALID_FILTER_VALUE |
uniquement des virgules à ?seo_name= | HTTP 400 INVALID_FILTER_VALUE (« n'a aucune valeur ») |
| Caractères de contrôle ou UTF-8 non valide | HTTP 400 INVALID_FILTER_VALUE; le message contient des caractères illisibles en U+FFFD |
caractère de début lng/xx/ | HTTP 400 INVALID_FILTER_VALUE: le message contient ?language=xx |
plus de 255 caractères ( /seohistorys comptés tels qu’ils ont été envoyés) | HTTP 400 INVALID_FILTER_VALUE |
Valeur de la liste (?seo_string[]=…) | HTTP 400 INVALID_FILTER_VALUE |
à /categories/{id}, /products/{id} ou une plage | HTTP 400 FILTER_NOT_APPLICABLE |
?seo_string= à DELETE /seohistory(s) | HTTP 400 INVALID_FILTER_VALUE (« ne s'applique pas à ce point de terminaison »), rien n'est supprimé |
{
"success": false,
"api_version": "2.122.11",
"error": {
"code": "INVALID_FILTER_VALUE",
"message": "One or more filter values could not be used. No data was returned — see \"details\"."
},
"details": [
{ "param": "seo_string", "message": "Value \"lng/en/fishing-rods/\" starts with the language segment \"lng/en/\". Drop it and pass ?language=en instead." }
]
}
Uniquement pour les requêtes GET : le filtre d'adresse seo_string ne s'applique qu'en lecture. À l’adresse DELETE /seohistory(s), cela génère une erreur au lieu d’être ignoré : DELETE /seohistory(s)?seo_string= renvoie un HTTP 400, rien n’est supprimé. Jusqu’à la version v2.122.10, le nom était ignoré et seules les entrées ?type=/?base_id= étaient supprimées ; avec ?type=p, toutes les entrées de produit étaient donc supprimées. La suppression s’effectue via l’ sh_id de la requête GET.
| Requête | jusqu'à la v2.122.10 | à partir de la v2.122.11 |
|---|
/coupons?type=, (uniquement des virgules et des espaces, par exemple une liste vide) | Filtre non applicable : la liste complète des coupons, y compris les codes de crédit | HTTP 400 INVALID_FILTER_VALUE (« holds no value ») |
nom de paramètre inconnu avec un UTF-8 non valide (?a%C3%28=1), sur chaque point de terminaison d'exportation | HTTP 200 avec corps vide ; avec ?_strict=true HTTP 400 sans corps | Avertissement « UNKNOWN_FILTER » comme pour tout nom inconnu, caractères illisibles tels que « U+FFFD » ; avec « ?_strict=true » HTTP 400 avec corps |
Rejet de la validation de la valeur (INVALID_FILTER_VALUE, INVALID_PAGINATION) en raison d'un UTF-8 non valide dans la valeur | HTTP 400 sans corps | HTTP 400 avec corps, la valeur contenant U+FFFD |
/ticket_attachment/{id}?file= ou DELETE /ticket_attachment/{id}?filename= contenant un UTF-8 non valide | HTTP 404 sans corps | HTTP 404 avec tronc |
- Une valeur composée uniquement de virgules est considérée comme une erreur dans toutes les listes de filtres, et non jamais comme « non définie ». Un élément vide entre les valeurs (
P,,F, P,) est ignoré ; un élément entièrement vide (?type=) signifie « non défini ». La sélection de champ, qui n’est pas un filtre, constitue une exception : ?fields=, ne sélectionne aucune clé et renvoie l’ensemble complet des données. - Seuls le nom ou la valeur répétés dans l’avertissement et le message sont remplacés, jamais un champ de données.
- Les requêtes valides renvoient une réponse inchangée. Réponse vide malgré un code HTTP 200 sur une boutique en ligne plus ancienne : vérifiez d’abord si les noms de paramètres de la requête contiennent des caractères mal codés.
Les filtres de date qui lisent des entrées libres telles que yesterday ou 01.10.2026 ne considéraient jusqu’à présent qu’une valeur provenant d’un signe de ponctuation comme « maintenant ». Le filtre était ainsi activé, mais ne comportait pas de date.
| Requête | jusqu’à la v2.122.10 | à partir de la v2.122.11 |
|---|
/tickets?date_to=,, de même que date_from et /contracts, /projects, /appointments, /wallet_logs; due_from/due_to vers /project_tasks; since vers /medias | « jusqu’à présent » ou « à partir de maintenant » : HTTP 200 avec une sélection dont personne n’avait demandé | HTTP 400 « INVALID_FILTER_VALUE » (« n’a aucune valeur ») |
/products?last_modified=. | uniquement les articles modifiés depuis cet instant, généralement aucun | HTTP 400 |
/coupons?valid_on=, | les bons de réduction valables aujourd’hui | HTTP 400 |
uniquement des espaces vides (?date_from=+, %20, %0D …) au niveau de ces filtres | « à partir de maintenant » ou « jusqu’à maintenant », ou à partir de ou jusqu’au 01/01/1970 (?date_to=%0D: une liste vide) | ne sont pas définies, comme ?date_from= |
une date valide avec un saut de ligne en marge (?date_to=2026-10-01%0D) | filtrée « jusqu’au 01/01/1970 » (une liste vide) | la date est filtrée |
last_modified sur /tickets, /projects, /project_tasks et /appointments, elle ne contient que des espaces | selon la base de données, erreur HTTP 500 ou liste incomplète | non défini |
- « Vide » signifie ici : ni lettre ni chiffre. Les formats libres restent valides et fonctionnent comme auparavant (
yesterday, -1 day, 01.10.2026). - Un «
+ » dans l'adresse correspond à un espace ; pour envoyer un signe « + », utilisez « %2B ». - Message :
Value "," holds no value, only punctuation and white space (no letter or digit). Leave the parameter out (or empty) for no filter. - Les filtres avec des horaires fixes, par exemple
last_modified vers /customers et /orders, rejetaient déjà ce type de valeurs auparavant.
La validation des valeurs évalue chaque valeur de requête sans espace en bordure : espace (y compris dans l’adresse +), tabulation %09, saut de ligne %0A/%0D, %00 et %0B. Depuis la version v2.122.12, le point de terminaison reçoit exactement cette valeur validée, pour les opérations d’exportation, d’importation et de suppression. Une valeur vide ou un simple espace signifie « non défini » pour tout paramètre soumis à une règle fixe (nombre, ID, bouton, valeur de sélection, date, heure, langue, nom de fichier, lettres et chiffres), même dans les cas où le point de terminaison se contentait jusqu’à présent de vérifier si le paramètre existait.
| Requête | jusqu’à la v2.122.11 | à partir de la v2.122.12 |
|---|
?_strict=true%0A avec un filtre ou un champ inconnu | HTTP 200 avec avertissement | HTTP 400 comme avec ?_strict=true |
/tickets?type=%20job | les tickets et les tâches | uniquement les tâches |
/categories?parent_id=5%00, ainsi que status et recursive, ainsi que les filtres numériques et de commutation sur les contrats, les tickets, les projets, les tâches, les rendez-vous et les écritures de crédit | Filtre supprimé | Le filtre s'applique |
/products?bundles=%201, ainsi que marketplaces et bonus_free_features; /porters?with_columns=1%20 | Bloc manquant | Bloc présent |
/products_options_values?orphaned=%20true | toutes les valeurs | uniquement les orphelines |
/porters?status=%20, /products_options?listing_status=%20 | filtrées à 0, c'est-à-dire, pour les porteurs, les inactives | non définies |
%00 devant le chiffre : /porters?status=%001, /products_options?listing_status=%001, /products_options_values?option_id=%005 | interprétées comme 0 : les ports inactifs, statut 0 ou attribut 0 | la valeur envoyée ; pour les ports, les valeurs actives |
/products_options_values?option_id=%20 | les valeurs de la caractéristique 0, c'est-à-dire une liste vide ; avec orphaned=true, code HTTP 400 | non défini : toutes les valeurs ou celles orphelines |
/faqs?language=, de même que /faqcats, /cms et /sliders (ainsi que %20) ; /categories?language=%20 | une liste vide | toutes les langues, comme s’il n’y en avait aucune language |
/categories/productlist?language=%20 | une liste vide | la langue, comme sans language (à partir de la v2.122.13, celle dont la valeur languages_id est la plus petite) |
/medias?entity_type= ou %20 | une liste vide avec une remarque | les images du produit, comme sans entity_type |
/appointments?ticket_id=5&target_type=%20&target_id=7 | filtre de billets supprimé | Le filtre de tickets s'applique |
/products_options?with_values= ou %20 | HTTP 400 | non activé |
GET /seohistorys?type=%20p | Entrées de tous types | uniquement le type p |
/wallet_logs?source=%20 v2.122.13 | jusqu'à la v2.122.12 : filtré sur une source vide, généralement une liste vide | à partir de la v2.122.13 : non défini, toutes les sources |
- Reste inchangé : le texte libre (mots-clés, noms, codes tels que
name ou rubric), les filtres avec vérification de valeur propre (les filtres de produits, de clients et de bons de réduction, ainsi que la date et le pays de livraison pour les commandes ; dans ce cas, la valeur vérifiée était déjà en vigueur), ainsi que le défilement et le tri (limit, offset, page, sort, order). Le point final tronque lui-même le texte libre avant de vérifier s’il contient une valeur : un espace vide signifie également « non défini » à l’adresse /wallet_logs?source= depuis la v2.122.13 (dernière ligne du tableau). Depuis lors, ?source=0 y filtre également, et ce sur une source « 0 » qui n’existe pas : une liste vide. Jusqu’à la v2.122.12, 0 était ignoré en silence (toutes les sources). Dans les boutiques antérieures à la version 4.9.174, omettez ce paramètre si vous ne souhaitez pas filtrer. - Les valeurs non vides sans espace à la fin répondent comme auparavant ; exception depuis la v2.122.13 :
/wallet_logs?source=0 (voir ci-dessus). - Import (
_strict) et Delete (ce qui est désormais supprimé) : voir l’API d’importation et l’API de suppression. - Les boutiques antérieures à la version 4.9.173 continuent de lire la valeur non tronquée : dans ce cas, envoyez des valeurs sans espace à la fin et omettez les paramètres vides (
/faqs?language= renvoie alors une liste vide).