v2 — Última implantação: 29 de outubro de 2026
Apps — bannerMedia
GET appsGET apps/{slug}
Quando bannerMedia está definido, o bloco da primeira imagem é removido de description e contentSections, mesmo que seja diferente do banner. Aplicado em cada sincronização; o conteúdo WordPress é preservado. Sem banner, o conteúdo não muda. Ressincronizar as apps e substituir o conteúdo local. V1 inalterada.
Documentos exclusivos do WordPress
GET productsGET products/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}
Os documentos com a classe api-hidden são excluídos durante a sincronização V2. Continuam disponíveis no WordPress. Não são adicionados campos JSON. Após a implementação, sincronizar novamente e substituir os arrays locais documents. V1 inalterada.
Excertos completos das aplicações
GET appsGET apps/{slug}
Os excertos (subtitle) deixam de estar limitados a 255 caracteres. O campo continua a ser texto sem HTML. Compatível com o contrato existente; sincronizar novamente as aplicações para obter os textos completos. V1 inalterada.
Vídeos no conteúdo das aplicações
GET appsGET apps/{slug}
Os shortcodes de vídeo ACF passam a leitores HTML YouTube ou Vimeo na sua posição em description e contentSections. O array videos permanece inalterado. As linhas api-hidden continuam excluídas. Após publicação, sincronizar novamente o conteúdo e permitir estes iframes no cliente. V1 inalterada.
Conteúdo exclusivo do WordPress
GET appsGET apps/{slug}GET servicesGET services/{slug}GET solutionsGET solutions/{slug}GET productsGET products/{slug}GET categoriesGET categories/{slug}
Os elementos HTML ou WPBakery com a classe api-hidden e os seus descendentes são excluídos das descrições e secções estruturadas do catálogo V2. O WordPress permanece inalterado. Sem novos campos JSON; executar uma sincronização completa para remover estes conteúdos das cópias locais. V1 inalterada.
Remoção de preços
GET productsGET products/{slug}GET apps/{slug}GET solutions/{slug}GET services/{slug}
O campo price (antes objeto montante/moeda ou null) é removido dos produtos, incluindo os associados. O filtro price é removido e as seleções ignoradas. Alteração incompatível V2: remover leituras, apresentações e filtros de preços; executar uma sincronização completa para eliminar preços guardados. V1 inalterada.
Segundo botão opcional
GET page/{slug}
Segundo botão nos cartões HTML data.content: texto e URL independentes, ambos necessários. Classe api-sync-button--secondary. Compatível com cartões existentes, sem novo campo JSON; adaptar o estilo se necessário.
Série do produto
GET productsGET products/{slug}
Adição compatível de series às listas e aos detalhes dos produtos: { label, slug, order }, ou null sem série. O nome e o slug seguem o idioma do produto. series.order é a posição do produto na série, distinta da ordem geral; é null quando não definida. Os campos existentes não mudam. Nenhuma migração necessária; tratar null antes de utilizar a série.
Ligações para páginas recriadas
GET menusGET menu/{slug}
Uma entrada de menu para uma página ativa permanece visível quando a página foi recriada com o mesmo slug de uma página eliminada. Destinos eliminados ou não autorizados continuam ocultos. Correção compatível com ou sem lang, sem alteração do formato JSON.
Origem do banner de categoria
GET categoriesGET categories/{slug}
bannerImage utiliza agora « Bannière Sheet Category » (banner-sheet-category) em vez de « Bannière Product Sheet » (category_image). Não há recurso ao campo anterior: um valor ausente ou uma imagem inválida devolve null. O nome e o formato JSON mantêm-se nas listas, detalhes e subcategorias; primaryMedia permanece independente. Preencher o novo campo antes da próxima sincronização para conservar um banner existente.
Slugs das coleções nos menus
GET menu/{slug}
Os destinos de menu do tipo collection incluem slug, com o mesmo valor de collection (apps, solutions ou services). Disponível com ou sem lang, em items[].target ou nas entradas agrupadas por idioma. Adição compatível na v2; os outros tipos não mudam.
Imagens dos links
GET apps/{slug}
Cada entrada de links inclui media: um objeto multimédia no mesmo formato de primaryMedia, ou null quando o link não tem uma imagem válida. A imagem e os metadados provêm da ficha no idioma solicitado, sem recurso a outro idioma. Os campos existentes são preservados; adição compatível apenas na v2. As listas de aplicações não mudam.
Imagem de destaque das páginas
GET pagesGET page/{slug}
A imagem de destaque do WordPress é apresentada como bannerMedia nas listas e nos detalhes das páginas, com o formato multimédia do catálogo. null se não existir uma imagem válida. Não é adicionado primaryMedia às páginas. Os metadados provêm da imagem da página no idioma solicitado, sem recurso a outro idioma. Adição compatível apenas na v2.
Imagens de cabeçalho das categorias
GET categoriesGET categories/{slug}
As categorias incluem bannerImage, um objeto multimédia com o mesmo formato de primaryMedia, proveniente do campo «Category image» do cabeçalho. Disponível em listas, detalhes e subcategorias; null se não existir uma imagem válida. A miniatura primaryMedia mantém-se independente. Sem recurso a outro idioma. Adição compatível apenas na v2.
Migração de v1 para v2 — impacto para os 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 diretamente a API com uma licença autorizada para os grupos pretendidos e aceitar campos JSON adicionais, a principal alteração é substituir /api/ por /api/v2/. Exemplo: /api/products?lang=fr passa a /api/v2/products?lang=fr.
**Sem alterações:** token da licença, autenticação (Authorization: Bearer ou x-api-token), idioma, filtros, paginação e campos existentes. A utilização de groups, groupsByLanguage e bannerMedia é opcional; clientes que rejeitam propriedades JSON desconhecidas devem adaptar o esquema.
**Conteúdo acessível:** v2 aplica os grupos autorizados da licença. As licenças existentes receberam todos os grupos disponíveis na migração; novos grupos não são atribuídos automaticamente. Sem grupos autorizados, as listas ficam vazias e os detalhes devolvem 404. Tokens técnicos antigos sem licença com grupos não dão acesso ao catálogo v2.
**Catálogo local:** iniciar uma sincronização completa em v2 sem reutilizar delta ou syncUntil de v1. Substituir o catálogo local pelo resultado completo autorizado e utilizar o novo syncUntil v2 nas sincronizações seguintes. Uma resposta 410 exige nova sincronização completa, nomeadamente após alterações aos grupos da licença. Não se aplica à consulta direta sem cópia local.
V1 continua disponível em /api/*; não é imposta migração nem redirecionamento automático.
Grupos nas respostas
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}
Os recursos das listas e dos detalhes incluem groups, todos os slugs dos grupos atribuídos (exemplo: ["standard", "BSD"]). [] indica conteúdo sem grupo. São grupos do conteúdo, não permissões do token; a filtragem não muda. As referências estruturadas identificadas também são enriquecidas. Menus sem lang expõem groupsByLanguage, preservando data. As eliminações delta não mudam. Adição compatível apenas na v2; efetuar uma leitura completa para atualizar os dados guardados.
Acesso 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}
Os conteúdos v2 são filtrados pelos grupos autorizados para o token. Para conteúdos associados a vários grupos, basta uma correspondência. Os conteúdos sem grupo continuam disponíveis para tokens com pelo menos um grupo válido. Tokens sem grupos não devolvem conteúdos: listas vazias e estado 404 nos detalhes.
As licenças existentes receberão todos os grupos disponíveis na migração, sem inclusão automática de grupos futuros. Os grupos são selecionados ao criar ou editar uma licença no dashboard. Uma nova licença sem seleção não tem acesso à v2.
A filtragem também abrange conteúdos relacionados, menus, contagens, facetas e paginação. Os links gerados para o catálogo utilizam rotas v2. Quando um conteúdo deixa os grupos autorizados, a sincronização incremental comunica uma eliminação.
Execute uma sincronização completa para esta alteração e após modificar os grupos de uma licença, substituindo os dados locais anteriores. Um pedido incremental incompatível devolve 410 e exige uma nova sincronização completa. A v1 permanece inalterada.
Adição de bannerMedia
GET productsGET products/{slug}GET solutionsGET solutions/{slug}GET servicesGET services/{slug}GET appsGET apps/{slug}
O campo bannerMedia está disponível nas listas e nos detalhes por slug de produtos, soluções, serviços e aplicações. Contém a imagem do banner no mesmo formato de primaryMedia, ou null se não estiver definido um banner para o idioma solicitado.