Basileus 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 (které jste testovali na basileus.docs.apiary.io) — 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, webhooky stavů, veřejná tracking URL, ADR — hotovo.

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.

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
409Konflikt (např. storno už doručené zásilky)
422Chyba validace (error.details.errors)
429Překročen limit požadavků
500Interní chyba (error.details.error_id pro reklamaci)

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#

Rate limit je nastaven individuálně podle vašeho objemu (pro agregátor řádově tisíce req/min). Aktuální hodnotu hlásí hlavičky X-RateLimit-Limit / X-RateLimit-Remaining; 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: 6000
X-RateLimit-Remaining: 5993
Retry-After: 12

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).

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.

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": "8f3c…",
    "tracking_number": "IPS-…",
    "state": 0,
    "type": "BOX",
    "price": null,
    "price_currency": "CZK",
    "external_id": "OBJ-2026-0001",
    "labels_url": "https://ips.basileus.cz/public-api/v1/shipments/IPS-…/label",
    "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

Response

Response 200
{
  "ok": true,
  "data": {
    "tracking_number": "IPS-…",
    "external_id": "OBJ-2026-0001",
    "state": 5,
    "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 } ]
  },
  "timestamp": "..."
}

10.4Storno zásilky#

DELETE/shipments/{trackingNumber}

Stornuje zásilku.

Doručenou zásilku nelze stornovat → 409.

Response

Response 200
{ "ok": true, "data": { "tracking_number": "IPS-…", "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 (A6, logo, adresa, dobírka, Code128)
?format=zplZPL II (Zebra, termální tiskárny), text/plain

Stahujte serverově s hlavičkou X-API-KEY. Stejná adresa je v labels_url z odpovědi vytvoření. Endpoint je idempotentní (re-print kdykoli vrátí aktuální štítek).

Příklad

cURL — PDF
curl https://ips.basileus.cz/public-api/v1/shipments/IPS-…/label?format=pdf \
  -H "X-API-KEY: <váš_api_klíč>" \
  -o stitek.pdf
cURL — ZPL
curl https://ips.basileus.cz/public-api/v1/shipments/IPS-…/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).

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, load_type:"pallet", state, sender_*, recipient_*, number_of_packages, cod, external_id, price, labels_url.

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).

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

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": "IPS-…",
    "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