Публичный API предназначен для серверных интеграций с магазинами, торговыми системами, плагинами WordPress/WooCommerce и внешними производственными процессами.
Создайте учётные данные API в настройках интернет-магазина. Токен доступа показывается только один раз, поэтому сразу сохраните его в защищённом хранилище секретов на сервере.
Храните ключ и токен доступа на своём сервере. Конечные точки с аутентификацией отклоняют вызовы из браузера с заголовками 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 или среду выполнения, затем позвольте среде вызвать инициализацию с токеном 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 секунд
Запись заказов/сеансы встраивания/привязки среды выполнения