Shadow System B2B

Dokumentacja API zamówień

Dokument opisuje metody integracyjne służące do pobierania zamówień z panelu B2B oraz aktualizacji ich statusów przez system zewnętrzny.

Wersja dokumentu: 2026-07-01

Autoryzacja

Oba endpointy są przeznaczone dla integracji zewnętrznej i wymagają autoryzacji tokenem technicznym. Nie jest to token użytkownika JWT z panelu B2B, tylko stały token integracyjny przekazywany w nagłówku x-shadow-token.

Wymagane nagłówki

x-shadow-token: <TOKEN>
Content-Type: application/json

Weryfikacja tokenu

Token jest porównywany z wartością zmiennej środowiskowej X_SHADOW_TOKEN.

Brak tokenu zwraca 403, a błędny token zwraca 401.

Przykład użycia tokenu

curl -X POST "https://api.shadow.code-m.pl/orders/all" \
  -H "Content-Type: application/json" \
  -H "x-shadow-token: TOKEN_INTEGRACYJNY" \
  -d '{}'

Odpowiedzi błędów autoryzacji

Kod Przyczyna Przykładowa odpowiedź
403 Nie przekazano nagłówka x-shadow-token. { "message": "Brak tokenu." }
401 Przekazany token jest inny niż skonfigurowany token integracyjny. { "message": "Token jest nieprawidłowy." }

Token powinien być przechowywany po stronie systemu integrującego w konfiguracji serwerowej lub zmiennej środowiskowej. Nie należy umieszczać go w kodzie frontendowym ani udostępniać użytkownikom końcowym.

POST

1. Pobieranie zamówień

https://api.shadow.code-m.pl/orders/all

Endpoint zwraca listę zamówień z panelu B2B. Można pobrać wszystkie zamówienia albo zawęzić wynik filtrami przekazanymi w body. Każde zamówienie zawiera dane nagłówkowe, historię statusów, dane rozliczeniowe, dane dostawy oraz pozycje zamówienia.

Body requestu

{
  "d0": "2026-05-11",
  "status": 0,
  "gr_id_zam": 123,
  "gr_rok_zam": 2026,
  "gr_nr_zam": 45,
  "gr_id_kth": "1001",
  "order_id": 12,
  "sort_order": "DESC"
}

Parametry

Parametr Typ Wymagany Opis
d0 string Nie Data utworzenia zamówienia. Filtrowanie działa jako created_at LIKE 'YYYY-MM-DD%'.
status number Nie Status zamówienia w panelu B2B.
gr_id_zam number Nie ID zamówienia z systemu ERP/Shadow.
gr_rok_zam number Nie Rok zamówienia z systemu ERP/Shadow.
gr_nr_zam number Nie Numer zamówienia z systemu ERP/Shadow.
gr_id_kth string / number Nie ID kontrahenta z systemu ERP/Shadow.
order_id number Nie ID zamówienia w panelu B2B.
sort_order string Nie Kierunek sortowania wyników po order_id: ASC lub DESC. Domyślnie DESC (najnowsze zamówienia jako pierwsze).

Jeśli body jest puste, np. {}, endpoint zwraca wszystkie zamówienia.

Przykład requestu

curl -X POST "https://api.shadow.code-m.pl/orders/all" \
  -H "Content-Type: application/json" \
  -H "x-shadow-token: TOKEN" \
  -d '{
    "d0": "2026-05-11",
    "status": 0
  }'

Przykład odpowiedzi

[
  {
    "order_id": 34,
    "net_total": "560.00",
    "tax": "23.00",
    "total": "688.80",
    "currency": "pln",
    "payment_method": "direct_transfer",
    "status": 0,
    "created_at": "2026-05-11T11:29:34.000Z",
    "updated_at": "2026-05-11T11:31:01.000Z",
    "gr_id_kth": "1",
    "gr_id_zam": null,
    "gr_rok_zam": null,
    "gr_nr_zam": null,
    "custom_name": "Nazwa własna zamówienia",
    "shipping_tracking": [
      {
        "order_id": 34,
        "tracking_number": "88683524525",
        "carrier": "GLS",
        "tracking_url": "https://gls-group.eu/PL/pl/sledzenie-przesylek?match=88683524525"
      },
      {
        "order_id": 34,
        "tracking_number": "88683524526",
        "carrier": "GLS",
        "tracking_url": "https://gls-group.eu/PL/pl/sledzenie-przesylek?match=88683524526"
      }
    ],
    "order_history": [
      { "status": 0, "date": "2026-05-11" }
    ],
    "products": [
      {
        "order_item_id": 37,
        "name": "P1615 tłumaczenie PL nowe",
        "sku": "P1615",
        "price_group": "2",
        "retail_price": "560.00",
        "user_price": "560.00",
        "gr_id_indeksu": 8784,
        "discount": 0,
        "currency": "pln",
        "params": [
          {
            "lp_gr": "1000",
            "source_id": 45004,
            "value": 1650,
            "label": "1650",
            "name": "Szerokość [mm]"
          },
          {
            "lp_gr": "1001",
            "source_id": 45005,
            "value": 1520,
            "label": "1520",
            "name": "Wysokość [mm]"
          },
          {
            "lp_gr": "1010",
            "source_id": 45006,
            "value": "1870",
            "label": "0-0135 PL (SK) [gat. 0]",
            "name": "Tkanina",
            "gr_id_indeksu_mat": 1870,
            "fabricclass": "0"
          },
          {
            "lp_gr": "1015",
            "source_id": 45056,
            "value": "DB 703",
            "label": "DB703-ciemnoszary",
            "name": "Kolor systemu"
          },
          {
            "lp_gr": "1099",
            "source_id": 53478,
            "value": "UWAGI DO POZYCJI",
            "label": "UWAGI DO POZYCJI",
            "name": "Uwagi do pozycji"
          }
        ],
        "quantity": 1,
        "type": "custom",
        "notes": "Notatki do pozycji w sklepie"
      }
    ],
    "billing": {
      "company": "Firma ABC",
      "nip": "1234567890",
      "representative": "Jan Kowalski"
    },
    "shipping": {
      "first_name": "Jan",
      "last_name": "Kowalski",
      "company": "Firma ABC",
      "address": "Działkowa 9",
      "city": "Warszawa",
      "postcode": "00-001",
      "country": "Poland",
      "phone": "+48500000000",
      "custom_name": "Adres główny",
      "address_status": "domyslny",
      "erp_address_id": "GRAF-001"
    }
  }
]

Pola obiektu shipping

Pole Typ Opis
address_status string Status adresu dostawy. Wartości: domyslny - adres domyślny pobrany z ERP (znany przez ERP, nie wymaga zapisu); dodatkowy - adres niedomyślny z ERP lub zapisany przez klienta; incydentalny - adres jednorazowy podany tylko dla tego zamówienia - ERP nie powinien zapisywać go do bazy adresów klienta.
erp_address_id string | null Identyfikator adresu w systemie ERP (wartość przekazana przez ERP przy pobraniu listy adresów). Dla adresów incydentalny wartość jest null.

Kody odpowiedzi

Kod Znaczenie
200 Lista zamówień została zwrócona.
401 Nieprawidłowy token.
403 Brak tokenu.
500 Błąd serwera lub bazy danych.
POST

2. Aktualizacja statusów zamówień

https://api.shadow.code-m.pl/orders/status-update

Endpoint aktualizuje statusy zamówień w panelu B2B. Przyjmuje pojedynczy obiekt albo tablicę obiektów. Dla każdego poprawnego obiektu:

  • opcjonalnie aktualizuje orders.status,
  • przy zmianie danych nagłówka aktualizuje orders.updated_at,
  • opcjonalnie zapisuje dane ERP: gr_id_zam, gr_rok_zam, gr_nr_zam,
  • opcjonalnie zapisuje dane wysyłkowe: tracking_number, carrier,
  • jeśli dane wysyłkowe zostaną przekazane, dopisuje nowe rekordy do tabeli order_shipping_tracking,
  • identyczny wpis order_id + tracking_number + carrier nie jest dublowany,
  • dopisuje wpis do order_status_history,
  • zwraca listę faktycznie zaktualizowanych zamówień.

Body requestu

{
  "order_id": 12,
  "status": 1,
  "date": "2026-05-11",
  "gr_id_zam": 123,
  "gr_rok_zam": 2026,
  "gr_nr_zam": 45,
  "tracking_number": "88683524525",
  "carrier": "GLS"
}

Parametry pojedynczego obiektu

Parametr Typ Wymagany Opis
order_id number Tak ID zamówienia w panelu B2B.
status number Nie Nowy status zamówienia. Jeśli pole nie zostanie przekazane, wpis historii zapisze się jako informacyjny -1 bez zmiany głównego statusu zamówienia.
date string Nie Data statusu zapisywana w historii, np. 2026-05-11. Jeśli pole nie zostanie przekazane, backend użyje bieżącej daty.
gr_id_zam number Nie ID zamówienia w systemie ERP/Shadow.
gr_rok_zam number Nie Rok zamówienia w systemie ERP/Shadow.
gr_nr_zam number Nie Numer zamówienia w systemie ERP/Shadow.
tracking_number string Nie Numer listu przewozowego, np. 88683524525.
carrier string Nie Przewoźnik przypisany do numeru listu, np. GLS.
message string Nie Dodatkowy komentarz do wpisu historii statusów.

Przykład requestu

curl -X POST "https://api.shadow.code-m.pl/orders/status-update" \
  -H "Content-Type: application/json" \
  -H "x-shadow-token: TOKEN" \
  -d '[
    {
      "order_id": 12,
      "gr_id_zam": 123
    },
    {
      "order_id": 12,
      "gr_nr_zam": 45,
      "gr_rok_zam": 2026,
      "tracking_number": "88683524525",
      "carrier": "GLS"
    },
    {
      "order_id": 13,
      "status": -1,
      "date": "2026-05-11",
      "tracking_number": "88683524526",
      "carrier": "GLS"
    }
  ]'

Przykład odpowiedzi

{
  "updated_ids": [12, 13]
}

Zasady działania

  • Endpoint przyjmuje pojedynczy obiekt albo tablicę obiektów.
  • Wymagane jest tylko pole order_id. Pozostałe pola są opcjonalne.
  • Do updated_ids trafiają tylko zamówienia, które zostały znalezione i zaktualizowane.
  • Pola tracking_number i carrier są opcjonalne i mogą być przekazywane niezależnie od zmiany statusu.
  • Dane wysyłkowe są zapisywane w tabeli order_shipping_tracking z polami order_id, tracking_number, carrier.
  • Nowe numery przesyłek dla tego samego zamówienia są dopisywane jako kolejne rekordy.
  • Identyczny wpis order_id + tracking_number + carrier nie jest dublowany.
  • Status -1 oznacza wpis informacyjny. Nie zmienia głównego statusu zamówienia, a jedynie dopisuje komunikat do historii statusów.
  • Jeśli status nie zostanie przekazany, wpis historii statusów zapisze się jako informacyjny -1.
  • Historia statusów jest dopisywana do tabeli order_status_history, a opis wykonanej akcji zapisywany jest w kolumnie message.

Kody odpowiedzi

Kod Znaczenie
200 Aktualizacja wykonana.
401 Nieprawidłowy token.
403 Brak tokenu.
500 Błąd serwera lub bazy danych.
POST

3. Upload faktury PDF

https://api.shadow.code-m.pl/admin-tools/sync-import/invoice-upload

Endpoint przyjmuje plik PDF faktury wraz z metadanymi zamówienia ERP. Format: multipart/form-data. Maksymalny rozmiar pliku: 10 MB.

Pola formularza

PoleTypWymaganeOpis
file plik PDF Tak Plik faktury w formacie PDF. Maksymalny rozmiar: 10 MB.
gr_id_inv number / string Tak ID faktury w systemie ERP. Klucz unikalny - ponowny upload dla tego samego gr_id_inv nadpisuje plik.
gr_id_kth number / string Tak ID kontrahenta w systemie ERP. Wymagane - powiązuje fakturę z kontrahentem i umożliwia klientowi pobranie pliku w panelu B2B.

Przykład requestu (curl)

curl -X POST "https://api.shadow.code-m.pl/admin-tools/sync-import/invoice-upload" \
  -H "x-shadow-token: <TOKEN>" \
  -F "=@/path/to/Faktura_2026_31279.pdf" \
  -F "gr_id_inv=31279" \
  -F "gr_id_kth=128"

Przykład odpowiedzi

{
  "ok": true,
  "invoice_id": 12,
  "gr_id_inv": "31279"
}

Kody odpowiedzi

KodZnaczenie
200Faktura zapisana pomyślnie.
400Brak pliku lub nieprawidłowy format (nie PDF).
401Nieprawidłowy token synchronizacji.
403Brak tokenu synchronizacji.
500Błąd serwera lub bazy danych.

Statusy zamówień

W kodzie status jest przechowywany jako liczba typu int. Znaczenie statusów powinno być zgodne z mapą używaną w panelu B2B oraz ERP.

0 - nowe / złożone
1 - przyjęte / w realizacji
2 - zakończone
3 - anulowane
-1 - informacja / wpis techniczny