v2 — Dernier déploiement : 29 octobre 2026
Apps — bannerMedia
GET appsGET apps/{slug}
Quand bannerMedia est défini, le bloc contenant la première image est retiré de description et contentSections, même si cette image diffère de la bannière. Traitement appliqué à chaque synchronisation ; contenu WordPress conservé. Sans bannière, contenu inchangé. Resynchroniser les applications et remplacer le contenu local. V1 inchangée.
Documents réservés à WordPress
GET productsGET products/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}
Les documents portant la classe api-hidden sont exclus lors de la synchronisation V2. Ils restent disponibles dans WordPress. Aucun champ JSON ajouté. Après déploiement, resynchroniser les données et remplacer les tableaux documents locaux. V1 inchangée.
Extraits complets des applications
GET appsGET apps/{slug}
Les extraits des applications (subtitle) ne sont plus limités à 255 caractères. Le champ conserve son format texte sans HTML. Compatible avec le contrat existant ; resynchroniser les applications pour récupérer les textes complets. V1 inchangée.
Vidéos dans le contenu des applications
GET appsGET apps/{slug}
Les shortcodes ACF vidéos sont désormais remplacés à leur emplacement par un lecteur HTML YouTube ou Vimeo dans description et contentSections. Le tableau videos reste inchangé. Les rangées api-hidden restent exclues. Après publication, resynchroniser les contenus et autoriser les iframes de ces lecteurs dans le rendu client. V1 inchangée.
Contenus réservés à WordPress
GET appsGET apps/{slug}GET servicesGET services/{slug}GET solutionsGET solutions/{slug}GET productsGET products/{slug}GET categoriesGET categories/{slug}
Les éléments HTML ou WPBakery portant la classe api-hidden, ainsi que leurs descendants, sont exclus des descriptions et des sections structurées du catalogue V2. Le contenu WordPress reste inchangé. Aucun champ JSON ajouté ; effectuer une synchronisation complète pour retirer ces contenus des copies locales. V1 inchangée.
Suppression des prix produits
GET productsGET products/{slug}GET apps/{slug}GET solutions/{slug}GET services/{slug}
Le champ price est supprimé des produits (auparavant objet montant/devise ou null), y compris des produits associés. Le filtre price disparaît et toute sélection de ce filtre est ignorée. Rupture de contrat V2 : retirer les lectures de price, les affichages de prix et le filtre correspondant ; effectuer une synchronisation complète pour purger les prix déjà stockés. V1 inchangée.
Second bouton facultatif
GET page/{slug}
Second bouton facultatif dans le HTML data.content des cartes de navigation : libellé et lien indépendants, tous deux requis. Classe api-sync-button--secondary. Compatible avec les cartes existantes, sans nouveau champ JSON ; adapter le style si nécessaire.
Série du produit
GET productsGET products/{slug}
Ajout compatible du champ series dans les listes et détails produits : { label, slug, order }, ou null sans série. Le libellé et le slug suivent la langue du produit. series.order est la position du produit dans sa série, distincte de l’ordre général ; il vaut null s’il n’est pas renseigné. Aucun champ existant ne change. Aucun changement requis côté client ; gérer la valeur null avant d’utiliser la série.
Liens vers les pages recréées
GET menusGET menu/{slug}
Une entrée de menu vers une page active reste visible lorsque cette page a été recréée avec le même slug qu’une ancienne page supprimée. Les destinations supprimées ou non autorisées restent masquées. Correction compatible, avec ou sans paramètre lang, sans changement de format JSON.
Source de la bannière de catégorie
GET categoriesGET categories/{slug}
Le champ bannerImage utilise désormais « Bannière Sheet Category » (banner-sheet-category) au lieu de « Bannière Product Sheet » (category_image). Aucun repli vers l’ancien champ : une valeur absente ou une image invalide donne null. Le nom et le format JSON restent identiques dans les listes, détails et catégories enfants ; primaryMedia reste indépendant. Pour conserver une bannière existante, renseigner le nouveau champ avant la prochaine synchronisation.
Slug des collections dans les menus
GET menu/{slug}
Les cibles de menu de type collection incluent désormais slug, avec la même valeur que collection (apps, solutions ou services). Disponible avec ou sans paramètre lang, dans items[].target ou les entrées regroupées par langue. Ajout compatible en v2 ; les autres types de cible restent inchangés.
Image associée aux liens
GET apps/{slug}
Chaque entrée de links expose désormais media : un objet média au même format que primaryMedia, ou null si aucune image valide n’est associée au lien. L’image et ses métadonnées proviennent de la fiche de la langue demandée, sans repli vers une autre langue. Les champs existants sont conservés ; ajout compatible en v2 uniquement. Les listes d’applications restent inchangées.
Image mise en avant des pages
GET pagesGET page/{slug}
L’image mise en avant WordPress est exposée sous bannerMedia dans les listes et détails des pages, avec le même format média que le catalogue. null si aucune image valide n’est renseignée. Aucun attribut primaryMedia n’est ajouté aux pages. Les métadonnées proviennent du média de la langue concernée, sans repli vers une autre langue. Ajout compatible en v2 uniquement.
Images de bandeau des catégories
GET categoriesGET categories/{slug}
Les catégories exposent bannerImage, un objet média au même format que primaryMedia, issu du champ « Category image » du bandeau header. Présent dans les listes, détails et catégories enfants ; null si aucune image valide n’est renseignée. La vignette primaryMedia reste indépendante. Aucun repli vers une autre langue. Ajout compatible, uniquement en v2.
Migration de v1 vers v2 — impacts pour les consommateurs
GET productsGET products/{slug}GET categoriesGET categories/{slug}GET appsGET apps/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}GET pagesGET page/{slug}GET menusGET menu/{slug}
Pour un consommateur qui interroge directement l’API, utilise une licence autorisée sur les groupes souhaités et accepte les champs JSON supplémentaires, l’adaptation consiste principalement à remplacer le préfixe /api/ par /api/v2/. Exemple : /api/products?lang=fr devient /api/v2/products?lang=fr.
**Ce qui reste identique :** le token de licence, l’authentification (Authorization: Bearer ou x-api-token), les paramètres de langue, les filtres, la pagination et les champs existants. Il n’est pas nécessaire d’exploiter les nouveaux champs groups, groupsByLanguage et bannerMedia ; les clients qui refusent les propriétés JSON inconnues doivent toutefois adapter leur schéma.
**Contenus accessibles :** la v2 applique les groupes autorisés pour la licence. Les licences existantes ont reçu tous les groupes disponibles lors de la migration ; les groupes créés ensuite ne sont pas accordés automatiquement. Sans groupe autorisé, les listes sont vides et les détails répondent 404. Les anciens tokens techniques non rattachés à une licence avec groupes ne donnent pas accès au catalogue v2.
**Catalogue stocké localement :** effectuer une première synchronisation complète en v2, sans reprendre les paramètres delta ou syncUntil de la v1. Remplacer le catalogue local par le résultat complet autorisé, puis utiliser le nouveau syncUntil v2 pour les synchronisations suivantes. Une réponse 410 impose de recommencer une synchronisation complète, notamment après modification des groupes de la licence. Cette étape ne concerne pas les consommateurs qui consultent l’API directement sans copie locale.
La v1 reste disponible sur /api/* ; aucune migration ni redirection automatique n’est imposée.
Groupes dans les réponses
GET productsGET products/{slug}GET categoriesGET categories/{slug}GET appsGET apps/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}GET pagesGET page/{slug}GET menusGET menu/{slug}
Chaque ressource des listes et détails contient désormais groups, la liste complète des slugs des groupes de syndication affectés au contenu (exemple : ["standard", "BSD"]). [] indique un contenu sans groupe. Cette liste décrit le contenu, pas les droits du token ; le filtrage reste inchangé. Les références structurées identifiées sont également enrichies. Pour un menu sans paramètre lang, groupsByLanguage fournit les groupes du menu par langue, sans modifier data. Les suppressions différentielles restent inchangées. Ajout compatible en v2 uniquement ; effectuer une lecture complète pour enrichir les données déjà stockées.
Accès par groupes
GET productsGET products/{slug}GET categoriesGET categories/{slug}GET appsGET apps/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}GET pagesGET page/{slug}GET menusGET menu/{slug}
Les contenus v2 sont désormais filtrés selon les groupes autorisés pour le token. Un contenu appartenant à plusieurs groupes est accessible dès qu’un groupe correspond. Les contenus sans groupe restent accessibles aux tokens possédant au moins un groupe valide. Un token sans groupe ne retourne aucun contenu : listes vides et détails en 404.
Les licences existantes recevront tous les groupes disponibles lors de la migration, sans ajout automatique des futurs groupes. Les groupes se sélectionnent à la création ou à l’édition d’une licence dans le dashboard. Une nouvelle licence sans sélection n’a aucun accès v2.
Le filtrage s’applique également aux contenus liés, aux menus, aux compteurs, aux facettes et à la pagination. Les liens générés vers le catalogue utilisent les routes v2. Lorsqu’un contenu quitte les groupes autorisés, la synchronisation différentielle transmet une suppression.
Effectuez une synchronisation complète lors de cette évolution et après modification des groupes d’une licence, en remplaçant les données locales précédentes. Une requête différentielle devenue incompatible retourne 410 et nécessite une nouvelle synchronisation complète. La v1 reste inchangée.
Ajout de bannerMedia
GET productsGET products/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}GET appsGET apps/{slug}
Le champ bannerMedia est disponible dans les listes et les détails par slug des produits, solutions, services et applications. Il contient l’image de bannière au même format que primaryMedia, ou null si aucune bannière n’est définie pour la langue demandée.