De Public API is bedoeld voor server-naar-serverintegraties met winkels, commercebackends, WordPress/WooCommerce-plug-ins en externe productieworkflows.
Maak API-inloggegevens aan in het paneel met e-commerce-instellingen. De Access Token wordt één keer getoond, dus sla deze direct op in de beveiligde opslag van je backend.
Bewaar de Access Key en Access Token op je server. Geauthenticeerde endpoints weigeren browserverzoeken met Origin- of Referer-headers.
Inloggegevens kunnen beperkte machtigingen hebben. Gebruik GET /auth/check om de actieve winkel, planmogelijkheden en machtigingen van de inloggegevens te controleren.
De onderstaande helper wordt in de overige voorbeelden gebruikt. Deze gebruikt gewone fetch en werkt in Node.js 18+ of elke serverruntime die fetch ondersteunt.
De onderstaande tabel komt overeen met de openbare routes in backend-public-api/app.js. De paden bevatten het openbare proxyvoorvoegsel voor externe integraties.
Methode
Endpoint
Beschrijving
Toegang
GET
/public-api/healthz
Statuscontrole van de service.
openbaar
GET
/public-api/v1/auth/check
Valideert inloggegevens en retourneert de winkel, machtigingen en planmogelijkheden.
alle geauthenticeerde inloggegevens
GET
/public-api/v1/customer-orders
Retourneert een gepagineerde en filterbare lijst met klantbestellingen.
orders:read
GET
/public-api/v1/customer-orders/:id
Retourneert één klantbestelling met geconfigureerde productartikelen.
orders:read
POST
/public-api/v1/customer-orders/batch
Retourneert maximaal 100 bestellingen op ID.
orders:read
PATCH
/public-api/v1/customer-orders/:id/status
Werkt de bestelstatus bij.
orders:write
PATCH
/public-api/v1/customer-orders/:orderId/quantity
Werkt de aantallen van geselecteerde besteldetails bij.
Met klantbestel-endpoints kan een externe winkel geconfigureerde bestelregels lezen, aantallen aanpassen, de afhandelingsstatus wijzigen en verlaten bestellingen verwijderen.
Parameter
Verplicht
Details
name
nee
Zoekt op ontwerpnaam en numeriek bestel-ID.
category_id
nee
Filtert op productcategorie-ID.
order_status
nee
Een van de toegestane bestelstatussen.
offset
nee
Standaard 0. Moet >= 0 zijn.
limit
nee
Standaard 9 voor deze controller, maximaal 50.
order_by
nee
id, created_at of design_name.
direction
nee
ASC of DESC.
Voorbeeldverzoek (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]})});
Toegestane waarden
Status
Beschrijving
shopping_cart
Winkelwagenfase; de klant kan de configuratie nog bewerken.
editable
De bestelling blijft bewerkbaar voor de klant.
paid
De bestelling is betaald en klaar voor afhandeling.
Maak op je server een kort geldig embedtoken aan, geef het door aan het iframe/de runtime en laat de runtime vervolgens bootstrap aanroepen met een Bearer-token.
Parameter
Verplicht
Details
runtimeBindingId
aanbevolen
Voorkeursidentificatie voor actieve runtimekoppelingen.
De importeindpunten van de generator ondersteunen alleen leesverzoeken tussen servers. Ze vereisen de gebruikelijke API-headers, de scope embed:session:create en een actief abonnement. Importautorisatie maakt geen editorsessie aan en verbruikt het maandelijkse quotum daarvoor niet. Het openen van de editor gebruikt dezelfde teller monthlyEmbedTokenLimit als de andere ingesloten tools.
Modellen met generator zoeken en importeren
Gebruik /model-generator/models om beschikbare modellen met een generator op te vragen. De descriptor generator legt projectId, revision, configurationId, templateRevision, productId en productModel3dId vast. Volg de bijbehorende importPath om precies die bronrevisie op te halen. Manifesten van productassets bevatten ook generators en de descriptor generator van elk model. Sjablonen kunnen afzonderlijk worden geïmporteerd op basis van configuratie en revisie.
Catalogusfilters
Endpoint
Details
/model-generator/models
Modellijst: name (of q), categoryId, scope (all, own, global), limit (1–50) en offset.
/model-generator/catalog
Sjablooncatalogus: generatorType, productId, audience, q, templateKey, configurationId, limit en offset.
/model-generator/projects
Projectlijst: configurationId, q, scope (all, own, global), limit en offset. De openbare proxy stelt scope standaard in op all.
/model-generator/image-libraries/:kind/assets
Textuur- en achtergrondbibliotheken: kind is texture of background; q, category en mapType filteren de beschikbare assets.
Een projectimport bevat document, revision, template en een manifest files. Elk bestand levert een path onder /v1/model-generator/; voeg /public-api vóór dit pad toe wanneer je het van Alter Product downloadt. Kopieer de benodigde bestanden naar je eigen opslag en vervang de bronverwijzingen door lokale verwijzingen. Importeer mannequins en textuurbibliotheken via hun cataloguseindpunten; public-files is beperkt tot toegestane bronpaden en sjablonen moeten de toegangscontroles voor hun configuratie en revisie doorlopen.
Voorbeeldverzoek (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 });
Editorsessie en lokale opslag
Maak de editorsessie aan met tool: model-generator, een positieve numerieke toolId die het lokale generatorproject identificeert (niet de UUID ervan of het WooCommerce-product-ID) en de toegestane oorsprong van de winkel. Geef voor deze tool geen designId, orderId, runtimeBindingId of winkelwagenvelden mee. De UUID van het generatorproject is een aparte identificatie. Geef het ontvangen token door via de iframe-handshake; de runtime-bootstrap retourneert de generatorcontext met 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.
Iframe-berichten van de WordPress-brug
De WordPress-plugin verzorgt de opslagbrug en controleert beheerdersrechten of rechten voor WooCommerce-beheer. De plugin valideert de oorsprong van het iframe, het bronvenster, de nonce, het verzoek-ID en de toegestane projectpaden. De brug stuurt lokale lees- en schrijfverzoeken naar /wp-json/alter-wc/v1/model-generator. API-inloggegevens blijven op de server. Een aangepaste integratie moet gelijkwaardige, geauthenticeerde opslagafhandeling implementeren; de openbare generator-API slaat geen projecten op bij Alter Product.
Type
Beschrijving
ALTER_CHILD_HELLO / ALTER_PARENT_ACK
Het iframe start de handshake met een nonce; de bovenliggende pagina bevestigt dezelfde nonce.
Het iframe vraagt een bewerkingssessie voor model-generator aan; de bovenliggende pagina retourneert het geautoriseerde token.
ALTER_MODEL_GENERATOR_REQUEST
Het iframe stuurt requestId, nonce en request met daarin method, path, data en responseType.
ALTER_MODEL_GENERATOR_RESPONSE
De bovenliggende pagina antwoordt met dezelfde requestId en nonce, plus status, data, headers en een eventuele 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.
Bij het opslaan worden expectedRevision, templateRevision, document en artefactverwijzingen meegestuurd. Dit maakt een onveranderlijke revisie aan; een verouderde expectedRevision levert HTTP 409 op. WordPress bewaart metadata in zijn database en bestanden in zijn uploads-map. JSON wordt geminificeerd en met gzip gecomprimeerd wanneer compressie de omvang verkleint.
// 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'}};
Opgeslagen model in ontwerp gebruiken publiceert een volledige opgeslagen revisie naar een gekoppeld productontwerp. Klanten zien deze vervolgens via de bestaande Customizer, Configurator of Viewer, met de gebruikelijke productkoppelingen en abonnementscontroles. De generatoreditor blijft een tool voor de verkoper. Bestellingskoppelingen behouden het opgeslagen project en de revisie, zodat latere bewerkingen eerdere bestellingen niet ongemerkt wijzigen.
Ontwerpimports bieden ontwerpen en bestanden uit Alter-opslag aan voor externe productie- of migratieprocessen. De API controleert of het Business-plan dit toestaat.
Openbare voorbeeldbestanden zijn geschikt voor browsers. Beveiligde bestanden vereisen een ondertekende URL of API-inloggegevens met files:read. Lettertypen en valuta's zijn openbare leesendpoints.
Runtimekoppelingen verbinden externe e-commerceproducten met Alter Product-ontwerpen en runtimetypen. Ze worden vooral gebruikt voor WordPress/WooCommerce-integraties en geavanceerde winkelbackends.
Parameter
Verplicht
Details
designId
nee
ID van een Alter Product-ontwerp dat eigendom is van de winkel.
externalProductId
ja, voor synchronisatie
Extern product-ID, bijvoorbeeld een WooCommerce-product-ID.
runtimeType
ja, voor synchronisatie
viewer, configurator of customizer.
status
nee
draft, active, inactive, archived of legacy_active.
legacyStorefrontProductId
nee
Optioneel ID van een oude koppeling.
legacyBindingMeta
nee
Optionele JSON-metadata, bijvoorbeeld 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'}}}]})});
Het WordPress-uitwisselingsendpoint gebruikt een eenmalige overdrachtscode en retourneert API-inloggegevens aan de plug-in. Het is geen algemeen endpoint voor het aanmaken van inloggegevens.
De meeste controllerfouten worden omgezet in een code-antwoord. Authenticatiemiddleware en verzoekbegrenzers kunnen in plaats daarvan een error-antwoord geven.
// Controller error{"code":"assetCatalog.invalidType"}// Auth middleware or rate limit{"error":"Unauthorized"}{"error":"Too Many Requests"}