BasileusBasileus Public API
v1 · stabilní ips.basileus.cz/public-api/v1 Kontakt

Basileus Public API · v1

Přepravní REST API pro balíky, palety a výdejní místa

Veřejné přepravní API systému IPS. Vytvářejte zásilky, tiskněte štítky (PDF i ZPL), sledujte stav, stornujte, registrujte webhooky a posílejte nebezpečné zboží (ADR) — vše přes jeden konzistentní kontrakt.

Balíky & palety Výdejní místa & boxy Štítky PDF / ZPL Tracking & storno Dry-run validace Webhooky stavů ADR nebezpečné zboží

01Úvod#

Tato dokumentace popisuje veřejné přepravní API systému IPS.

Kontrakt je kompatibilní s dřívějším Basileus ERP API — stejné endpointy, pole, tělo, stavové kódy, autentizace X-API-KEY i chování štítků / storna / trackingu. Vůči vaší integraci se mění pouze base URL a API klíč; logika běží nově v IPS.

Stav implementace

Balíky, palety, výdejní místa, štítky (PDF i ZPL), tracking, storno, dry-run validace (balíky i palety), webhooky stavů, veřejná tracking URL, ADR, přílohy, vícekusové zásilky — hotovo.

0Changelog#

22. 7. 2026 — doplnění dokumentace na aktuální stav API (žádná změna chování)

  • Alternativní názvy polí (sender_zipsender_psc, receiver_*recipient_*, customer_referencereference, extra_insurance_valueinsurance, u kusů weight_kg / width / length / height) — API přijímá obě sady, viz Aliasy polí.
  • POST /palets/check — dry-run validace i pro palety (dřív jen pro balíky), viz Dry-run palety.
  • Formát tiskového archu ?sheet= u štítku — role QL (výchozí) nebo A4 s 1/2/4/6/8 štítky na stránku, viz Štítek.
  • Tisk z prohlížeče bez API klíče v URLlabels_url v odpovědi nese podepsaný token ?lt=… (platnost 1 rok, odemkne jen náhled štítku dané zásilky).
  • Odpověď create zdokumentována celánumber_of_packages, packages[] (číslo + štítek každé krabice), idempotent a blok box (kód k vyzvednutí), viz Vytvoření zásilky.
  • Oprava v dokumentaci: tracking číslo má tvar IPS2600000193 (bez pomlčky) — dřívější příklady IPS-… byly zavádějící.

20. 7. 2026 — na základě zpětné vazby e-shopů

  • Štítek nese typ doručení HD / VM / BOX podle skutečné destinace (dřív balík na výdejní místo ukazoval HD).
  • /places je vyčištěné a konzistentní s /shipments/check — vrací jen doručitelná místa (s adresou); nekešuje se → po změnách katalog znovu stáhněte.
  • ?format=zpl (ZPL II) je potvrzený stabilní formát štítku.
  • Vícekusové štítky: ?all=1 (všechny krabice), kódy krabic IPS…-N, dobírka jen na 1. krabici.

02Base URL a prostředí#

ProstředíBase URL
Produkcehttps://ips.basileus.cz/public-api/v1
Test (sandbox)stejný host, klíč s příznakem sandbox (zásilky se nezařadí do ostrého provozu)

Všechny cesty níže jsou relativní k base URL.

Příklad volání
curl https://ips.basileus.cz/public-api/v1/places \
  -H "X-API-KEY: <váš_api_klíč>"

03Autentizace#

Každý požadavek musí obsahovat hlavičku:

HTTP hlavička
X-API-KEY: <váš_api_klíč>

Klíč si vygenerujete sami po přihlášení do partnerského portálu eshop.basileus.cz → sekce API (klíč se zobrazí jen jednou, uložte si ho). Klíč lze omezit na konkrétní zdrojové IP (doporučeno).

Chybová autentizace

Chybný / chybějící klíč → 401. Nedostatečné oprávnění nebo nepovolená IP → 403.

03.2Oprávnění (scopes) a IP allowlist#

Každý klíč má seznam oprávnění. Prázdný seznam = plný přístup (zpětná kompatibilita starších klíčů). Chybějící oprávnění → 403.

ScopeCo odemyká
shipments:createvytvoření zásilky + dry-run /check
shipments:cancelstorno zásilky
tracking:readčtení stavu a detailu
label:readstažení štítku
palets:createvytvoření paletové zásilky + /palets/check
palets:readpaletový ceník, zóny, kalkulace ceny
pickup-points:readkatalog výdejních míst a boxů (/places)
webhooks:managespráva odběrů webhooků
Omezení na IP

Ke klíči lze přiřadit seznam povolených zdrojových IP nebo rozsahů CIDR (např. 203.0.113.0/24). Prázdný seznam = bez omezení. Volání z jiné adresy → 403 ip_not_allowed. Klíč posílejte výhradně ze serveru — nikdy z prohlížeče, mobilní aplikace ani z gitu.

04Formát odpovědí#

Každá odpověď API má jednotný obal. Úspěšná odpověď obsahuje ok: true a objekt data, chybová ok: false a objekt error.

  • ok — boolean, zda požadavek uspěl.
  • data — užitečná data odpovědi (jen u úspěchu).
  • errorcode, message a případně details (jen u chyby).
  • timestamp — čas zpracování (ISO 8601, UTC).

Příklady

Úspěch ok: true
{ "ok": true, "data": { }, "timestamp": "2026-06-29T10:00:00.000Z" }
Chyba ok: false
{ "ok": false, "error": { "code": "VALIDATION_ERROR", "message": "Popis chyby", "timestamp": "..." } }

05HTTP status kódy#

HTTPVýznam
200OK (tracking, storno, idempotentní opakování)
201Zásilka vytvořena
400Neplatné JSON tělo
401Chybí / neplatný klíč
403Bez oprávnění / IP není povolena
404Zásilka nenalezena — i cizí zásilka (izolace dat)
409Konflikt (storno doručené zásilky; Idempotency-Key s jiným tělem; chybějící ceník u paletových čtení)
422Chyba validace (error.details.errors)
429Překročen limit požadavků
500Interní chyba (error.details.error_id / X-Request-Id pro reklamaci)
503Modul ještě není připravený (např. chybí katalog výdejních míst)

06Idempotence#

U POST posílejte buď stabilní external_id v těle, nebo hlavičku Idempotency-Key: <uuid>.

  • Stejné external_id → vrátí původní zásilku (HTTP 200, data.idempotent: true), žádný duplikát.
  • Stejný Idempotency-Key s jiným tělem → 409.
Hlavička
Idempotency-Key: 7f1c9b2e-3a4d-4f5e-8a9b-0c1d2e3f4a5b

07Rate limit#

Výchozí 600 požadavků za minutu na klíč; pro agregátory ho po dohodě zvyšujeme individuálně. Platnou hodnotu vždy hlásí hlavičky odpovědi X-RateLimit-Limit, X-RateLimit-Remaining a X-RateLimit-Reset (unixový čas konce okna) — řiďte se jimi, ne tímto číslem. Při překročení 429 + Retry-After (sekundy do dalšího pokusu).

Tip

Pro snížení počtu dotazů na stav doporučujeme webhooky místo pollingu.

Odpovědní hlavičky
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 593
X-RateLimit-Reset: 1769000460
Retry-After: 12

07.2Odpovědní hlavičky#

HlavičkaVýznam
X-Request-Ididentifikátor volání — uveďte ho při reklamaci, dohledáme přesný požadavek
X-RateLimit-Limit / -Remaining / -Resetlimit požadavků, zbývá, unixový čas konce okna
Retry-Afterjen u 429 — za kolik sekund zkusit znovu
X-Sheetjen u PDF štítku — použité rozvržení archu (?sheet=)

08Limity zásilek#

Validace probíhá při vytvoření i při dry-run. Co projde check, projde i create.

CoDoručení na adresu (HD)Výdejní box (BOX)Paleta
Max váha31,5 kg20 kgdle dohody
Max rozměrjedna strana ≤ 180 cmkus se vejde do 50 × 40 × 30 cm
Dobírka (COD)≤ 150 000 Kč≤ 150 000 Kč≤ 250 000 Kč
Připojištění≤ 1 000 000 Kč≤ 1 000 000 Kč≤ 1 000 000 Kč
Počet kusů1–1001počet palet 1–33

Velikostní kategorie (S/M/L/XL) se u balíku dopočítá automaticky z váhy a slouží jen pro interní přehled — při importu / přes API stačí poslat váhu, kategorii ani size_type posílat nemusíte:

VáhaKategorie
do 5 kgS
do 10 kgM
do 15 kgL
do 31,5 kgXL

PSČ = 5 číslic (mezery se ignorují). Doručujeme i odesíláme v rámci ČR (CZ → CZ).

09Validační tabulka polí#

Min/max a pravidla pro jednotlivá pole (porušení → 422 VALIDATION_ERROR, seznam v error.details.errors):

FieldTypeRequiredMinMaxValidation
sender_namestring2100název / jméno odesílatele
recipient_namestring2100název / jméno příjemce (u palety receiver_company)
sender_street / recipient_streetstringu HD (u VM/BOX adresu dá výdejna)2120ulice (+ *_h_number = č.p.)
sender_city / recipient_citystringu HD180město
sender_psc / recipient_pscstringu HD55přesně 5 číslic ^\d{5}$ (mezery se ignorují); paleta: *_zip
sender_phone / recipient_phonestringodesílatel; u BOXU i příjemce+ volitelně, 9–15 číslic; povolené mezery ( ) / -
*_countrystring– (def. CZ)22jen CZ (CZ → CZ)
notestring500volná poznámka
external_idstringdoporučeno80vaše ID objednávky (idempotence)
referencestring64volná reference (paleta: customer_reference)
codnumber0150 000 (balík) / 250 000 (paleta)dobírka v Kč
insurancenumber01 000 000připojištění v Kč (paleta: extra_insurance_value)
packs[].weightnumber > 0> 031,5 (balík) / 20 (BOX)kg
packs[].x / y / znumber1180 (HD/VM); BOX: kus do 50×40×30 cmcm
place_idstringu VM/BOXmusí existovat a být aktivní (GET /places)
tracking_numberstring— (read-only)generuje IPS, nezadáváte — vrací se v odpovědi create

Velikostní kategorie (size_category S/M/L/XL) se nezadává — dopočítá se z váhy (viz Limity).

09.2Alternativní názvy polí (aliasy)#

Balíkové (/shipments) a paletové (/palets) endpointy historicky pojmenovávaly stejné údaje jinak. API dnes přijímá obě sady názvů na obou endpointech — nemusíte udržovat dvě mapování formuláře. Pošlete si, co vám vyhovuje; chybějící tvar si doplníme sami.

ÚdajTvar ATvar B
PSČ odesílatelesender_pscsender_zip
Příjemce (všechna pole)recipient_name, recipient_street, recipient_city, recipient_psc, recipient_phone, …receiver_name, receiver_street, receiver_city, receiver_zip, receiver_phone, …
Vaše číslo objednávky / referencereferencecustomer_reference
Připojištěníinsuranceextra_insurance_value
Váha kusupacks[].weightpacks[].weight_kg
Rozměry kusupacks[].x / y / zpacks[].width / length (i depth) / height
Pravidla

Když pošlete oba tvary, platí ten vyplněný; existující hodnotu alias nikdy nepřepíše. Aliasy platí i pro POST /shipments/check a POST /palets/check. V odpovědích vracíme kanonické názvy daného endpointu (/shipmentsrecipient_*, /paletsreceiver_*).

10Vytvoření zásilky#

POST/shipments

Vytvoří novou zásilku. Tělo je ploché pole.

PoleTypPovinnéPozn.
typeenumVM (výdejní místo) / BOX (výdejní box) / HD (doručení na adresu)
entry_typeenumalias k type
place_idstringu VM/BOXID výdejního místa (viz GET /places); musí existovat a být aktivní
size_type1/2/3nepovinné, kategorie se dopočítá z váhy
external_idstringdoporučenovaše ID objednávky (idempotence)
sender_name … sender_emailstringsender_name/country/psc/city/street/h_number/phone povinné, email volitelné
recipient_name … recipient_emailstringviz nížeu HD povinná adresa; u VM/BOX stačí recipient_name + recipient_phone (adresu doplní výdejní místo)
currencystringvýchozí czk
codnumberdobírka (0 = bez); limity viz §8
insurancenumberpřipojištění
notestringpoznámka
packsarraykusy: { weight, x, y, z }; weight (kg) povinná, rozměry (cm) volitelné
adrobjectnebezpečné zboží (viz ADR)
filesarraypřílohy v Base64 (viz Přílohy)
Doručení na výdejní místo / box (VM/BOX)

Stačí place_id + jméno a telefon příjemce. Adresu doručení převezmeme z katalogu výdejen. Telefon je u boxu nutný (SMS s kódem). U boxu platí limit kusu 50 × 40 × 30 cm a 20 kg.

Pole odpovědi

PoleTypVýznam
package_idstringInterní identifikátor IPS. Pro další volání používejte tracking_number.
tracking_numberstringPřepravní číslo ve tvaru IPS{RR}{8 číslic}, např. IPS2600000193. Přiděluje IPS, nelze zadat ani změnit.
statenumberStav zásilky (0 = přijetí dat) — číselník v §10.3.
typestringHD / VM / BOX / PAL.
pricenullU balíků vždy null — cena se počítá až ve fakturaci.
number_of_packagesstringPočet krabic (string, kvůli shodě se starým ERP).
packages[]arrayJedna položka = jedna krabice: její tracking_number (IPS…-N) a přímý odkaz na štítek.
labels_urlstringŠtítek zásilky. U víc krabic obsahuje ?all=1 → vytiskne všechny naráz.
boxobject | nullJen u doručení do boxu. pick_up_code = kód, kterým příjemce box otevře; erp_tracking = číslo rezervace v síti boxů; status = reserved / failed. U ostatních typů null.
idempotentbooltrue = zásilka s tímto external_id už existovala, nic nového nevzniklo (HTTP 200).
Podepsaný odkaz na štítek ?lt=…

Token, kterým lze štítek otevřít přímo v prohlížeči bez API klíče (platnost 1 rok). Odemyká výhradně náhled štítku té jedné zásilky — nelze jím nic vytvořit, stornovat ani číst cizí data. Váš API klíč se do URL nedostane.

Request / Response

Request doručení do boxu
{
  "type": "BOX",
  "place_id": "P12345",
  "external_id": "OBJ-2026-0001",
  "sender_name": "Sklad s.r.o.", "sender_country": "CZ", "sender_psc": "13000",
  "sender_city": "Praha", "sender_street": "Jiřího z Poděbrad", "sender_h_number": "123",
  "sender_phone": "+420777111222",
  "recipient_name": "Jan Novák", "recipient_phone": "+420777123456",
  "recipient_email": "jan@example.cz",
  "currency": "czk", "cod": 1290,
  "packs": [ { "weight": 2.5, "x": 30, "y": 20, "z": 15 } ]
}
Response 201
{
  "ok": true,
  "data": {
    "package_id": "8f3c1d2e-…",
    "tracking_number": "IPS2600000193",
    "state": 0,
    "type": "BOX",
    "price": null,
    "price_currency": "CZK",
    "external_id": "OBJ-2026-0001",
    "number_of_packages": "1",
    "packages": [
      { "tracking_number": "IPS2600000193", "labels_url": "https://ips.basileus.cz/public-api/v1/shipments/IPS2600000193/label?lt=…" }
    ],
    "labels_url": "https://ips.basileus.cz/public-api/v1/shipments/IPS2600000193/label?lt=…",
    "box": {
      "erp_tracking": "BS0035004063",
      "pick_up_code": "4827",
      "labels_url": "https://…",
      "status": "reserved"
    },
    "idempotent": false
  },
  "timestamp": "..."
}
cURL
curl -X POST https://ips.basileus.cz/public-api/v1/shipments \
  -H "X-API-KEY: <váš_api_klíč>" \
  -H "Content-Type: application/json" \
  -d @shipment.json

10.2Validace bez vytvoření (dry-run)#

POST/shipments/check

Stejné tělo jako POST /shipments, ale nic se nevytvoří — jen se ověří. Validuje přesně jako create (sdílená logika), takže co projde checkem, projde i createm.

Response

Validní valid: true
{ "ok": true, "data": { "valid": true, "errors": [] }, "timestamp": "..." }
Při chybách valid: false
{ "ok": true, "data": { "valid": false, "errors": [
  { "field": "weight_kg", "code": "range", "message": "Do boxu max 20 kg." }
] }, "timestamp": "..." }

10.3Stav a detail zásilky#

GET/shipments/{trackingNumber}

Vrátí aktuální stav a detail zásilky.

payed_cod: "0" = dobírka nezaplacena (vybere kurýr), "1" = zaplacena předem.

Stavové kódy state

stateVýznam
0Přijetí dat o zásilce
2Vyzvednuto / přijato do přepravy
3Přijato na příjmovém depu
4V přepravě / expediční depo
5Předáno na doručení
6Připraveno k vyzvednutí (výdejní místo)
7Doručeno
8Nedoručeno / kontroling
9Vrácení odesílateli
11Storno

items[] nese rozměry a váhy kusů tak, jak jste je poslali v packs[] (bez rozměrů se vrátí jedna položka jen s váhou). box je vyplněný jen u doručení do výdejního boxu — pick_up_code dostane příjemce i SMS/e-mailem, jakmile je zásilka ve stavu 6. Dotaz na cizí zásilku vrátí 404, i když tracking číslo uhodnete.

Response

Response 200
{
  "ok": true,
  "data": {
    "tracking_number": "IPS2600000193",
    "external_id": "OBJ-2026-0001",
    "state": 6,
    "type": "BOX",
    "cod": 1290,
    "payed_cod": "0",
    "sender": { "name": "Sklad s.r.o." },
    "recipient": { "name": "Jan Novák" },
    "items": [ { "weight": 2.5, "x": 30, "y": 20, "z": 15 } ],
    "box": {
      "pick_up_code": "4827",
      "erp_tracking": "BS0035004063",
      "labels_url": "https://…"
    }
  },
  "timestamp": "..."
}

10.4Storno zásilky#

DELETE/shipments/{trackingNumber}

Stornuje zásilku.

Doručenou zásilku nelze stornovat → 409. Opakované storno už stornované zásilky vrací 200 se zprávou „Zásilka již byla zrušena." (operace je idempotentní).

Response

Response 200
{ "ok": true, "data": { "tracking_number": "IPS2600000193", "state": 11, "message": "Zásilka byla zrušena." }, "timestamp": "..." }

10.5Štítek zásilky#

GET/shipments/{trackingNumber}/label
ParametrVýsledek
(bez parametru) nebo ?format=pdfPDF — štítek 102 × 62 mm (logo, odesílatel + příjemce, dobírka, Code128)
?format=zplZPL II (Zebra, termální tiskárny), text/plain — stabilní, podporovaný formát
?all=1všechny krabice naráz (vícestránkové PDF / více ZPL bloků)
?sheet=…rozvržení tisku u PDF — viz tabulka níže

Rozvržení archu ?sheet= (jen pro PDF)

HodnotaVýsledek
ql (výchozí)jeden štítek 102 × 62 mm na stránku — role Brother QL / štítkovací tiskárna
a4-1A4, 1 štítek na stránku
a4-2A4, 2 štítky pod sebou
a4-4A4, 4 štítky pod sebou
a4-6A4, 6 štítků (2 sloupce × 3 řady)
a4-8A4, 8 štítků (2 sloupce × 4 řady)

Neznámá hodnota se tiše bere jako ql. Použité rozvržení vracíme v hlavičce X-Sheet. Kombinace ?all=1&sheet=a4-8 vytiskne všechny krabice zásilky na archy po osmi.

Stahujte serverově s hlavičkou X-API-KEY (doporučeno), nebo přímo z prohlížeče přes labels_url z odpovědi create — nese podepsaný token ?lt=… (platí rok, odemyká jen náhled štítku té jedné zásilky). Endpoint je idempotentní — dotisk kdykoli vrátí aktuální štítek.

Vícekusová zásilka & typ doručení na štítku

Jednotlivé krabice mají tracking IPS…-1, IPS…-2, … Volání …/label bez parametru vrátí štítek 1. krabice, …/label?all=1 všechny naráz; štítek konkrétní krabice přes její vlastní tracking (…/shipments/IPS…-2/label). Dobírka (COD) se tiskne jen na 1. krabici. Typ doručení nahoře na štítku (HD / VM / BOX) se určuje podle skutečné destinace zásilky, ne podle pole type v požadavku.

?format=png tady není podporovaný (samotný čárový kód jako PNG umí jen interní nativní rozhraní). Neznámý formát vrátí PDF.

Příklad

cURL — PDF
curl https://ips.basileus.cz/public-api/v1/shipments/IPS2600000193/label?format=pdf \
  -H "X-API-KEY: <váš_api_klíč>" \
  -o stitek.pdf
cURL — ZPL
curl https://ips.basileus.cz/public-api/v1/shipments/IPS2600000193/label?format=zpl \
  -H "X-API-KEY: <váš_api_klíč>"

11Nebezpečné zboží (ADR)#

Zásilka může obsahovat nebezpečné zboží — přidejte do těla POST /shipments blok adr:

Pole adr.*PovinnéPozn.
un_numbermusí být z číselníku (GET /adr)
classdoplní se z číselníku, lze přepsat
quantitykladné množství (jinak se vezme hmotnost kusů)
unitL / KG (doplní se z číselníku)
packing_groupI / II / III

Při vyplněném adr jede zásilka v ADR režimu (automaticky se objedná svoz). Název látky, jednotka a typický obal se doplní z číselníku podle un_number. (U paletových zásilek se nebezpečné zboží značí přes goods_character: "adr".)

Číselník UN kódů#

GET/adr

Vrátí povolené UN kódy (třída, oficiální název, jednotka, typický obal). Filtry: ?class=3, ?q=benzín.

Request / Response

Request — blok adr
{
  "type": "HD",
  "external_id": "OBJ-ADR-1",
  "sender_name": "...", "sender_psc": "13000", "sender_city": "Praha",
  "sender_street": "...", "sender_h_number": "1", "sender_country": "CZ", "sender_phone": "+420…",
  "recipient_name": "...", "recipient_psc": "60200", "recipient_city": "Brno",
  "recipient_street": "...", "recipient_h_number": "2", "recipient_country": "CZ", "recipient_phone": "+420…",
  "packs": [ { "weight": 20, "x": 60, "y": 40, "z": 40 } ],
  "adr": { "un_number": "1170", "class": "3", "quantity": 20, "unit": "L", "packing_group": "II" }
}
GET /adr 200
{ "ok": true, "data": { "count": 34, "codes": [
  { "un_number": "1203", "class": "3", "name": "BENZÍN", "unit": "L", "uom_note": "čistý objem", "packaging": "3H1 (Plast. kanystr)" }
] }, "timestamp": "..." }

12Přílohy (files / Base64)#

K zásilce lze přiložit dokumenty (např. ADR doklad, faktura) jako Base64 v poli files (alias attachments) v těle POST /shipments.

VlastnostHodnota
Podporované formátyPDF (application/pdf), JPG/JPEG (image/jpeg), PNG (image/png)
Max. velikost 1 souboru5 MB
Max. celkem15 MB
Max. počet souborů5

Struktura jedné položky: name (název s příponou — z ní se odvodí formát) a data (Base64 obsah; akceptujeme i prefix data:…;base64,). Volitelně lze poslat content_type.

Nepovolený formát / překročení limitů → 422 VALIDATION_ERROR (error.details.errors).

Request

Request — files
{
  "type": "HD",
  "external_id": "OBJ-FILES-1",
  "sender_name": "Sklad s.r.o.", "sender_country": "CZ", "sender_psc": "13000",
  "sender_city": "Praha", "sender_street": "Jiřího z Poděbrad", "sender_h_number": "123", "sender_phone": "+420777111222",
  "recipient_name": "Jan Novák", "recipient_country": "CZ", "recipient_psc": "11000",
  "recipient_city": "Praha 1", "recipient_street": "Václavské nám.", "recipient_h_number": "1", "recipient_phone": "+420777123456",
  "packs": [ { "weight": 2.0, "x": 30, "y": 20, "z": 15 } ],
  "files": [
    { "name": "adr-document.pdf", "data": "JVBERi0xLjQKJeLjz9MKMy..." },
    { "name": "faktura.pdf", "data": "JVBERi0xLjQKJ..." }
  ]
}

13Výdejní místa#

GET/places

Parametry: q, city, postalCode, country, active (1/0), type (1 = VM výdejní místo, 2 = box), limit (≤1000, def. 200), offset.

Vrací jen místa aktivní na straně IPS (provozovatel může jednotlivá místa ručně vypnout — pak je v create nelze použít).

Katalog je konzistentní s create a nekešuje se — ostrý výpis vrací jen doručitelná místa (s adresou); záznamy bez PSČ/města nebo testovací (název „TEST") se nevrací. /places i POST /shipments/check používají stejnou logiku aktivnosti. Pokud si katalog ukládáte lokálně, po změnách (vypnutí/zapnutí míst) ho znovu stáhněte.

Doručování do výdejních míst (type 1, VM) je připravené, ale aktuálně může být dočasně vypnuté — proto vám v některých městech vrací katalog jen boxy (type 2). Doručujeme tedy na adresu (HD) a do boxu (BOX); jakmile se VM zapnou, fungují beze změny integrace.

Response

Response 200
{
  "ok": true,
  "data": {
    "count": 1,
    "places": [
      {
        "type": 2, "active": 1, "name": "Box Praha 1", "place_id": "P12345",
        "partner": "alza", "address": "Václavské nám. 1", "city": "Praha",
        "postalCode": "11000", "country": "CZ",
        "gps": { "lat": 50.08, "lng": 14.42 }, "operatingHours": null
      }
    ]
  },
  "timestamp": "..."
}

14Paletové zásilky#

POST/palets

Vytvoření paletové zásilky. Plochá pole dle ERP.

Skupiny sender_* (fakturační), pickup_* (pickup_same_as_sender), receiver_*, delivery_* (delivery_same_as_receiver); goods_character, cod, extra_insurance_value, customer_reference, external_id; packs[].

goods_character (enum)

neam · potraviny_ambient · cham · adr · fresh · frozen

packs[].package_type (enum)

CL · EP · CP · BL · JEDNOCESTNA · DS · ROLE · GITTERBOX · BIGBAG — plus weight, x, y, z, protective_wrap.

Odpověď 201 — pole v data

package_id, tracking_number (tvar PAL…), load_type:"pallet", state, sender_name/city/psc, recipient_name/city/psc, number_of_packages, cod, external_id, price, price_currency, price_breakdown, labels_url a packages[] (číslo + štítek každého kusu).

Na rozdíl od balíků se u palety cena dopočítá hned, pokud máte přiřazený ceník: price_breakdown nese { ok: true, total, currency, zone }. Bez ceníku se paleta založí normálně, jen s price: null a price_breakdown.reason: "no_pricelist" — provoz neblokujeme. Opakované volání se stejným external_id vrátí původní paletu s duplicate: true (HTTP 200).

Když pickup_same_as_sender / delivery_same_as_receiver = true (nebo je vynecháte), převezme se nakládka z odesílatele a doručení z příjemce — pak pickup_* / delivery_* neposílejte. Dobírka palety až 250 000 Kč.

Request — oddělené adresy

sender ≠ pickup, receiver ≠ delivery
{
  "external_id": "OBJ-PAL-SEP-0001",

  "sender_company": "Fakturační s.r.o.", "sender_street": "Účetní 1", "sender_city": "Praha",
  "sender_zip": "11000", "sender_country": "CZ", "sender_phone": "+420777000001",

  "pickup_same_as_sender": false,
  "pickup_company": "Sklad Plzeň", "pickup_street": "Skladová 99", "pickup_city": "Plzeň",
  "pickup_zip": "30100", "pickup_country": "CZ", "pickup_phone": "+420777000002",

  "receiver_company": "Příjemce a.s.", "receiver_street": "Hlavní 5", "receiver_city": "Brno",
  "receiver_zip": "60200", "receiver_country": "CZ", "receiver_phone": "+420777000003",

  "delivery_same_as_receiver": false,
  "delivery_company": "Pobočka Ostrava", "delivery_street": "Nádražní 10", "delivery_city": "Ostrava",
  "delivery_zip": "70200", "delivery_country": "CZ", "delivery_phone": "+420777000004",

  "goods_character": "neam",
  "cod": 12000, "extra_insurance_value": 50000, "customer_reference": "REF-2026-1",
  "packs": [
    { "package_type": "EP", "weight": 240, "x": 120, "y": 80, "z": 100, "protective_wrap": "stretch_foil" }
  ]
}

14.2Stav / storno / štítek palety#

Pro paletu fungují obě varianty cest — buď přes zásilky, nebo přes /palets:

AkceCesta
StavGET /palets/{trackingNumber} (nebo GET /shipments/{trackingNumber})
StornoDELETE /palets/{trackingNumber} (nebo DELETE /shipments/{trackingNumber})
ŠtítekGET /palets/{trackingNumber}/label (?format=zpl též)

Dobírka palety až 250 000 Kč (viz Limity).

14.3Validace palety bez vytvoření (dry-run)#

POST/palets/check

Dry-run pro palety, obdoba /shipments/check. Tělo je identické s POST /palets, ale nic se nezaloží — sdílí stejnou validaci, takže co projde checkem, projde i createm.

Při chybějících povinných polích dostanete jednu položku na každé z nich. U ostatních chyb (neplatný package_type, goods_character, rozměr mimo rozsah, dobírka nad limit) vrátíme jednu položku s field: null a popisem v message. Ověření nekontroluje ceník — paleta se založí i bez přiřazeného ceníku (jen s price: null).

Response

Validní valid: true
{ "ok": true, "data": { "valid": true, "errors": [] }, "timestamp": "..." }
Chybějící pole valid: false
{ "ok": true, "data": { "valid": false, "errors": [
  { "field": "receiver_phone", "code": "required", "message": "receiver_phone je povinné." },
  { "field": "sender_zip", "code": "required", "message": "sender_zip je povinné." }
] }, "timestamp": "..." }

15Ochranné balení — protective_wrap#

Volitelné pole na úrovni kusu (packs[].protective_wrap), string / enum. Default = neuvedeno (bez ochranného balení, none). Povolené hodnoty (reálné backend hodnoty):

HodnotaVýznam
nonebez ochranného balení
bubble_wrapbublinková fólie
stretch_foilstretch fólie
cardboardkartonová ochrana / proložky
wooden_cratedřevěná bedna / klec
edge_protectorsochranné rohy / hranové chrániče

Jiná hodnota → 422 VALIDATION_ERROR. Stejný číselník platí i pro goods_lines[].protective_wrap u balíkových zásilek.

16Webhooky (push změn stavu)#

Místo pravidelného dotazování na stav si zaregistrujte webhook — IPS vám sám pošle POST na vaši URL při změně stavu zásilky, kterou jste vytvořili.

Registrace

POST/webhooks

Odpověď 201 vrací mj. secret (zobrazí se jen jednou — uložte si ho pro ověření podpisu). Když secret nepošlete, vygeneruje se.

Správa odběrů

  • GET /webhooks — seznam vašich odběrů + available_events.
  • PATCH /webhooks/{id}{ active?, events?, description?, rotate_secret? }.
  • DELETE /webhooks/{id} — zrušení odběru.

Dostupné události

shipment.created · shipment.status_changed · shipment.out_for_delivery · shipment.delivered · shipment.failed · shipment.cancelled · shipment.eta_updated

Když při registraci žádnou událost nevyberete, přihlásíme vás k shipment.status_changed.

Registrace

POST /webhooks — body
{ "url": "https://vase-domena.cz/ips-webhook", "events": ["shipment.status_changed"], "secret": "volitelný_vlastní_secret" }

Tvar callbacku#

IPS pošle POST na vaši URL s tělem (viz vpravo). Hlavičky: X-IPS-Event, X-IPS-Delivery, X-IPS-Signature = HMAC-SHA256(tělo, secret).

Ověřte podpis a vraťte 2xx. Při neúspěchu IPS opakuje s exponenciálním odstupem (po vyčerpání pokusů → dead-letter, lze přehrát).

Callback

POST na vaši URL
{
  "event": "shipment.status_changed",
  "delivery_id": "…",
  "data": {
    "tracking_number": "IPS2600000193",
    "state": 7,
    "status": "delivered",
    "status_label": "Doručeno",
    "carrier_code": "DELIVERED",
    "at": "2026-06-29T10:00:00.000Z"
  }
}
Hlavičky
X-IPS-Event: shipment.status_changed
X-IPS-Delivery: …
X-IPS-Signature: HMAC-SHA256(tělo, secret)

17Veřejné sledování pro zákazníka#

Pro koncového příjemce existuje veřejná (bez přihlášení) tracking stránka:

Tracking URL
https://ips.basileus.cz/sledovat/{tracking_number}
https://ips.basileus.cz/sledovat?id={tracking_number}

(Po nasměrování domény funguje i tvar https://tracking.basileus.cz/?id={tracking_number}.)

Tahle stránka je určená lidem (zobrazuje stav + mapu). Strojové dotazy na stav dělejte přes GET /shipments/{trackingNumber} s X-API-KEY.

18Odlišnosti od starého ERP#

Drobné, vědomé odchylky implementace IPS (přečtěte si!):

  1. package_id je textový identifikátor (ne číslo). Pro všechna další volání (stav/storno/štítek) používejte tracking_number — to platilo i dřív.
  2. price ve vytvoření vracíme null — cena se počítá dle ceníku per partner až ve fakturaci, ne při založení zásilky. (U palet se price dopočítá, je-li ceník.)
  3. Velikostní kategorie se dopočítá z váhy — při importu stačí poslat váhu (viz Limity).
  4. Číselné stavy state viz tabulka v §10.3 (mapováno 1:1 na interní stavy IPS).
  5. Celní pole se nepoužívají — custom_code (PackageItem) ani customs_shipment (paleta) nejsou potřeba, protože doručujeme jen v rámci ČR (CZ → CZ, bez cla). Pokud je pošlete, ignorují se.

Vše ostatní (názvy polí, struktura těla i odpovědí, autentizace, štítky, storno) je shodné. Pokud narazíte na jakýkoli rozdíl oproti tomu, co jste testovali, dejte vědět — doladíme.

19Bezpečnost a izolace dat#

  • Každá zásilka je svázaná s vaším klíčem. Přes API vidíte a spravujete výhradně vlastní zásilky — tracking ani storno cizí zásilky není možné, ani při znalosti cizího tracking čísla.
  • Doporučujeme klíč omezit na vaše zdrojové IP.
  • Každý požadavek má request_id (v hlavičce X-Request-Id) pro rychlou reklamaci.

20Doporučený postup nasazení#

  1. Vyžádejte si sandbox klíč (nebo si ho vygenerujte na eshop.basileus.cz).
  2. Pusťte svou stávající integraci proti base URL IPS se sandbox klíčem, ověřte odpovědi (check → vytvoření → štítek PDF/ZPL → tracking → storno → places → palets → webhook callback).
  3. Po potvrzení přepněte na produkční klíč. Žádné přepisování integrace.

21Kontakt#

Potřebujete sandbox klíč nebo pomoc s integrací?

Napište nám — rádi vám pomůžeme s napojením na Basileus Public API.

obchod@basileus.cz