REST API v1

Integracja przez REST API

Pobieraj produkty, stany magazynowe i swoje indywidualne ceny La Grana bezpośrednio do swojego systemu. Pełna automatyzacja z uwierzytelnianiem JWT.

🔐
JWT Auth
Bezpieczne uwierzytelnianie tokenami JWT z automatycznym odświeżaniem.
REST + JSON
Standardowe endpointy REST z odpowiedziami JSON. Prosto i przewidywalnie.
💰
Indywidualne ceny
Każde konto ma przypisane indywidualne ceny i rabat — widoczne bezpośrednio w odpowiedziach API.
Uwierzytelnianie
API La Grana używa JWT (JSON Web Tokens). Najpierw uzyskaj token, a następnie dołącz go do każdego żądania w nagłówku Authorization.
POST /api/token/ Uzyskaj token dostępu
PoleTypOpis
usernamewymaganeTwój login do systemu La Grana
passwordwymaganeTwoje hasło
cURL
curl -X POST https://b2b.lagrana.pl/api/token/ \
  -H "Content-Type: application/json" \
  -d '{"username": "twoj_login", "password": "haslo"}'
Odpowiedź
{
  "access":  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

Token access ważny przez 60 minut. Odśwież przez POST /api/token/refresh/ podając token refresh.

Dołącz token do każdego żądania:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Base URL i format
Wszystkie żądania kieruj na poniższy adres. API zwraca i przyjmuje dane w formacie JSON (UTF-8). Wszystkie endpointy listowania są paginowane — używaj pola next do iterowania stron.
https://b2b.lagrana.pl/api/
Odpowiedź z paginacją
{
  "count": 1248,        // łączna liczba wyników
  "next":  "https://b2b.lagrana.pl/api/products/?page=2",
  "previous": null,
  "results": [ /* ... */ ]
}
Produkty
Pełny katalog produktów z opisami, zdjęciami, atrybutami i Twoimi indywidualnymi cenami. client_price to cena końcowa po rabacie; client_price_without_discount to cena bazowa przed rabatem.
GET /api/products/ Lista produktów (paginacja)
ParametrTypOpis
pageopcjonalnyNumer strony (domyślnie 1)
brandopcjonalnyFiltruj po nazwie marki
categoriesopcjonalnyFiltruj po ID kategorii
statusopcjonalnyFiltruj po ID statusu
activeopcjonalnytrue / false
searchopcjonalnySzukaj po SKU lub statusie

Pola odpowiedzi

id sku name brand ean active vat_rate for_who advantages stock_warehouse stock_supplier added_at updated_at client_price client_price_without_discount categories [ ] status { } prod_image [ ] description { } additional [ ]

pola cenowe   zagnieżdżone obiekty/tablice

Odpowiedź
{
  "count": 1248,
  "next": "https://b2b.lagrana.pl/api/products/?page=2",
  "previous": null,
  "results": [
    {
      "id": 42,
      "sku": "LG-12345",
      "name": "Nazwa produktu",
      "brand": "BrandName",
      "ean": "1234567890123",
      "active": true,
      "vat_rate": 23,
      "for_who": "Dla niej",
      "advantages": ["Zaletą jest...", "..."],
      "stock_warehouse": 24,
      "stock_supplier": 10,
      "added_at": "2025-01-15T08:00:00Z",
      "updated_at": "2026-03-01T12:00:00Z",
      "client_price": "84.15",               // cena po rabacie
      "client_price_without_discount": "99.00", // cena bazowa
      "categories": [
        { "id": 3, "name_pl": "Wibratory", "name_en": "Vibrators", "parent": null }
      ],
      "status": { "id": 1, "name": "Nowość" },
      "prod_image": [
        { "image": "https://cdn.lagrana.pl/img/lg-12345-1.jpg", "main_image": true, "hoover_image": false },
        { "image": "https://cdn.lagrana.pl/img/lg-12345-2.jpg", "main_image": false, "hoover_image": true }
      ],
      "description": {
        "id": 5, "product": 42,
        "lang_pl": "Opis po polsku...",
        "lang_en": "Description in English...",
        "lang_de": "Beschreibung auf Deutsch...",
        // oraz: lang_nl, lang_fr, lang_es, lang_it, lang_gr, lang_cz, lang_sk, lang_ua, lang_ru
      },
      "additional": [
        { "id": 101, "product": 42, "item": "Kolor", "value": "Czarny" },
        { "id": 102, "product": 42, "item": "Długość", "value": "18 cm" }
      ]
    }
  ]
}
GET /api/products/{id}/ Pojedynczy produkt po ID

Zwraca jeden obiekt produktu z tymi samymi polami co lista. Użyj numerycznego ID z pola id, lub użyj endpointu products-sku do wyszukiwania po SKU.

Produkt po SKU
Pobierz pojedynczy produkt bezpośrednio po kodzie SKU — przydatne przy synchronizacji z zewnętrznymi systemami, gdzie wewnętrzne ID nie jest znane.
GET /api/products-sku/{sku}/ Produkt po kodzie SKU
cURL
curl "https://b2b.lagrana.pl/api/products-sku/LG-12345/" \
  -H "Authorization: Bearer $TOKEN"

Zwraca te same pola co GET /api/products/{id}/. Zwraca 404 jeśli SKU nie istnieje.

GET /api/products-sku/ Lista z filtrowaniem

Te same parametry filtrowania co /api/products/ (brand, categories, status, active, search). Endpoint szczegółowy używa SKU jako klucza zamiast numerycznego ID.

Kategorie
Pełna lista kategorii z wielojęzycznymi nazwami. Użyj pola parent do budowania drzewa kategorii.
GET /api/categories/ Lista kategorii
Odpowiedź
[
  {
    "id": 1,
    "name_pl": "Wibratory",
    "name_en": "Vibrators",
    "name_de": "Vibratoren",
    "name_nl": null,
    "name_fr": null,
    "name_es": null,
    "name_it": null,
    "name_gr": null,
    "name_cz": null,
    "name_sk": null,
    "name_ua": null,
    "name_ru": null,
    "parent": null   // ID kategorii nadrzędnej, null = najwyższy poziom
  }
]
Stany magazynowe
Lekki endpoint do sprawdzania dostępności bez pobierania pełnych danych produktu. Obsługuje te same filtry co /api/products/.
GET /api/stock/ Stany aktywnych produktów
ParametrTypOpis
brandopcjonalnyFiltruj po marce
categoriesopcjonalnyFiltruj po ID kategorii
searchopcjonalnySzukaj po SKU
Odpowiedź
{
  "count": 1248,
  "results": [
    { "sku": "LG-12345", "stock_warehouse": 24, "stock_supplier": 10 },
    { "sku": "LG-12346", "stock_warehouse": 0,  "stock_supplier": 50 }
  ]
}

stock_warehouse — ilość w magazynie La Grana
stock_supplier — ilość dostępna u dostawcy

Zamówienia
Twórz i listuj swoje zamówienia. Każde konto widzi tylko swoje zamówienia. Produkty możesz podawać po wewnętrznym ID lub po SKU.
GET /api/orders/ Lista Twoich zamówień
Odpowiedź
{
  "count": 3,
  "results": [
    {
      "id": 7,
      "external_id": "WC-1234",    // Twój numer referencyjny (opcjonalny)
      "status": "pending",
      "currency": "PLN",
      "total_gross": "267.00",
      "notes": "Uwagi do zamówienia",
      "created_at": "2026-03-01T12:00:00Z",
      "updated_at": "2026-03-01T12:05:00Z",
      "items_read": [
        {
          "product": 42, "sku": "LG-12345", "name": "Nazwa produktu",
          "qty": 3, "unit_price_gross": "89.00",
          "vat_rate": 23, "line_total_gross": "267.00"
        }
      ]
    }
  ]
}
POST /api/orders/ Utwórz zamówienie
PoleTypOpis
itemswymaganeTablica pozycji zamówienia (patrz niżej)
external_idopcjonalnyTwój własny numer referencyjny (np. ID zamówienia WooCommerce)
currencyopcjonalnyPLN / EUR (domyślnie: PLN)
notesopcjonalnyUwagi do zamówienia

Każda pozycja w tablicy items:

PoleTypOpis
productproduct lub skuWewnętrzne ID produktu
skuproduct lub skuSKU produktu (alternatywa dla product)
qtyopcjonalnyIlość (domyślnie: 1)
Treść żądania
{
  "external_id": "WC-5678",
  "currency": "PLN",
  "notes": "Pilne",
  "items": [
    { "product": 42, "qty": 3 },
    { "sku": "LG-12346", "qty": 1 }
  ]
}
Feed XML
Alternatywa dla API JSON — feed produktów w formacie XML, dostępny przez unikalny token (bez JWT). Przydatne dla platform obsługujących import XML (np. PrestaShop, IdoSell). Skontaktuj się z nami, aby otrzymać swój token.
GET /api/xml/{token}/ Feed XML produktów
XML
<?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <id>42</id>
    <sku>LG-12345</sku>
    <name>Nazwa produktu</name>
    <description>Opis po polsku...</description>
    <category>Wibratory</category>
    <brand>BrandName</brand>
    <price>84.15</price>   <!-- Twoja cena -->
    <stock>24</stock>
    <image>https://cdn.lagrana.pl/img/lg-12345-1.jpg</image>
    <active>true</active>
  </product>
</products>

Feed nie wymaga nagłówka uwierzytelniającego — token w URL stanowi dostęp. Ceny odzwierciedlają Twoje indywidualne stawki.

Kody błędów
API używa standardowych kodów HTTP. Odpowiedź błędu zawiera pole detail z opisem.
KodZnaczenie
200Sukces
201Zasób utworzony (np. nowe zamówienie)
400Błąd w żądaniu — sprawdź parametry lub wymagane pola
401Brak uwierzytelnienia lub wygasły token
403Brak uprawnień do zasobu
404Zasób nie istnieje
429Przekroczono limit zapytań (rate limiting)
Przykład — Python
Python
import requests

# 1. Uzyskaj token
resp = requests.post("https://b2b.lagrana.pl/api/token/", json={
    "username": "twoj_login",
    "password": "haslo"
})
token = resp.json()["access"]
headers = {"Authorization": f"Bearer {token}"}

# 2. Pobierz produkty (wszystkie strony)
url = "https://b2b.lagrana.pl/api/products/"
while url:
    data = requests.get(url, headers=headers).json()
    for p in data["results"]:
        print(p["sku"], p["client_price"], p["stock_warehouse"])
    url = data["next"]

# 3. Pobierz produkt po SKU
p = requests.get(
    "https://b2b.lagrana.pl/api/products-sku/LG-12345/",
    headers=headers
).json()
print(p["name"], p["client_price"], p["client_price_without_discount"])

# 4. Utwórz zamówienie
order = requests.post("https://b2b.lagrana.pl/api/orders/", json={
    "external_id": "WC-1234",
    "items": [
        {"sku": "LG-12345", "qty": 3},
        {"sku": "LG-12346", "qty": 1},
    ]
}, headers=headers)
print(order.json())
Przykład — PHP
PHP
// 1. Uzyskaj token
$res = file_get_contents('https://b2b.lagrana.pl/api/token/', false,
    stream_context_create(['http' => [
        'method'  => 'POST',
        'header'  => 'Content-Type: application/json',
        'content' => json_encode(['username'=>'login', 'password'=>'haslo'])
    ]])
);
$token = json_decode($res)->access;
$authHeader = "Authorization: Bearer $token";

// 2. Pobierz produkty
$url = 'https://b2b.lagrana.pl/api/products/';
while ($url) {
    $data = json_decode(file_get_contents($url, false,
        stream_context_create(['http' => ['header' => $authHeader]])
    ));
    foreach ($data->results as $p) {
        echo $p->sku . ' ' . $p->client_price . ' ' . $p->stock_warehouse . "\n";
    }
    $url = $data->next;
}

// 3. Utwórz zamówienie
$order = file_get_contents('https://b2b.lagrana.pl/api/orders/', false,
    stream_context_create(['http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/json\r\n" . $authHeader,
        'content' => json_encode([
            'external_id' => 'WC-1234',
            'items' => [
                ['sku' => 'LG-12345', 'qty' => 3],
                ['sku' => 'LG-12346', 'qty' => 1],
            ]
        ])
    ]])
);
var_dump(json_decode($order));
Przykład — cURL
Shell
# Uzyskaj token i zapisz
TOKEN=$(curl -s -X POST https://b2b.lagrana.pl/api/token/ \
  -H "Content-Type: application/json" \
  -d '{"username":"login","password":"haslo"}' \
  | python3 -c "import sys,json;print(json.load(sys.stdin)['access'])")

# Pobierz produkty (pierwsza strona)
curl "https://b2b.lagrana.pl/api/products/" \
  -H "Authorization: Bearer $TOKEN"

# Pobierz produkt po SKU
curl "https://b2b.lagrana.pl/api/products-sku/LG-12345/" \
  -H "Authorization: Bearer $TOKEN"

# Pobierz stany magazynowe
curl "https://b2b.lagrana.pl/api/stock/" \
  -H "Authorization: Bearer $TOKEN"

# Utwórz zamówienie
curl -X POST "https://b2b.lagrana.pl/api/orders/" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"external_id":"WC-1234","items":[{"sku":"LG-12345","qty":3}]}'
Gotowy na integrację?

Zaloguj się i zacznij korzystać z API

Dostęp do API przyznajemy na wniosek — skontaktuj się z nami lub zaloguj, jeśli masz już konto.

Zaloguj się Zapytaj o dostęp