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.
1. Pobieranie zamówień
https://api.shadow.code-m.pl/orders/allEndpoint 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. |
2. Aktualizacja statusów zamówień
https://api.shadow.code-m.pl/orders/status-updateEndpoint 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 + carriernie 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_idstrafiają tylko zamówienia, które zostały znalezione i zaktualizowane. - Pola
tracking_numbericarriersą opcjonalne i mogą być przekazywane niezależnie od zmiany statusu. - Dane wysyłkowe są zapisywane w tabeli
order_shipping_trackingz polamiorder_id,tracking_number,carrier. - Nowe numery przesyłek dla tego samego zamówienia są dopisywane jako kolejne rekordy.
- Identyczny wpis
order_id + tracking_number + carriernie jest dublowany. - Status
-1oznacza wpis informacyjny. Nie zmienia głównego statusu zamówienia, a jedynie dopisuje komunikat do historii statusów. - Jeśli
statusnie 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 kolumniemessage.
Kody odpowiedzi
| Kod | Znaczenie |
|---|---|
200 |
Aktualizacja wykonana. |
401 |
Nieprawidłowy token. |
403 |
Brak tokenu. |
500 |
Błąd serwera lub bazy danych. |
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
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
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
| Kod | Znaczenie |
|---|---|
200 | Faktura zapisana pomyślnie. |
400 | Brak pliku lub nieprawidłowy format (nie PDF). |
401 | Nieprawidłowy token synchronizacji. |
403 | Brak tokenu synchronizacji. |
500 | Błą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.