API - Visão geral

API - Gerador de modelos 3D

Importe modelos e templates, inicie o gerador e gira a comunicação e a gravação de projetos.

Visão geral dos endpoints

MétodoEndpointDescriçãoAcesso
GET/public-api/v1/model-generator/catalogLista os produtos do gerador, as configurações e as revisões de templates visíveis.embed:session:create
GET/public-api/v1/model-generator/modelsLista modelos com descritores de fontes do gerador fixados em revisões específicas para importação.embed:session:create
GET/public-api/v1/model-generator/designer-catalogDevolve o catálogo de modelos do gerador utilizado pelo Designer.embed:session:create
GET/public-api/v1/model-generator/projectsLista os projetos do gerador do proprietário e os disponíveis globalmente.embed:session:create
GET/public-api/v1/model-generator/projects/:projectIdDevolve a revisão mais recente ou selecionada do projeto, o template e o manifesto de ficheiros.embed:session:create
GET/public-api/v1/model-generator/projects/:projectId/revisions/:revisionDevolve a revisão mais recente ou selecionada do projeto, o template e o manifesto de ficheiros.embed:session:create
GET/public-api/v1/model-generator/projects/:projectId/artifacts/:artifactIdDescarrega um artefacto após verificar o acesso ao respetivo projeto.embed:session:create
GET/public-api/v1/model-generator/configurations/:configurationId/revisions/:revision/templateDevolve um documento de template acessível para a revisão de configuração selecionada.embed:session:create
GET/public-api/v1/model-generator/configurations/:configurationId/revisions/:revision/importDevolve o pacote de importação do template com os ficheiros de dependências.embed:session:create
GET/public-api/v1/model-generator/mannequinsDevolve ambos os manequins e os descritores dos respetivos recursos.embed:session:create
GET/public-api/v1/model-generator/image-libraries/:kind/assetsLista os recursos das bibliotecas de texturas ou fundos com ficheiros importáveis.embed:session:create
GET/public-api/v1/model-generator/image-libraries/:kind/assets/:assetIdDevolve um recurso de textura ou fundo com os respetivos ficheiros importáveis.embed:session:create
GET/public-api/v1/model-generator/public-files/:keyDescarrega um ficheiro de dependência permitido do gerador.embed:session:create

Gerador de modelos 3D

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

EndpointDetalhes
/model-generator/modelsLista de modelos: name (ou q), categoryId, scope (all, own, global), limit (1-50) e offset.
/model-generator/catalogCatálogo de templates: generatorType, productId, audience, q, templateKey, configurationId, limit e offset.
/model-generator/projectsLista 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/assetsBibliotecas 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 alterFetch and authHeaders from the API connection guide.
const catalog = await alterFetch('/model-generator/models?' + new URLSearchParams({
  scope: 'all', limit: '24', offset: '0'
}));

const selected = catalog.items[0];
if (!selected?.generator) throw new Error('Select an available generator model');

const importPath = selected.generator.importPath;
if (!importPath.startsWith('/v1/model-generator/projects/')) {
  throw new Error('Invalid generator import path');
}
const bundle = await alterFetch(importPath.slice('/v1'.length));

for (const file of bundle.files) {
  if (!file.path.startsWith('/v1/model-generator/')) {
    throw new Error('Invalid generator file path');
  }
  const response = await fetch('https://alterproduct.com/public-api' + file.path, {
    headers: authHeaders,
    redirect: 'error'
  });
  if (!response.ok) throw new Error(`File download failed: ${response.status}`);
  const bytes = new Uint8Array(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 = await alterFetch('/assets/products/' + selected.generator.productId);
const mannequins = await alterFetch('/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 = await alterFetch('/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 = await fetch('https://alterproduct.com/public-api/v1/runtime/bootstrap', {
  headers: { Authorization: `Bearer ${session.token}` }
});
if (!bootstrapResponse.ok) throw new Error('Generator bootstrap failed');
const context = await bootstrapResponse.json();
console.log(context);

Exemplo de resposta

{
  "runtimeBindingId": null,
  "designId": null,
  "productId": 42,
  "toolId": 42,
  "runtimeType": "model-generator",
  "storageMode": "wordpress_local",
  "parentOrigin": "https://yourstore.com"
}
// Host page: WordPress returns a numeric toolId and a UUID in id.
const url = new URL('https://alterproduct.com/app/model-generator');
url.search = new URLSearchParams({
  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.

TipoDescrição
ALTER_CHILD_HELLO / ALTER_PARENT_ACKO iframe inicia o handshake com um nonce; a página principal confirma esse mesmo nonce.
ALTER_CUSTOMIZER_INIT_SESSION / ALTER_CUSTOMIZER_SESSION_READYO iframe pede uma sessão de edição model-generator; a página principal devolve o token autorizado.
ALTER_MODEL_GENERATOR_REQUESTO iframe envia requestId, nonce e request com method, path, data e responseType.
ALTER_MODEL_GENERATOR_RESPONSEA 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.