API Delete : supprimer des enregistrements à l'aide de la commande DELETE

DELETE · Contrôles de sécurité

API de suppression

Supprimez des enregistrements en toute sécurité. Grâce à des contrôles de sécurité intégrés, vous évitez toute suppression accidentelle de données dépendantes.

DELETE /xpanel/xoport/Delete/JSON/{entity}/{id}
Attention : à partir de la version 2.70.0, la méthode est imposée : les points de terminaison disponibles à l'adresse Delete/JSON/ n'acceptent que la méthode HTTP DELETE. Toute autre méthode reçoit en réponse de l’interface le code d’état 405 METHOD_NOT_ALLOWED et l’en-tête Allow: DELETE – avant que quoi que ce soit ne se produise. Veuillez vérifier votre connexion : jusqu’à présent, la méthode n’était pas vérifiée ici ; un appel via GET entraînait également la suppression. Si votre programme utilise GET ou POST, veuillez le configurer pour utiliser DELETE.

Points de terminaison disponibles

Point de terminaisonDescriptionPortéeContrôles de sécurité
DELETE /Delete/JSON/product/{id}Supprimer le produitproducts:delete-
DELETE /Delete/JSON/categories/{id}Supprimer une catégoriecategories:deleteSous-catégories, produits
DELETE /Delete/JSON/customer/{id}Supprimer un clientcustomers:deleteCommandes
DELETE /Delete/JSON/manufacturer/{id}Supprimer un fabricantmanufacturers:deleteProduits
DELETE /Delete/JSON/supplier/{id}Supprimer un fournisseursuppliers:deleteProduits
DELETE /Delete/JSON/customer_group/{id}Supprimer un groupe de clientscustomer_groups:deleteGroupe 0 bloqué (403 PROTECTED_GROUP), clients associés (409 HAS_CUSTOMERS)
DELETE /Delete/JSON/newsdesk/{id}Supprimer un article d'actualiténews:delete-
DELETE /Delete/JSON/newsdeskcat/{id}Supprimer une catégorie d'actualitésnewscategories:deleteSous-catégories, articles
DELETE /Delete/JSON/faq/{id}Supprimer la FAQfaq:delete-
DELETE /Delete/JSON/faqcat/{id}Supprimer une catégorie de FAQfaqcategories:deleteSous-catégories, entrées de FAQ
DELETE /Delete/JSON/cms/{id}Supprimer une page CMScms:deletePages système dont l'ID est compris entre 1 et 999 (409 PROTECTED_SYSTEM_PAGE), pages verrouillées (409 CONTENT_LOCKED)
DELETE /Delete/JSON/seohistory/{id}Supprimer l'historique SEOseohistory:deleteSuppression groupée, filtres, éléments expirés
DELETE /Delete/JSON/newsletter_subscriber/{id}Supprimer un abonné à la newsletter newsletter:deleteCascade RGPD, synchronisation des fournisseurs, suppression en masse
DELETE /Delete/JSON/newsletter/{id}Supprimer une campagne de newsletter newsletters:deleteVérification des comptes verrouillés, vérification des envois (409)
DELETE /Delete/JSON/contract/{id}Supprimer un contratcontracts:deleteLot via JSON tronc {"data": [{"contracts_id": …}]}; ⚠️ pas de blocage en cas de factures liées ou en cours (voir Contrôles de sécurité)
DELETE /Delete/JSON/ticket/{id}Supprimer un ticket NOUVEAUtickets:deleteCascade : historique, administrateurs, abonnés, rendez-vous, fichiers
DELETE /Delete/JSON/media/{id}Supprimer une image NOUVEAU v2.16.0media:deleteLot via ?entity_id= (toutes les images d’un produit) ou JSON tronqué {"ids": […]}; s’il s’agissait de l’image principale, le champ image du produit est vidé
DELETE /Delete/JSON/slider/{id}Supprimer un slider NOUVEAU v2.22.0slider:delete-
DELETE /Delete/JSON/project/{id}Supprimer un projet xoCRM NOUVEAU v2.35.0projects:deleteCascade : tâches, descriptions, responsables, clients, catégories, historique des statuts ; les commandes/tickets sont uniquement dissociés
DELETE /Delete/JSON/project_task/{id}Supprimer une tâche de projet NOUVEAU v2.35.0project_tasks:deleteCascade : descriptions, responsables, clients, catégories, historique des statuts (le projet est conservé)
DELETE /Delete/JSON/appointment/{id}Supprimer un rendez-vous (suppression temporaire) NOUVEAU v2.44.0appointments:deleteDéfinit deleted_at (CalDAV-Tombstone) ; les descriptions et les liens sont conservés
DELETE /Delete/JSON/order_status_history/{id}Supprimer l'historique d'une commande NOUVEAU v2.95.0orders:writeLe statut de la commande est mis à jour ; l'entrée la plus ancienne est protégée (409)
DELETE /Delete/JSON/ticket_status_history/{id}Supprimer l'historique d'un ticket NOUVEAU v2.95.0tickets:deleteLe statut du ticket est mis à jour
DELETE /Delete/JSON/ticket_attachment/{tshid}?filename=…Supprimer une pièce jointe d'un ticket NOUVEAU v2.97.0tickets:deleteFichier supprimé uniquement s’il n’y a pas d’autre entrée qui y fait référence
DELETE /Delete/JSON/ticket_department/{id}Supprimer le service associé au ticket NOUVEAU v2.103.0tickets:deleteOccupé : 409 – ?reassign_to={id} ou ?force=1

L'ID figure dans le chemin d'accès (/{entity}/{id}). Sans celui-ci, par exemple avec ?products_id=42, la boutique renvoie une réponse HTTP 400 MISSING_ID et ne supprime rien ; elle ignore alors silencieusement les paramètres de requête inconnus. Sans ID dans le chemin d’accès, seuls les médias, l’historique SEO, les abonnés à la newsletter et les contrats peuvent être supprimés, via des filtres ou un corps JSON. En l’absence de ces deux éléments, une erreur HTTP 400 est renvoyée (NO_TARGETS, MISSING_FILTER ou MISSING_DATA).

Envoyez l’ID sous forme de nombre entier, sans caractère supplémentaire, sans décimales ni signe. La validation stricte du segment de chemin, présente dans l’exportation depuis la version v2.122.12 (voir API d’exportation), ne s’applique pas à la suppression.


Contrôles de sécurité

Certaines ressources ne peuvent pas être supprimées s’il existe des données dépendantes (HTTP 409, rien n’est supprimé) :

Catégories

  • HAS_SUBCATEGORIES: comporte des sous-catégories
  • HAS_PRODUCTS: Contient des produits

Catégories d'actualités

  • HAS_SUBCATEGORIES: Possède des sous-catégories
  • HAS_NEWS: Contient des articles d'actualité

Clients

  • HAS_ORDERS: Comporte des commandes
Contrats sans blocage : « DELETE /Delete/JSON/contract/{id} » et la suppression par lot via JSON-Rumpf suppriment un contrat même si des factures y sont associées ou sont encore en suspens, comme lors de la suppression dans le backend. Les commandes elles-mêmes sont conservées, seul le lien avec le contrat est supprimé. Un prélèvement via un mandat SEPA ne pourra plus concerner ces factures par la suite. Vérifiez les factures avant la suppression : celles qui sont associées figurent à l’adresse orders[] de GET /Export/JSON/contract/{id}, chacune avec son statut de commande orders_status. Pour savoir si un statut est considéré comme « payé », consultez is_paid à l’adresse GET /Export/JSON/order_statuses (Commandes, section « Données de base du statut de commande ») ; la commande elle-même fournit GET /Export/JSON/order/{orders_id}.

Paramètres de requête v2.122.10

Chaque paramètre de requête d’un point de terminaison de suppression est soumis à une règle. Avant que la boutique ne supprime quoi que ce soit, les vérifications suivantes sont effectuées : une valeur invalide ou une valeur de liste (?param[]=…) renvoie un code HTTP 400 INVALID_FILTER_VALUE, details[] renvoie respectivement param et message pour chaque erreur, et rien n’est supprimé.

Point de terminaisonParamètres et règle
chaque point de terminaison « Delete »language une valeur unique (uniquement la règle de liste ; aucun point de terminaison de suppression ne lit la langue)
DELETE /media(s)entity_id nombre entier
DELETE /seohistory(s)type c, , , , ou · nombre entier · commutateur / · Non utilisé s m p n o base_id expired 01 seo_string depuis la v2.122.11: HTTP 400, rien n'est supprimé
DELETE /ticket_attachment/{id}filename Nom de fichier sans chemin d'accès ; s'il manque, retourne une erreur HTTP 400 MISSING_FILENAME, avec chemin d'accès, retourne une erreur HTTP 400 INVALID_FILENAME
DELETE /ticket_department/{id}reassign_to nombre entier à partir de 0 (le service vers lequel les tickets sont transférés) · force 1 /true/yes ou 0/false/no, sans distinction entre majuscules et minuscules
  • Une valeur vide ou un espace seul signifie « non défini ». Depuis la version v2.122.12, les espaces en bordure ne sont plus pris en compte : la suppression s'effectue après la valeur vérifiée. Dans les boutiques antérieures à la version 4.9.173, envoyez des valeurs sans espace à la fin et omettez les paramètres vides. Les valeurs valides sans espace à la fin fonctionnent comme auparavant.
  • Contrairement à l’exportation, le point de terminaison « Delete » ignore les noms de paramètres inconnus.
  • Depuis la version v2.122.11, le filtre d’adresse seo_string ne fonctionne qu’avec la méthode GET. Vous pouvez retrouver les entrées correspondant à une ancienne adresse via GET /Export/JSON/seohistorys?seo_string=… et les supprimer via leur sh_id: DELETE /Delete/JSON/seohistory/{sh_id} ou avec le tronc {"type": "seohistory", "data": [{"sh_id": …}]}. Jusqu’à la v2.122.10, le nom était ignoré, et la suppression s’effectuait uniquement selon type et base_id; avec ?type=p, toutes les entrées de produit étaient donc supprimées.
DELETE /Delete/JSON/seohistorys?type=p&base_id=abc

HTTP 400
{
  "success": false,
  "api_version": "2.122.12",
  "error": {
    "code": "INVALID_FILTER_VALUE",
    "message": "One or more query parameter values could not be used. Nothing was deleted — see \"details\"."
  },
  "details": [
    { "param": "base_id", "message": "Value \"abc\" is not an integer." }
  ]
}
Modification apportée dans la version 2.122.10 : jusqu’à la version 2.122.9, chaque point de terminaison « Delete » lisait ses propres paramètres, et une valeur inutilisable influençait discrètement ce qui était supprimé : DELETE /seohistorys?type=p&base_id[]=42 (ainsi que base_id=abc) supprimait toutes les entrées de type p, tandis que ?type=p&expired=yes supprimait toutes les entrées à l’exception de celles dont la date d’expiration était dépassée ; DELETE /ticket_department/{id}?reassign_to[]=5 a déplacé les tickets vers le service 1, ?reassign_to=5abc vers le service 5. À présent, on obtient une erreur HTTP 400 et rien n’est supprimé.
Modification apportée dans la v2.122.12 : jusqu’à la v2.122.11, la boutique vérifiait les valeurs sans espace à la fin, mais le point de terminaison « Delete » lisait ensuite la valeur non tronquée. Désormais, il supprime la valeur après la partie vérifiée. ⚠️ Elle ne supprime jamais plus que ce que les valeurs validées indiquent, mais elle supprime davantage qu’auparavant : les requêtes qui étaient rejetées jusqu’à la v2.122.11 faute de condition valide sont désormais supprimées (lignes marquées d’un ⚠️).
Requêtejusqu’à la v2.122.11à partir de la v2.122.12
DELETE /seohistorys?type=p&base_id=42%00supprimait toutes les entrées de type puniquement les entrées de l'article 42
DELETE /seohistorys?type=%20p&base_id=42a supprimé les entrées de tous les types associées à l'ID 42uniquement celles de type « p » associées à l'ID 42
DELETE /seohistorys?type=p&expired=1%00la condition a été supprimée : a supprimé toutes les entrées de type puniquement les entrées expirées de type p
⚠️ DELETE /seohistorys?type=%20p sans autre filtreHTTP 400 MISSING_FILTER, rien n'a été supprimésupprime toutes les entrées de type p
⚠️ DELETE /seohistorys?base_id=42%00 ou ?expired=1%00 seulHTTP 400 MISSING_FILTER, rien n'est supprimésupprime toutes les entrées portant l'ID 42 ou toutes celles qui ont expiré
⚠️ DELETE /medias?entity_id=7%00HTTP 400 NO_TARGETS ou uniquement les ID figurant dans le corps du messageen plus, toutes les images de l'article 7: entity_id sélectionne les cibles, cela ne les limite pas
⚠️ DELETE /ticket_department/{id}?reassign_to=%005HTTP 409 DEPARTMENT_IN_USE, pas de transfertBillets déplacés vers la section 5, section supprimée
DELETE /ticket_department/{id}?force=%20truecomme s'il n'y en avait pas forceforce s'applique

Avant la mise à jour, vérifiez si votre connexion envoie des valeurs contenant des espaces, des sauts de ligne ou des %00 en marge, par exemple à partir d’un fichier importé : ces valeurs sont désormais considérées telles qu’elles apparaissent sans ces caractères.

Formats de réponse

Suppression réussie

{
  "success": true,
  "api_version": "2.122.12",
  "type": "newsdesk",
  "deleted_id": 23,
  "details": {
    "newsdesk_id": 23,
    "newsdesk_article_name": "Gelöschter Artikel"
  },
  "timestamp": "2026-10-18 14:00:00"
}

Suppression bloquée

{
  "success": false,
  "api_version": "2.122.12",
  "error": {
    "code": "HAS_SUBCATEGORIES",
    "message": "Cannot delete newsdesk category \"Shopnews\" (ID: 1): Has 3 sub-categories. Delete them first."
  }
}

Attention lors de la suppression !

Les opérations de suppression sont irréversibles. Créez d'abord une exportation à titre de sauvegarde.

Créer une exportation

Importation de données avec l'API xoPort

Les points de terminaison d'importation permettent d'intégrer efficacement des données provenant de systèmes externes. Grâce à une logique « upsert » intelligente, vous n'avez pas à vous soucier de faire la distinction entre les enregistrements nouveaux et ceux qui existent déjà.

Bonnes pratiques

  • Utilisez les importations par lots (50 enregistrements max.) pour de meilleures performances
  • Vérifiez le tableau « errors » dans la réponse pour détecter les enregistrements ayant échoué
  • Mettez en place une logique de réessai pour les erreurs transitoires
  • Validez les données côté client avant l'importation