Crea le credenziali API nel pannello Impostazioni e-commerce. L'Access Token viene mostrato una sola volta: salvalo subito nell'archivio dei segreti del backend.
Conserva Access Key e Access Token sul server. Gli endpoint autenticati rifiutano le chiamate provenienti dal browser che includono gli header Origin o Referer.
Le credenziali possono avere ambiti limitati. Usa GET /auth/check per verificare il negozio attivo, le funzionalità del piano e gli ambiti restituiti per la credenziale.
La funzione ausiliaria seguente è usata negli altri esempi. Usa fetch semplice e può essere eseguita in Node.js 18+ o in qualsiasi runtime server che offra fetch.
La tabella seguente rispecchia le route pubbliche montate in backend-public-api/app.js. I percorsi sono mostrati con il prefisso del proxy pubblico usato dalle integrazioni esterne.
Metodo
Endpoint
Descrizione
Accesso
GET
/public-api/healthz
Verifica della disponibilità del servizio.
pubblico
GET
/public-api/v1/auth/check
Convalida le credenziali e restituisce negozio, ambiti e funzionalità del piano.
qualsiasi credenziale autenticata
GET
/public-api/v1/customer-orders
Restituisce un elenco paginato e filtrabile degli ordini dei clienti.
orders:read
GET
/public-api/v1/customer-orders/:id
Restituisce un singolo ordine cliente con articoli di prodotto configurati.
orders:read
POST
/public-api/v1/customer-orders/batch
Restituisce fino a 100 ordini tramite ID.
orders:read
PATCH
/public-api/v1/customer-orders/:id/status
Aggiorna lo stato dell'ordine.
orders:write
PATCH
/public-api/v1/customer-orders/:orderId/quantity
Aggiorna le quantità delle righe d'ordine selezionate.
Gli endpoint degli ordini dei clienti consentono a un negozio esterno di leggere gli articoli configurati, aggiornare le quantità, far avanzare un ordine tra gli stati di evasione ed eliminare ordini abbandonati.
Parametro
Obbligatorio
Dettagli
name
no
Cerca per nome del design e ID numerico dell'ordine.
category_id
no
Filtra per ID della categoria del prodotto.
order_status
no
Uno degli stati dell'ordine consentiti.
offset
no
Predefinito 0. Deve essere >= 0.
limit
no
Predefinito 9 per questo controller, massimo 50.
order_by
no
id, created_at o design_name.
direction
no
ASC o DESC.
Esempio di richiesta (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]})});
Valori consentiti
Stato
Descrizione
shopping_cart
Flusso del carrello; il cliente può ancora modificare la configurazione.
Gli endpoint di importazione del generatore accettano solo richieste di lettura tra server. Richiedono gli header API standard, lo scope embed:session:create e un piano attivo. L’autorizzazione all’importazione non crea una sessione dell’editor e non ne consuma la quota mensile. L’apertura dell’editor utilizza lo stesso contatore monthlyEmbedTokenLimit degli altri strumenti incorporati.
Trovare e importare modelli con generatore
Usa /model-generator/models per elencare i modelli disponibili con generatore. Il descrittore generator fissa projectId, revision, configurationId, templateRevision, productId e productModel3dId. Segui il suo importPath per recuperare esattamente quella revisione sorgente. I manifest delle risorse di prodotto espongono anche generators e il descrittore generator di ogni modello. I template possono essere importati separatamente in base a configurazione e revisione.
Filtri dei cataloghi
Endpoint
Dettagli
/model-generator/models
Elenco dei modelli: name (o q), categoryId, scope (all, own, global), limit (1–50) e offset.
/model-generator/catalog
Catalogo dei template: generatorType, productId, audience, q, templateKey, configurationId, limit e offset.
/model-generator/projects
Elenco dei progetti: configurationId, q, scope (all, own, global), limit e offset. Il proxy pubblico imposta scope su all per impostazione predefinita.
/model-generator/image-libraries/:kind/assets
Librerie di texture e sfondi: kind è texture o background; q, category e mapType filtrano le risorse disponibili.
L’importazione di un progetto contiene document, revision, template e un manifest files. Ogni file fornisce un path sotto /v1/model-generator/; anteponi /public-api quando lo scarichi da Alter Product. Copia i file necessari nel tuo spazio di archiviazione e sostituisci i riferimenti sorgente con riferimenti locali. Importa manichini e librerie di texture tramite i rispettivi endpoint di catalogo; public-files è limitato ai percorsi di risorse consentiti e i template devono superare i controlli di accesso per la propria configurazione e revisione.
Esempio di richiesta (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 });
Sessione dell’editor e archiviazione locale
Crea la sessione dell’editor con tool: model-generator, un toolId numerico positivo che identifichi il progetto locale del generatore (non il suo UUID né l’ID del prodotto WooCommerce) e l’origine consentita del negozio. Per questo strumento non inviare designId, orderId, runtimeBindingId o campi del carrello. L’UUID del progetto del generatore è un identificatore separato. Trasmetti il token ricevuto tramite l’handshake dell’iframe; il bootstrap del runtime restituisce il contesto del generatore con 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.
Messaggi iframe utilizzati dal ponte WordPress
Il plugin WordPress ospita il ponte di archiviazione e verifica i permessi di amministratore o gestore WooCommerce. Convalida l’origine dell’iframe, la finestra sorgente, il nonce, l’ID della richiesta e i percorsi di progetto consentiti. Il ponte invia le letture e le scritture locali a /wp-json/alter-wc/v1/model-generator. Le credenziali API rimangono sul server. Un’integrazione personalizzata deve implementare una gestione autenticata dell’archiviazione equivalente; l’API pubblica del generatore non salva progetti su Alter Product.
Tipo
Descrizione
ALTER_CHILD_HELLO / ALTER_PARENT_ACK
L’iframe avvia l’handshake con un nonce; la pagina principale conferma lo stesso nonce.
L’iframe richiede una sessione di modifica model-generator; la pagina principale restituisce il token autorizzato.
ALTER_MODEL_GENERATOR_REQUEST
L’iframe invia requestId, nonce e request contenente method, path, data e responseType.
ALTER_MODEL_GENERATOR_RESPONSE
La pagina principale risponde con gli stessi requestId e nonce, oltre a status, data, headers ed eventuale 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.
Il salvataggio invia expectedRevision, templateRevision, document e i riferimenti agli artefatti. Crea una revisione immutabile; un valore expectedRevision non aggiornato restituisce HTTP 409. WordPress memorizza i metadati nel proprio database e i file nella directory uploads. Il JSON viene minificato e compresso con gzip quando la compressione ne riduce le dimensioni.
// 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'}};
Usa il modello salvato nel design pubblica una revisione salvata completa in un design di prodotto collegato. I clienti la visualizzano poi tramite Customizer, Configurator o Viewer esistenti, con le consuete associazioni di prodotto e verifiche dell’abbonamento. L’editor del generatore rimane uno strumento per il commerciante. I collegamenti degli ordini conservano il progetto e la revisione salvati, in modo che le modifiche successive non alterino silenziosamente gli ordini precedenti.
Il catalogo delle risorse espone risorse originali dei prodotti, sfondi, ambienti, elementi della libreria grafica, modelli di design e risorse mockup. Gli endpoint di elenco restituiscono descrittori leggeri; quelli di dettaglio includono manifesti dei file.
Tipo
Descrizione
products
Risorse base del prodotto, anteprime, modelli 3D e descrittori di materiali e texture.
backgrounds
Sfondi statici del Viewer.
environments
Mappe ambientali e immagini di anteprima.
image_library
Risorse della libreria grafica, incluse grafiche limitate al negozio.
design_templates
Anteprime dei modelli di design e riferimenti ai file dei livelli. Supporta il filtro product_id.
mockups
Risorse del generatore di mockup, sfondi e mappe di sovrapposizione. Supporta il filtro product_id.
Le importazioni di design espongono i design ospitati su Alter e i relativi file per flussi esterni di produzione o migrazione. L'API verifica l'idoneità del piano Business.
I file pubblici di anteprima sono adatti ai browser. I file protetti richiedono un URL firmato o una credenziale API con files:read. Font e valute sono endpoint pubblici di lettura.
Le associazioni runtime collegano prodotti commerciali esterni a design e tipi di runtime Alter Product. Sono usate soprattutto dalle integrazioni WordPress/WooCommerce e dai backend avanzati dei negozi.
Parametro
Obbligatorio
Dettagli
designId
no
ID del design Alter Product appartenente al negozio.
externalProductId
sì per la sincronizzazione
ID del prodotto esterno, ad esempio un ID di prodotto WooCommerce.
runtimeType
sì per la sincronizzazione
viewer, configurator o customizer.
status
no
draft, active, inactive, archived o legacy_active.
legacyStorefrontProductId
no
ID facoltativo della mappatura legacy.
legacyBindingMeta
no
Metadati JSON facoltativi, ad esempio 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'}}}]})});
L'endpoint di scambio della connessione WordPress consuma un codice di passaggio monouso e restituisce le credenziali API al plugin. Non è un endpoint generico per creare credenziali.
La maggior parte degli errori dei controller viene normalizzata in una risposta code. Il middleware di autenticazione e i limitatori di richieste possono invece restituire una risposta error.
// Controller error{"code":"assetCatalog.invalidType"}// Auth middleware or rate limit{"error":"Unauthorized"}{"error":"Too Many Requests"}
Tipo
Limite
Finestra
Globale
600 richieste
60 secondi
GET /auth/check
60 richieste
60 secondi
Lettura di ordini/prodotti
300 richieste
60 secondi
Scrittura di ordini/sessioni di incorporamento/associazioni runtime