L’API publique est conçue pour les intégrations de serveur à serveur avec les boutiques, les systèmes e-commerce, les extensions WordPress/WooCommerce et les processus de production externes.
Créez des identifiants API dans le panneau des paramètres e-commerce. Le jeton d’accès n’est affiché qu’une fois : enregistrez-le immédiatement dans le stockage sécurisé des secrets de votre serveur.
Conservez la clé d’accès et le jeton d’accès sur votre serveur. Les points d’accès authentifiés rejettent les appels provenant du navigateur qui incluent les en-têtes Origin ou Referer.
Les identifiants peuvent avoir des portées limitées. Utilisez GET /auth/check pour vérifier la boutique active, les fonctionnalités de l’offre et les portées renvoyées pour l’identifiant.
La fonction utilitaire ci-dessous est utilisée dans les exemples suivants. Elle repose sur fetch natif et peut s’exécuter dans Node.js 18+ ou dans tout environnement serveur fournissant fetch.
Le tableau ci-dessous reprend les routes publiques déclarées dans backend-public-api/app.js. Les chemins sont affichés avec le préfixe du proxy public utilisé par les intégrations externes.
Méthode
Point d’accès
Description
Accès
GET
/public-api/healthz
Vérification de la disponibilité du service.
public
GET
/public-api/v1/auth/check
Valide les identifiants et renvoie la boutique, les portées et les fonctionnalités de l’offre.
tout identifiant authentifié
GET
/public-api/v1/customer-orders
Renvoie une liste paginée et filtrable des commandes clients.
orders:read
GET
/public-api/v1/customer-orders/:id
Renvoie une commande client avec ses articles configurés.
orders:read
POST
/public-api/v1/customer-orders/batch
Renvoie jusqu’à 100 commandes par identifiant.
orders:read
PATCH
/public-api/v1/customer-orders/:id/status
Met à jour le statut de la commande.
orders:write
PATCH
/public-api/v1/customer-orders/:orderId/quantity
Met à jour les quantités des lignes de commande sélectionnées.
Les points d’accès des commandes clients permettent à une boutique externe de lire les lignes configurées, de modifier les quantités, de faire évoluer les statuts de traitement d’une commande et de supprimer les commandes abandonnées.
Paramètre
Obligatoire
Détails
name
non
Recherche le nom du design et l’identifiant numérique de la commande.
category_id
non
Filtre par identifiant de catégorie de produit.
order_status
non
L’un des statuts de commande autorisés.
offset
non
Valeur par défaut : 0. Doit être >= 0.
limit
non
Valeur par défaut pour ce contrôleur : 9, maximum : 50.
order_by
non
id, created_at ou design_name.
direction
non
ASC ou DESC.
Exemple de requête (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]})});
Valeurs autorisées
Statut
Description
shopping_cart
Parcours du panier ; le client peut encore modifier la configuration.
Créez un jeton d’intégration de courte durée depuis votre serveur, transmettez-le à l’iframe ou à l’environnement d’exécution, puis laissez ce dernier appeler le point d’initialisation avec un jeton Bearer.
Paramètre
Obligatoire
Détails
runtimeBindingId
recommandé
Identifiant à privilégier pour les associations d’exécution actives.
Les points de terminaison d’import du générateur n’acceptent que les requêtes en lecture entre serveurs. Ils nécessitent les en-têtes API habituels, le scope embed:session:create et un abonnement actif. L’autorisation d’import ne crée pas de session d’édition et ne consomme pas son quota mensuel. L’ouverture de l’éditeur utilise le même compteur monthlyEmbedTokenLimit que les autres outils intégrés.
Rechercher et importer des modèles avec générateur
Utilisez /model-generator/models pour lister les modèles disponibles dotés d’un générateur. Le descripteur generator fixe projectId, revision, configurationId, templateRevision, productId et productModel3dId. Suivez son importPath pour récupérer exactement cette révision source. Les manifestes des ressources produit exposent aussi generators et le descripteur generator de chaque modèle. Les gabarits peuvent être importés séparément selon leur configuration et leur révision.
Filtres des catalogues
Point d’accès
Détails
/model-generator/models
Liste des modèles : name (ou q), categoryId, scope (all, own, global), limit (1–50) et offset.
/model-generator/catalog
Catalogue des gabarits : generatorType, productId, audience, q, templateKey, configurationId, limit et offset.
/model-generator/projects
Liste des projets : configurationId, q, scope (all, own, global), limit et offset. Le proxy public définit scope sur all par défaut.
/model-generator/image-libraries/:kind/assets
Bibliothèques de textures et d’arrière-plans : kind vaut texture ou background ; q, category et mapType filtrent les ressources disponibles.
Un import de projet contient document, revision, template et un manifeste files. Chaque fichier fournit un path sous /v1/model-generator/ ; ajoutez /public-api devant ce chemin pour le télécharger depuis Alter Product. Copiez les fichiers nécessaires dans votre propre espace de stockage et remplacez les références sources par des références locales. Importez les mannequins et les bibliothèques de textures via leurs points de terminaison de catalogue ; public-files n’autorise que certains chemins de ressources, et les gabarits restent soumis aux contrôles d’accès de leur configuration et de leur révision.
Exemple de requête (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 });
Session d’édition et stockage local
Créez la session d’édition avec tool: model-generator, un toolId numérique positif identifiant le projet local du générateur (et non son UUID ni l’ID du produit WooCommerce), ainsi que l’origine autorisée de la boutique. Ne transmettez pas designId, orderId, runtimeBindingId ni les champs du panier pour cet outil. L’UUID du projet du générateur est un identifiant distinct. Transmettez le jeton reçu via la négociation iframe ; l’initialisation du runtime renvoie le contexte du générateur avec 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.
Messages iframe utilisés par la passerelle WordPress
L’extension WordPress héberge la passerelle de stockage et vérifie les droits d’administrateur ou de gestionnaire WooCommerce. Elle valide l’origine de l’iframe, la fenêtre source, le nonce, l’identifiant de requête et les chemins de projet autorisés. La passerelle transmet les lectures et écritures locales à /wp-json/alter-wc/v1/model-generator. Les identifiants API restent sur le serveur. Une intégration personnalisée doit fournir un traitement du stockage authentifié équivalent ; l’API publique du générateur n’enregistre pas les projets sur Alter Product.
Type
Description
ALTER_CHILD_HELLO / ALTER_PARENT_ACK
L’iframe commence la négociation avec un nonce ; la page parente confirme ce même nonce.
L’iframe demande une session d’édition model-generator ; la page parente renvoie le jeton autorisé.
ALTER_MODEL_GENERATOR_REQUEST
L’iframe envoie requestId, nonce et request contenant method, path, data et responseType.
ALTER_MODEL_GENERATOR_RESPONSE
La page parente répond avec les mêmes requestId et nonce, ainsi que status, data, headers et, le cas échéant, 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.
Un enregistrement transmet expectedRevision, templateRevision, document et les références aux artefacts. Il crée une révision immuable ; une valeur expectedRevision obsolète renvoie HTTP 409. WordPress stocke les métadonnées dans sa base de données et les fichiers dans son répertoire uploads. Le JSON est minifié et compressé avec gzip lorsque la compression réduit sa taille.
// 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'}};
Utiliser le modèle enregistré dans le design publie une révision enregistrée complète dans un design produit lié. Les clients la voient ensuite via les outils Customizer, Configurator ou Viewer existants, avec les associations produit et les contrôles d’abonnement habituels. L’éditeur du générateur reste un outil réservé au marchand. Les liens des commandes conservent le projet et la révision enregistrés afin que les modifications ultérieures ne changent pas discrètement les commandes passées.
Le catalogue de ressources expose les ressources sources des produits, les arrière-plans, les environnements, les éléments de la bibliothèque graphique, les modèles de design et les ressources des maquettes. Les points d’accès de liste renvoient des descripteurs légers ; ceux de détail incluent les manifestes des fichiers.
Type
Description
products
Ressources de produits de base, aperçus, modèles 3D, descripteurs de matériaux et de textures.
backgrounds
Arrière-plans statiques de Viewer.
environments
Cartes d’environnement et images d’aperçu.
image_library
Ressources de la bibliothèque graphique, y compris les images propres à la boutique.
design_templates
Aperçus des modèles de design et références des fichiers de calques. Prend en charge le filtre product_id.
mockups
Ressources du générateur de maquettes, arrière-plans et cartes de superposition. Prend en charge le filtre product_id.
Les imports de designs donnent accès aux designs hébergés chez Alter et à leurs fichiers pour les processus de production ou de migration externes. L’API vérifie l’éligibilité à l’offre Business.
Les fichiers d’aperçu publics sont directement utilisables dans le navigateur. Les fichiers protégés nécessitent une URL signée ou un identifiant API doté de la portée files:read. Les polices et les devises sont accessibles via des points de lecture publics.
Les associations d’exécution relient les produits commerciaux externes aux designs Alter Product et aux types d’outils. Elles sont principalement utilisées par les intégrations WordPress/WooCommerce et les systèmes e-commerce avancés.
Paramètre
Obligatoire
Détails
designId
non
Identifiant du design Alter Product appartenant à la boutique.
externalProductId
oui pour la synchronisation
Identifiant du produit externe, par exemple celui d’un produit WooCommerce.
runtimeType
oui pour la synchronisation
viewer, configurator ou customizer.
status
non
draft, active, inactive, archived ou legacy_active.
legacyStorefrontProductId
non
Identifiant d’association historique facultatif.
legacyBindingMeta
non
Métadonnées JSON facultatives, par exemple 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'}}}]})});
Le point d’accès d’échange de connexion WordPress consomme un code de transfert à usage unique et renvoie des identifiants API à l’extension. Il ne s’agit pas d’un point d’accès général de création d’identifiants.
La plupart des erreurs des contrôleurs sont normalisées en réponses code. Les intergiciels d’authentification et les limiteurs de requêtes peuvent renvoyer une réponse error à la place.
// Controller error{"code":"assetCatalog.invalidType"}// Auth middleware or rate limit{"error":"Unauthorized"}{"error":"Too Many Requests"}
Type
Limite
Période
Global
600 requêtes
60 secondes
GET /auth/check
60 requêtes
60 secondes
Lecture des commandes/produits
300 requêtes
60 secondes
Écriture des commandes/sessions d’intégration/associations d’exécution