Alter Product Public API-integrasjon

Public API er laget for server-til-server-integrasjoner med butikker, netthandelsbackender, WordPress/WooCommerce-utvidelser og eksterne produksjonsarbeidsflyter.

Autentisering og basis-URL

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

Opprett API-legitimasjon i nettbutikkinnstillingene. Access Token vises bare én gang, så lagre det umiddelbart i backendens sikre lagring for hemmeligheter.

Oppbevar Access Key og Access Token på serveren din. Autentiserte endepunkter avviser nettleserforespørsler som inneholder Origin- eller Referer-headere.

Legitimasjon kan ha begrenset tilgangsomfang. Bruk GET /auth/check for å kontrollere aktiv butikk, abonnementsfunksjoner og tilgangsomfanget som returneres for legitimasjonen.

x-alter-access-key: YOUR_API_KEY
x-alter-access-token: YOUR_API_TOKEN
ParameterPåkrevdDetaljer
x-alter-access-keyjaOffentlig identifikator for legitimasjonen.
x-alter-access-tokenjaHemmelig token koblet til tilgangsnøkkelen.
x-alter-client-fingerprintneiValgfritt fast fingeravtrykk for begrensning av innebyggingssesjonsforespørsler.
Authorizationkun runtimeBearer-token returnert av POST /embed/session, brukt av /runtime/bootstrap.

Tilkoblingstest

Bruk endepunktet for autentiseringskontroll før du aktiverer synkronisering eller innebygging i en produksjonsintegrasjon.

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

Eksempelforespørsel (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);

Eksempelsvar

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

Hjelpefunksjonen nedenfor brukes av de øvrige eksemplene. Den bruker vanlig fetch og kan kjøres i Node.js 18+ eller enhver serverruntime med 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;
}

Endepunktoversikt

Tabellen nedenfor gjenspeiler de offentlige rutene i backend-public-api/app.js. Stiene vises med det offentlige proxyprefikset som brukes av eksterne integrasjoner.

MetodeEndepunktBeskrivelseTilgang
GET/public-api/healthzHelsekontroll av tjenesten.offentlig
GET/public-api/v1/auth/checkValiderer legitimasjon og returnerer butikk, tilgangsomfang og abonnementsfunksjoner.enhver autentisert legitimasjon
GET/public-api/v1/customer-ordersReturnerer en paginert og filtrerbar liste med kundebestillinger.orders:read
GET/public-api/v1/customer-orders/:idReturnerer én kundebestilling med konfigurerte produktlinjer.orders:read
POST/public-api/v1/customer-orders/batchReturnerer opptil 100 bestillinger etter ID.orders:read
PATCH/public-api/v1/customer-orders/:id/statusOppdaterer bestillingsstatusen.orders:write
PATCH/public-api/v1/customer-orders/:orderId/quantityOppdaterer antallet for valgte bestillingsdetaljer.orders:write
PATCH/public-api/v1/customer-orders/:orderId/quantity/allAngir samme antall for hver vare i en bestilling.orders:write
DELETE/public-api/v1/customer-orders/:idSletter en kundebestilling som tilhører butikkeieren.orders:write
GET/public-api/v1/productsReturnerer butikkprodukter/design med tilgjengelighet for innebygging og medie-URL-er.products:read
GET/public-api/v1/products/:idReturnerer ett butikkprodukt/design.products:read
POST/public-api/v1/embed/sessionUtsteder et kortvarig JWT for innebygde verktøy, inkludert modellgeneratoren.embed:session:create
GET/public-api/v1/runtime/bootstrapFinner runtimekontekst fra et innebyggings-JWT.Bearer-innebyggingstoken
GET/public-api/v1/assetsLister ressurskatalogelementer av forespurt type.enhver autentisert legitimasjon
GET/public-api/v1/assets/:type/:assetIdReturnerer et ressursmanifest med nedlastbare filroller.enhver autentisert legitimasjon
GET/public-api/v1/assets/:type/:assetId/files/:roleLaster ned en ressursfil etter rolle.enhver autentisert legitimasjon
GET/public-api/v1/design-importsLister importerbare design lagret hos Alter.autentisert legitimasjon, Business-abonnement kreves
GET/public-api/v1/design-imports/:idReturnerer designimportpayload og filbeskrivelser.autentisert legitimasjon, Business-abonnement kreves
GET/public-api/v1/design-imports/:id/files/:fileIdLaster ned en fil fra en designimportbeskrivelse.autentisert legitimasjon, Business-abonnement kreves
GET/public-api/v1/file/public/products/:productId/:sizeReturnerer en offentlig produktforhåndsvisning. Størrelsen må være small.png, medium.png eller big.png.offentlig
GET/public-api/v1/file/protected/:keyReturnerer en beskyttet fil etter lagringsnøkkel.signert URL eller files:read
GET/public-api/v1/fontsReturnerer alle tilgjengelige skrifter.offentlig
GET/public-api/v1/currenciesReturnerer alle valutaer.offentlig
POST/public-api/v1/runtime-bindings/sync-from-wordpressOppretter eller oppdaterer runtimekoblinger fra WordPress-produktkoblinger.enhver autentisert legitimasjon
PATCH/public-api/v1/runtime-bindings/:idOppdaterer en runtimekobling delvis.enhver autentisert legitimasjon
POST/public-api/v1/runtime-bindings/:id/activateAktiverer en runtimekobling.enhver autentisert legitimasjon
POST/public-api/v1/runtime-bindings/:id/deactivateDeaktiverer en runtimekobling.enhver autentisert legitimasjon
POST/public-api/v1/wp-connect/exchangeBytter en overføringskode for automatisk WordPress-tilkobling mot API-legitimasjon.engangskode for overføring
GET/public-api/v1/model-generator/catalogViser synlige generatorprodukter, konfigurasjoner og malrevisjoner.embed:session:create
GET/public-api/v1/model-generator/modelsViser modeller med deskriptorer som fastsetter bestemte kilderevisjoner av generatoren for import.embed:session:create
GET/public-api/v1/model-generator/designer-catalogReturnerer generatorens modellkatalog som brukes av Designer.embed:session:create
GET/public-api/v1/model-generator/projectsViser eierens og globalt tilgjengelige generatorprosjekter.embed:session:create
GET/public-api/v1/model-generator/projects/:projectIdReturnerer den nyeste eller valgte prosjektrevisjonen, malen og filmanifestet.embed:session:create
GET/public-api/v1/model-generator/projects/:projectId/revisions/:revisionReturnerer den nyeste eller valgte prosjektrevisjonen, malen og filmanifestet.embed:session:create
GET/public-api/v1/model-generator/projects/:projectId/artifacts/:artifactIdLaster ned en artefakt etter å ha kontrollert tilgang til prosjektet den tilhører.embed:session:create
GET/public-api/v1/model-generator/configurations/:configurationId/revisions/:revision/templateReturnerer et tilgjengelig maldokument for den valgte konfigurasjonsrevisjonen.embed:session:create
GET/public-api/v1/model-generator/configurations/:configurationId/revisions/:revision/importReturnerer importpakken for malen med tilhørende avhengighetsfiler.embed:session:create
GET/public-api/v1/model-generator/mannequinsReturnerer begge mannekengene og ressursdeskriptorene deres.embed:session:create
GET/public-api/v1/model-generator/image-libraries/:kind/assetsViser ressurser fra tekstur- eller bakgrunnsbiblioteket med filer som kan importeres.embed:session:create
GET/public-api/v1/model-generator/image-libraries/:kind/assets/:assetIdReturnerer én tekstur- eller bakgrunnsressurs med tilhørende filer som kan importeres.embed:session:create
GET/public-api/v1/model-generator/public-files/:keyLaster ned en tillatt avhengighetsfil for generatoren.embed:session:create

Kundebestillinger

Endepunkter for kundebestillinger lar en ekstern butikk lese konfigurerte bestillingslinjer, oppdatere antall, endre behandlingsstatus og fjerne forlatte bestillinger.

ParameterPåkrevdDetaljer
nameneiSøker i designnavn og numerisk bestillings-ID.
category_idneiFiltrerer etter produktkategori-ID.
order_statusneiEn av de tillatte bestillingsstatusene.
offsetneiStandard 0. Må være >= 0.
limitneiStandard 9 for denne kontrolleren, maksimalt 50.
order_byneiid, created_at eller design_name.
directionneiASC eller DESC.

Eksempelforespørsel (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]
  })
});

Tillatte verdier

StatusBeskrivelse
shopping_cartHandlekurvfase; kunden kan fortsatt redigere konfigurasjonen.
editableBestillingen kan fortsatt redigeres av kunden.
paidBestillingen er betalt og klar til behandling.
processingBestillingen er under behandling.
completedBestillingen er ferdig behandlet.
cancelledBestillingen ble kansellert.

Eksempelforespørsel (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'
});

Eksempelsvar

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

Butikkprodukter

Produktendepunkter returnerer butikkdesign som kan bygges inn som Viewer-, Configurator- eller Customizer-opplevelser.

ParameterPåkrevdDetaljer
nameneiSøker i produkt-/designnavn.
customizerneitrue eller false.
offsetneiStandard 0. Må være >= 0.
limitneiStandard 9, maksimalt 50.
order_byneiid, name eller created_at.
directionneiASC eller DESC.

Eksempelforespørsel (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');

Eksempelsvar

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

Innbyggingssesjoner og initialisering av runtime

Opprett et kortvarig innebyggingstoken på serveren, send det til iframe/runtime, og la runtime kalle bootstrap med et Bearer-token.

ParameterPåkrevdDetaljer
runtimeBindingIdanbefaltForetrukket identifikator for aktive runtimekoblinger.
toolpåkrevd uten runtimeBindingIddesigner | viewer | configurator | customizer | model-generator
toolIdtool: model-generatorPositiv numerisk ID for det lokale generatorprosjektet, ikke prosjektets UUID eller WooCommerce-produktets ID.
originjaOrigin der innebyggingen vises, for eksempel https://yourstore.com.
designIdén identifikatorAlter Product-design-ID. Ikke kombiner med orderId.
orderIdén identifikatorCustomizer-bestillings-ID. Kun gyldig for customizer.
cartKey + cartModeneiHandlekurvkontekst kun for Customizer. cartMode er view eller edit.

Eksempelforespørsel (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 });

Merknader

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
  })
});

Eksempelsvar

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

3D-modellgenerator

Importendepunktene for generatoren støtter bare leseforespørsler mellom servere. De krever standard API-headere, tillatelsen embed:session:create og en aktiv plan. Importautorisasjon oppretter ingen redigeringsøkt og bruker ikke av den månedlige kvoten for slike økter. Når redigeringsverktøyet åpnes, brukes den samme monthlyEmbedTokenLimit-telleren som for de andre innebygde verktøyene.

Finn og importer modeller med generator

Bruk /model-generator/models for å vise tilgjengelige modeller med generatorer. Deskriptoren generator fastsetter konkrete verdier for projectId, revision, configurationId, templateRevision, productId og productModel3dId. Følg importPath for å hente akkurat denne kilderevisjonen. Manifestene for produktressurser viser også generators og hver modells generator-deskriptor. Maler kan importeres separat etter konfigurasjon og revisjon.

Katalogfiltre

EndepunktDetaljer
/model-generator/modelsModelliste: name (eller q), categoryId, scope (all, own, global), limit (1–50) og offset.
/model-generator/catalogMalkatalog: generatorType, productId, audience, q, templateKey, configurationId, limit og offset.
/model-generator/projectsProsjektliste: configurationId, q, scope (all, own, global), limit og offset. Den offentlige proxyen bruker scope all som standard.
/model-generator/image-libraries/:kind/assetsTekstur- og bakgrunnsbiblioteker: kind er texture eller background; q, category og mapType filtrerer de tilgjengelige ressursene.

En prosjektimport inneholder document, revision, template og et files-manifest. Hver fil oppgir en path under /v1/model-generator/; legg til /public-api foran denne når du laster ned fra Alter Product. Kopier nødvendige filer til ditt eget lager, og erstatt kildereferansene med lokale referanser. Importer mannekenger og teksturbiblioteker gjennom katalogendepunktene deres; public-files er begrenset til tillatte ressursbaner, og maler må bestå tilgangskontrollene for konfigurasjon og revisjon.

Eksempelforespørsel (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 });

Redigeringsøkt og lokal lagring

Opprett redigeringsøkten med tool: model-generator, en positiv numerisk toolId som identifiserer det lokale generatorprosjektet (ikke prosjektets UUID eller en WooCommerce-produkt-ID), og butikkens tillatte origin. Ikke send designId, orderId, runtimeBindingId eller handlekurvfelter for dette verktøyet. Generatorprosjektets UUID er en separat identifikator. Send tokenet som returneres, gjennom iframe-håndtrykket; runtime bootstrap returnerer generatorkonteksten med 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);

Eksempelsvar

{
  "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-meldinger som brukes av WordPress-broen

WordPress-utvidelsen håndterer lagringsbroen og kontrollerer rettigheter som administrator eller butikkansvarlig i WooCommerce. Den validerer iframe-ens origin, kildevindu, nonce, forespørsels-ID og tillatte prosjektbaner. Broen sender lokale lese- og skriveoperasjoner til /wp-json/alter-wc/v1/model-generator. API-legitimasjonen forblir på serveren. En egen integrasjon må implementere tilsvarende autentisert lagringshåndtering; generatorens offentlige API lagrer ikke prosjekter i Alter Product.

TypeBeskrivelse
ALTER_CHILD_HELLO / ALTER_PARENT_ACKDen underordnede iframe-en starter håndtrykket med en nonce; foreldresiden bekrefter samme nonce.
ALTER_CUSTOMIZER_INIT_SESSION / ALTER_CUSTOMIZER_SESSION_READYDen underordnede iframe-en ber om en redigeringsøkt for model-generator; foreldresiden returnerer det autoriserte tokenet.
ALTER_MODEL_GENERATOR_REQUESTDen underordnede iframe-en sender requestId, nonce og request som inneholder method, path, data og responseType.
ALTER_MODEL_GENERATOR_RESPONSEForeldresiden svarer med samme requestId og nonce, i tillegg til status, data, headers og eventuell 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.

En lagring sender expectedRevision, templateRevision, document og referanser til artefakter. Den oppretter en uforanderlig revisjon; en utdatert expectedRevision returnerer HTTP 409. WordPress lagrer metadata i sin database og filer i uploads-mappen. JSON minifiseres og komprimeres med gzip når komprimeringen reduserer størrelsen.

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

Handlingen Bruk lagret modell i design publiserer en fullstendig lagret revisjon til et tilknyttet design. Kundene ser den deretter i eksisterende Customizer, Configurator eller Viewer med de vanlige produktkoblingene og abonnementskontrollene. Generatorens redigeringsverktøy er fortsatt et verktøy for forhandleren. Ordrelenker beholder det lagrede prosjektet og revisjonen, slik at senere redigeringer ikke automatisk endrer tidligere ordrer.

Ressurskatalog

Ressurskatalogen gir tilgang til produktkilder, bakgrunner, miljøer, grafikkbibliotek, designmaler og mockupressurser. Listeendepunkter returnerer lette beskrivelser; detaljendepunkter inneholder filmanifester.

TypeBeskrivelse
productsGrunnleggende produktressurser, forhåndsvisninger, 3D-modeller og beskrivelser av materialer og teksturer.
backgroundsStatiske Viewer-bakgrunner.
environmentsMiljøkart og forhåndsvisningsbilder.
image_libraryGrafikkbibliotekressurser, inkludert butikkspesifikk grafikk.
design_templatesForhåndsvisninger av designmaler og referanser til lagfiler. Støtter filteret product_id.
mockupsMockupgeneratorressurser, bakgrunner og overleggskart. Støtter filteret product_id.

Eksempelforespørsel (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();

Eksempelsvar

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

Designimport

Designimport gir tilgang til Alter-lagrede design og filer for eksterne produksjons- eller migreringsflyter. API-et kontrollerer om Business-abonnementet gir tilgang.

ParameterPåkrevdDetaljer
searchneiSøker i designtittel eller ID.
offsetneiStandard 0.
limitneiStandard 20, maksimalt 100.

Eksempelforespørsel (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();

Eksempelsvar

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

Filer, skrifter og valutaer

Offentlige forhåndsvisningsfiler kan brukes i nettleseren. Beskyttede filer krever en signert URL eller API-legitimasjon med files:read. Skrifter og valutaer er offentlige leseendepunkter.

EndepunktTilgangDetaljer
/file/public/products/:productId/small.pngoffentligLiten produktforhåndsvisning.
/file/public/products/:productId/medium.pngoffentligMellomstor produktforhåndsvisning.
/file/public/products/:productId/big.pngoffentligStor produktforhåndsvisning.
/file/protected/:keysignert URL eller files:readBeskyttet fil i objektlagring.
/fontsoffentligListe med skriftposter.
/currenciesoffentligListe med valutaposter.

Eksempelforespørsel (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());

Eksempelsvar

[
  {
    "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
  }
]

Runtimekoblinger

Runtimekoblinger knytter eksterne butikkprodukter til Alter Product-design og runtimetyper. De brukes hovedsakelig i WordPress/WooCommerce-integrasjoner og avanserte butikkbackender.

ParameterPåkrevdDetaljer
designIdneiID for Alter Product-design som eies av butikken.
externalProductIdja, ved synkroniseringEkstern produkt-ID, for eksempel en WooCommerce-produkt-ID.
runtimeTypeja, ved synkroniseringviewer, configurator eller customizer.
statusneidraft, active, inactive, archived eller legacy_active.
legacyStorefrontProductIdneiValgfri eldre koblings-ID.
legacyBindingMetaneiValgfrie JSON-metadata, for eksempel manifestHash.

Eksempelforespørsel (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'
          }
        }
      }
    ]
  })
});

Eksempelsvar

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

Utveksling ved WordPress-tilkobling

WordPress-endepunktet for tilkoblingsutveksling bruker en engangskode og returnerer API-legitimasjon til utvidelsen. Det er ikke et generelt endepunkt for å opprette legitimasjon.

Eksempelforespørsel (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();

Eksempelsvar

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

Feil og forespørselsgrenser

De fleste kontrollerfeil normaliseres til et code-svar. Autentiseringsmellomvare og forespørselsbegrensere kan i stedet returnere et error-svar.

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

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

{
  "error": "Too Many Requests"
}
TypeGrenseTidsvindu
Globalt600 forespørsler60 sekunder
GET /auth/check60 forespørsler60 sekunder
Lese bestillinger/lese produkter300 forespørsler60 sekunder
Skrive bestillinger/innebyggingssesjoner/runtimekoblinger120 forespørsler60 sekunder
Lese ressurser/designimport180 forespørsler60 sekunder
Skrifter300 forespørsler60 sekunder
WP-tilkoblingsutveksling30 forespørsler60 sekunder
GET /model-generator/*600 forespørsler60 sekunder