v2 — Last deployment: October 29, 2026
Apps — bannerMedia
GET appsGET apps/{slug}
When bannerMedia is set, the block containing the first image is removed from description and contentSections, even when its image differs from the banner. Applied on every sync; WordPress content is preserved. Without a banner, content is unchanged. Resync apps and replace local content. V1 unchanged.
WordPress-only documents
GET productsGET products/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}
Documents with the api-hidden class are excluded during V2 synchronization. They remain available in WordPress. No JSON fields are added. After deployment, synchronize again and replace local documents arrays. V1 is unchanged.
Complete app excerpts
GET appsGET apps/{slug}
App excerpts (subtitle) are no longer limited to 255 characters. The field remains plain text without HTML. Compatible with the existing contract; resync apps to retrieve full text. V1 unchanged.
Videos in app content
GET appsGET apps/{slug}
ACF video shortcodes now render a YouTube or Vimeo HTML player in place in description and contentSections. The videos array is unchanged. api-hidden rows remain excluded. After release, resync content and allow these player iframes in client rendering. V1 unchanged.
WordPress-only content
GET appsGET apps/{slug}GET servicesGET services/{slug}GET solutionsGET solutions/{slug}GET productsGET products/{slug}GET categoriesGET categories/{slug}
HTML or WPBakery elements with the api-hidden class and their descendants are excluded from V2 catalog descriptions and structured sections. WordPress content is unchanged. No new JSON fields; run a full synchronization to remove this content from local copies. V1 unchanged.
Product pricing removed
GET productsGET products/{slug}GET apps/{slug}GET solutions/{slug}GET services/{slug}
The price field is removed from products (previously an amount/currency object or null), including related products. The price filter is removed and selections are ignored. Breaking V2 change: remove price reads, displays and filters; perform a full synchronization to clear previously stored prices. V1 unchanged.
Optional second button
GET page/{slug}
Optional second navigation-card button in data.content HTML: independent label and URL, both required. Class api-sync-button--secondary. Compatible with existing cards, no new JSON field; adjust styling if needed.
Product series
GET productsGET products/{slug}
Compatible addition of series to product lists and details: { label, slug, order }, or null when no series is associated. Label and slug follow the product language. series.order is the product position within its series, separate from its general order; it is null when unspecified. Existing fields are unchanged. No client migration required; handle null before using the series.
Links to recreated pages
GET menusGET menu/{slug}
A menu entry pointing to an active page remains visible when that page was recreated with the same slug as a deleted page. Deleted or unauthorized destinations remain hidden. Compatible fix, with or without the lang parameter, with no JSON format change.
Category banner source
GET categoriesGET categories/{slug}
bannerImage now uses “Bannière Sheet Category” (banner-sheet-category) instead of “Bannière Product Sheet” (category_image). No fallback to the old field: a missing value or invalid image returns null. The JSON name and format remain unchanged in lists, details and child categories; primaryMedia remains independent. Populate the new field before the next synchronization to retain an existing banner.
Collection slugs in menus
GET menu/{slug}
Menu targets of type collection now include slug, equal to collection (apps, solutions or services). Available with or without lang, in items[].target or language-grouped entries. Backward-compatible v2 addition; other target types are unchanged.
Link images
GET apps/{slug}
Each links entry now includes media: a media object with the same format as primaryMedia, or null when no valid image is associated with the link. Images and metadata come from the requested language record, without language fallback. Existing fields are preserved; backward-compatible addition in v2 only. App lists are unchanged.
Page featured images
GET pagesGET page/{slug}
The WordPress featured image is exposed as bannerMedia in page lists and details, using the catalog media format. null when no valid image is configured. No primaryMedia attribute is added to pages. Metadata comes from the image assigned to the page in the requested language, without cross-language fallback. Compatible addition in v2 only.
Category header images
GET categoriesGET categories/{slug}
Categories expose bannerImage, a media object with the same shape as primaryMedia, from the header’s “Category image” field. Available in lists, details and child categories; null when no valid image is configured. The primaryMedia thumbnail remains independent. No fallback to another language. Backward-compatible addition in v2 only.
Migrating from v1 to v2 — consumer impact
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}
For a consumer querying the API directly, using a licence with the required groups and accepting additional JSON fields, the main change is replacing /api/ with /api/v2/. Example: /api/products?lang=fr becomes /api/v2/products?lang=fr.
**Unchanged:** the licence token, authentication (Authorization: Bearer or x-api-token), language parameters, filters, pagination and existing fields. Using the new groups, groupsByLanguage and bannerMedia fields is optional; clients rejecting unknown JSON properties must update their schema.
**Accessible content:** v2 applies the groups allowed for the licence. Existing licences received all groups available at migration; later groups are not granted automatically. Without an allowed group, lists are empty and details return 404. Legacy technical tokens without a licence with groups do not grant access to the v2 catalogue.
**Locally stored catalogue:** start with a full v2 synchronization without reusing v1 delta or syncUntil parameters. Replace the local catalogue with the complete authorized result, then use the new v2 syncUntil for subsequent synchronizations. A 410 response requires a new full synchronization, including after licence group changes. This step does not apply to direct API consumers without a local copy.
V1 remains available at /api/*; no automatic migration or redirect is imposed.
Groups in responses
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}
List and detail resources now include groups, the full list of assigned syndication group slugs (for example ["standard", "BSD"]). [] means ungrouped content. These are content groups, not token permissions; filtering is unchanged. Identified structured references are also enriched. Menus requested without lang expose groupsByLanguage, preserving data. Delta tombstones are unchanged. Additive v2-only change; perform a full read to enrich previously stored data.
Group-based access
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}
V2 content is now filtered by the groups allowed for the token. Content in several groups is accessible when at least one matches. Ungrouped content remains available to tokens with at least one valid group. Tokens without groups return no content: empty lists and 404 for details.
Existing licenses will receive all groups available at migration, without automatically receiving future groups. Select groups when creating or editing a license in the dashboard. A new license without a selection has no v2 access.
Filtering also covers related content, menus, counts, facets and pagination. Generated catalog links use v2 routes. When content leaves the allowed groups, incremental synchronization reports a deletion.
Run a full synchronization for this change and after editing a license’s groups, replacing previous local data. An incompatible incremental request returns 410 and requires a new full synchronization. V1 remains unchanged.
Added bannerMedia
GET productsGET products/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}GET appsGET apps/{slug}
The bannerMedia field is available in product, solution, service and app lists and details by slug. It contains the banner image in the same format as primaryMedia, or null if no banner is defined for the requested language.