Public API este conceput pentru integrări între servere cu magazine, backenduri comerciale, module WordPress/WooCommerce și fluxuri externe de producție.
Creează credențiale API în panoul Setări e-commerce. Access Token este afișat o singură dată, deci salvează-l imediat în stocarea secretelor din backend.
Păstrează Access Key și Access Token pe server. Endpointurile autentificate resping apelurile provenite din browser care includ antetele Origin sau Referer.
Credențialele pot avea domenii de acces limitate. Folosește GET /auth/check pentru a verifica magazinul activ, funcționalitățile planului și domeniile de acces returnate pentru setul de credențiale.
Funcția auxiliară de mai jos este folosită de celelalte exemple. Folosește fetch simplu și poate rula în Node.js 18+ sau în orice mediu de execuție de server care oferă fetch.
Tabelul de mai jos reflectă rutele publice montate în backend-public-api/app.js. Căile sunt afișate cu prefixul proxy public folosit de integrările externe.
Metodă
Endpoint
Descriere
Acces
GET
/public-api/healthz
Verificarea disponibilității serviciului.
public
GET
/public-api/v1/auth/check
Validează credențialele și returnează magazinul, domeniile de acces și funcționalitățile planului.
orice set de credențiale autentificat
GET
/public-api/v1/customer-orders
Returnează o listă paginată și filtrabilă a comenzilor clienților.
orders:read
GET
/public-api/v1/customer-orders/:id
Returnează o comandă de client cu articole de produs configurate.
orders:read
POST
/public-api/v1/customer-orders/batch
Returnează până la 100 de comenzi după ID.
orders:read
PATCH
/public-api/v1/customer-orders/:id/status
Actualizează starea comenzii.
orders:write
PATCH
/public-api/v1/customer-orders/:orderId/quantity
Actualizează cantitățile pozițiilor selectate din comandă.
Endpointurile comenzilor de client permit unui magazin extern să citească articolele configurate, să actualizeze cantitățile, să treacă o comandă prin stările de procesare și să elimine comenzile abandonate.
Parametru
Obligatoriu
Detalii
name
nu
Caută după numele designului și ID-ul numeric al comenzii.
category_id
nu
Filtrează după ID-ul categoriei de produs.
order_status
nu
Una dintre stările permise ale comenzii.
offset
nu
Implicit 0. Trebuie să fie >= 0.
limit
nu
Implicit 9 pentru acest controler, maximum 50.
order_by
nu
id, created_at sau design_name.
direction
nu
ASC sau DESC.
Exemplu de solicitare (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 permise
Stare
Descriere
shopping_cart
Fluxul coșului; clientul încă poate edita configurația.
editable
Comanda rămâne editabilă de către client.
paid
Comanda este plătită și pregătită pentru procesare.
Creează pe server un token de încorporare de scurtă durată, transmite-l către iframe/mediul de execuție, apoi permite mediului să apeleze bootstrap cu un token Bearer.
Parametru
Obligatoriu
Detalii
runtimeBindingId
recomandat
Identificator preferat pentru asocierile de execuție active.
Endpointurile de import ale generatorului permit doar citirea în comunicarea dintre servere. Necesită antetele API standard, permisiunea embed:session:create și un plan activ. Autorizarea importului nu creează o sesiune de editor și nu consumă limita lunară a acesteia. Deschiderea editorului folosește același contor monthlyEmbedTokenLimit ca celelalte instrumente încorporate.
Găsirea și importarea modelelor cu generator
Folosește /model-generator/models pentru a lista modelele disponibile cu generatoare. Descriptorul generator fixează valorile projectId, revision, configurationId, templateRevision, productId și productModel3dId. Urmează importPath pentru a prelua exact acea revizie sursă. Manifestele resurselor de produs expun și generators, precum și descriptorul generator al fiecărui model. Șabloanele pot fi importate separat, după configurație și revizie.
Filtre de catalog
Endpoint
Detalii
/model-generator/models
Lista de modele: name (sau q), categoryId, scope (all, own, global), limit (1–50) și offset.
/model-generator/catalog
Catalogul de șabloane: generatorType, productId, audience, q, templateKey, configurationId, limit și offset.
/model-generator/projects
Lista de proiecte: configurationId, q, scope (all, own, global), limit și offset. Proxy-ul public folosește implicit scope all.
/model-generator/image-libraries/:kind/assets
Biblioteci de texturi și fundaluri: kind este texture sau background; q, category și mapType filtrează resursele disponibile.
Un import de proiect conține document, revision, template și un manifest files. Fiecare fișier furnizează un path sub /v1/model-generator/; adaugă /public-api înaintea lui când descarci din Alter Product. Copiază fișierele necesare în propriul spațiu de stocare și înlocuiește referințele sursă cu referințe locale. Importă manechinele și bibliotecile de texturi prin endpointurile lor de catalog; public-files permite numai căile de resurse aprobate, iar șabloanele trebuie să treacă verificările de acces la configurație și revizie.
Exemplu de solicitare (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 });
Sesiunea editorului și stocarea locală
Creează sesiunea editorului cu tool: model-generator, un toolId numeric pozitiv care identifică proiectul local al generatorului (nu UUID-ul acestuia sau ID-ul produsului WooCommerce) și originea permisă a magazinului. Nu transmite designId, orderId, runtimeBindingId sau câmpuri de coș pentru acest instrument. UUID-ul proiectului generatorului este un identificator separat. Transmite tokenul primit prin handshake-ul iframe; runtime bootstrap returnează contextul generatorului cu 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.
Mesaje iframe folosite de puntea WordPress
Pluginul WordPress găzduiește puntea de stocare și verifică permisiunile de administrator sau manager WooCommerce. Validează originea iframe-ului, fereastra sursă, nonce, identificatorul cererii și căile de proiect permise. Puntea trimite citirile și scrierile locale către /wp-json/alter-wc/v1/model-generator. Datele de acces API rămân pe server. O integrare personalizată trebuie să implementeze un mecanism echivalent de stocare autentificată; API-ul public al generatorului nu salvează proiecte în Alter Product.
Tip
Descriere
ALTER_CHILD_HELLO / ALTER_PARENT_ACK
Iframe-ul inițiază handshake-ul cu un nonce; pagina părinte confirmă același nonce.
Iframe-ul solicită o sesiune de editare model-generator; pagina părinte returnează tokenul autorizat.
ALTER_MODEL_GENERATOR_REQUEST
Iframe-ul trimite requestId, nonce și request care conține method, path, data și responseType.
ALTER_MODEL_GENERATOR_RESPONSE
Pagina părinte răspunde cu același requestId și nonce, împreună cu status, data, headers și eventualul 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 salvare transmite expectedRevision, templateRevision, document și referințe la artefacte. Creează o revizie imuabilă; o valoare expectedRevision neactualizată returnează HTTP 409. WordPress stochează metadatele în baza sa de date, iar fișierele în directorul uploads. JSON este minificat și comprimat cu gzip atunci când comprimarea îi reduce dimensiunea.
// 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'}};
Acțiunea Folosește modelul salvat în design publică o revizie salvată completă într-un design asociat. Clienții o văd apoi prin Customizer, Configurator sau Viewer, cu asocierile obișnuite ale produselor și verificările de abonament. Editorul generatorului rămâne un instrument al comerciantului. Legăturile comenzilor păstrează proiectul și revizia salvate, astfel încât modificările ulterioare să nu schimbe automat comenzile anterioare.
Catalogul de resurse expune resursele sursă ale produselor, fundaluri, medii, elemente ale bibliotecii grafice, șabloane de design și resurse pentru machete. Endpointurile de listare returnează descriptori ușori; cele de detaliu includ manifeste de fișiere.
Tip
Descriere
products
Resurse de bază ale produsului, previzualizări, modele 3D și descriptori de materiale și texturi.
backgrounds
Fundaluri statice Viewer.
environments
Hărți de mediu și imagini de previzualizare.
image_library
Resurse ale bibliotecii grafice, inclusiv grafică limitată la magazin.
design_templates
Previzualizări ale șabloanelor de design și referințe la fișierele straturilor. Acceptă filtrul product_id.
mockups
Resurse ale generatorului de machete, fundaluri și hărți de suprapunere. Acceptă filtrul product_id.
Importurile de designuri expun designuri găzduite pe Alter și fișierele lor pentru fluxuri externe de producție sau migrare. Eligibilitatea planului Business este verificată de API.
Fișierele publice de previzualizare sunt compatibile cu browserele. Fișierele protejate necesită un URL semnat sau un set de credențiale API cu files:read. Fonturile și monedele sunt endpointuri publice de citire.
Asocierile de execuție conectează produse comerciale externe la designuri și tipuri de execuție Alter Product. Sunt folosite în principal de integrările WordPress/WooCommerce și de backendurile avansate ale magazinelor.
Parametru
Obligatoriu
Detalii
designId
nu
ID-ul designului Alter Product care aparține magazinului.
externalProductId
da pentru sincronizare
ID-ul produsului extern, de exemplu un ID de produs WooCommerce.
runtimeType
da pentru sincronizare
viewer, configurator sau customizer.
status
nu
draft, active, inactive, archived sau legacy_active.
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'}}}]})});
Endpointul pentru schimbul codului de conectare WordPress consumă un cod de transfer de unică folosință și returnează credențiale API modulului. Nu este un endpoint general pentru crearea credențialelor.
Majoritatea erorilor de controler sunt normalizate într-un răspuns code. Middleware-ul de autentificare și limitatoarele de solicitări pot returna în schimb un răspuns error.
// Controller error{"code":"assetCatalog.invalidType"}// Auth middleware or rate limit{"error":"Unauthorized"}{"error":"Too Many Requests"}
Tip
Limită
Fereastră
Global
600 de solicitări
60 de secunde
GET /auth/check
60 de solicitări
60 de secunde
Citire comenzi/produse
300 de solicitări
60 de secunde
Scriere comenzi/sesiuni de încorporare/asocieri de execuție