Customizer — integracja API

Integracja API — uwierzytelnianie

Aby zintegrować się z Customizer API i pobierać dane produktów, musisz najpierw wygenerować klucze dostępu.

Generowanie kluczy API

  1. Zaloguj się do panelu: Ustawienia e-commerce — Dane dostępowe API
  2. Kliknij Dodaj dane dostępowe ⚠️ Klucze można wyświetlić tylko raz po wygenerowaniu. Jeśli później je utracisz, trzeba będzie wygenerować nowe.

Nagłówki uwierzytelniające

Wszystkie zapytania muszą zawierać nagłówki z danymi uwierzytelniającymi (tylko po stronie serwera!).

Uwagi operacyjne

  • Base path: https://alterproduct.com/public-api/v1
  • Endpoint zdrowia: GET /healthz
  • Tylko połączenia server-to-server.
x-alter-access-key: API_KEY
x-alter-access-token: API_TOKEN

Test połączenia

Aby sprawdzić, czy połączenie z API działa poprawnie, wyślij zapytanie GET na poniższy adres:

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

Oczekiwana odpowiedź:

{
  "ok": true,
  "message": "success",
  "storefrontId": 12,
  "userOwnerId": 34,
  "credentialId": 56,
  "scopes": ["orders:read", "orders:write"]
}

Przykładowe zapytanie (Node.js / fetch)

const response = await fetch('https://alterproduct.com/public-api/v1/auth/check', {
  method: 'GET',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json',
  }
});

const result = await response.json();
console.log(result);

Przykładowe zapytanie (axios)

import axios from 'axios';

const result = await axios.get('https://alterproduct.com/public-api/v1/auth/check', {
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json',
  }
});

console.log(result.data);

Endpointy API

Lista dostępnych endpointów dla /public-api. Endpointy pozwalają uwierzytelniać zapytania, zarządzać zamówieniami klientów, uzyskiwać dostęp do produktów storefrontu, generować sesje embed i tokeny dostępu oraz pobierać publiczne lub chronione pliki dla uwierzytelnionego storefrontu.
MetodaEndpointOpisScope
GET/public-api/v1/auth/checkSprawdza, czy podane dane API są poprawne dla bieżącego storefrontu (test auth/health).(dowolny uwierzytelniony)
GET/public-api/v1/customer-ordersPobiera paginowaną listę zamówień dla uwierzytelnionego storefrontu.orders:read
GET/public-api/v1/customer-orders/:idPobiera szczegóły pojedynczego zamówienia.orders:read
POST/public-api/v1/customer-orders/batchPobiera listę zamówień na podstawie tablicy identyfikatorów.orders:read
PATCH/public-api/v1/customer-orders/:id/statusAktualizuje status zamówienia.orders:write
PATCH/public-api/v1/customer-orders/:orderId/quantityAktualizuje ilości dla wybranych pozycji zamówienia.orders:write
PATCH/public-api/v1/customer-orders/:orderId/quantity/allUstawia tę samą ilość dla wszystkich pozycji zamówienia.orders:write
DELETE/public-api/v1/customer-orders/:idUsuwa zamówienie.orders:write
POST/public-api/v1/embed/sessionTworzy sesję embed używaną do zainicjalizowania osadzonego Viewer/Configurator/Customizer.embed:session:create
GET/public-api/v1/files/public/products/:productId/:sizeZwraca publiczny plik podglądu produktu (CORS włączony).(publiczny)
GET/public-api/v1/productsPobiera listę produktów dla uwierzytelnionego storefrontu.products:read
GET/public-api/v1/products/:idPobiera szczegóły pojedynczego produktu dla uwierzytelnionego storefrontu.products:read

Pobieranie listy zamówień klientów

GET https://alterproduct.com/public-api/v1/customer-orders

Ten endpoint zwraca paginowaną listę zamówień klientów dla uwierzytelnionego storefrontu. Zwykle używa się go do synchronizacji systemów zewnętrznych (np. backendu sklepu lub paneli) z zamówieniami tworzonymi przez customizer.

Przykładowe zapytanie

const params = new URLSearchParams({
  // Filters (optional)
  name: 'T-shirt',              // string
  category_id: 12,         // number
  order_status: 'pending',   // string

  // Pagination (optional)
  offset: 0,               // number >= 0
  limit: 20,               // number 1-50

  // Sorting (optional)
  order_by: 'created_at',    // id | created_at | design_name
  direction: 'DESC'          // ASC | DESC
});

const url = `https://alterproduct.com/public-api/v1/customer-orders?${params.toString()}`;

const res = await fetch(url, {
  method: 'GET',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  }
});

const data = await res.json();
console.log(data);

fetch (Node.js):

{
    "order": {
        "items": [
            {
                "id": 33,
                "customizerId": 381,
                "isSeenByOwner": false,
                "orderStatus": "shopping_cart",
                "createdAt": "2026-02-09T01:55:48.000Z",
                "customizerOrderURL": "http://localhost:3000/app/customizer/381/33",
                "productItems": [
                    {
                        "id": 29,
                        "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,
                            "minOrderQuantity": 0,
                            "processingTime": 0,
                            "stockQuantity": 0,
                            "volume": null,
                            "weight": null
                        },
                        "unitPrice": {
                            "value": 5,
                            "currency": "EUR"
                        },
                        "totalPrice": {
                            "value": 5,
                            "currency": "EUR"
                        },
                        "quantity": 1,
                        "updatedAt": "2026-02-09 01:55:49.000000"
                    }
                ],
                "customizerName": "Men’s T-Shirt",
                "productGroup": null,
                "totalPrice": {
                    "value": 5,
                    "currency": "EUR"
                }
            }
        ],
        "total": 1
    }
}

Pobieranie pojedynczego zamówienia klienta

GET https://alterproduct.com/public-api/v1/customer-orders/:id

Ten endpoint zwraca pełne szczegóły pojedynczego zamówienia klienta — w tym status, przypisany projekt, model 3D, link do edycji, wybrany wariant oraz łączną cenę.

Przykładowe zapytanie (fetch)

const res = await fetch('https://alterproduct.com/public-api/v1/customer-orders/1', {
  method: 'GET',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  }
});

const data = await res.json();
console.log(data);

Przykładowa odpowiedź

{
    "order": {
        "id": 1,
        "customizerId": 10,
        "orderStatus": "editable",
        "createdAt": "2025-07-28T14:18:20.000Z",
        "customizerOrderURL": "https://alterproduct.com/app/customizer/10/1",
        "productItems": [
            {
                "id": 1,
                "model3d": {
                    "id": 10
                },
                "size": {
                    "id": 9,
                    "name": {
                        "pl": "450ml (15oz)",
                        "en": "450ml (15oz)"
                    },
                    "measureSize": {
                        "D": 8.65,
                        "H": 11.95
                    }
                },
                "material": {
                    "id": 3,
                    "name": {
                        "pl": "Ceramika",
                        "en": "Ceramic"
                    }
                },
                "printType": {
                    "id": 5,
                    "name": {
                        "pl": "Sublimacja",
                        "en": "Sublimation"
                    }
                },
                "color": {
                    "id": 11,
                    "name": {
                        "pl": "Domyślny",
                        "en": "Default"
                    },
                    "hex": "#FFFFFF"
                },
                "variant": {
                    "id": 11,
                    "productGroupId": 1,
                    "productModel3dId": 3,
                    "sizeId": 9,
                    "materialId": 3,
                    "printTypeId": 5,
                    "colorId": 11,
                    "metadata": null,
                    "minOrderQuantity": null,
                    "processingTime": null,
                    "stockQuantity": null,
                    "volume": null,
                    "weight": null
                },
                "unitPrice": {
                    "value": 0,
                    "currency": "EUR"
                },
                "totalPrice": {
                    "value": 0,
                    "currency": "EUR"
                },
                "quantity": 1,
                "updatedAt": "2025-07-28 14:18:20.000000"
            }
        ],
        "designName": "Mug 450ml (15oz)",
        "productGroup": {
            "id": 1,
            "name": {
                "pl": "Kubek 450ml (15oz)",
                "en": "Mug 450ml (15oz)"
            }
        },
        "totalPrice": {
            "value": 0,
            "currency": "EUR"
        }
    }
}

Pobieranie wielu zamówień

POST https://alterproduct.com/public-api/v1/customer-orders/batch

Ten endpoint pozwala pobrać listę zamówień na podstawie ich ID. Jest szczególnie przydatny, gdy klient dodał do koszyka wiele projektów.

Przykładowe zapytanie

Body JSON:

{
  "customerOrderIds": [1, 2, 3]
}

fetch (Node.js):

const response = await fetch('https://alterproduct.com/public-api/v1/customer-orders/batch', {
  method: 'POST',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    customerOrderIds: [1, 2, 3]
  })
});

const data = await response.json();
console.log(data);

Przykładowa odpowiedź

{
    "orders": [
        {
            "id": 1,
            "customizerId": 10,
            "orderStatus": "editable",
            "createdAt": "2025-07-28T14:18:20.000Z",
            "customizerOrderURL": "https://alterproduct.com/app/customizer/10/1",
            "productItems": [
                {
                    "id": 1,
                    "model3d": {
                        "id": 10
                    },
                    "size": {
                        "id": 9,
                        "name": {
                            "pl": "450ml (15oz)",
                            "en": "450ml (15oz)"
                        },
                        "measureSize": {
                            "D": 8.65,
                            "H": 11.95
                        }
                    },
                    "material": {
                        "id": 3,
                        "name": {
                            "pl": "Ceramika",
                            "en": "Ceramic"
                        }
                    },
                    "printType": {
                        "id": 5,
                        "name": {
                            "pl": "Sublimacja",
                            "en": "Sublimation"
                        }
                    },
                    "color": {
                        "id": 11,
                        "name": {
                            "pl": "Domyślny",
                            "en": "Default"
                        },
                        "hex": "#FFFFFF"
                    },
                    "variant": {
                        "id": 11,
                        "productGroupId": 1,
                        "productModel3dId": 3,
                        "sizeId": 9,
                        "materialId": 3,
                        "printTypeId": 5,
                        "colorId": 11,
                        "metadata": null,
                        "minOrderQuantity": null,
                        "processingTime": null,
                        "stockQuantity": null,
                        "volume": null,
                        "weight": null
                    },
                    "unitPrice": {
                        "value": 0,
                        "currency": "EUR"
                    },
                    "totalPrice": {
                        "value": 0,
                        "currency": "EUR"
                    },
                    "quantity": 1,
                    "updatedAt": "2025-07-28 14:18:20.000000"
                }
            ],
            "designName": "Mug 450ml (15oz)",
            "productGroup": {
                "id": 1,
                "name": {
                    "pl": "Kubek 450ml (15oz)",
                    "en": "Mug 450ml (15oz)"
                }
            },
            "totalPrice": {
                "value": 0,
                "currency": "EUR"
            }
        },
        {
            "id": 2,
            "customizerId": 10,
            "orderStatus": "editable",
            "createdAt": "2025-07-28T14:20:48.000Z",
            "customizerOrderURL": "https://alterproduct.com/app/customizer/10/2",
            "productItems": [
                {
                    "id": 2,
                    "model3d": {
                        "id": 10
                    },
                    "size": {
                        "id": 9,
                        "name": {
                            "pl": "450ml (15oz)",
                            "en": "450ml (15oz)"
                        },
                        "measureSize": {
                            "D": 8.65,
                            "H": 11.95
                        }
                    },
                    "material": {
                        "id": 3,
                        "name": {
                            "pl": "Ceramika",
                            "en": "Ceramic"
                        }
                    },
                    "printType": {
                        "id": 5,
                        "name": {
                            "pl": "Sublimacja",
                            "en": "Sublimation"
                        }
                    },
                    "color": {
                        "id": 11,
                        "name": {
                            "pl": "Domyślny",
                            "en": "Default"
                        },
                        "hex": "#FFFFFF"
                    },
                    "variant": {
                        "id": 11,
                        "productGroupId": 1,
                        "productModel3dId": 3,
                        "sizeId": 9,
                        "materialId": 3,
                        "printTypeId": 5,
                        "colorId": 11,
                        "metadata": null,
                        "minOrderQuantity": null,
                        "processingTime": null,
                        "stockQuantity": null,
                        "volume": null,
                        "weight": null
                    },
                    "unitPrice": {
                        "value": 0,
                        "currency": "EUR"
                    },
                    "totalPrice": {
                        "value": 0,
                        "currency": "EUR"
                    },
                    "quantity": 1,
                    "updatedAt": "2025-07-28 14:20:48.000000"
                }
            ],
            "designName": "Mug 450ml (15oz)",
            "productGroup": {
                "id": 1,
                "name": {
                    "pl": "Kubek 450ml (15oz)",
                    "en": "Mug 450ml (15oz)"
                }
            },
            "totalPrice": {
                "value": 0,
                "currency": "EUR"
            }
        },
        {
            "id": 3,
            "customizerId": 10,
            "orderStatus": "editable",
            "createdAt": "2025-07-28T14:21:19.000Z",
            "customizerOrderURL": "https://alterproduct.com/app/customizer/10/3",
            "productItems": [
                {
                    "id": 3,
                    "model3d": {
                        "id": 10
                    },
                    "size": {
                        "id": 9,
                        "name": {
                            "pl": "450ml (15oz)",
                            "en": "450ml (15oz)"
                        },
                        "measureSize": {
                            "D": 8.65,
                            "H": 11.95
                        }
                    },
                    "material": {
                        "id": 3,
                        "name": {
                            "pl": "Ceramika",
                            "en": "Ceramic"
                        }
                    },
                    "printType": {
                        "id": 5,
                        "name": {
                            "pl": "Sublimacja",
                            "en": "Sublimation"
                        }
                    },
                    "color": {
                        "id": 11,
                        "name": {
                            "pl": "Domyślny",
                            "en": "Default"
                        },
                        "hex": "#FFFFFF"
                    },
                    "variant": {
                        "id": 11,
                        "productGroupId": 1,
                        "productModel3dId": 3,
                        "sizeId": 9,
                        "materialId": 3,
                        "printTypeId": 5,
                        "colorId": 11,
                        "metadata": null,
                        "minOrderQuantity": null,
                        "processingTime": null,
                        "stockQuantity": null,
                        "volume": null,
                        "weight": null
                    },
                    "unitPrice": {
                        "value": 0,
                        "currency": "EUR"
                    },
                    "totalPrice": {
                        "value": 0,
                        "currency": "EUR"
                    },
                    "quantity": 1,
                    "updatedAt": "2025-07-28 14:21:19.000000"
                }
            ],
            "designName": "Mug 450ml (15oz)",
            "productGroup": {
                "id": 1,
                "name": {
                    "pl": "Kubek 450ml (15oz)",
                    "en": "Mug 450ml (15oz)"
                }
            },
            "totalPrice": {
                "value": 0,
                "currency": "EUR"
            }
        }
    ]
}

Aktualizacja statusu zamówienia

PATCH https://alterproduct.com/public-api/v1/customer-orders/:id/status

Pozwala zmienić status konkretnego zamówienia klienta. Status można też zmienić ręcznie w panelu zamówień Customizera lub przez API.

Kontekst

Gdy klient kliknie „Dodaj do koszyka” w Customizerze, powstaje zamówienie w trybie edytowalnym ze statusem shopping_cart i nadal może być edytowane przez: https://alterproduct.com/app/customizer/{customizerId}/{orderId}. Po przejściu do statusów realizacji takich jak paid, processing, completed lub cancelled, edycja przez klienta zostaje zablokowana.

Dostępne wartości statusu (enum)

StatusOpis
shopping_cartZamówienie jest w procesie koszyka i nadal może być edytowane przez klienta
editableZamówienie pozostaje edytowalne przez klienta
processingZamówienie przeszło przez checkout
paidZamówienie jest opłacone i oczekuje na realizację
completedZamówienie zostało zrealizowane
cancelledZamówienie zostało anulowane

Edytowalne etapy klienta są obsługiwane przez statusy takie jak „shopping_cart” i „editable”. Statusy końcowe (np. „paid”, „processing”, „completed”, „cancelled”) blokują dalszą edycję.

Przykładowe zapytanie (fetch)

const res = await fetch('https://alterproduct.com/public-api/v1/customer-orders/1/status', {
  method: 'PATCH',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    status: 'processing'
  })
});

const data = await res.json();
console.log(data);

Przykładowa odpowiedź

{
  "success": true,
  "message": "Order status updated.",
  "orderId": 1,
  "newStatus": "processing"
}

Aktualizacja ilości dla konkretnej pozycji zamówienia

PATCH https://alterproduct.com/public-api/v1/customer-orders/:orderId/quantity

Ten endpoint pozwala zaktualizować ilość dla konkretnego wariantu (productItem) w jednym zamówieniu.

Przykładowe zapytanie

Body JSON:

{
  "items": [
    { "orderDetailId": 1, "quantity": 3 }
  ]
}

fetch (Node.js):

const response = await fetch('https://alterproduct.com/public-api/v1/customer-orders/1/quantity', {
  method: 'PATCH',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    items: [
      { orderDetailId: 1, quantity: 3 } // ID pozycji z zamówienia (productItem)
    ]
  })
});

const result = await response.json();
console.log(result);

Przykładowa odpowiedź

{
  "success": true,
  "message": "Order quantities updated.",
  "orderId": 1
}

Ustawienie tej samej ilości dla wszystkich pozycji (productItems) w zamówieniu

PATCH https://alterproduct.com/public-api/v1/customer-orders/:orderId/quantity/all

Ten endpoint pozwala łatwo ustawić tę samą ilość dla wszystkich pozycji (productItems) w zamówieniu.

Przykładowe zapytanie

Body JSON:

{
  "quantity": 2
}

fetch (Node.js):

const response = await fetch('https://alterproduct.com/public-api/v1/customer-orders/1/quantity/all', {
  method: 'PATCH',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    quantity: 2
  })
});

const result = await response.json();
console.log(result);

Przykładowa odpowiedź

{
    "success": true,
    "orderId": 1,
    "quantity": 2
}

Usuwanie zamówienia klienta

DELETE https://alterproduct.com/public-api/v1/customer-orders/:id

Ten endpoint służy do trwałego usunięcia zamówienia klienta — np. gdy projekt został porzucony lub anulowany przed produkcją. Po usunięciu zamówienia nie można go już otworzyć ani edytować.

Przykładowe zapytanie (fetch, Node.js)

const response = await fetch('https://alterproduct.com/public-api/v1/customer-orders/1', {
  method: 'DELETE',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  }
});

const result = await response.json();
console.log(result);

Przykładowa odpowiedź

{
  "success": true,
  "message": "Order deleted.",
  "orderId": 1
}

Sesja embed

POST https://alterproduct.com/public-api/v1/embed/session

Ten endpoint tworzy krótkotrwały token sesji embed (JWT), który pozwala Twojej aplikacji bezpiecznie otworzyć narzędzia Alter Product (viewer, configurator, customizer) dla konkretnego zasobu (projektu lub zamówienia) oraz zweryfikowanego origin. Token ma minimalne uprawnienia i wygasa automatycznie (TTL: 3600s).

Przykładowe zapytanie (fetch, Node.js)

const response = await fetch('https://alterproduct.com/public-api/v1/embed/session', {
  method: 'POST',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    tool: 'customizer', // Tool to open: viewer | configurator | customizer
    origin: 'https://yourstore.com', // Domain where embed will be rendered (must be allowed in settings)
    designId: 123 // Resource identifier (provide designId OR orderId)
  })
});

const result = await response.json();
console.log(result);

Przykładowa odpowiedź

{
  "token": "eyJhbGciOiJIUzI1NiIsImtpZCI6IjEifQ...",
  "expiresIn": 3600,
  "kid": "1",
  "mode": "design"
}

Publiczny plik podglądu produktu

GET https://alterproduct.com/public-api/v1/files/public/products/:productId/:size

Ten endpoint zwraca publiczny obraz podglądu produktu. Nie wymaga uwierzytelnienia i ma włączony CORS, więc można go używać bezpośrednio w przeglądarkach lub aplikacjach frontendowych.

Przykładowe zapytanie (przeglądarka / fetch)

const url = "https://alterproduct.com/public-api/v1/files/public/products/42/medium";

const response = await fetch(url);
const blob = await response.blob();

const imageUrl = URL.createObjectURL(blob);
console.log(imageUrl);

Przykładowa odpowiedź

Binary image file (image/png or image/webp)

Produkty storefrontu

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

Ten endpoint zwraca listę produktów dostępnych dla uwierzytelnionego storefrontu (posiadających viewer, configurator lub customizer).

Przykładowe zapytanie (fetch, Node.js)

const params = new URLSearchParams({
  offset: '0',          // default: 0
  limit: '9',           // default: 9, max: 50
  name: 't-shirt',      // optional search
  customizer: 'true',   // optional: true/false
  order_by: 'name',     // optional (whitelisted server-side)
  direction: 'ASC'      // ASC | DESC
});

const response = await fetch(`https://alterproduct.com/public-api/v1/products?${params.toString()}`, {
  method: 'GET',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  }
});

const result = await response.json();
console.log(result);

Przykładowa odpowiedź

{
  "products": {
    "items": [
      {
        "id": 381,
        "name": "Men’s T-Shirt",
        "createdAt": "2026-01-03T23:55:05.000Z",
        "productId": 4,
        "media": {
          "img": {
            "big": "http://localhost:5010/v1/file/public/products/4/big.png",
            "medium": "http://localhost:5010/v1/file/public/products/4/medium.png",
            "small": "http://localhost:5010/v1/file/public/products/4/small.png"
          }
        },
        "storefrontProduct": {
          "id": 89,
          "shareAccess": "public",
          "idUserDesign": 381,
          "isCustomizer": 1
        },
        "embeddable": {
          "viewer": true,
          "configurator": true,
          "customizer": true
        }
      }
    ],
    "total": 1
  }
}

Pobieranie pojedynczego produktu

GET https://alterproduct.com/public-api/v1/products/:id

Ten endpoint zwraca pełne szczegóły pojedynczego produktu dla uwierzytelnionego storefrontu.

Przykładowe zapytanie (fetch, Node.js)

const productId = 381;

const response = await fetch(`https://alterproduct.com/public-api/v1/products/${productId}`, {
  method: 'GET',
  headers: {
    'x-alter-access-key': 'YOUR_API_KEY',
    'x-alter-access-token': 'YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  }
});

const result = await response.json();
console.log(result);

Przykładowa odpowiedź

{
  "id": 381,
  "name": "Men’s T-Shirt",
  "createdAt": "2026-01-03T23:55:05.000Z",
  "productId": 4,
  "media": {
    "img": {
      "big": "http://localhost:5010/v1/file/public/products/4/big.png",
      "medium": "http://localhost:5010/v1/file/public/products/4/medium.png",
      "small": "http://localhost:5010/v1/file/public/products/4/small.png"
    }
  },
  "storefrontProduct": {
    "id": 89,
    "shareAccess": "public",
    "idUserDesign": 381,
    "isCustomizer": 1
  },
  "embeddable": {
    "viewer": true,
    "configurator": true,
    "customizer": true
  }
}