Alter Product Public API entegrasyonu

Public API; mağazalar, e-ticaret backend’leri, WordPress/WooCommerce eklentileri ve dış üretim iş akışlarıyla sunucular arası entegrasyon için tasarlanmıştır.

Kimlik doğrulama ve temel URL

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

E-ticaret ayarları panelinde API kimlik bilgileri oluşturun. Access Token yalnızca bir kez gösterilir; hemen backend’inizin gizli bilgi deposuna kaydedin.

Access Key ve Access Token değerlerini sunucunuzda saklayın. Kimlik doğrulanan uç noktalar, Origin veya Referer başlıkları içeren tarayıcı kaynaklı çağrıları reddeder.

Kimlik bilgilerinin izinleri sınırlandırılabilir. Etkin mağazayı, plan özelliklerini ve kimlik bilgisi için döndürülen izinleri doğrulamak amacıyla GET /auth/check kullanın.

x-alter-access-key: YOUR_API_KEY
x-alter-access-token: YOUR_API_TOKEN
ParametreGerekliAyrıntılar
x-alter-access-keyevetKimlik bilgisinin herkese açık tanımlayıcısı.
x-alter-access-tokenevetErişim anahtarıyla eşleştirilmiş gizli belirteç.
x-alter-client-fingerprinthayırYerleştirme oturumu hız sınırlaması için isteğe bağlı, sabit parmak izi.
Authorizationyalnızca çalışma zamanıPOST /embed/session tarafından döndürülen ve /runtime/bootstrap tarafından kullanılan Bearer belirteci.

Bağlantı testi

Canlı entegrasyonda eşitleme veya yerleştirme özelliklerini etkinleştirmeden önce kimlik doğrulama kontrolü uç noktasını kullanın.

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

Örnek istek (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);

Örnek yanıt

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

Aşağıdaki yardımcı işlev diğer örneklerde de kullanılır. Düz fetch kullanır; Node.js 18+ veya fetch sağlayan herhangi bir sunucu çalışma zamanında çalışabilir.

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

Uç noktalara genel bakış

Aşağıdaki tablo, backend-public-api/app.js içinde bağlı herkese açık rotaları yansıtır. Yollar, dış entegrasyonların kullandığı genel proxy önekiyle gösterilir.

YöntemUç noktaAçıklamaErişim
GET/public-api/healthzHizmet durum kontrolü.herkese açık
GET/public-api/v1/auth/checkKimlik bilgilerini doğrular; mağazayı, izinleri ve plan özelliklerini döndürür.kimliği doğrulanmış herhangi bir kimlik bilgisi
GET/public-api/v1/customer-ordersSayfalanmış ve filtrelenebilir müşteri sipariş listesini döndürür.orders:read
GET/public-api/v1/customer-orders/:idYapılandırılmış ürün öğeleriyle tek müşteri siparişini döndürür.orders:read
POST/public-api/v1/customer-orders/batchKimliklere göre en fazla 100 sipariş döndürür.orders:read
PATCH/public-api/v1/customer-orders/:id/statusSipariş durumunu günceller.orders:write
PATCH/public-api/v1/customer-orders/:orderId/quantitySeçili sipariş ayrıntılarının miktarlarını günceller.orders:write
PATCH/public-api/v1/customer-orders/:orderId/quantity/allSiparişteki tüm öğelere tek bir miktar atar.orders:write
DELETE/public-api/v1/customer-orders/:idMağaza sahibine ait müşteri siparişini siler.orders:write
GET/public-api/v1/productsYerleştirme kullanılabilirliği ve medya URL’leriyle mağaza ürünlerini/tasarımlarını döndürür.products:read
GET/public-api/v1/products/:idTek mağaza ürünü/tasarımı döndürür.products:read
POST/public-api/v1/embed/sessionModel oluşturucu dahil gömülü araçlar için kısa ömürlü bir JWT verir.embed:session:create
GET/public-api/v1/runtime/bootstrapYerleştirme JWT’sinden çalışma zamanı bağlamını çözümler.Bearer yerleştirme belirteci
GET/public-api/v1/assetsİstenen türdeki varlık kataloğu öğelerini listeler.kimliği doğrulanmış herhangi bir kimlik bilgisi
GET/public-api/v1/assets/:type/:assetIdİndirilebilir dosya rolleri içeren varlık manifesti döndürür.kimliği doğrulanmış herhangi bir kimlik bilgisi
GET/public-api/v1/assets/:type/:assetId/files/:roleRolüne göre varlık dosyası indirir.kimliği doğrulanmış herhangi bir kimlik bilgisi
GET/public-api/v1/design-importsAlter’da barındırılan, içe aktarılabilir tasarımları listeler.kimliği doğrulanmış kimlik bilgisi, Business planı gerekir
GET/public-api/v1/design-imports/:idTasarım içe aktarma verilerini ve dosya tanımlayıcılarını döndürür.kimliği doğrulanmış kimlik bilgisi, Business planı gerekir
GET/public-api/v1/design-imports/:id/files/:fileIdTasarım içe aktarma tanımlayıcısındaki dosyayı indirir.kimliği doğrulanmış kimlik bilgisi, Business planı gerekir
GET/public-api/v1/file/public/products/:productId/:sizeHerkese açık ürün önizlemesini döndürür. Boyut small.png, medium.png veya big.png olmalıdır.herkese açık
GET/public-api/v1/file/protected/:keyDepolama anahtarına göre korumalı dosya döndürür.imzalı URL veya files:read
GET/public-api/v1/fontsKullanılabilir tüm yazı tiplerini döndürür.herkese açık
GET/public-api/v1/currenciesTüm para birimlerini döndürür.herkese açık
POST/public-api/v1/runtime-bindings/sync-from-wordpressWordPress ürün eşleştirmelerinden çalışma zamanı bağları oluşturur veya günceller.kimliği doğrulanmış herhangi bir kimlik bilgisi
PATCH/public-api/v1/runtime-bindings/:idÇalışma zamanı bağını kısmen günceller.kimliği doğrulanmış herhangi bir kimlik bilgisi
POST/public-api/v1/runtime-bindings/:id/activateÇalışma zamanı bağını etkinleştirir.kimliği doğrulanmış herhangi bir kimlik bilgisi
POST/public-api/v1/runtime-bindings/:id/deactivateÇalışma zamanı bağını devre dışı bırakır.kimliği doğrulanmış herhangi bir kimlik bilgisi
POST/public-api/v1/wp-connect/exchangeWordPress otomatik bağlantı aktarım kodunu API kimlik bilgileriyle değiştirir.tek kullanımlık aktarım kodu
GET/public-api/v1/model-generator/catalogGörünür oluşturucu ürünlerini, yapılandırmaları ve şablon revizyonlarını listeler.embed:session:create
GET/public-api/v1/model-generator/modelsİçe aktarma için belirli oluşturucu kaynak revizyonlarını sabitleyen tanımlayıcılara sahip modelleri listeler.embed:session:create
GET/public-api/v1/model-generator/designer-catalogDesigner tarafından kullanılan oluşturucu model kataloğunu döndürür.embed:session:create
GET/public-api/v1/model-generator/projectsSahibin oluşturucu projelerini ve genel kullanıma açık oluşturucu projelerini listeler.embed:session:create
GET/public-api/v1/model-generator/projects/:projectIdEn son veya seçilen proje revizyonunu, şablonu ve dosya bildirimini döndürür.embed:session:create
GET/public-api/v1/model-generator/projects/:projectId/revisions/:revisionEn son veya seçilen proje revizyonunu, şablonu ve dosya bildirimini döndürür.embed:session:create
GET/public-api/v1/model-generator/projects/:projectId/artifacts/:artifactIdProjesine erişimi kontrol ettikten sonra bir çıktı dosyasını indirir.embed:session:create
GET/public-api/v1/model-generator/configurations/:configurationId/revisions/:revision/templateSeçilen yapılandırma revizyonu için erişilebilir bir şablon belgesi döndürür.embed:session:create
GET/public-api/v1/model-generator/configurations/:configurationId/revisions/:revision/importŞablon içe aktarma paketini bağımlılık dosyalarıyla birlikte döndürür.embed:session:create
GET/public-api/v1/model-generator/mannequinsHer iki mankeni ve kaynak tanımlayıcılarını döndürür.embed:session:create
GET/public-api/v1/model-generator/image-libraries/:kind/assetsDoku veya arka plan kitaplığındaki varlıkları içe aktarılabilir dosyalarla birlikte listeler.embed:session:create
GET/public-api/v1/model-generator/image-libraries/:kind/assets/:assetIdTek bir doku veya arka plan varlığını içe aktarılabilir dosyalarıyla birlikte döndürür.embed:session:create
GET/public-api/v1/model-generator/public-files/:keyİzin verilen bir oluşturucu bağımlılık dosyasını indirir.embed:session:create

Müşteri siparişleri

Müşteri siparişi uç noktaları, dış mağazanın yapılandırılmış satırları okumasını, miktarları güncellemesini, siparişi karşılama durumları arasında ilerletmesini ve terk edilmiş siparişleri kaldırmasını sağlar.

ParametreGerekliAyrıntılar
namehayırTasarım adı ve sayısal sipariş kimliğinde arama yapar.
category_idhayırÜrün kategorisi kimliğine göre filtreler.
order_statushayırİzin verilen sipariş durumlarından biri.
offsethayırVarsayılan 0. >= 0 olmalıdır.
limithayırBu denetleyici için varsayılan 9, en fazla 50.
order_byhayırid, created_at veya design_name.
directionhayırASC veya DESC.

Örnek istek (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]
  })
});

İzin verilen değerler

DurumAçıklama
shopping_cartSepet akışı; müşteri yapılandırmayı hâlâ düzenleyebilir.
editableSipariş müşteri tarafından düzenlenebilir durumda kalır.
paidSipariş ödendi ve hazırlanmaya hazır.
processingSipariş hazırlanıyor.
completedSipariş tamamlandı.
cancelledSipariş iptal edildi.

Örnek istek (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'
});

Örnek yanıt

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

Mağaza ürünleri

Ürün uç noktaları; Viewer, Configurator veya Customizer deneyimi olarak yerleştirilebilen mağaza tasarımlarını döndürür.

ParametreGerekliAyrıntılar
namehayırÜrün/tasarım adında arama yapar.
customizerhayırtrue veya false.
offsethayırVarsayılan 0. >= 0 olmalıdır.
limithayırVarsayılan 9, en fazla 50.
order_byhayırid, name veya created_at.
directionhayırASC veya DESC.

Örnek istek (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');

Örnek yanıt

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

Yerleştirme oturumları ve çalışma zamanı başlangıç yüklemesi

Sunucunuzda kısa ömürlü yerleştirme belirteci oluşturup iframe/çalışma zamanına iletin; ardından çalışma zamanı bootstrap çağrısını Bearer belirteciyle yapsın.

ParametreGerekliAyrıntılar
runtimeBindingIdönerilirEtkin çalışma zamanı bağları için tercih edilen tanımlayıcı.
toolruntimeBindingId yoksa gereklidesigner | viewer | configurator | customizer | model-generator
toolIdtool: model-generatorYerel oluşturucu projesinin pozitif sayısal kimliği; projenin UUID’si veya WooCommerce ürün kimliği değildir.
originevetYerleştirmenin gösterildiği origin; örneğin https://yourstore.com.
designIdbir tanımlayıcıAlter Product tasarım kimliği. orderId ile birlikte kullanmayın.
orderIdbir tanımlayıcıCustomizer sipariş kimliği. Yalnızca customizer için geçerlidir.
cartKey + cartModehayırYalnızca Customizer’a özel sepet bağlamı. cartMode, view veya edit değerini alır.

Örnek istek (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 });

Notlar

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

Örnek yanıt

{
  "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 Model Oluşturucu

Oluşturucunun içe aktarma uç noktaları, sunucular arasında yalnızca okuma isteklerini destekler. Standart API üstbilgilerini, embed:session:create yetkisini ve etkin bir planı gerektirir. İçe aktarma yetkilendirmesi bir düzenleyici oturumu oluşturmaz ve bu oturumun aylık kotasını tüketmez. Düzenleyiciyi açmak, diğer gömülü araçlarla aynı monthlyEmbedTokenLimit sayacını kullanır.

Oluşturucu içeren modelleri bulma ve içe aktarma

Oluşturucu içeren kullanılabilir modelleri listelemek için /model-generator/models kullanın. generator tanımlayıcısı, belirli projectId, revision, configurationId, templateRevision, productId ve productModel3dId değerlerini sabitler. Tam olarak bu kaynak revizyonunu almak için importPath yolunu izleyin. Ürün varlık bildirimleri ayrıca generators alanını ve her modelin generator tanımlayıcısını sunar. Şablonlar, yapılandırma ve revizyon temelinde ayrı olarak içe aktarılabilir.

Katalog filtreleri

Uç noktaAyrıntılar
/model-generator/modelsModel listesi: name (veya q), categoryId, scope (all, own, global), limit (1–50) ve offset.
/model-generator/catalogŞablon kataloğu: generatorType, productId, audience, q, templateKey, configurationId, limit ve offset.
/model-generator/projectsProje listesi: configurationId, q, scope (all, own, global), limit ve offset. Herkese açık proxy, varsayılan scope değeri olarak all kullanır.
/model-generator/image-libraries/:kind/assetsDoku/arka plan kitaplıkları: kind, texture veya background değerini alır; q, category ve mapType kullanılabilir varlıkları filtreler.

Bir proje içe aktarımı document, revision, template ve bir files bildirimi içerir. Her dosya, /v1/model-generator/ altında bir path sunar; Alter Product'tan indirirken başına /public-api ekleyin. Gerekli dosyaları kendi depolama alanınıza kopyalayın ve kaynak referanslarını yerel referanslarla değiştirin. Mankenleri ve doku kitaplıklarını kendi katalog uç noktaları üzerinden içe aktarın; public-files yalnızca izin verilen kaynak yollarıyla sınırlıdır ve şablonlar yapılandırma/revizyon erişim kontrollerinden geçmelidir.

Örnek istek (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 });

Düzenleyici oturumu ve yerel depolama

Düzenleyici oturumunu tool: model-generator, yerel oluşturucu projesini tanımlayan pozitif sayısal bir toolId (projenin UUID'si veya WooCommerce ürün ID'si değil) ve mağazanın izin verilen origin değeriyle oluşturun. Bu araç için designId, orderId, runtimeBindingId veya sepet alanlarını iletmeyin. Oluşturucu projesinin UUID'si ayrı bir tanımlayıcıdır. Döndürülen tokenı iframe el sıkışması üzerinden iletin; runtime bootstrap, storageMode: wordpress_local içeren oluşturucu bağlamını döndürür.

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

Örnek yanıt

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

WordPress köprüsünün kullandığı iframe mesajları

WordPress eklentisi, depolama köprüsünü barındırır ve yönetici veya WooCommerce mağaza yöneticisi izinlerini kontrol eder. iframe origin değerini, kaynak pencereyi, nonce değerini, istek kimliğini ve izin verilen proje yollarını doğrular. Köprü, yerel okuma ve yazma işlemlerini /wp-json/alter-wc/v1/model-generator adresine gönderir. API kimlik bilgileri sunucuda kalır. Özel bir entegrasyon, kimlik doğrulamalı eşdeğer bir depolama işleyişi uygulamalıdır; oluşturucunun herkese açık API'si projeleri Alter Product'a kaydetmez.

TürAçıklama
ALTER_CHILD_HELLO / ALTER_PARENT_ACKAlt iframe, nonce ile el sıkışmayı başlatır; üst sayfa aynı nonce değerini onaylar.
ALTER_CUSTOMIZER_INIT_SESSION / ALTER_CUSTOMIZER_SESSION_READYAlt iframe, model-generator düzenleme oturumu ister; üst sayfa yetkilendirilmiş tokenı döndürür.
ALTER_MODEL_GENERATOR_REQUESTAlt iframe, requestId, nonce ve method, path, data ile responseType içeren request gönderir.
ALTER_MODEL_GENERATOR_RESPONSEÜst sayfa aynı requestId ve nonce ile birlikte status, data, headers ve varsa error alanlarını döndürür.
// 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.

Kaydetme işlemi expectedRevision, templateRevision, document ve çıktı dosyalarına referansları iletir. Değiştirilemez bir revizyon oluşturur; güncel olmayan expectedRevision, HTTP 409 döndürür. WordPress, meta verileri kendi veritabanında ve dosyaları uploads dizininde saklar. JSON küçültülür ve sıkıştırma boyutunu azaltıyorsa gzip ile sıkıştırılır.

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

Kaydedilmiş modeli tasarımda kullan eylemi, kaydedilmiş tam bir revizyonu bağlı bir tasarıma yayımlar. Müşteriler daha sonra bu revizyonu, mevcut Customizer, Configurator veya Viewer üzerinden, olağan ürün bağları ve abonelik kontrolleriyle görür. Oluşturucu düzenleyicisi satıcının kullandığı bir araç olarak kalır. Sipariş bağlantıları, kaydedilen proje ve revizyonu korur; böylece sonraki düzenlemeler geçmiş siparişleri otomatik olarak değiştirmez.

Varlık kataloğu

Varlık kataloğu ürün kaynak varlıklarını, arka planları, ortamları, grafik kütüphanesi öğelerini, tasarım şablonlarını ve maket varlıklarını sunar. Liste uç noktaları hafif tanımlayıcılar, ayrıntı uç noktaları ise dosya manifestleri döndürür.

TürAçıklama
productsTemel ürün varlıkları, önizlemeler, 3D modeller, malzeme ve doku tanımlayıcıları.
backgroundsSabit Viewer arka planları.
environmentsOrtam haritaları ve önizleme görselleri.
image_libraryMağazaya özel grafikler dahil grafik kütüphanesi varlıkları.
design_templatesTasarım şablonu önizlemeleri ve katman dosyası referansları. product_id filtresini destekler.
mockupsMaket oluşturucu varlıkları, arka planları ve kaplama haritaları. product_id filtresini destekler.

Örnek istek (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();

Örnek yanıt

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

Tasarım içe aktarımları

Tasarım içe aktarımları, dış üretim veya taşıma akışları için Alter’da barındırılan tasarımları ve dosyalarını sunar. API, Business planı uygunluğunu kontrol eder.

ParametreGerekliAyrıntılar
searchhayırTasarım başlığı veya kimliğinde arama yapar.
offsethayırVarsayılan 0.
limithayırVarsayılan 20, en fazla 100.

Örnek istek (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();

Örnek yanıt

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

Dosyalar, yazı tipleri ve para birimleri

Herkese açık önizleme dosyaları tarayıcıda kullanıma uygundur. Korumalı dosyalar imzalı URL veya files:read iznine sahip API kimlik bilgisi gerektirir. Yazı tipleri ve para birimleri herkese açık okuma uç noktalarıdır.

Uç noktaErişimAyrıntılar
/file/public/products/:productId/small.pngherkese açıkKüçük ürün önizlemesi.
/file/public/products/:productId/medium.pngherkese açıkOrta ürün önizlemesi.
/file/public/products/:productId/big.pngherkese açıkBüyük ürün önizlemesi.
/file/protected/:keyimzalı URL veya files:readKorumalı nesne depolama dosyası.
/fontsherkese açıkYazı tipi kayıtları dizisi.
/currenciesherkese açıkPara birimi kayıtları dizisi.

Örnek istek (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());

Örnek yanıt

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

Çalışma zamanı bağları

Çalışma zamanı bağları, dış e-ticaret ürünlerini Alter Product tasarımlarıyla ve çalışma zamanı türleriyle ilişkilendirir. Başlıca WordPress/WooCommerce entegrasyonlarında ve gelişmiş mağaza backend’lerinde kullanılır.

ParametreGerekliAyrıntılar
designIdhayırMağazaya ait Alter Product tasarım kimliği.
externalProductIdeşitleme için evetDış ürün kimliği; örneğin WooCommerce ürün kimliği.
runtimeTypeeşitleme için evetviewer, configurator veya customizer.
statushayırdraft, active, inactive, archived veya legacy_active.
legacyStorefrontProductIdhayırİsteğe bağlı eski eşleştirme kimliği.
legacyBindingMetahayırİsteğe bağlı JSON meta verisi; örneğin manifestHash.

Örnek istek (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'
          }
        }
      }
    ]
  })
});

Örnek yanıt

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

WordPress bağlantı değişimi

WordPress bağlantı değişimi uç noktası, tek kullanımlık aktarım kodunu tüketir ve eklentiye API kimlik bilgilerini döndürür. Genel amaçlı kimlik bilgisi oluşturma uç noktası değildir.

Örnek istek (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();

Örnek yanıt

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

Hatalar ve istek hızı sınırları

Denetleyici hatalarının çoğu code yanıtına normalleştirilir. Kimlik doğrulama ara katmanı ve hız sınırlayıcılar bunun yerine error yanıtı döndürebilir.

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

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

{
  "error": "Too Many Requests"
}
TürSınırZaman aralığı
Genel600 istek60 saniye
GET /auth/check60 istek60 saniye
Sipariş/ürün okuma300 istek60 saniye
Sipariş yazma/yerleştirme oturumları/çalışma zamanı bağları120 istek60 saniye
Varlık/tasarım içe aktarımı okuma180 istek60 saniye
Yazı tipleri300 istek60 saniye
WP bağlantı değişimi30 istek60 saniye
GET /model-generator/*600 istek60 saniye