API d'exportation : récupérer les données de la boutique via une requête GET

GET · Export · Lecture · v2.1.0

API 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

Chemins d'accès RESTful (v2.1.0)

Adressage intuitif des ressources :

/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.

Exportation des catégories

Point de terminaisonDescriptionExemple
GET /categoriesToutes les catégoriesArborescence 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=1Sous-arbre completTous les descendants
GET /categories?status=1Uniquement les actifsFiltrage
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=deUniquement en allemandFiltre par langue
GET /categories/productlistLégère : mise en correspondance catégorie→produit NOUVEAU v2.12.0Par catégorie : ID + modèles
GET /categories/productlist?categories_id={id}Produits d'une catégorie?categories_id=73
Médias NOUVEAU v2.16.0GET /Export/JSON/mediasmedia:read

Autres points de terminaison d'exportation

EntitéTousUniquePortée
Produits Pagination SQL v2.12.0GET /productsGET /product/{id}products:read
ClientsGET /customersGET /customer/{id}customers:read
Paniers NOUVEAU v2.122.10GET /customers_basketsGET /customers_basket/{customers_id}customers:read
FabricantsGET /manufacturersGET /manufacturer/{id}manufacturers:read
CommandesGET /ordersGET /order/{id}orders:read
Statut de la commande NOUVEAU v2.122.10GET /order_statusesGET /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=rgorders:read
ActualitésGET /newsdesksGET /newsdesk/{id}news:read
Catégories d'actualitésGET /newsdeskcatsGET /newsdeskcat/{id}newscategories:read
FAQGET /faqsGET /faq/{id}faq:read
Catégories de FAQGET /faqcatsGET /faqcat/{id}faqcategories:read
Historique SEO
Rechercher l'ancienne adresse : ?seo_string= (v2.122.11)
GET /seohistorysGET /seohistory/{id}seohistory:read
ContratsGET /contractsGET /contract/{id}contracts:read
Abonnés à la newsletterGET /newsletter_subscribersGET /newsletter_subscriber/{id}newsletter:read
Campagnes de newsletterGET /newslettersGET /newsletter/{id}newsletters:read
Tickets CRUD v2.11.0
Avec claim et edit_lock (v2.118.0)
GET /ticketsGET /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=nametickets:read
Curseur NOUVEAU v2.22.0GET /slidersGET /slider/{id}slider:read
Projets (xoCRM) NOUVEAU v2.35.0GET /projectsGET /project/{id}projects:read
Tâches de projet NOUVEAU v2.35.0GET /project_tasksGET /project_task/{id}project_tasks:read
Rendez-vous (xoCRM) NOUVEAU v2.44.0GET /appointmentsGET /appointment/{id}appointments:read
Caractéristiques et valeurs d'option NOUVEAU v2.96.0GET /products_options
GET /products_options_values
GET /products_option/{id}products:read
Profils de délais de livraison NOUVEAU v2.94.0GET /shipping_profilesGET /shipping_profile/{id}products:read
Classes d'imposition NOUVEAU v2.90.0GET /tax_classesGET /tax_class/{id}products:read
Filtres des pages de catégories NOUVEAU v2.100.0GET /products_filtersGET /products_filter/{fid}products:read
Bons d'achat et coupons NOUVEAU v2.102.0GET /couponsGET /coupon/{id}orders:read
Services de billetterie NOUVEAU v2.103.0GET /ticket_departmentsGET /ticket_department/{id}tickets:read
Paramètres NOUVEAU v2.108.0GET /configuration–configuration:read
Importateur CSV/XLS NOUVEAU v2.109.0GET /portersGET /porter/{id}porters:read
Avis NOUVEAU v2.122.6GET /reviewsGET /review/{id}products:read

Avis sur les produits v2.122.6

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ètresFonctionExemple
products_idAvis sur un ou plusieurs articles?products_id=104648,104650
status1 publiés (par défaut), 0 en attente de publication, all les deux?status=all
sincecréé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.

Format de la réponse

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

Pagination v2.10.0

Tous les points de terminaison d'exportation utilisent les mêmes paramètres de requête :

ParamètresPar défautMaxDescription
limit50 ou aucun (voir ci-dessous)250enregistrements par page. Une valeur supérieure est limitée à 250, ce qui entraîne l'affichage de l'avertissement LIMIT_CAPPED
offset0—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 terminaisonsans limitpage 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 chemindéfilement toujours activé, 50 éléments par page ; stats contient toujours limit, offset et has_more50 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 clientjusqu’à 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_more250 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éfilement
  • has_more — true, si d’autres résultats suivent cette page ; uniquement en cas de défilement
  • page — 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.

Filtre de produits v2.65.0

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ètresEffetExemple
statusStatut de l'article?status=1
tax_class_idClasse fiscale?tax_class_id=0,1
categories_idL'article appartient à l'une des catégories suivantes?categories_id=10039,10104
ean_prefixLe code EAN commence par…?ean_prefix=978,979,977
model_prefixLe numéro d'article commence par…?model_prefix=166-
products_model, products_eanle numéro d'article ou l'EAN, exactement?products_model=KB
last_modifiedmodifié 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_nameAdresse 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_stateFiltre 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
fieldsAucun 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.

Bons d'achat et coupons v2.102.0

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ètresEffetExemple
codeCode de coupon, exact (sensible ou non à la casse)?code=SOMMER10
typeP Pourcentage, S livraison gratuite, F montant fixe, G/N crédit ; liste séparée par des virgules?type=P,F
active1 actif, 0 inactif?active=1
kinddiscount ou credit?kind=credit
valid_onuniquement les coupons valables ce jour-là?valid_on=2026-09-13
last_modifiedDelta : 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 ».

Valeurs non valides et valeurs de liste v2.122.10

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êtejusqu'à la v2.122.9à partir de la v2.122.10
/orders?status=abc, ?customer_id=7,8,9, ?status=3,4Pas de filtre : toutes les commandes de tous les clientsHTTP 400 INVALID_FILTER_VALUE
/orders?status=1.5, ?products_id=1e3interprété comme 1 ou 1 000HTTP 400
/tickets?status=abc, /contracts?interval=5, /medias?since=quatschfiltre non applicableHTTP 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 toutHTTP 400
/products?status[]=1, /faqs?status[]=1, /cms?module[]=stripepas de filtre : l'intégralité du catalogue, c'est-à-dire toutes les FAQ ou pagesHTTP 400
?language=xxune liste vide par point de terminaison, toutes les langues ou implicitement la langue par défautHTTP 400
?language[]=de à chaque point de terminaisonHTTP 500HTTP 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 pHTTP 400, rien n'a été supprimé
DELETE /ticket_department/{id}?reassign_to[]=5a déplacé les tickets vers le service 1HTTP 400, rien n'a été supprimé
POST/PUT /Import/JSON/…?_strict=1mode strict désactivé, l'importation a partiellement écritHTTP 400, rien n'a été écrit

Règles

Règlevalidenon valide (exemples)
nombre entierexactement un nombre : 5, -3, 007abc, 1.5, 1e3, +5, 7,8,9
IDnombre entier à partir de 10, -4
Commutateur0, 1true, yes, on, 2, 1abc
Datedonné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 »)
HeureFormats fixes : YYYY-MM-DD, YYYY-MM-DD HH:MM[:SS] (séparateur : espace, T ou +), fractions d'heure, fuseau horaireyesterday, 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 uncode inconnu, 02, 2.0, 99
Quantitéexactement l'une des valeurs mentionnéestout autre cas
Textechaque valeur individuelleuniquement les valeurs de la liste
Classe de filtrele 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é)
/ordersstatus, 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
/productsstatus, 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
/customerstous les filtres Classe de filtres · sort, order
/categoriesparent_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/productlistcategories_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
/ticketsstatus, 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
/contractsstatus, customer_id, product_id nombre entier · interval 1 , 2, 3, 4, 6, 12 · date_from, date_to date · active commutateur
/projectsstatus, customer_id, category_id, leader_admin_id nombre entier · is_private, include_tasks commutateur · date_from, date_to date · last_modified heure
/project_tasksproject_id, status, priority, admin_id, customer_id, category_id, progress_min, progress_max nombre entier · due_from, due_to date · last_modified heure
/appointmentsdone, 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_logscustomer_id, order_id, coupon_id nombre entier · source texte · date_from, date_to date · include_historic commutateur
/mediasentity_type product, , , , , , , (insensible à la casse) · nombre entier · date products_images category manufacturer static option product_video download entity_id since
/newslettersstatus, language_id nombre entier
/portersstatus, with_columns commutateur · rubric texte
/ticket_departmentsactive commutateur
/products_filtersoptions_id nombre entier (négatif = filtres intégrés) · categories_id ID
/products_optionslisting_status entier · with_values commutateur · name, name_prefix texte · sort, order
/products_options_valuesoption_id nombre entier · orphaned true /1/false/0 · name, name_prefix texte · sort, order
/seohistorystype c, , , , , · nombre entier · classe de filtre (depuis la v2.122.11) s m p n o base_id seo_string
/slidersstatus, type, categories_id, content_id nombre entier
/faqs, /faqcatsstatus entier
/cmsstatus 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, /reviewstous les filtres Classe de filtres
/manufacturers, /suppliers, /customer_groups, /tax_classes, /shipping_profiles, /configuration, /newsdesks, /newsdesk_authors, /newsdeskcats, /ticket_attachments, /order_statusesuniquement 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}.

Format de chemin new:{datum} v2.122.10

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 terminaisonFiltres 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}:.

Segment de chemin : ID, plage ou sous-route v2.122.12

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.

SegmentSignification
{id}: nombre entier comportant au maximum 18 chiffresConsultation individuelle ou début de plage, selon le point de terminaison comme auparavant
{a}:{b}, {a}:: les deux limites sont des nombres entiersPlage ou plage ouverte
new:{datum}uniquement pour les clients et les commandes (voir « Forme de chemin new :{datum}»)
productlist à /categories, écrit exactement ainsiSous-route /categories/productlist
tout le resteHTTP 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êtejusqu’à la version v2.122.11à partir de la v2.122.12
/product/42%20, /order/42%20, /customer/%0942HTTP 200, la listeEnregistrement 42 (article sans résultat : HTTP 404)
/customers/100%20:200, /products/42%20:HTTP 400 INVALID_RANGEPlage de 100 à 200 ou à partir de 42
/product/42x, /order/42%2B, /product/%20, /product//42HTTP 200, la listeHTTP 400 INVALID_RANGE
⚠️ /product/1e3, /customer/4.2, /order/+5Enregistrement 1 000, 4 ou 5HTTP 400 INVALID_RANGE
⚠️ /product/42.0, /orders/100.0:200.0 (nombre entier sous forme décimale)Enregistrement 42 ou plage de 100 à 200HTTP 400 INVALID_RANGE
/products/1.5:3, /orders/1:1e3plage de 1 à 3 ou de 1 à 1 000HTTP 400 INVALID_RANGE
/orders/ avec 19 chiffres ou plusune limite au-delà de tout identifiant ; à partir de 309 chiffres, la liste complèteHTTP 400 INVALID_RANGE
/orders/5%3A10 (codé par deux points)HTTP 200, la listeHTTP 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 deltaHTTP 400 INVALID_RANGE: envoyer le deux-points après new sans l'encoder
⚠️ /contracts/10/20Contrats à partir de 10 sans limite maximaleHTTP 400 INVALID_RANGE; la plage est /contracts/10:20
/categories/5/Productlist, /product/42/xcatégorie 5 ou article 42, le segment suivant a été ignoréHTTP 400 INVALID_RANGE
/products/productlist, /categories/ProductlistHTTP 200, la listeHTTP 400 INVALID_RANGE
/categories/5/productlistsous-route, la 5 est ignoréeinchangé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.

Adresse de la boutique → ID v2.122.11

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.

FiltresCorrespond à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 leschemin, 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 languesdernier 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_idchemin 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

SaisieRéponse
valeur videnon 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 valideHTTP 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 plageHTTP 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.

Uniquement les séparateurs, UTF-8 non valide v2.122.11

Requêtejusqu'à 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éditHTTP 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'exportationHTTP 200 avec corps vide ; avec ?_strict=true HTTP 400 sans corpsAvertissement « 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 valeurHTTP 400 sans corpsHTTP 400 avec corps, la valeur contenant U+FFFD
/ticket_attachment/{id}?file= ou DELETE /ticket_attachment/{id}?filename= contenant un UTF-8 non valideHTTP 404 sans corpsHTTP 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.

Filtre de date sans contenu v2.122.11

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êtejusqu’à 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 aucunHTTP 400
/coupons?valid_on=,les bons de réduction valables aujourd’huiHTTP 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 espacesselon la base de données, erreur HTTP 500 ou liste incomplètenon 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.

Espace en bordure : la valeur vérifiée est v2.122.12

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êtejusqu’à la v2.122.11à partir de la v2.122.12
?_strict=true%0A avec un filtre ou un champ inconnuHTTP 200 avec avertissementHTTP 400 comme avec ?_strict=true
/tickets?type=%20jobles tickets et les tâchesuniquement 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éditFiltre suppriméLe filtre s'applique
/products?bundles=%201, ainsi que marketplaces et bonus_free_features; /porters?with_columns=1%20Bloc manquantBloc présent
/products_options_values?orphaned=%20truetoutes les valeursuniquement les orphelines
/porters?status=%20, /products_options?listing_status=%20filtrées à 0, c'est-à-dire, pour les porteurs, les inactivesnon définies
%00 devant le chiffre : /porters?status=%001, /products_options?listing_status=%001, /products_options_values?option_id=%005interprétées comme 0 : les ports inactifs, statut 0 ou attribut 0la valeur envoyée ; pour les ports, les valeurs actives
/products_options_values?option_id=%20les valeurs de la caractéristique 0, c'est-à-dire une liste vide ; avec orphaned=true, code HTTP 400non défini : toutes les valeurs ou celles orphelines
/faqs?language=, de même que /faqcats, /cms et /sliders (ainsi que %20) ; /categories?language=%20une liste videtoutes les langues, comme s’il n’y en avait aucune language
/categories/productlist?language=%20une liste videla langue, comme sans language (à partir de la v2.122.13, celle dont la valeur languages_id est la plus petite)
/medias?entity_type= ou %20une liste vide avec une remarqueles images du produit, comme sans entity_type
/appointments?ticket_id=5&target_type=%20&target_id=7filtre de billets suppriméLe filtre de tickets s'applique
/products_options?with_values= ou %20HTTP 400non activé
GET /seohistorys?type=%20pEntrées de tous typesuniquement le type p
/wallet_logs?source=%20 v2.122.13jusqu'à 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).

Authentification sécurisée via l'API

L'API xoPort utilise un concept de sécurité à plusieurs niveaux qui prend en charge aussi bien des méthodes d'authentification simples que hautement sécurisées. De la liste blanche basée sur les adresses IP pour les serveurs internes aux clés API à portée limitée pour les intégrations de tiers.

Bonnes pratiques

  • Utilisez une clé API distincte pour chaque intégration
  • Limitez les périmètres d'accès au strict minimum (principe du moindre privilège)
  • Définissez des dates d'expiration pour les intégrations temporaires
  • Surveillez régulièrement les journaux d'utilisation
  • Renouvelez périodiquement les clés API