v2 — Último despliegue: 29 de octubre de 2026
Apps — bannerMedia
GET appsGET apps/{slug}
Si bannerMedia está definido, se elimina el bloque de la primera imagen de description y contentSections, aunque sea distinta del banner. Se aplica en cada sincronización; se conserva el contenido WordPress. Sin banner no cambia el contenido. Resincronizar las apps y reemplazar el contenido local. V1 sin cambios.
Documentos exclusivos de WordPress
GET productsGET products/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}
Los documentos con la clase api-hidden se excluyen durante la sincronización V2. Siguen disponibles en WordPress. No se añaden campos JSON. Tras el despliegue, sincronizar de nuevo y sustituir los arrays locales documents. V1 no cambia.
Extractos completos de aplicaciones
GET appsGET apps/{slug}
Los extractos (subtitle) ya no están limitados a 255 caracteres. El campo sigue siendo texto sin HTML. Compatible con el contrato existente; resincronizar las aplicaciones para obtener los textos completos. V1 sin cambios.
Vídeos en el contenido de aplicaciones
GET appsGET apps/{slug}
Los shortcodes de vídeo ACF se convierten en reproductores HTML de YouTube o Vimeo en su posición dentro de description y contentSections. El array videos no cambia. Las filas api-hidden siguen excluidas. Tras la publicación, resincronizar el contenido y permitir estos iframes en el cliente. V1 sin cambios.
Contenido exclusivo de WordPress
GET appsGET apps/{slug}GET servicesGET services/{slug}GET solutionsGET solutions/{slug}GET productsGET products/{slug}GET categoriesGET categories/{slug}
Los elementos HTML o WPBakery con clase api-hidden y sus descendientes se excluyen de las descripciones y secciones estructuradas del catálogo V2. WordPress no cambia. Sin nuevos campos JSON; realizar una sincronización completa para eliminar estos contenidos de las copias locales. V1 sin cambios.
Eliminación de precios
GET productsGET products/{slug}GET apps/{slug}GET solutions/{slug}GET services/{slug}
Se elimina price (antes objeto importe/moneda o null) de los productos, incluidos los relacionados. Se elimina el filtro price y se ignoran sus selecciones. Cambio incompatible V2: retirar lecturas, visualizaciones y filtros de precios; realizar una sincronización completa para eliminar precios almacenados. V1 sin cambios.
Segundo botón opcional
GET page/{slug}
Segundo botón en las tarjetas HTML data.content: etiqueta y URL independientes, ambas necesarias. Clase api-sync-button--secondary. Compatible con las tarjetas existentes, sin nuevos campos JSON; adaptar el estilo si es necesario.
Serie del producto
GET productsGET products/{slug}
Se añade de forma compatible series a las listas y detalles de productos: { label, slug, order }, o null sin serie. La etiqueta y el slug siguen el idioma del producto. series.order es la posición del producto en su serie, distinta del orden general; es null si no está definida. Los campos existentes no cambian. No requiere migración; gestionar null antes de utilizar la serie.
Enlaces a páginas recreadas
GET menusGET menu/{slug}
Una entrada de menú hacia una página activa permanece visible cuando se ha recreado con el mismo slug de una página eliminada. Los destinos eliminados o no autorizados siguen ocultos. Corrección compatible con o sin lang, sin cambios en el formato JSON.
Origen del banner de categoría
GET categoriesGET categories/{slug}
bannerImage utiliza ahora « Bannière Sheet Category » (banner-sheet-category) en lugar de « Bannière Product Sheet » (category_image). No se utiliza el campo anterior como alternativa: un valor ausente o una imagen no válida devuelve null. El nombre y formato JSON no cambian en listas, detalles y subcategorías; primaryMedia sigue siendo independiente. Completar el nuevo campo antes de la próxima sincronización para conservar un banner existente.
Slugs de colecciones en los menús
GET menu/{slug}
Los destinos de menú de tipo collection incluyen slug, con el mismo valor que collection (apps, solutions o services). Disponible con o sin lang, en items[].target o las entradas agrupadas por idioma. Adición compatible en v2; los demás tipos no cambian.
Imágenes de los enlaces
GET apps/{slug}
Cada entrada de links incluye media: un objeto multimedia con el mismo formato que primaryMedia, o null si el enlace no tiene una imagen válida. La imagen y sus metadatos proceden de la ficha del idioma solicitado, sin recurrir a otro idioma. Se conservan los campos existentes; incorporación compatible solo en v2. Las listas de aplicaciones no cambian.
Imagen destacada de las páginas
GET pagesGET page/{slug}
La imagen destacada de WordPress se devuelve como bannerMedia en listas y detalles de páginas, con el formato multimedia del catálogo. null si no hay una imagen válida. No se añade primaryMedia a las páginas. Los metadatos proceden de la imagen asignada a la página en el idioma solicitado, sin recurrir a otro idioma. Incorporación compatible solo en v2.
Imágenes de cabecera de categorías
GET categoriesGET categories/{slug}
Las categorías incluyen bannerImage, un objeto multimedia con el mismo formato que primaryMedia, obtenido del campo «Category image» de la cabecera. Disponible en listas, detalles y categorías hijas; null si no hay una imagen válida. La miniatura primaryMedia sigue siendo independiente. Sin recurrir a otro idioma. Incorporación compatible solo en v2.
Migración de v1 a v2 — impacto para los consumidores
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}
Para consultar directamente la API con una licencia autorizada para los grupos necesarios y aceptar campos JSON adicionales, el cambio principal es sustituir /api/ por /api/v2/. Ejemplo: /api/products?lang=fr pasa a /api/v2/products?lang=fr.
**Sin cambios:** token de licencia, autenticación (Authorization: Bearer o x-api-token), idioma, filtros, paginación y campos existentes. Usar groups, groupsByLanguage y bannerMedia es opcional; los clientes que rechazan propiedades JSON desconocidas deben adaptar su esquema.
**Contenido accesible:** v2 aplica los grupos autorizados de la licencia. Las licencias existentes recibieron todos los grupos disponibles al migrar; los nuevos no se conceden automáticamente. Sin grupos autorizados, las listas están vacías y los detalles devuelven 404. Los antiguos tokens técnicos sin licencia con grupos no permiten acceder al catálogo v2.
**Catálogo local:** iniciar una sincronización completa en v2 sin reutilizar delta ni syncUntil de v1. Sustituir el catálogo local por el resultado completo autorizado y usar el nuevo syncUntil v2 en las siguientes sincronizaciones. Una respuesta 410 exige una nueva sincronización completa, en particular tras modificar los grupos de la licencia. No se aplica a consultas directas sin copia local.
V1 sigue disponible en /api/*; no se impone ninguna migración ni redirección automática.
Grupos en las respuestas
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}
Las listas y los detalles incluyen groups, todos los slugs de los grupos asignados (ejemplo: ["standard", "BSD"]). [] indica contenido sin grupo. Son grupos del contenido, no permisos del token; el filtrado no cambia. También se enriquecen las referencias estructuradas identificadas. Los menús sin lang exponen groupsByLanguage, conservando data. Las eliminaciones delta no cambian. Adición compatible solo en v2; realizar una lectura completa para actualizar los datos guardados.
Acceso por grupos
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}
Los contenidos v2 se filtran según los grupos autorizados para el token. Si un contenido pertenece a varios grupos, basta con que coincida uno. Los contenidos sin grupo siguen disponibles para tokens con al menos un grupo válido. Un token sin grupos no devuelve contenido: listas vacías y detalles con estado 404.
Las licencias existentes recibirán todos los grupos disponibles durante la migración, sin incorporar automáticamente grupos futuros. Los grupos se seleccionan al crear o editar una licencia en el dashboard. Una licencia nueva sin selección no tiene acceso a v2.
El filtrado también incluye contenidos relacionados, menús, contadores, facetas y paginación. Los enlaces generados hacia el catálogo utilizan rutas v2. Si un contenido deja de pertenecer a los grupos autorizados, la sincronización incremental comunica una eliminación.
Realice una sincronización completa para este cambio y tras modificar los grupos de una licencia, sustituyendo los datos locales anteriores. Una solicitud incremental incompatible devuelve 410 y requiere una nueva sincronización completa. La v1 no cambia.
Incorporación de bannerMedia
GET productsGET products/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}GET appsGET apps/{slug}
El campo bannerMedia está disponible en los listados y en los detalles por slug de productos, soluciones, servicios y aplicaciones. Contiene la imagen del banner con el mismo formato que primaryMedia, o null si no hay ningún banner definido para el idioma solicitado.