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, salve-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 status 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 status 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 status de pedido permitidos.
offset
não
Padrão 0. Deve ser >= 0.
limit
não
Padrão 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
Status
Descrição
shopping_cart
Fluxo do carrinho; o cliente ainda pode editar a configuração.
Os endpoints de importação do gerador aceitam apenas solicitações de leitura entre servidores. Eles exigem os cabeçalhos padrão da API, o escopo embed:session:create e um plano ativo. A autorização de importação não cria uma sessão do editor nem consome sua cota mensal. A abertura do editor usa o mesmo contador monthlyEmbedTokenLimit das outras ferramentas incorporadas.
Encontrar e importar modelos com gerador
Use /model-generator/models para listar os modelos disponíveis com geradores. O descritor generator fixa projectId, revision, configurationId, templateRevision, productId e productModel3dId. Siga seu importPath para obter exatamente essa revisão de origem. Os manifestos de recursos de produto também expõem 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 padrã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 arquivo fornece um path em /v1/model-generator/; acrescente /public-api antes desse caminho ao baixá-lo do Alter Product. Copie os arquivos necessários para seu próprio armazenamento e substitua as referências de origem por referências locais. Importe manequins e bibliotecas de texturas pelos respectivos endpoints de catálogo; public-files é restrito aos caminhos de recursos permitidos, e os templates precisam passar pelas verificações de acesso de sua 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 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 essa ferramenta. O UUID do projeto do gerador é um identificador separado. Transmita o token recebido pelo handshake do iframe; o bootstrap do runtime retorna 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 do iframe usadas pela ponte do WordPress
O plugin do WordPress hospeda a ponte de armazenamento e verifica as permissões de administrador ou gerente do WooCommerce. Ele valida a origem do iframe, a janela de origem, o nonce, o ID da solicitação e os caminhos de projeto permitidos. A ponte envia as leituras e gravações locais para /wp-json/alter-wc/v1/model-generator. As credenciais da API permanecem no servidor. Uma integração personalizada precisa implementar um tratamento autenticado de armazenamento equivalente; a API pública do gerador não salva 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 solicita uma sessão de edição model-generator; a página principal retorna o token autorizado.
ALTER_MODEL_GENERATOR_REQUEST
O iframe envia requestId, nonce e request contendo 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 houver, 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.
O salvamento envia expectedRevision, templateRevision, document e as referências aos artefatos. Ele cria uma revisão imutável; um valor expectedRevision desatualizado retorna HTTP 409. O WordPress armazena os metadados em seu banco de dados e os arquivos no diretório uploads. O JSON é minificado e compactado com gzip quando a compactação reduz 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'}};
Usar modelo salvo no design publica uma revisão salva completa em um design de produto vinculado. Os clientes passam a vê-la pelo Customizer, Configurator ou Viewer existente, com os vínculos de produto e as verificações de assinatura habituais. O editor do gerador continua sendo uma ferramenta do lojista. Os links dos pedidos preservam o projeto e a revisão salvos para que edições posteriores não alterem pedidos anteriores silenciosamente.
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 arquivos.
Tipo
Descrição
products
Recursos base do produto, prévias, modelos 3D e descritores de materiais e texturas.
backgrounds
Fundos estáticos do Viewer.
environments
Mapas de ambiente e imagens de prévia.
image_library
Recursos da biblioteca de imagens, incluindo imagens restritas à loja.
design_templates
Prévias de modelos de design e referências a arquivos 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 hospedados no Alter e seus arquivos para fluxos externos de produção ou migração. A API verifica a elegibilidade do plano Business.
Os arquivos públicos de prévia são compatíveis com navegadores. Os arquivos protegidos exigem uma URL assinada 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