Integrace veřejného API Alter Product

Veřejné API je určeno pro integraci mezi servery s obchody, backendy e-shopů, pluginy WordPress/WooCommerce a externími výrobními procesy.

Ověření a základní URL

https://alterproduct.com/public-api/v1

Přístupové údaje API vytvořte v panelu nastavení e-shopu. Access Token se zobrazí pouze jednou, proto jej ihned uložte do úložiště tajných údajů na backendu.

Uchovávejte Access Key a Access Token na svém serveru. Koncové body vyžadující ověření odmítají volání z prohlížeče obsahující hlavičky Origin nebo Referer.

Přístupové údaje mohou mít omezené rozsahy oprávnění. Pomocí GET /auth/check ověřte aktivní obchod, možnosti tarifu a rozsahy vrácené pro dané přístupové údaje.

x-alter-access-key: YOUR_API_KEY
x-alter-access-token: YOUR_API_TOKEN
ParametrPovinnéPodrobnosti
x-alter-access-keyanoVeřejný identifikátor přístupových údajů.
x-alter-access-tokenanoTajný token spárovaný s přístupovým klíčem.
x-alter-client-fingerprintneVolitelný stabilní otisk pro omezení počtu relací vložených nástrojů.
Authorizationpouze běhové prostředíToken Bearer vrácený voláním POST /embed/session, používaný v /runtime/bootstrap.

Test připojení

Před zapnutím synchronizace nebo vložených nástrojů v produkční integraci použijte koncový bod kontroly ověření.

GET https://alterproduct.com/public-api/v1/auth/check

Příklad požadavku (fetch)

const response = await fetch('https://alterproduct.com/public-api/v1/auth/check', {
  method: 'GET',
  headers: {
    'x-alter-access-key': process.env.ALTER_ACCESS_KEY,
    'x-alter-access-token': process.env.ALTER_ACCESS_TOKEN
  }
});

const payload = await response.json();

if (!response.ok) {
  throw new Error(payload?.code || payload?.error || `Alter API ${response.status}`);
}

console.log(payload);

Příklad odpovědi

{
  "ok": true,
  "message": "success",
  "storefrontId": 12,
  "userOwnerId": 34,
  "credentialId": 56,
  "scopes": ["orders:read", "orders:write", "products:read"],
  "plan": {
    "requiredPlan": "Business",
    "currentPlanName": "Business",
    "eligible": true,
    "runtimeFlags": {
      "viewer": true,
      "configurator": true,
      "customizer": true
    },
    "limits": {
      "activeRuntimeBindingsLimit": 100,
      "monthlyReassignmentLimit": 1000,
      "monthlyEmbedTokenLimit": 50000
    }
  }
}

Níže uvedenou pomocnou funkci používají i zbývající příklady. Jde o běžný fetch a může běžet v Node.js 18+ nebo v libovolném serverovém prostředí s podporou fetch.

const ALTER_API_BASE = 'https://alterproduct.com/public-api/v1';

const authHeaders = {
  'x-alter-access-key': process.env.ALTER_ACCESS_KEY,
  'x-alter-access-token': process.env.ALTER_ACCESS_TOKEN
};

async function alterFetch(path, options = {}) {
  const response = await fetch(`${ALTER_API_BASE}${path}`, {
    ...options,
    headers: {
      ...authHeaders,
      ...(options.body ? { 'Content-Type': 'application/json' } : {}),
      ...options.headers
    }
  });

  const payload = await response.json().catch(() => null);

  if (!response.ok) {
    throw new Error(payload?.code || payload?.error || `Alter API ${response.status}`);
  }

  return payload;
}

Přehled koncových bodů

Následující tabulka odpovídá veřejným trasám připojeným v backend-public-api/app.js. Cesty obsahují veřejný prefix proxy používaný externími integracemi.

MetodaKoncový bodPopisPřístup
GET/public-api/healthzKontrola dostupnosti služby.veřejný
GET/public-api/v1/auth/checkOvěřuje přístupové údaje a vrací obchod, rozsahy oprávnění a možnosti tarifu.libovolné ověřené přístupové údaje
GET/public-api/v1/customer-ordersVrací stránkovaný a filtrovatelný seznam objednávek zákazníků.orders:read
GET/public-api/v1/customer-orders/:idVrací jednu objednávku zákazníka s nakonfigurovanými položkami produktů.orders:read
POST/public-api/v1/customer-orders/batchVrací až 100 objednávek podle ID.orders:read
PATCH/public-api/v1/customer-orders/:id/statusAktualizuje stav objednávky.orders:write
PATCH/public-api/v1/customer-orders/:orderId/quantityAktualizuje množství vybraných položek objednávky.orders:write
PATCH/public-api/v1/customer-orders/:orderId/quantity/allNastavuje stejné množství pro každou položku objednávky.orders:write
DELETE/public-api/v1/customer-orders/:idOdstraňuje objednávku zákazníka patřící vlastníkovi obchodu.orders:write
GET/public-api/v1/productsVrací produkty/návrhy obchodu s dostupností vložení a URL médií.products:read
GET/public-api/v1/products/:idVrací jeden produkt/návrh obchodu.products:read
POST/public-api/v1/embed/sessionVydává krátkodobý JWT pro vložené nástroje, včetně generátoru modelů.embed:session:create
GET/public-api/v1/runtime/bootstrapZjišťuje kontext běhového prostředí z JWT vloženého nástroje.token vloženého nástroje Bearer
GET/public-api/v1/assetsVypisuje položky katalogu podkladů požadovaného typu.libovolné ověřené přístupové údaje
GET/public-api/v1/assets/:type/:assetIdVrací manifest podkladu s rolemi souborů ke stažení.libovolné ověřené přístupové údaje
GET/public-api/v1/assets/:type/:assetId/files/:roleStahuje soubor podkladu podle role.libovolné ověřené přístupové údaje
GET/public-api/v1/design-importsVypisuje návrhy hostované v Alter Product, které lze importovat.ověřené přístupové údaje, vyžadován tarif Business
GET/public-api/v1/design-imports/:idVrací data importu návrhu a popisy souborů.ověřené přístupové údaje, vyžadován tarif Business
GET/public-api/v1/design-imports/:id/files/:fileIdStahuje soubor z popisu importu návrhu.ověřené přístupové údaje, vyžadován tarif Business
GET/public-api/v1/file/public/products/:productId/:sizeVrací veřejný náhled produktu. Size musí být small.png, medium.png nebo big.png.veřejný
GET/public-api/v1/file/protected/:keyVrací chráněný soubor podle klíče úložiště.podepsané URL nebo files:read
GET/public-api/v1/fontsVrací všechna dostupná písma.veřejný
GET/public-api/v1/currenciesVrací všechny měny.veřejný
POST/public-api/v1/runtime-bindings/sync-from-wordpressVytváří nebo aktualizuje vazby běhového prostředí podle propojení produktů WordPressu.libovolné ověřené přístupové údaje
PATCH/public-api/v1/runtime-bindings/:idAktualizuje vazbu běhového prostředí.libovolné ověřené přístupové údaje
POST/public-api/v1/runtime-bindings/:id/activateAktivuje vazbu běhového prostředí.libovolné ověřené přístupové údaje
POST/public-api/v1/runtime-bindings/:id/deactivateDeaktivuje vazbu běhového prostředí.libovolné ověřené přístupové údaje
POST/public-api/v1/wp-connect/exchangeVyměňuje předávací kód automatického připojení WordPressu za přístupové údaje API.jednorázový předávací kód
GET/public-api/v1/model-generator/catalogZobrazuje viditelné produkty generátoru, konfigurace a revize šablon.embed:session:create
GET/public-api/v1/model-generator/modelsZobrazuje modely s deskriptory určujícími konkrétní zdrojové revize generátoru pro import.embed:session:create
GET/public-api/v1/model-generator/designer-catalogVrací katalog modelů generátoru používaný Designerem.embed:session:create
GET/public-api/v1/model-generator/projectsZobrazuje projekty generátoru vlastníka i globálně dostupné projekty.embed:session:create
GET/public-api/v1/model-generator/projects/:projectIdVrací nejnovější nebo vybranou revizi projektu, šablonu a manifest souborů.embed:session:create
GET/public-api/v1/model-generator/projects/:projectId/revisions/:revisionVrací nejnovější nebo vybranou revizi projektu, šablonu a manifest souborů.embed:session:create
GET/public-api/v1/model-generator/projects/:projectId/artifacts/:artifactIdStáhne artefakt po ověření přístupu k jeho projektu.embed:session:create
GET/public-api/v1/model-generator/configurations/:configurationId/revisions/:revision/templateVrací přístupný dokument šablony pro vybranou revizi konfigurace.embed:session:create
GET/public-api/v1/model-generator/configurations/:configurationId/revisions/:revision/importVrací balíček pro import šablony se soubory závislostí.embed:session:create
GET/public-api/v1/model-generator/mannequinsVrací obě figuríny a deskriptory jejich zdrojů.embed:session:create
GET/public-api/v1/model-generator/image-libraries/:kind/assetsZobrazuje podklady knihovny textur nebo pozadí se soubory k importu.embed:session:create
GET/public-api/v1/model-generator/image-libraries/:kind/assets/:assetIdVrací jeden podklad textury nebo pozadí se soubory k importu.embed:session:create
GET/public-api/v1/model-generator/public-files/:keyStáhne povolený soubor závislosti generátoru.embed:session:create

Objednávky zákazníků

Koncové body objednávek umožňují externímu obchodu číst nakonfigurované položky, měnit množství, posouvat objednávku mezi stavy vyřízení a odstraňovat opuštěné objednávky.

ParametrPovinnéPodrobnosti
nameneVyhledává podle názvu návrhu a číselného ID objednávky.
category_idneFiltruje podle ID kategorie produktu.
order_statusneJeden z povolených stavů objednávky.
offsetneVýchozí hodnota 0. Musí být >= 0.
limitneVýchozí hodnota tohoto řadiče je 9, maximum 50.
order_byneid, created_at nebo design_name.
directionneASC nebo DESC.

Příklad požadavku (fetch)

const params = new URLSearchParams({
  limit: '20',
  offset: '0',
  order_status: 'shopping_cart',
  order_by: 'created_at',
  direction: 'DESC'
});

const orders = await alterFetch(`/customer-orders?${params.toString()}`);

const order = await alterFetch('/customer-orders/123');

const batch = await alterFetch('/customer-orders/batch', {
  method: 'POST',
  body: JSON.stringify({
    customerOrderIds: [123, 124, 125]
  })
});

Povolené hodnoty

StavPopis
shopping_cartFáze košíku; zákazník může konfiguraci nadále upravovat.
editableObjednávku může zákazník nadále upravovat.
paidObjednávka je zaplacená a připravená k vyřízení.
processingObjednávka se vyřizuje.
completedObjednávka byla vyřízena.
cancelledObjednávka byla zrušena.

Příklad požadavku (fetch)

await alterFetch('/customer-orders/123/status', {
  method: 'PATCH',
  body: JSON.stringify({
    status: 'processing'
  })
});

await alterFetch('/customer-orders/123/quantity', {
  method: 'PATCH',
  body: JSON.stringify({
    items: [
      { orderDetailId: 987, quantity: 3 }
    ]
  })
});

await alterFetch('/customer-orders/123/quantity/all', {
  method: 'PATCH',
  body: JSON.stringify({
    quantity: 2
  })
});

await alterFetch('/customer-orders/123', {
  method: 'DELETE'
});

Příklad odpovědi

{
  "order": {
    "id": 123,
    "customizerId": 381,
    "orderStatus": "shopping_cart",
    "createdAt": "2026-05-28T10:15:00.000Z",
    "customizerOrderURL": "https://alterproduct.com/app/customizer/381/123",
    "productItems": [
      {
        "id": 987,
        "model3d": { "id": 381 },
        "size": {
          "id": 395,
          "name": { "pl": "M", "en": "M" },
          "measureSize": null
        },
        "material": {
          "id": 2,
          "name": { "pl": "Bawełna", "en": "Cotton" }
        },
        "printType": {
          "id": 1,
          "name": { "pl": "DTG", "en": "DTG" }
        },
        "color": {
          "id": 418,
          "name": { "pl": "Domyślny", "en": "Default" },
          "hex": "#ffffff"
        },
        "variant": {
          "id": 531,
          "metadata": null,
          "stockQuantity": 25
        },
        "unitPrice": { "value": 12.5, "currency": "EUR" },
        "totalPrice": { "value": 37.5, "currency": "EUR" },
        "quantity": 3
      }
    ],
    "customizerName": "Men's T-Shirt",
    "productGroup": {
      "id": 4,
      "name": { "pl": "Koszulka", "en": "T-Shirt" }
    },
    "totalPrice": { "value": 37.5, "currency": "EUR" }
  }
}

Produkty obchodu

Koncové body produktů vracejí návrhy obchodu, které lze vložit jako Viewer, Configurator nebo Customizer.

ParametrPovinnéPodrobnosti
nameneVyhledává podle názvu produktu/návrhu.
customizernetrue nebo false.
offsetneVýchozí hodnota 0. Musí být >= 0.
limitneVýchozí hodnota 9, maximum 50.
order_byneid, name nebo created_at.
directionneASC nebo DESC.

Příklad požadavku (fetch)

const params = new URLSearchParams({
  limit: '20',
  offset: '0',
  name: 't-shirt',
  customizer: 'true',
  order_by: 'created_at',
  direction: 'DESC'
});

const products = await alterFetch(`/products?${params.toString()}`);
const product = await alterFetch('/products/381');

Příklad odpovědi

{
  "products": {
    "items": [
      {
        "id": 381,
        "name": "Men's T-Shirt",
        "createdAt": "2026-01-03T23:55:05.000Z",
        "productId": 4,
        "media": {
          "img": {
            "big": "https://alterproduct.com/public-api/v1/file/public/products/4/big.png",
            "medium": "https://alterproduct.com/public-api/v1/file/public/products/4/medium.png",
            "small": "https://alterproduct.com/public-api/v1/file/public/products/4/small.png"
          },
          "mockups": []
        },
        "storefrontProduct": {
          "id": 89,
          "idUserDesign": 381,
          "shareAccess": "public",
          "isCustomizer": 1
        },
        "runtimeBindings": [
          {
            "id": 42,
            "runtimeType": "customizer",
            "status": "active",
            "externalProductId": "wc_123"
          }
        ],
        "embeddable": {
          "viewer": true,
          "configurator": true,
          "customizer": true
        }
      }
    ],
    "total": 1
  }
}

Relace vložených nástrojů a inicializace běhového prostředí

Vytvořte na svém serveru krátkodobý token vloženého nástroje, předejte jej do iframe/běhového prostředí a poté nechte prostředí zavolat bootstrap s tokenem Bearer.

ParametrPovinnéPodrobnosti
runtimeBindingIddoporučenéPreferovaný identifikátor aktivních vazeb běhového prostředí.
toolpovinné bez runtimeBindingIddesigner | viewer | configurator | customizer | model-generator
toolIdtool: model-generatorKladné číselné ID místního projektu generátoru, nikoli jeho UUID ani ID produktu WooCommerce.
originanoOrigin, na kterém se vložený nástroj vykresluje, například https://yourstore.com.
designIdjeden identifikátorID návrhu Alter Product. Nekombinujte s orderId.
orderIdjeden identifikátorID objednávky Customizeru. Platí pouze pro customizer.
cartKey + cartModeneKontext košíku pouze pro Customizer. cartMode je view nebo edit.

Příklad požadavku (fetch)

const session = await alterFetch('/embed/session', {
  method: 'POST',
  headers: {
    'x-alter-client-fingerprint': '9f1b7a5e4b3c2d1f9f1b7a5e4b3c2d1f'
  },
  body: JSON.stringify({
    runtimeBindingId: 42,
    origin: 'https://yourstore.com'
  })
});

const bootstrapResponse = await fetch('https://alterproduct.com/public-api/v1/runtime/bootstrap', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${session.token}`
  }
});

const bootstrap = await bootstrapResponse.json();
console.log({ session, bootstrap });

Poznámky

await alterFetch('/embed/session', {
  method: 'POST',
  body: JSON.stringify({
    tool: 'customizer',
    origin: 'https://yourstore.com',
    orderId: 123
  })
});

await alterFetch('/embed/session', {
  method: 'POST',
  body: JSON.stringify({
    tool: 'viewer',
    origin: 'https://yourstore.com',
    designId: 381
  })
});

Příklad odpovědi

{
  "token": "eyJhbGciOiJIUzI1NiIsImtpZCI6IjEifQ...",
  "expiresIn": 900,
  "kid": "1",
  "mode": "design",
  "runtimeBindingId": 42,
  "runtimeType": "customizer"
}

Runtime bootstrap

{
  "runtimeBindingId": 42,
  "designId": 381,
  "productId": "wc_123",
  "runtimeType": "customizer",
  "storageMode": "wordpress_local",
  "manifestUrl": "https://yourstore.com/wp-content/uploads/alter/381/manifest.json",
  "assetBaseUrl": "https://yourstore.com/wp-content/uploads/alter/381/",
  "manifestHash": "a3b1...",
  "planCapabilities": {
    "viewer": true,
    "configurator": true,
    "customizer": true
  },
  "cartKey": null,
  "cartMode": null,
  "orderId": null
}

Generátor 3D modelů

Endpointy pro import generátoru slouží pouze ke čtení při komunikaci mezi servery. Vyžadují standardní hlavičky API, oprávnění embed:session:create a aktivní plán. Autorizace importu nevytváří relaci editoru a nečerpá její měsíční limit. Otevření editoru používá stejný čítač monthlyEmbedTokenLimit jako ostatní vložené nástroje.

Vyhledávání a import modelů s generátorem

Pomocí /model-generator/models zobrazíte dostupné modely s generátory. Deskriptor generator určuje konkrétní projectId, revision, configurationId, templateRevision, productId a productModel3dId. Prostřednictvím jeho importPath načtěte přesně tuto zdrojovou revizi. Manifesty produktových podkladů zpřístupňují také generators a deskriptor generator jednotlivých modelů. Šablony lze importovat samostatně podle konfigurace a revize.

Filtry katalogů

Koncový bodPodrobnosti
/model-generator/modelsSeznam modelů: name (nebo q), categoryId, scope (all, own, global), limit (1–50) a offset.
/model-generator/catalogKatalog šablon: generatorType, productId, audience, q, templateKey, configurationId, limit a offset.
/model-generator/projectsSeznam projektů: configurationId, q, scope (all, own, global), limit a offset. Veřejná proxy ve výchozím nastavení používá scope all.
/model-generator/image-libraries/:kind/assetsKnihovny textur a pozadí: kind je texture nebo background; q, category a mapType filtrují dostupné podklady.

Import projektu obsahuje document, revision, template a manifest files. Každý soubor uvádí path v prostoru /v1/model-generator/; při stahování z Alter Product před něj přidejte /public-api. Zkopírujte požadované soubory do vlastního úložiště a nahraďte zdrojové odkazy místními. Figuríny a knihovny textur importujte přes jejich katalogové endpointy; public-files povoluje pouze schválené cesty ke zdrojům a šablony podléhají kontrole přístupu ke konfiguraci a revizi.

Příklad požadavku (fetch)

// Server-side: uses the alterFetch helper and authHeaders defined above.
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 });

Relace editoru a místní ukládání

Vytvořte relaci editoru s tool: model-generator, kladným číselným toolId místního projektu generátoru (nikoli jeho UUID ani ID produktu WooCommerce) a povoleným origin obchodu. Pro tento nástroj nepředávejte designId, orderId, runtimeBindingId ani pole košíku. UUID projektu generátoru je samostatný identifikátor. Předejte získaný token prostřednictvím handshake iframe; runtime bootstrap vrátí kontext generátoru se 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);

Příklad odpovědi

{
  "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.

Zprávy iframe používané propojením ve WordPressu

Plugin WordPress zajišťuje propojení s místním úložištěm a kontroluje oprávnění správce nebo manažera WooCommerce. Ověřuje origin iframe, zdrojové okno, nonce, identifikátor požadavku a povolené cesty projektu. Místní čtení a zápisy směruje na /wp-json/alter-wc/v1/model-generator. Přístupové údaje API zůstávají na serveru. Vlastní integrace musí zajistit rovnocennou autentizovanou obsluhu úložiště; veřejné API generátoru neukládá projekty do Alter Product.

TypPopis
ALTER_CHILD_HELLO / ALTER_PARENT_ACKVložený iframe zahájí handshake s nonce; nadřazená stránka potvrdí stejný nonce.
ALTER_CUSTOMIZER_INIT_SESSION / ALTER_CUSTOMIZER_SESSION_READYVložený iframe požádá o relaci úprav model-generator; nadřazená stránka vrátí autorizovaný token.
ALTER_MODEL_GENERATOR_REQUESTVložený iframe odešle requestId, nonce a request obsahující method, path, data a responseType.
ALTER_MODEL_GENERATOR_RESPONSENadřazená stránka odpoví stejným requestId a nonce spolu s poli status, data, headers a případným 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.

Uložení předává expectedRevision, templateRevision, document a odkazy na artefakty. Vytvoří neměnnou revizi; neaktuální expectedRevision vrátí HTTP 409. WordPress ukládá metadata do své databáze a soubory do adresáře uploads. JSON se minifikuje a komprimuje pomocí gzip, pokud komprese zmenší jeho velikost.

// 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'
  }
};

Akce Použít uložený model v návrhu publikuje kompletní uloženou revizi do propojeného návrhu produktu. Zákazníci ji pak vidí ve stávajícím Customizeru, Configuratoru nebo Vieweru se zachováním běžných vazeb produktu a kontrol předplatného. Editor generátoru zůstává nástrojem obchodníka. Odkazy v objednávkách zachovávají uložený projekt a revizi, takže pozdější úpravy automaticky nezmění dřívější objednávky.

Katalog podkladů

Katalog podkladů zpřístupňuje zdrojové podklady produktů, pozadí, prostředí, položky knihovny grafiky, šablony návrhů a podklady mockupů. Koncové body seznamů vracejí stručné popisy; koncové body podrobností obsahují manifesty souborů.

TypPopis
productsPodklady základních produktů, náhledy, 3D modely, popisy materiálů a textur.
backgroundsStatická pozadí Vieweru.
environmentsMapy prostředí a obrázky náhledů.
image_libraryPodklady knihovny grafiky včetně grafiky omezené na obchod.
design_templatesNáhledy šablon návrhů a odkazy na soubory vrstev. Podporuje filtr product_id.
mockupsPodklady generátoru mockupů, pozadí a překryvné mapy. Podporuje filtr product_id.

Příklad požadavku (fetch)

const assets = await alterFetch('/assets?' + new URLSearchParams({
  type: 'products',
  limit: '20',
  offset: '0',
  search: 'mug'
}));

const details = await alterFetch('/assets/products/4');

const fileResponse = await fetch(
  'https://alterproduct.com/public-api/v1/assets/products/4/files/preview_medium',
  {
    headers: authHeaders
  }
);

const fileBlob = await fileResponse.blob();

Příklad odpovědi

{
  "type": "products",
  "items": [
    {
      "assetType": "products",
      "assetId": "4",
      "title": "Mug 450ml",
      "slug": "product-4",
      "description": "Base product 4",
      "primaryRole": "preview_big",
      "fileCount": 8,
      "remoteVersion": "1.0",
      "thumbnail": {
        "role": "preview_small",
        "fileName": "product-4-preview-small.png",
        "mime": "image/png",
        "downloadPath": "/v1/assets/products/4/files/preview_small"
      },
      "metadata": {
        "productCategoryId": 2,
        "productModelCount": 1,
        "isDedicated": false
      }
    }
  ],
  "total": 1,
  "limit": 20,
  "offset": 0
}

Importy návrhů

Importy návrhů zpřístupňují návrhy hostované v Alter Product a jejich soubory pro externí výrobu nebo migraci. API ověřuje dostupnost v tarifu Business.

ParametrPovinnéPodrobnosti
searchneVyhledává podle názvu nebo ID návrhu.
offsetneVýchozí hodnota 0.
limitneVýchozí hodnota 20, maximum 100.

Příklad požadavku (fetch)

const imports = await alterFetch('/design-imports?' + new URLSearchParams({
  limit: '20',
  offset: '0',
  search: 'mug'
}));

const details = await alterFetch('/design-imports/381');

const fileId = details.files[0].id;
const fileResponse = await fetch(
  `https://alterproduct.com/public-api/v1/design-imports/381/files/${fileId}`,
  {
    headers: authHeaders
  }
);

const fileBlob = await fileResponse.blob();

Příklad odpovědi

{
  "eligible": true,
  "requiredPlan": "Business",
  "currentPlanName": "Business",
  "designs": [
    {
      "id": 381,
      "title": "Men's T-Shirt",
      "createdAt": "2026-01-03T23:55:05.000Z",
      "sourceStorefrontId": 12,
      "productId": 4,
      "productName": {
        "pl": "Koszulka",
        "en": "T-Shirt"
      },
      "storageMode": "alter",
      "runtimeStatus": {
        "designer": true,
        "viewer": true,
        "configurator": true,
        "customizer": true
      },
      "thumbnail": {
        "kind": "design-mockup",
        "fileId": "7df7...",
        "downloadPath": "/v1/design-imports/381/files/7df7..."
      }
    }
  ],
  "total": 1
}

Soubory, písma a měny

Veřejné soubory náhledů lze snadno používat v prohlížeči. Chráněné soubory vyžadují podepsané URL nebo přístupové údaje API s files:read. Písma a měny mají veřejné koncové body pro čtení.

Koncový bodPřístupPodrobnosti
/file/public/products/:productId/small.pngveřejnýMalý náhled produktu.
/file/public/products/:productId/medium.pngveřejnýStřední náhled produktu.
/file/public/products/:productId/big.pngveřejnýVelký náhled produktu.
/file/protected/:keypodepsané URL nebo files:readChráněný soubor v objektovém úložišti.
/fontsveřejnýPole záznamů písem.
/currenciesveřejnýPole záznamů měn.

Příklad požadavku (fetch)

const publicPreview = await fetch(
  'https://alterproduct.com/public-api/v1/file/public/products/4/medium.png'
);

const protectedFile = await fetch(
  'https://alterproduct.com/public-api/v1/file/protected/user_34/381/design/mockup-large.webp',
  {
    headers: authHeaders
  }
);

const fonts = await fetch('https://alterproduct.com/public-api/v1/fonts').then((res) => res.json());
const currencies = await fetch('https://alterproduct.com/public-api/v1/currencies').then((res) => res.json());

Příklad odpovědi

[
  {
    "id": 1,
    "family": "Inter",
    "source": "google",
    "category": "sans-serif",
    "variants": ["regular", "600", "700"],
    "subsets": ["latin"],
    "version": "v19",
    "menu": "Inter",
    "files": {
      "regular": "https://..."
    }
  }
]
[
  {
    "id": 1,
    "code": "EUR",
    "name": "Euro",
    "symbol": "€",
    "decimalPlaces": 2
  }
]

Vazby běhového prostředí

Vazby běhového prostředí propojují externí produkty e-shopu s návrhy Alter Product a typy běhového prostředí. Používají je především integrace WordPress/WooCommerce a pokročilé backendy obchodů.

ParametrPovinnéPodrobnosti
designIdneID návrhu Alter Product patřícího obchodu.
externalProductIdano pro syncID externího produktu, například ID produktu WooCommerce.
runtimeTypeano pro syncviewer, configurator nebo customizer.
statusnedraft, active, inactive, archived nebo legacy_active.
legacyStorefrontProductIdneVolitelné ID staršího propojení.
legacyBindingMetaneVolitelná metadata JSON, například manifestHash.

Příklad požadavku (fetch)

await alterFetch('/runtime-bindings/sync-from-wordpress', {
  method: 'POST',
  body: JSON.stringify({
    bindings: [
      {
        externalProductId: 'wc_123',
        runtimeType: 'customizer',
        status: 'active',
        designId: 381,
        legacyBindingMeta: {
          manifestHash: 'a3b1...'
        }
      }
    ]
  })
});

await alterFetch('/runtime-bindings/42', {
  method: 'PATCH',
  body: JSON.stringify({
    status: 'inactive'
  })
});

await alterFetch('/runtime-bindings/42/activate', { method: 'POST' });
await alterFetch('/runtime-bindings/42/deactivate', { method: 'POST' });

wordpress_local

await alterFetch('/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'
          }
        }
      }
    ]
  })
});

Příklad odpovědi

{
  "message": "runtimeBinding.syncCompleted",
  "runtimeBindings": [
    {
      "id": 42,
      "designId": 381,
      "externalProductId": "wc_123",
      "runtimeType": "customizer",
      "status": "active"
    }
  ]
}

Výměna údajů pro připojení WordPressu

Koncový bod výměny údajů pro připojení WordPressu spotřebuje jednorázový předávací kód a vrátí pluginu přístupové údaje API. Neslouží k obecnému vytváření přístupových údajů.

Příklad požadavku (fetch)

const response = await fetch('https://alterproduct.com/public-api/v1/wp-connect/exchange', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    code: 'ONE_TIME_HANDOFF_CODE',
    storeUrl: 'https://yourstore.com/',
    siteOrigin: 'https://yourstore.com',
    codeVerifier: 'PKCE_CODE_VERIFIER_32_TO_128_CHARS'
  })
});

const credentials = await response.json();

Příklad odpovědi

{
  "message": "wpConnect.exchange.ok",
  "accessKey": "generated-access-key",
  "accessToken": "generated-access-token",
  "storefrontId": 12
}

Chyby a limity požadavků

Většina chyb řadičů se převádí na odpověď s code. Autentizační middleware a omezovače požadavků mohou místo toho vrátit odpověď s error.

// Controller error
{
  "code": "assetCatalog.invalidType"
}

// Auth middleware or rate limit
{
  "error": "Unauthorized"
}

{
  "error": "Too Many Requests"
}
TypLimitČasové okno
Globální600 požadavků60 sekund
GET /auth/check60 požadavků60 sekund
Čtení objednávek/produktů300 požadavků60 sekund
Zápis objednávek/relace vložených nástrojů/vazby běhového prostředí120 požadavků60 sekund
Čtení podkladů/importů návrhů180 požadavků60 sekund
Písma300 požadavků60 sekund
Výměna údajů pro připojení WP30 požadavků60 sekund
GET /model-generator/*600 požadavků60 sekund