Live — produkcja

Asgard API
Kompleksowa dokumentacja

Produkty, znakowania i zamówienia w jednym miejscu. REST API gotowe do integracji.

GET  /api/products-index/ GET  /api/marking-data/ POST /api/orders/ 🔒 JWT Bearer
🔒  Zaloguj się do panelu Dokumentacja Swagger

Pierwsze kroki

Każde żądanie do chronionych endpointów wymaga ważnego tokena JWT w nagłówku. Poniżej trzyetapowy quick-start.

1
Pobierz token JWT
Wyślij POST /api/token/ z loginem i hasłem. Otrzymasz access (ważny 5 min) oraz refresh.
2
Dodaj nagłówek do każdego żądania
Authorization: Bearer <access_token>
3
Odświeżaj token przed wygaśnięciem
Użyj POST /api/token/refresh/ z polem refresh, by dostać nowy access bez ponownego logowania.
👥
Konto dostępowe przyznaje administrator. Swagger UI z pełnym podglądem endpointów dostępny pod adresem /docs/.
🔒

Autoryzacja JWT

API używa JWT (JSON Web Token). Token przekazuj w nagłówku Authorization przy każdym żądaniu.

POST /api/token/
POST /api/token/
Content-Type: application/json

{
  "username": "twoj_login",
  "password": "twoje_haslo"
}
Odpowiedź 200 OK
{
  "access":  "eyJhbGci...",   // <-- używaj tego, wygasa po 5 min
  "refresh": "eyJhbGci..."    // <-- do odświeżenia, ważny 1 dzień
}
Nagłówek w każdym żądaniu
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Token access wygasa po 5 minutach. Odświeżaj go przez POST /api/token/refresh/ z ciałem {"refresh": "..."}.

Produkty — przegląd

API udostępnia kilka endpointów produktowych zoptymalizowanych pod różne przypadki użycia: pełne dane, stany magazynowe, aktualizacje i katalogi.

GET/api/products-index/pełne dane, lookup po index
GET/api/products-index/{index}/jeden produkt po indeksie
GET/api/products/lista aktywnych (lookup po id)
GET/api/stock-info/tylko indeks + stan magazynowy
GET/api/last-update/zaktualizowane w ostatnich 45 min
GET/api/catalogue/produkty katalogowe (z cenami katalog.)
GET/api/christmas-catalogue/katalog świąteczny
GET/api/product-base/wszystkie produkty (aktywne i nieaktywne)admin
Do codziennej synchronizacji polecamy /api/products-index/ — dane zwracane po indeksie produktu, co upraszcza mapowanie do własnych systemów.
📄

Pełna lista produktów

Endpoint /api/products-index/ zwraca aktywne produkty ze wszystkimi powiązanymi danymi zagnieżdżonymi w jednej odpowiedzi.

Pobierz wszystkie produkty
GET  /api/products-index/             // lista wszystkich
GET  /api/products-index/ABC-123/      // jeden produkt po indeksie
Authorization: Bearer <token>

Co zawiera jeden produkt:

PoleTypOpis
indexstringUnikalny kod produktu (klucz w URL)
quantityintegerAktualny stan magazynowy
activebooleanCzy produkt jest aktywny
names[]arrayNazwy w językach: name_pl, name_en, name_de, name_fr, name_cz
descriptions[]arrayOpisy wielojęzyczne
prices[]arrayCeny: pln, eur, chf, czk
madeof[]arraySkład materiałowy (wielojęzyczny)
image[]arrayAdresy URL zdjęć produktu
additional[]arrayAtrybuty dodatkowe (klucz–wartość)
future_delivery[]arrayPlanowane dostawy: data + ilość
marking_data[]arrayDane znakowania (nested: miejsca, opcje)
category / subcategoryintegerID kategorii i podkategorii
new_product, promotion, salebooleanFlagi statusu produktu
📈

Stany magazynowe

Lekki endpoint zwracający wyłącznie indeks i ilość — idealny do częstej synchronizacji stanów.

GET /api/stock-info/
GET  /api/stock-info/
Authorization: Bearer <token>

// Odpowiedź:
{
  "count":    1250,
  "next":     "/api/stock-info/?page=2",
  "previous": null,
  "results": [
    { "index": "ABC-123", "quantity": 450 },
    { "index": "XYZ-007", "quantity": 0 },
    ...
  ]
}
Endpoint /api/last-update/ zwraca produkty zmienione w ostatnich 45 minutach — używaj go do inkrementalnej synchronizacji zamiast pobierania całego katalogu.

Filtrowanie i wyszukiwanie

Wszystkie endpointy produktowe obsługują filtrowanie przez parametry GET i paginację (100 wyników na stronę).

Parametry /api/products-index/:

?search=ABC ?index=ABC-123 ?category=5 ?new_product=true ?discount_prices=true ?promotion=true ?sale=true ?page=2
Przykłady filtrowania
// Produkty z kategorii ID=5 z rabatem
GET  /api/products-index/?category=5&discount_prices=true

// Nowości - strona 2
GET  /api/products-index/?new_product=true&page=2

// Szukaj po fragmencie indeksu
GET  /api/products-index/?search=ABC

// Kategorie i podkategorie
GET  /api/categories/
GET  /api/subcategories/
{

Struktura odpowiedzi produktu

Pełna struktura JSON jednego produktu z /api/products-index/{index}/.

Przykład odpowiedzi
{
  "id":              142,
  "index":         "ABC-123",
  "quantity":      450,
  "active":        true,
  "new_product":   false,
  "promotion":     false,
  "sale":          false,
  "discount_prices": true,
  "category":      5,
  "subcategory":   12,

  "names": [
    { "id": 1, "language": "name_pl", "title": "Kubek termiczny 350ml" },
    { "id": 2, "language": "name_en", "title": "Thermal mug 350ml" }
  ],

  "prices": [
    { "pln": "24.90", "eur": "5.80", "chf": "5.50", "czk": "138.00" }
  ],

  "image": [
    { "url": "https://cdn.example.com/products/abc-123-1.jpg" },
    { "url": "https://cdn.example.com/products/abc-123-2.jpg" }
  ],

  "future_delivery": [
    { "quantity": 200, "date": "2026-03-15" }
  ],

  "additional": [
    { "item": "wymiary", "value": "8.5 x 8.5 x 12 cm" },
    { "item": "waga",    "value": "210g" }
  ],

  "marking_data": [ /* patrz sekcja Znakowanie */ ],

  // ... names, descriptions, madeof, marking (text)
}

Znakowanie — architektura danych

Dane znakowania mają hierarchiczną strukturę. Każdy produkt może mieć wiele miejsc znakowania, a każde miejsce — kilka opcji z różnymi cenami.

Produkt
Product
Dane znakowania
MarkingData
Miejsce
MarkingPlace
Opcja / Metoda
MarkingOption
Progi cenowe
PriceCode

Jeden produkt → wiele miejsc (np. “Front”, “Tył”) → wiele opcji (np. “Sitodruk”, “Grawerowanie”) → cena zależy od ilości zamówionych sztuk.

Pojęcia kluczowe:

ObiektOpisKluczowe pola
MarkingDataGłówny węzeł znakowania produktu. Zawiera domyślną metodę.product, default_marking_code
MarkingPlaceMiejsce na produkcie gdzie można nanieść oznaczenie.code, name_pl
MarkingOptionKonkretna technika znakowania w danym miejscu.marking_code, option_code, price_code, max_colors
MarkingVariantWariant opcji (np. rozmiar pola znakowania).variant_code, variant_label
MarkingPriceCodeKlucz cenowy — łączy opcję z progami cenowymi.code
PriceCodePróg cenowy dla danej ilości zamówionych sztuk.from_qty, to_qty, price_pln
AdditionalServiceUsługi dodatkowe do znakowania (np. setup, przesyłka wzoru).service_id, service_price_pln

Endpointy znakowania

Dwa tryby dostępu: zagnieżdżony (nested — pełna hierarchia w jednym żądaniu) lub płaski (solo — każdy obiekt osobno, lżejsze odpowiedzi).

Tryb zagnieżdżony (nested):

GET/api/marking-data/pełna hierarchia w jednym żądaniu
GET/api/marking-data/?product=IDznakowanie konkretnego produktu
GET/api/marking-default/domyślna metoda per produkt (szukaj po product__index)

Tryb płaski (solo — do szczegółowego zapytania):

GET/api/marking-solodata/MarkingData, szukaj: ?search=<index>
GET/api/marking-soloplace/MarkingPlace, filtruj: ?marking_data=ID
GET/api/marking-solooption/MarkingOption, filtruj: ?marking_place=ID
GET/api/marking-additional/AdditionalService, filtruj: ?marking_data=ID
GET/api/marking-name/słownik etykiet technik znakowania
Pobierz znakowanie produktu ABC-123 (nested)
// Krok 1 — znajdź ID produktu
GET  /api/products-index/ABC-123/
// → w odpowiedzi znajdziesz "id": 142 oraz zagnieżdżone "marking_data"

// Krok 2 — lub bezpośrednio przez marking-data
GET  /api/marking-data/?product=142

// Odpowiedź (nested):
{
  "id":                    18,
  "product":              142,
  "default_marking_code": "TS-F1",
  "marking_place": [
    {
      "id":      55,
      "code":   "F1",
      "name_pl": "Przód",
      "marking_option": [
        {
          "id":            201,
          "marking_code":  "TS-F1",
          "option_code":   "TS",          // kod techniki
          "price_code":    7,           // ID → /api/marking-price/
          "max_colors":    4,
          "realisation_time_id": 3,
          "marking_variant": []
        }
      ]
    }
  ],
  "additional_service": [
    { "service_id": "SETUP", "service_price_pln": "35.00" }
  ]
}
💳

Progi cenowe znakowania

Cena za sztukę znakowania zależy od zamówionej ilości. Progi pobierasz przez price_code z opcji znakowania.

GET/api/marking-price/kody cenowe z progami (nested)
GET/api/marking-tierprice/?marking_option=IDprogi dla konkretnej opcji
Progi cenowe dla kodu “P3”
GET  /api/marking-price/?code=P3

// Odpowiedź:
{
  "id":   7,
  "code": "P3",
  "main_marking_price": [
    { "from_qty": 25,  "to_qty": 49,  "price_pln": "2.80" },
    { "from_qty": 50,  "to_qty": 99,  "price_pln": "2.20" },
    { "from_qty": 100, "to_qty": 249, "price_pln": "1.60" },
    { "from_qty": 250, "to_qty": 499, "price_pln": "1.10" }
  ]
}

Typowy przepływ integracji znakowania

Jak zbudować konfigurator znakowania krok po kroku.

1
Pobierz produkt
GET /api/products-index/ABC-123/ — w odpowiedzi masz zagnieżdżone marking_data z miejscami i opcjami.
2
Wybierz miejsce i opcję znakowania
Z marking_place[] wybierz miejsce (np. “Przód”), z marking_option[] wybierz technikę (np. “Sitodruk”). Zanotuj price_code i marking_code.
3
Pobierz ceny dla wybranej opcji
GET /api/marking-price/?code=P3 (lub /api/marking-tierprice/?marking_option=ID) — wyświetl progi cenowe dla ilości klienta.
4
Pobierz usługi dodatkowe
GET /api/marking-additional/?marking_data=ID — dodaj koszty setup, przesyłki wzoru itp.
5
Złóż zamówienie
POST /api/orders/ z danymi produktu, ilością i adresem dostawy (znakowanie w przyszłości).
Aktualne zamówienia przez /api/orders/ obejmują czysty towar (bez znakowania). Obsługa zamówień ze znakowaniem zostanie dodana w kolejnej wersji API.
👤

Profil i uprawnienia

Przed złożeniem pierwszego zamówienia sprawdź swój profil. Administrator musi ustawić trzy kluczowe pola — bez nich zamówienie nie trafi do Vendo lub zostanie zablokowane.

GET/api/me/JWT
Odpowiedź
{
  "username":       "firma_abc",
  "email":          "biuro@firma.pl",
  "vendo_id":         18479,          // null = brak → ZO nie trafi do Vendo
  "can_order":        true,           // false = POST /api/orders/ zwróci 403
  "discount_percent": 10.00,          // % rabatu na produkty z discount_prices=true
  "currency":         "PLN",          // waluta używana w zamówieniach
  "payment_method":   "banktransfer", // forma płatności w zamówieniach
  "language":         "pl"
}
PoleOpisKto ustawia
vendo_idID klienta w Vendo. Gdy null — zamówienie zapisane, ale nie wysłane do Vendo.Administrator
can_orderGdy false — API odrzuca POST /api/orders/ z błędem 403.Administrator
discount_percentRabat procentowy naliczany na produkty z discount_prices=true. Ceny CenaNetto0 i CenaNetto są automatycznie wyliczane i przekazywane do Vendo. 0 = brak rabatu.Administrator
currencyWaluta używana we wszystkich zamówieniach tego konta. Wpływa na wybór kolumny cenowej (pln / eur / chf / czk).Administrator
payment_methodForma płatności dla zamówień. Domyślnie banktransfer.Administrator
Pola profilu ustawia administrator w panelu Django Admin → Auth → Users → wybierz użytkownika → sekcja Profil. Klient nie może ich zmieniać samodzielnie.
+

Złóż zamówienie

Wystarczy podać listę produktów. Waluta, forma płatności i dane do Vendo pobierane są automatycznie z profilu zalogowanego użytkownika. Zamówienie jest od razu przesyłane do Vendo ERP.

GET/api/me/sprawdź swój profil i uprawnienia
POST/api/orders/JWT
👤
Przed złożeniem zamówienia sprawdź swój profil przez GET /api/me/. Muszą być ustawione:
vendo_id — ID klienta w Vendo (ustawia administrator)
can_order = true — uprawnienie do składania zamówień
currency i payment_method — pobierane z profilu, nie trzeba podawać w zamówieniu
discount_percent — rabat na produkty z discount_prices=true; ceny finalne liczone i wysyłane do Vendo automatycznie
Żądanie — minimalne (tylko pozycje)
POST /api/orders/
Authorization: Bearer <access_token>
Content-Type:  application/json

{
  // Własny numer zamówienia (opcjonalny) → NumerZamówienia w Vendo
  "client_reference": "MOJ-NR-2024/001",

  "notes": "Proszę o fakturę VAT",  // opcjonalne

  // Lista produktów — minimum jedna pozycja
  "items": [
    { "product_index": "ABC-123", "quantity": 50 },
    { "product_index": "XYZ-007", "quantity": 10 }
  ]
}

// Waluta i forma płatności z profilu użytkownika — nie trzeba podawać.
201 Created
{
  "id":                42,
  "client_reference": "MOJ-NR-2024/001",
  // ... pola zamawiającego i adresów ...

  "items": [
    { "product_index": "ABC-123", "quantity": 50, "marking_code": "", "marking_place": "", "marking_info": "" },
    { "product_index": "XYZ-007", "quantity": 10, "marking_code": "", "marking_place": "", "marking_info": "" }
  ],
  "attachments":      [],

  "created_at":       "2026-06-25T10:35:00.123Z",

  // Wynik synchronizacji z Vendo (wypełniany automatycznie)
  "status":           "processing",    // new | processing | confirmed | rejected
  "vendo_client_id":  18479,
  "vendo_zo_id":      2310073,
  "sent_to_erp":      true,
  "erp_order_number": "A/2026/0000042",  // numer ZO w Vendo
  "erp_error":        ""                  // puste = sukces
}
400 Bad Request
{
  "items": [
    {
      "product_index": ["Produkt o indeksie 'XYZ' nie istnieje lub jest nieaktywny."]
    }
  ],
  "billing_city": ["To pole jest wymagane."]
}
401 Unauthorized
{ "detail": "Authentication credentials were not provided." }

Pola zamówienia

Pola żądania (wejściowe):

PoleTypOpis
items[]arrayLista pozycji zamówienia. Minimum jedna.wymagane
items[].product_indexstringIndeks produktu. Musi istnieć i być aktywny.wymagane
items[].quantityintegerIlość sztuk ≥ 1.wymagane
items[].marking_place_codestringKod miejsca znakowania, np. M02. Musi istnieć dla produktu.opcjonalne
items[].marking_option_codestringKod techniki znakowania, np. C1, S1.opcjonalne
items[].marking_colorsintegerLiczba kolorów. Wymagana gdy max_colors > 0.warunkowe
items[].marking_infostringOpis znakowania / instrukcje.opcjonalne
client_referencestringWłasny numer zamówienia → NumerZamówienia w Vendo. NumerObcy = API-{id}.opcjonalne
notesstringUwagi do zamówienia.opcjonalne

Pola pobierane automatycznie z profilu użytkownika:

PoleOpis
currencyWaluta zamówienia: PLN / EUR / CHF / CZK. Ustawiana przez admina w profilu.
payment_methodForma płatności: banktransfer / prepayment / cod. Domyślnie banktransfer.
vendo_client_idID klienta w Vendo. Bez tego ZO nie zostanie utworzone.
CenaNetto0 / CenaNettoDla produktów z discount_prices=true: cena bazowa i cena po rabacie (discount_percent z profilu) liczone automatycznie i przekazywane do Vendo. Dla pozostałych produktów Vendo używa własnych cen.

Pola odpowiedzi (tylko do odczytu):

PoleOpis
statusnew — nie wysłano  |  processing — przekazano do Vendo  |  confirmed — potwierdzone  |  rejected — odrzucone
erp_order_numberPełny numer ZO w Vendo, np. A/2026/0000042.
vendo_zo_idNumeryczny ID dokumentu ZO w Vendo.
erp_errorBłąd Vendo. Pusty = sukces.
attachments[]Ogólne załączniki zamówienia.
📌
Dostępne kody produktów: GET /api/stock-info/. Profil i uprawnienia: GET /api/me/.

Zamówienie ze znakowaniem

Każda pozycja zamówienia może zawierać znakowanie. Podajesz kod miejsca i techniki z danych produktu z API. System weryfikuje, czy takie znakowanie istnieje dla produktu, zanim przyjmie zamówienie.

🔍
Kody miejsc i opcji znakowania pobierasz z GET /api/marking-data/?product={id} lub z zagnieżdżonego marking_data[] w odpowiedzi produktu. Szukaj pól code (miejsce) i option_code (technika).

Pola pozycji ze znakowaniem:

PoleTypOpis
marking_place_codestringKod miejsca znakowania, np. M02. Musi istnieć dla produktu.opcjonalne
marking_option_codestringKod techniki znakowania, np. C1, S1, F1. Musi istnieć w danym miejscu.opcjonalne
marking_colorsintegerLiczba kolorów. Wymagana gdy technika ma max_colors > 0.warunkowe
marking_infostringOpis znakowania / instrukcje dla grafika.opcjonalne
design_files[]arrayLista plików projektu dla tej pozycji (tylko odczyt). Pliki przesyłasz osobnym żądaniem.read-only
Zamówienie z dwoma pozycjami — jedna ze znakowaniem
POST /api/orders/
Authorization: Bearer <token>
Content-Type:  application/json

{
  // ... pola zamawiającego i adresy ...

  "items": [
    {
      "product_index":      "20820-14",
      "quantity":           100,
      "marking_place_code": "M02",        // Tył
      "marking_option_code":"C1",         // DTF 60x50mm
      "marking_info":       "Logo firmowe, projekt w załączniku"
    },
    {
      "product_index":      "20820-14",
      "quantity":           50,
      "marking_place_code": "M02",
      "marking_option_code":"S1",         // Sitodruk 300x250mm
      "marking_colors":     2,            // max_colors=3
      "marking_info":       "Logo 2-kolorowe PMS"
    }
  ]
}

Upload pliku projektu dla pozycji:

POST/api/orders/{id}/items/{item_id}/designJWT
cURL — upload pliku projektu
# Krok 1 — złóż zamówienie, zanotuj id zamówienia i id pozycji
# W odpowiedzi items[0].id = 99 (id pozycji)

# Krok 2 — wyślij plik projektu
curl -X POST https://developers.bluecollection.eu/api/orders/42/items/99/design \
  -H "Authorization: Bearer $TOKEN" \
  -F "file=@/sciezka/do/logo.pdf"

// Odpowiedź 201:
{
  "id":          7,
  "file":        "/media/order_item_designs/42/logo.pdf",
  "uploaded_at": "2026-06-25T11:30:00.000Z"
}
Po wysłaniu zamówienia do Vendo pliki projektów są dołączane do dokumentu ZO jako base64, a jednocześnie kopiowane do wspólnego katalogu na serwerze SHARED_DESIGNS_PATH/{numer_ZO}/ — w ten sam sposób jak robi to magento_api_sync.
Gdy zamówienie zawiera znakowanie, po pomyślnym dodaniu ZO do Vendo wysyłany jest webhook na adres MARKING_WEBHOOK_URL z danymi zamówienia i listą pozycji ze znakowaniem.
📎

Załączniki

Do każdego zamówienia możesz dołączyć pliki (PDF, PNG, XLSX itp.). Załączniki są zapisywane na serwerze i przesyłane do dokumentu ZO w Vendo jako base64 przy wysyłce.

POST/api/orders/{id}/attachments/JWT
DEL/api/orders/{id}/attachments/{attachment_id}/admin
Dodaj załącznik (multipart/form-data)
POST /api/orders/42/attachments/
Authorization: Bearer <token>
Content-Type:  multipart/form-data

// Pole formularza: file

// cURL:
curl -X POST https://developers.bluecollection.eu/api/orders/42/attachments/ \
  -H "Authorization: Bearer $TOKEN" \
  -F "file=@/path/to/wzor.pdf"

// Odpowiedź 201:
{
  "id":          1,
  "file":        "/media/order_attachments/2026/06/wzor.pdf",
  "uploaded_at": "2026-06-25T11:00:00.000Z"
}
Jeśli załącznik zostanie dodany po wysłaniu zamówienia do Vendo, użyj endpointu POST /api/orders/{id}/send_to_vendo/ (admin), aby ponownie zsynchronizować i dołączyć plik do ZO.

Status & synchronizacja z Vendo

Każde zamówienie jest automatycznie wysyłane do Vendo ERP zaraz po jego utworzeniu. Pole status odzwierciedla wynik synchronizacji.

new
Nowe

Zamówienie zapisane, ale nie wysłane do Vendo (brak vendo_client_id lub błąd sieci).

processing
Przekazane do Vendo

ZO zostało utworzone w Vendo. Pole erp_order_number zawiera jego numer.

confirmed
Potwierdzone

Zamówienie potwierdzone po stronie Vendo.

rejected
Odrzucone

Zamówienie odrzucone po stronie Vendo.

Numeracja w Vendo:

Pole VendoWartośćOpis
NumerObcyAPI-{id}Numer nadawany przez ten system. Zawsze w tym formacie.
NumerZamówieniaclient_referenceWłasny numer klienta, jeśli podany w żądaniu.

Ręczna wysyłka / ponowna próba admin:

POST/api/orders/{id}/send_to_vendo/
Ponowna wysyłka do Vendo
POST /api/orders/42/send_to_vendo/
Authorization: Bearer <admin_token>

// Odpowiedź 200 — zaktualizowany obiekt zamówienia:
{
  "id":               42,
  "status":          "processing",
  "erp_order_number":"A/2026/0000042",
  "erp_error":       ""
}
👤
Aby zamówienie mogło trafić do Vendo, użytkownik musi mieć uzupełnione pole ID klienta w Vendo w panelu admina. Bez tego wartość erp_error będzie zawierać komunikat „Brak ID klienta w Vendo", a status pozostanie new.

Lista zamówień

Pobierz i przeszukuj złożone zamówienia. Filtr status pozwala monitorować kolejkę do Vendo.

GET/api/orders/JWT
GET/api/orders/{id}/szczegóły jednego zamówienia
?status=new ?status=processing ?sent_to_erp=false ?currency=EUR ?payment_method=cod ?search=Kowalski ?search=ABC-123 ?page=2
Zamówienia nie wysłane do Vendo
GET  /api/orders/?status=new
Authorization: Bearer <token>

Kody odpowiedzi

200
OK

Żądanie GET zakończone sukcesem.

201
Created

Zasób (zamówienie) utworzony pomyślnie.

400
Bad Request

Błąd walidacji — sprawdź treść odpowiedzi.

401
Unauthorized

Brak lub nieważny token JWT.

403
Forbidden

Brak uprawnień do zasobu.

404
Not Found

Zasób nie istnieje (np. błędny indeks).

Przykłady kodu

cURL — token + dane produktów
# 1. Pobierz token
TOKEN=$(curl -s -X POST https://developers.bluecollection.eu/api/token/ \
  -H "Content-Type: application/json" \
  -d '{"username":"login","password":"haslo"}' \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['access'])")

# 2. Lista produktów (paginowana)
curl https://developers.bluecollection.eu/api/products/ \
  -H "Authorization: Bearer $TOKEN"

# 3. Szczegóły produktu po indeksie
curl https://developers.bluecollection.eu/api/products-index/ABC-123/ \
  -H "Authorization: Bearer $TOKEN"

# 4. Stany magazynowe
curl https://developers.bluecollection.eu/api/stock-info/ \
  -H "Authorization: Bearer $TOKEN"
Python (requests)
import requests

BASE = "https://developers.bluecollection.eu"

# 1. Token
token = requests.post(f"{BASE}/api/token/", json={
    "username": "login", "password": "haslo"
}).json()["access"]
headers = {"Authorization": f"Bearer {token}"}

# 2. Lista produktów (pierwsza strona)
products = requests.get(f"{BASE}/api/products/", headers=headers).json()
print(f"Łącznie produktów: {products['count']}")

# 3. Szczegóły produktu po indeksie
product = requests.get(f"{BASE}/api/products-index/ABC-123/", headers=headers).json()
print(f"Stan: {product['quantity']} szt.")

# 4. Znakowanie produktu
marking = requests.get(f"{BASE}/api/marking-data/?product={product['id']}", headers=headers).json()
print(marking)
JavaScript (fetch)
const BASE = "https://developers.bluecollection.eu";
const post = (url, body, tok) => fetch(BASE + url, {
  method: "POST", headers: { "Content-Type": "application/json",
    ...(tok && { "Authorization": `Bearer ${tok}` }) },
  body: JSON.stringify(body) }).then(r => r.json());

// 1. Token
const { access } = await post("/api/token/", { username: "login", password: "haslo" });

// 2. Lista produktów
const get = (url) => fetch(BASE + url,
  { headers: { "Authorization": `Bearer ${access}` } }).then(r => r.json());

const products = await get("/api/products/");
console.log(`Łącznie produktów: ${products.count}`);

// 3. Szczegóły produktu po indeksie
const product = await get("/api/products-index/ABC-123/");
console.log(`Stan: ${product.quantity} szt.`);

// 4. Znakowanie produktu
const marking = await get(`/api/marking-data/?product=${product.id}`);
console.log(marking);
PHP (cURL)
<?php
$base = "https://developers.bluecollection.eu";
function apiPost($url, $data, $token = null) {
    $ch = curl_init($url);
    $headers = ["Content-Type: application/json"];
    if ($token) $headers[] = "Authorization: Bearer $token";
    curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true, CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POSTFIELDS => json_encode($data)]);
    return json_decode(curl_exec($ch));
}

// 1. Token
$auth  = apiPost("$base/api/token/", ["username"=>"login","password"=>"haslo"]);
$token = $auth->access;

// 2. Lista produktów
$ch = curl_init("$base/api/products/");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["Authorization: Bearer $token"]]);
$products = json_decode(curl_exec($ch));
echo "Łącznie produktów: {$products->count}\n";

// 3. Szczegóły produktu po indeksie
$ch = curl_init("$base/api/products-index/ABC-123/");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["Authorization: Bearer $token"]]);
$product = json_decode(curl_exec($ch));
echo "Stan: {$product->quantity} szt.\n";
print_r($product);
🔗
Adres serwera API: developers.bluecollection.eu. Dane logowania uzyskasz od administratora.