Public API призначений для міжсерверних інтеграцій із магазинами, комерційними серверними системами, плагінами WordPress/WooCommerce та зовнішніми виробничими процесами.
Створіть облікові дані API на панелі налаштувань електронної комерції. Access Token показується лише раз, тому одразу збережіть його в серверному сховищі секретів.
Зберігайте Access Key і Access Token на сервері. Кінцеві точки з автентифікацією відхиляють браузерні виклики із заголовками Origin або Referer.
Права облікових даних можна обмежувати. Використовуйте GET /auth/check, щоб перевірити активний магазин, можливості тарифу та права, повернені для цих облікових даних.
Наведена нижче допоміжна функція використовується в інших прикладах. Це звичайний fetch, який може працювати в Node.js 18+ або будь-якому серверному середовищі з підтримкою fetch.
Таблиця нижче відповідає публічним маршрутам, підключеним у backend-public-api/app.js. Шляхи наведено з префіксом публічного проксі для зовнішніх інтеграцій.
Метод
Кінцева точка
Опис
Доступ
GET
/public-api/healthz
Перевірка стану сервісу.
публічний
GET
/public-api/v1/auth/check
Перевіряє облікові дані й повертає магазин, права доступу та можливості тарифу.
будь-які автентифіковані облікові дані
GET
/public-api/v1/customer-orders
Повертає список замовлень покупців із пагінацією та фільтрами.
orders:read
GET
/public-api/v1/customer-orders/:id
Повертає одне замовлення покупця з налаштованими товарними позиціями.
Кінцеві точки замовлень дозволяють зовнішньому магазину читати налаштовані позиції, змінювати кількість, переводити замовлення між станами виконання та видаляти покинуті замовлення.
Параметр
Обов’язково
Подробиці
name
ні
Шукає за назвою дизайну та числовим ID замовлення.
category_id
ні
Фільтрує за ID категорії товару.
order_status
ні
Один із дозволених станів замовлення.
offset
ні
Типово 0. Має бути >= 0.
limit
ні
Типово 9 для цього контролера, максимум 50.
order_by
ні
id, created_at або design_name.
direction
ні
ASC або DESC.
Приклад запиту (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]})});
Дозволені значення
Стан
Опис
shopping_cart
Замовлення в кошику; покупець ще може редагувати конфігурацію.
Створіть короткостроковий токен вбудовування на сервері, передайте його iframe/середовищу виконання, а потім дозвольте середовищу викликати bootstrap із токеном Bearer.
Параметр
Обов’язково
Подробиці
runtimeBindingId
рекомендовано
Бажаний ідентифікатор активних прив’язок середовища виконання.
Ендпоїнти імпорту генератора підтримують лише читання під час обміну між серверами. Вони потребують стандартних заголовків API, дозволу embed:session:create й активного тарифу. Авторизація імпорту не створює сеанс редактора й не витрачає його місячний ліміт. Відкриття редактора використовує той самий лічильник monthlyEmbedTokenLimit, що й решта вбудованих інструментів.
Пошук та імпорт моделей із генератором
Використовуйте /model-generator/models, щоб отримати перелік доступних моделей із генераторами. Дескриптор generator фіксує projectId, revision, configurationId, templateRevision, productId і productModel3dId. Перейдіть за його importPath, щоб отримати саме цю вихідну ревізію. Маніфести ресурсів товару також надають generators і дескриптор generator для кожної моделі. Шаблони можна імпортувати окремо за конфігурацією та ревізією.
Фільтри каталогів
Кінцева точка
Подробиці
/model-generator/models
Перелік моделей: name (або q), categoryId, scope (all, own, global), limit (1–50) і offset.
/model-generator/catalog
Каталог шаблонів: generatorType, productId, audience, q, templateKey, configurationId, limit і offset.
/model-generator/projects
Перелік проєктів: configurationId, q, scope (all, own, global), limit і offset. Публічний проксі за замовчуванням використовує scope all.
/model-generator/image-libraries/:kind/assets
Бібліотеки текстур і фонів: kind має значення texture або background; q, category і mapType фільтрують доступні ресурси.
Імпорт проєкту містить document, revision, template і маніфест files. Кожен файл надає path у просторі /v1/model-generator/; під час завантаження з Alter Product додайте перед ним /public-api. Скопіюйте потрібні файли до власного сховища та замініть вихідні посилання локальними. Імпортуйте манекени й бібліотеки текстур через їхні ендпоїнти каталогів; public-files допускає лише дозволені шляхи ресурсів, а шаблони проходять перевірку доступу до конфігурації та ревізії.
Приклад запиту (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 });
Сеанс редактора й локальне зберігання
Створіть сеанс редактора з tool: model-generator, додатним числовим toolId локального проєкту генератора (не його UUID чи ID товару WooCommerce) і дозволеним origin магазину. Не передавайте designId, orderId, runtimeBindingId або поля кошика для цього інструмента. UUID проєкту генератора — окремий ідентифікатор. Передайте отриманий токен через handshake iframe; runtime bootstrap поверне контекст генератора зі 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 для зв’язку з WordPress
Плагін WordPress забезпечує зв’язок із локальним сховищем і перевіряє права адміністратора або менеджера WooCommerce. Він перевіряє origin iframe, вихідне вікно, nonce, ідентифікатор запиту й дозволені шляхи проєкту. Локальні операції читання та запису спрямовуються до /wp-json/alter-wc/v1/model-generator. Облікові дані API залишаються на сервері. Власна інтеграція має реалізувати рівноцінну обробку зберігання з автентифікацією; публічний API генератора не зберігає проєкти в Alter Product.
Тип
Опис
ALTER_CHILD_HELLO / ALTER_PARENT_ACK
Дочірній iframe починає handshake з nonce; батьківська сторінка підтверджує той самий nonce.
Дочірній iframe надсилає requestId, nonce і request, що містить method, path, data та responseType.
ALTER_MODEL_GENERATOR_RESPONSE
Батьківська сторінка відповідає з тими самими requestId і nonce, а також полями status, data, headers та 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.
Під час збереження передаються expectedRevision, templateRevision, document і посилання на артефакти. Створюється незмінна ревізія; застарілий expectedRevision повертає HTTP 409. WordPress зберігає метадані у своїй базі даних, а файли — у каталозі uploads. JSON мініфікується та стискається за допомогою gzip, якщо стиснення зменшує його розмір.
// 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'}};
Дія «Використати збережену модель у дизайні» публікує повну збережену ревізію в пов’язаному дизайні. Покупці бачать її через наявний Customizer, Configurator або Viewer зі звичними прив’язками товару й перевірками підписки. Редактор генератора залишається інструментом продавця. Посилання в замовленнях зберігають проєкт і ревізію, тому подальші правки не змінюють попередні замовлення автоматично.
Каталог ресурсів надає вихідні ресурси товарів, фони, оточення, елементи графічної бібліотеки, шаблони дизайнів і ресурси мокапів. Кінцеві точки списків повертають короткі описи, а детальні кінцеві точки — маніфести файлів.
Тип
Опис
products
Базові ресурси товарів, зображення перегляду, 3D-моделі, описи матеріалів і текстур.
backgrounds
Статичні фони Viewer.
environments
Карти оточення й зображення перегляду.
image_library
Ресурси графічної бібліотеки, зокрема графіка для певного магазину.
design_templates
Перегляди шаблонів дизайнів і посилання на файли шарів. Підтримує фільтр product_id.
mockups
Ресурси генератора мокапів, фони й карти накладання. Підтримує фільтр product_id.
Імпорт дизайнів надає доступ до дизайнів, розміщених в Alter, та їхніх файлів для зовнішніх виробничих процесів або міграції. API перевіряє наявність відповідного тарифу Business.
Публічні файли перегляду зручні для браузера. Захищені файли потребують підписаної URL-адреси або облікових даних API з files:read. Шрифти й валюти доступні через публічні кінцеві точки читання.
Прив’язки середовища виконання поєднують товари зовнішніх магазинів із дизайнами Alter Product і типами інструментів. Їх переважно використовують інтеграції WordPress/WooCommerce та складні серверні системи магазинів.
Параметр
Обов’язково
Подробиці
designId
ні
ID дизайну Alter Product, що належить магазину.
externalProductId
так, для синхронізації
ID зовнішнього товару, наприклад ID товару WooCommerce.
runtimeType
так, для синхронізації
viewer, configurator або customizer.
status
ні
draft, active, inactive, archived або legacy_active.
legacyStorefrontProductId
ні
Необов’язковий ID застарілого зіставлення.
legacyBindingMeta
ні
Необов’язкові метадані JSON, наприклад 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'}}}]})});
Кінцева точка обміну підключення WordPress приймає одноразовий код передачі й повертає плагіну облікові дані API. Вона не призначена для довільного створення облікових даних.
Більшість помилок контролерів нормалізуються у відповідь із code. Проміжні обробники автентифікації та обмеження частоти можуть натомість повертати відповідь із error.
// Controller error{"code":"assetCatalog.invalidType"}// Auth middleware or rate limit{"error":"Unauthorized"}{"error":"Too Many Requests"}
Тип
Ліміт
Інтервал
Глобальний
600 запитів
60 секунд
GET /auth/check
60 запитів
60 секунд
Читання замовлень/товарів
300 запитів
60 секунд
Запис замовлень/сеанси вбудовування/прив’язки середовища виконання