A Public API foi criada para integrações entre servidores com lojas, backends de e-commerce, plugins WordPress/WooCommerce e fluxos de produção externos.
Crie credenciais de API no painel de configurações de e-commerce. O Access Token é exibido uma única vez; por isso, guarde-o imediatamente no armazenamento de segredos do seu backend.
Mantenha a Access Key e o Access Token no seu servidor. Os endpoints autenticados rejeitam chamadas originadas no navegador que incluam os cabeçalhos Origin ou Referer.
As credenciais podem ter escopos limitados. Use GET /auth/check para verificar a loja ativa, os recursos do plano e os escopos retornados para a credencial.
A função auxiliar abaixo é usada nos demais exemplos. Ela usa fetch simples e pode ser executada no Node.js 18+ ou em qualquer ambiente de servidor que ofereça fetch.
A tabela abaixo reflete as rotas públicas montadas em backend-public-api/app.js. Os caminhos são exibidos com o prefixo de proxy público usado pelas integrações externas.
Método
Endpoint
Descrição
Acesso
GET
/public-api/healthz
Verificação de disponibilidade do serviço.
público
GET
/public-api/v1/auth/check
Valida as credenciais e retorna a loja, os escopos e os recursos do plano.
qualquer credencial autenticada
GET
/public-api/v1/customer-orders
Retorna uma lista paginada e filtrável de pedidos de clientes.
orders:read
GET
/public-api/v1/customer-orders/:id
Retorna um pedido de cliente individual com os itens de produto configurados.
orders:read
POST
/public-api/v1/customer-orders/batch
Retorna até 100 pedidos por ID.
orders:read
PATCH
/public-api/v1/customer-orders/:id/status
Atualiza o estado do pedido.
orders:write
PATCH
/public-api/v1/customer-orders/:orderId/quantity
Atualiza as quantidades dos itens selecionados do pedido.
Os endpoints de pedidos de clientes permitem que uma loja externa leia os itens configurados, atualize quantidades, mova um pedido entre estados de processamento e remova pedidos abandonados.
Parâmetro
Obrigatório
Detalhes
name
não
Pesquisa pelo nome do design e pelo ID numérico do pedido.
category_id
não
Filtra pelo ID da categoria do produto.
order_status
não
Um dos estados de pedido permitidos.
offset
não
Valor predefinido: 0. Deve ser >= 0.
limit
não
Valor predefinido: 9 neste controlador, máximo 50.
order_by
não
id, created_at ou design_name.
direction
não
ASC ou DESC.
Exemplo de solicitação (fetch)
const params =newURLSearchParams({limit:'20',offset:'0',order_status:'shopping_cart',order_by:'created_at',direction:'DESC'});const orders =awaitalterFetch(`/customer-orders?${params.toString()}`);const order =awaitalterFetch('/customer-orders/123');const batch =awaitalterFetch('/customer-orders/batch',{method:'POST',body:JSON.stringify({customerOrderIds:[123,124,125]})});
Valores permitidos
Estado
Descrição
shopping_cart
Fluxo do carrinho; o cliente ainda pode editar a configuração.
Os endpoints de importação do gerador aceitam apenas pedidos de leitura entre servidores. Exigem os cabeçalhos API habituais, o âmbito embed:session:create e um plano ativo. A autorização de importação não cria uma sessão do editor nem consome a respetiva quota mensal. A abertura do editor utiliza o mesmo contador monthlyEmbedTokenLimit das restantes ferramentas incorporadas.
Encontrar e importar modelos com gerador
Utilize /model-generator/models para listar os modelos disponíveis com geradores. O descritor generator fixa projectId, revision, configurationId, templateRevision, productId e productModel3dId. Siga o respetivo importPath para obter exatamente essa revisão de origem. Os manifestos de recursos de produto também disponibilizam generators e o descritor generator de cada modelo. Os templates podem ser importados separadamente por configuração e revisão.
Filtros dos catálogos
Endpoint
Detalhes
/model-generator/models
Lista de modelos: name (ou q), categoryId, scope (all, own, global), limit (1–50) e offset.
/model-generator/catalog
Catálogo de templates: generatorType, productId, audience, q, templateKey, configurationId, limit e offset.
/model-generator/projects
Lista de projetos: configurationId, q, scope (all, own, global), limit e offset. O proxy público define scope como all por predefinição.
/model-generator/image-libraries/:kind/assets
Bibliotecas de texturas e fundos: kind é texture ou background; q, category e mapType filtram os recursos disponíveis.
A importação de um projeto contém document, revision, template e um manifesto files. Cada ficheiro fornece um path em /v1/model-generator/; acrescente /public-api antes desse caminho ao descarregá-lo do Alter Product. Copie os ficheiros necessários para o seu próprio armazenamento e substitua as referências de origem por referências locais. Importe manequins e bibliotecas de texturas através dos respetivos endpoints de catálogo; public-files está limitado aos caminhos de recursos permitidos, e os templates têm de passar pelas verificações de acesso da respetiva configuração e revisão.
Exemplo de solicitação (fetch)
// Server-side: uses the alterFetch helper and authHeaders defined above.const catalog =awaitalterFetch('/model-generator/models?'+newURLSearchParams({scope:'all',limit:'24',offset:'0'}));const selected = catalog.items[0];if(!selected?.generator)thrownewError('Select an available generator model');const importPath = selected.generator.importPath;if(!importPath.startsWith('/v1/model-generator/projects/')){thrownewError('Invalid generator import path');}const bundle =awaitalterFetch(importPath.slice('/v1'.length));for(const file of bundle.files){if(!file.path.startsWith('/v1/model-generator/')){thrownewError('Invalid generator file path');}const response =awaitfetch('https://alterproduct.com/public-api'+ file.path,{headers: authHeaders,redirect:'error'});if(!response.ok)thrownewError(`File download failed: ${response.status}`);const bytes =newUint8Array(await response.arrayBuffer());// Persist bytes in your local storage; record the mapping from// file.sourceHref / file.href to the resulting local file reference.}// Persist bundle.document, bundle.template and revision metadata locally.// Import the related product asset and its textures/mockups as needed:const product =awaitalterFetch('/assets/products/'+ selected.generator.productId);const mannequins =awaitalterFetch('/model-generator/mannequins');console.log({ product, mannequins });
Sessão do editor e armazenamento local
Crie a sessão do editor com tool: model-generator, um toolId numérico positivo que identifique o projeto local do gerador (não o seu UUID nem o ID do produto WooCommerce) e a origem permitida da loja. Não envie designId, orderId, runtimeBindingId nem campos do carrinho para esta ferramenta. O UUID do projeto do gerador é um identificador separado. Transmita o token recebido através do handshake do iframe; o bootstrap do runtime devolve o contexto do gerador com storageMode: wordpress_local.
// Server-side, after authorizing the merchant's access to this local project.const localProjectId =42;// Local generator project ID, not its UUID or WC product ID.const session =awaitalterFetch('/embed/session',{method:'POST',body:JSON.stringify({tool:'model-generator',toolId: localProjectId,origin:'https://yourstore.com'})});// The iframe receives session.token through ALTER_CUSTOMIZER_SESSION_READY.// Do not put API credentials or the token in the iframe URL.const bootstrapResponse =awaitfetch('https://alterproduct.com/public-api/v1/runtime/bootstrap',{headers:{Authorization:`Bearer ${session.token}`}});if(!bootstrapResponse.ok)thrownewError('Generator bootstrap failed');const context =await bootstrapResponse.json();console.log(context);
// Host page: WordPress returns a numeric toolId and a UUID in id.const url =newURL('https://alterproduct.com/app/model-generator');url.search=newURLSearchParams({embedded:'1',lng:'en',parentOrigin:window.location.origin,toolId:String(localProject.toolId),serverProjectId: localProject.id}).toString();// Optional: serverProjectRevision pins an existing saved revision.iframe.src= url.toString();// Install the authenticated handshake and storage bridge described below.// Setting iframe.src alone does not authorize the editor or provide storage.
Mensagens iframe utilizadas pela ponte WordPress
O plugin WordPress aloja a ponte de armazenamento e verifica as permissões de administrador ou gestor WooCommerce. Valida a origem do iframe, a janela de origem, o nonce, o ID do pedido e os caminhos de projeto permitidos. A ponte envia as leituras e escritas locais para /wp-json/alter-wc/v1/model-generator. As credenciais API permanecem no servidor. Uma integração personalizada tem de implementar um tratamento autenticado do armazenamento equivalente; a API pública do gerador não guarda projetos no Alter Product.
Tipo
Descrição
ALTER_CHILD_HELLO / ALTER_PARENT_ACK
O iframe inicia o handshake com um nonce; a página principal confirma esse mesmo nonce.
O iframe pede uma sessão de edição model-generator; a página principal devolve o token autorizado.
ALTER_MODEL_GENERATOR_REQUEST
O iframe envia requestId, nonce e request com method, path, data e responseType.
ALTER_MODEL_GENERATOR_RESPONSE
A página principal responde com os mesmos requestId e nonce, além de status, data, headers e, se existir, error.
// Messages after ALTER_CHILD_HELLO / ALTER_PARENT_ACK agree on the nonce.// Iframe -> parent:const sessionRequest ={type:'ALTER_CUSTOMIZER_INIT_SESSION',nonce: handshakeNonce,payload:{tool:'model-generator',alterProductId: localProject.toolId,mode:'edit'}};// Parent -> iframe, after the server authorizes the merchant and issues a token:const sessionReady ={type:'ALTER_CUSTOMIZER_SESSION_READY',nonce: handshakeNonce,token: session.token,tool:'model-generator',cartKey:`model-generator:${localProject.id}`,mode:'edit',localSession:false,adminSession:true};// Send only to the validated iframe's exact origin and source window.// An authorized token and successful bootstrap are still required.
Ao guardar, são enviados expectedRevision, templateRevision, document e as referências aos artefactos. É criada uma revisão imutável; um valor expectedRevision desatualizado devolve HTTP 409. O WordPress armazena os metadados na sua base de dados e os ficheiros no diretório uploads. O JSON é minificado e comprimido com gzip quando a compressão reduz o seu tamanho.
// Example message from the iframe; savedSnapshot and artifact IDs come// from the generator. The host checks origin/source/nonce/project permissions.const message ={type:'ALTER_MODEL_GENERATOR_REQUEST',requestId: crypto.randomUUID(),nonce: handshakeNonce,request:{method:'POST',path:`/pattern-generator/projects/${projectUuid}/revisions`,data:{expectedRevision: loadedRevision,name: projectName, templateRevision,document: savedSnapshot,references:{artifactIds: savedArtifactIds }},responseType:'json'}};
Utilizar modelo guardado no design publica uma revisão guardada completa num design de produto associado. Os clientes passam a vê-la através do Customizer, Configurator ou Viewer existente, com as associações de produto e as verificações de subscrição habituais. O editor do gerador continua a ser uma ferramenta do comerciante. As ligações das encomendas preservam o projeto e a revisão guardados para que as edições posteriores não alterem silenciosamente as encomendas anteriores.
O catálogo de recursos disponibiliza os recursos originais dos produtos, fundos, ambientes, itens da biblioteca de imagens, modelos de design e recursos de mockup. Os endpoints de listagem retornam descritores leves; os endpoints de detalhes incluem manifestos de ficheiros.
Tipo
Descrição
products
Recursos base do produto, pré-visualizações, modelos 3D e descritores de materiais e texturas.
backgrounds
Fundos estáticos do Viewer.
environments
Mapas de ambiente e imagens de pré-visualização.
image_library
Recursos da biblioteca de imagens, incluindo imagens restritas à loja.
design_templates
Pré-visualizações de modelos de design e referências a ficheiros de camadas. Aceita o filtro product_id.
mockups
Recursos do gerador de mockups, fundos e mapas de sobreposição. Aceita o filtro product_id.
As importações de designs disponibilizam designs alojados no Alter e seus ficheiros para fluxos externos de produção ou migração. A API verifica a elegibilidade do plano Business.
Os ficheiros públicos de pré-visualização são compatíveis com navegadores. Os ficheiros protegidos exigem um URL assinado ou uma credencial de API com files:read. Fontes e moedas são endpoints públicos de leitura.
As associações de runtime conectam produtos de e-commerce externos a designs e tipos de runtime do Alter Product. São usadas principalmente por integrações WordPress/WooCommerce e backends avançados de lojas.
Parâmetro
Obrigatório
Detalhes
designId
não
ID do design do Alter Product pertencente à loja.
externalProductId
sim para sincronização
ID do produto externo, por exemplo, um ID de produto do WooCommerce.
runtimeType
sim para sincronização
viewer, configurator ou customizer.
status
não
draft, active, inactive, archived ou legacy_active.
legacyStorefrontProductId
não
ID opcional da associação legada.
legacyBindingMeta
não
Metadados JSON opcionais, por exemplo, manifestHash.
awaitalterFetch('/runtime-bindings/sync-from-wordpress',{method:'POST',body:JSON.stringify({bindings:[{externalProductId:'wc_123',runtimeType:'viewer',status:'active',externalDesign:{externalDesignKey:'wp-design-381',productId:4,title:'WooCommerce local design',manifestUrl:'https://yourstore.com/wp-content/uploads/alter/381/manifest.json',assetBaseUrl:'https://yourstore.com/wp-content/uploads/alter/381/',manifestHash:'a3b1...',sourceMeta:{pluginVersion:'1.2.0'}}}]})});
O endpoint de troca de conexão do WordPress consome um código de transferência de uso único e retorna credenciais de API ao plugin. Ele não é um endpoint genérico de criação de credenciais.
A maioria dos erros dos controladores é normalizada para uma resposta code. O middleware de autenticação e os limitadores de solicitações podem retornar uma resposta error.
// Controller error{"code":"assetCatalog.invalidType"}// Auth middleware or rate limit{"error":"Unauthorized"}{"error":"Too Many Requests"}
Tipo
Limite
Janela
Global
600 solicitações
60 segundos
GET /auth/check
60 solicitações
60 segundos
Leitura de pedidos/produtos
300 solicitações
60 segundos
Gravação de pedidos/sessões de incorporação/associações de runtime