La API pública está diseñada para integraciones de servidor a servidor con tiendas, backends de comercio electrónico, plugins de WordPress/WooCommerce y procesos externos de producción.
Crea las credenciales API en el panel de ajustes de comercio electrónico. Access Token se muestra una sola vez, así que guárdalo inmediatamente en el almacén de secretos de tu backend.
Guarda Access Key y Access Token en tu servidor. Los endpoints autenticados rechazan llamadas desde el navegador que incluyan cabeceras Origin o Referer.
Las credenciales pueden tener ámbitos limitados. Usa GET /auth/check para verificar la tienda activa, las funciones del plan y los ámbitos devueltos para la credencial.
Los demás ejemplos utilizan la función auxiliar siguiente. Usa fetch estándar y puede ejecutarse en Node.js 18+ o en cualquier entorno de servidor que proporcione fetch.
La tabla siguiente refleja las rutas públicas montadas en backend-public-api/app.js. Las rutas se muestran con el prefijo del proxy público utilizado por las integraciones externas.
Método
Endpoint
Descripción
Acceso
GET
/public-api/healthz
Comprobación del estado del servicio.
público
GET
/public-api/v1/auth/check
Valida las credenciales y devuelve la tienda, los ámbitos y las funciones del plan.
cualquier credencial autenticada
GET
/public-api/v1/customer-orders
Devuelve una lista paginada y filtrable de pedidos de clientes.
orders:read
GET
/public-api/v1/customer-orders/:id
Devuelve un pedido de cliente con los artículos de producto configurados.
orders:read
POST
/public-api/v1/customer-orders/batch
Devuelve hasta 100 pedidos por ID.
orders:read
PATCH
/public-api/v1/customer-orders/:id/status
Actualiza el estado del pedido.
orders:write
PATCH
/public-api/v1/customer-orders/:orderId/quantity
Actualiza las cantidades de las líneas seleccionadas del pedido.
Los endpoints de pedidos de clientes permiten a una tienda externa leer las líneas configuradas, actualizar cantidades, cambiar los estados de tramitación y eliminar pedidos abandonados.
Parámetro
Obligatorio
Detalles
name
no
Busca por nombre del diseño e ID numérico del pedido.
category_id
no
Filtra por ID de categoría del producto.
order_status
no
Uno de los estados de pedido permitidos.
offset
no
Predeterminado: 0. Debe ser >= 0.
limit
no
Predeterminado: 9 para este controlador; máximo: 50.
order_by
no
id, created_at o design_name.
direction
no
ASC o DESC.
Ejemplo de solicitud (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]})});
Valores permitidos
Estado
Descripción
shopping_cart
Flujo del carrito; el cliente todavía puede editar la configuración.
editable
El cliente puede seguir editando el pedido.
paid
El pedido está pagado y listo para su tramitación.
Crea un token de integración de corta duración desde tu servidor, pásalo al iframe o entorno de ejecución y permite que este llame a bootstrap con un token Bearer.
Parámetro
Obligatorio
Detalles
runtimeBindingId
recomendado
Identificador preferido para vinculaciones activas de herramientas.
Los endpoints de importación del generador solo admiten solicitudes de lectura entre servidores. Requieren las cabeceras API habituales, el permiso embed:session:create y un plan activo. La autorización de importación no crea una sesión del editor ni consume su cuota mensual. La apertura del editor utiliza el mismo contador monthlyEmbedTokenLimit que las demás herramientas integradas.
Buscar e importar modelos con generador
Utiliza /model-generator/models para listar los modelos disponibles con generador. El descriptor generator fija projectId, revision, configurationId, templateRevision, productId y productModel3dId. Sigue su importPath para obtener exactamente esa revisión de origen. Los manifiestos de recursos de producto también exponen generators y el descriptor generator de cada modelo. Las plantillas se pueden importar por separado según su configuración y revisión.
Filtros de los catálogos
Endpoint
Detalles
/model-generator/models
Lista de modelos: name (o q), categoryId, scope (all, own, global), limit (1–50) y offset.
/model-generator/catalog
Catálogo de plantillas: generatorType, productId, audience, q, templateKey, configurationId, limit y offset.
/model-generator/projects
Lista de proyectos: configurationId, q, scope (all, own, global), limit y offset. El proxy público establece scope en all de forma predeterminada.
/model-generator/image-libraries/:kind/assets
Bibliotecas de texturas y fondos: kind es texture o background; q, category y mapType filtran los recursos disponibles.
La importación de un proyecto contiene document, revision, template y un manifiesto files. Cada archivo proporciona un path bajo /v1/model-generator/; antepón /public-api al descargarlo desde Alter Product. Copia los archivos necesarios a tu propio almacenamiento y sustituye las referencias de origen por referencias locales. Importa maniquíes y bibliotecas de texturas mediante sus endpoints de catálogo; public-files se limita a las rutas de recursos permitidas, y las plantillas deben superar las comprobaciones de acceso de su configuración y revisión.
Ejemplo de solicitud (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 });
Sesión del editor y almacenamiento local
Crea la sesión del editor con tool: model-generator, un toolId numérico positivo que identifique el proyecto local del generador (no su UUID ni el ID del producto WooCommerce) y el origen permitido de la tienda. No envíes designId, orderId, runtimeBindingId ni campos del carrito para esta herramienta. El UUID del proyecto del generador es un identificador independiente. Transmite el token recibido mediante el intercambio inicial del iframe; la inicialización del runtime devuelve el contexto del generador 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.
Mensajes del iframe utilizados por el puente de WordPress
El plugin de WordPress aloja el puente de almacenamiento y comprueba los permisos de administrador o gestor de WooCommerce. Valida el origen del iframe, la ventana de origen, el nonce, el identificador de solicitud y las rutas de proyecto permitidas. El puente envía las lecturas y escrituras locales a /wp-json/alter-wc/v1/model-generator. Las credenciales API permanecen en el servidor. Una integración personalizada debe implementar una gestión autenticada del almacenamiento equivalente; la API pública del generador no guarda proyectos en Alter Product.
Tipo
Descripción
ALTER_CHILD_HELLO / ALTER_PARENT_ACK
El iframe inicia el intercambio con un nonce; la página principal confirma ese mismo nonce.
El iframe solicita una sesión de edición de model-generator; la página principal devuelve el token autorizado.
ALTER_MODEL_GENERATOR_REQUEST
El iframe envía requestId, nonce y request con method, path, data y responseType.
ALTER_MODEL_GENERATOR_RESPONSE
La página principal responde con los mismos requestId y nonce, además de status, data, headers y, si procede, 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.
Al guardar se envían expectedRevision, templateRevision, document y las referencias a los artefactos. Se crea una revisión inmutable; un valor expectedRevision desactualizado devuelve HTTP 409. WordPress almacena los metadatos en su base de datos y los archivos en su directorio uploads. El JSON se minifica y se comprime con gzip cuando la compresión reduce su tamaño.
// 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'}};
Usar el modelo guardado en el diseño publica una revisión guardada completa en un diseño de producto vinculado. Los clientes la ven después mediante el Customizer, Configurator o Viewer existente, con las vinculaciones de producto y las comprobaciones de suscripción habituales. El editor del generador sigue siendo una herramienta para el comerciante. Los enlaces de los pedidos conservan el proyecto y la revisión guardados para que los cambios posteriores no alteren los pedidos anteriores sin aviso.
El catálogo de recursos ofrece recursos originales de productos, fondos, entornos, elementos de la biblioteca gráfica, plantillas de diseño y recursos de mockups. Los endpoints de listas devuelven descriptores ligeros; los de detalles incluyen manifiestos de archivos.
Tipo
Descripción
products
Recursos de productos base, vistas previas, modelos 3D y descriptores de materiales y texturas.
backgrounds
Fondos estáticos de Viewer.
environments
Mapas de entorno e imágenes de vista previa.
image_library
Recursos de la biblioteca gráfica, incluidos gráficos específicos de la tienda.
design_templates
Vistas previas de plantillas de diseño y referencias a archivos de capas. Admite el filtro product_id.
mockups
Recursos del generador de mockups, fondos y mapas de superposición. Admite el filtro product_id.
Las importaciones de diseños proporcionan diseños alojados en Alter y sus archivos para procesos externos de producción o migración. La API comprueba la elegibilidad del plan Business.
Los archivos públicos de vista previa pueden usarse en el navegador. Los archivos protegidos requieren una URL firmada o una credencial API con files:read. Fuentes y monedas son endpoints públicos de lectura.
Las vinculaciones de herramientas conectan productos de comercio electrónico externos con diseños de Alter Product y tipos de herramientas. Se usan principalmente en integraciones de WordPress/WooCommerce y backends avanzados de tiendas.
Parámetro
Obligatorio
Detalles
designId
no
ID de diseño de Alter Product que pertenece a la tienda.
externalProductId
sí para sincronización
ID de producto externo, por ejemplo, un ID de producto de WooCommerce.
runtimeType
sí para sincronización
viewer, configurator o customizer.
status
no
draft, active, inactive, archived o legacy_active.
legacyStorefrontProductId
no
ID opcional de correspondencia heredada.
legacyBindingMeta
no
Metadatos JSON opcionales, por ejemplo, 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'}}}]})});
El endpoint de intercambio de conexión de WordPress consume un código de transferencia de un solo uso y devuelve credenciales API al plugin. No es un endpoint de creación de credenciales de uso general.
La mayoría de los errores de controladores se normalizan como una respuesta code. El middleware de autenticación y los limitadores de solicitudes pueden devolver una respuesta error en su lugar.
// Controller error{"code":"assetCatalog.invalidType"}// Auth middleware or rate limit{"error":"Unauthorized"}{"error":"Too Many Requests"}
Tipo
Límite
Intervalo
Global
600 solicitudes
60 segundos
GET /auth/check
60 solicitudes
60 segundos
Lectura de pedidos/productos
300 solicitudes
60 segundos
Escritura de pedidos/sesiones de integración/vinculaciones de herramientas