API - Огляд

API - Генератор 3D-моделей

Імпортуйте моделі й шаблони, запускайте генератор та обробляйте обмін повідомленнями й збереження проєктів.

Огляд кінцевих точок

МетодКінцева точкаОписДоступ
GET/public-api/v1/model-generator/catalogВиводить видимі товари генератора, конфігурації та ревізії шаблонів.embed:session:create
GET/public-api/v1/model-generator/modelsВиводить моделі з дескрипторами, що фіксують вихідні ревізії генератора для імпорту.embed:session:create
GET/public-api/v1/model-generator/designer-catalogПовертає каталог моделей генератора, який використовує Designer.embed:session:create
GET/public-api/v1/model-generator/projectsВиводить проєкти генератора власника й глобально доступні проєкти.embed:session:create
GET/public-api/v1/model-generator/projects/:projectIdПовертає найновішу або вибрану ревізію проєкту, шаблон і маніфест файлів.embed:session:create
GET/public-api/v1/model-generator/projects/:projectId/revisions/:revisionПовертає найновішу або вибрану ревізію проєкту, шаблон і маніфест файлів.embed:session:create
GET/public-api/v1/model-generator/projects/:projectId/artifacts/:artifactIdЗавантажує артефакт після перевірки доступу до його проєкту.embed:session:create
GET/public-api/v1/model-generator/configurations/:configurationId/revisions/:revision/templateПовертає доступний документ шаблону для вибраної ревізії конфігурації.embed:session:create
GET/public-api/v1/model-generator/configurations/:configurationId/revisions/:revision/importПовертає пакет імпорту шаблону з файлами залежностей.embed:session:create
GET/public-api/v1/model-generator/mannequinsПовертає обидва манекени та дескриптори їхніх ресурсів.embed:session:create
GET/public-api/v1/model-generator/image-libraries/:kind/assetsВиводить ресурси бібліотеки текстур або фонів із файлами для імпорту.embed:session:create
GET/public-api/v1/model-generator/image-libraries/:kind/assets/:assetIdПовертає один ресурс текстури або фону з файлами для імпорту.embed:session:create
GET/public-api/v1/model-generator/public-files/:keyЗавантажує дозволений файл залежності генератора.embed:session:create

Генератор 3D-моделей

Ендпоїнти імпорту генератора підтримують лише читання під час обміну між серверами. Вони потребують стандартних заголовків 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 alterFetch and authHeaders from the API connection guide.
const catalog = await alterFetch('/model-generator/models?' + new URLSearchParams({
  scope: 'all', limit: '24', offset: '0'
}));

const selected = catalog.items[0];
if (!selected?.generator) throw new Error('Select an available generator model');

const importPath = selected.generator.importPath;
if (!importPath.startsWith('/v1/model-generator/projects/')) {
  throw new Error('Invalid generator import path');
}
const bundle = await alterFetch(importPath.slice('/v1'.length));

for (const file of bundle.files) {
  if (!file.path.startsWith('/v1/model-generator/')) {
    throw new Error('Invalid generator file path');
  }
  const response = await fetch('https://alterproduct.com/public-api' + file.path, {
    headers: authHeaders,
    redirect: 'error'
  });
  if (!response.ok) throw new Error(`File download failed: ${response.status}`);
  const bytes = new Uint8Array(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 = await alterFetch('/assets/products/' + selected.generator.productId);
const mannequins = await alterFetch('/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 = await alterFetch('/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 = await fetch('https://alterproduct.com/public-api/v1/runtime/bootstrap', {
  headers: { Authorization: `Bearer ${session.token}` }
});
if (!bootstrapResponse.ok) throw new Error('Generator bootstrap failed');
const context = await bootstrapResponse.json();
console.log(context);

Приклад відповіді

{
  "runtimeBindingId": null,
  "designId": null,
  "productId": 42,
  "toolId": 42,
  "runtimeType": "model-generator",
  "storageMode": "wordpress_local",
  "parentOrigin": "https://yourstore.com"
}
// Host page: WordPress returns a numeric toolId and a UUID in id.
const url = new URL('https://alterproduct.com/app/model-generator');
url.search = new URLSearchParams({
  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.
ALTER_CUSTOMIZER_INIT_SESSION / ALTER_CUSTOMIZER_SESSION_READYДочірній iframe запитує сеанс редагування model-generator; батьківська сторінка повертає авторизований токен.
ALTER_MODEL_GENERATOR_REQUESTДочірній 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 зі звичними прив’язками товару й перевірками підписки. Редактор генератора залишається інструментом продавця. Посилання в замовленнях зберігають проєкт і ревізію, тому подальші правки не змінюють попередні замовлення автоматично.