Pravidla API
Platí pro API v1 (/api/v1/...). API v3 kompatibilní se SmartEmailingem má vlastní obálky a formáty, popsané v Kompatibilitě se SmartEmailingem.
Adresa a formát
- Základ:
https://www.postarna.cz/api/v1. Operace firmy:/api/v1/tenants/{tenant}/..., kde{tenant}je veřejné ID firmy (UUID). - Tělo požadavků POST, PUT a PATCH je JSON (
Content-Type: application/json, UTF-8). Jiný typ obsahu = 415validation/contentType, tělo, které není objekt JSON, = 400validation/body. Výjimky: nahrání CSV a souborů přijímá imultipart/form-data. - Odpovědi jsou JSON v UTF-8 (diakritika není escapovaná). Exporty a statistiky umí i CSV (
format=csv). - Jedno tělo požadavku má nejvýš 5 MB (větší = 413
validation/size); CSV soubor importu nahraný jakomultipart/form-dataaž 64 MB.
Datové typy
| Údaj | Formát | Příklad |
|---|---|---|
| ID objektu | řetězec číslic | "1201" |
| ID firmy | UUID | "3f6c2a1e-8b7d-4c5e-9f10-2a3b4c5d6e7f" |
| Čas | ISO 8601 v UTC s milisekundami | "2026-10-01T08:00:00.000Z" |
| Kalendářní den firmy | YYYY-MM-DD v časové zóně firmy | "2026-10-31" |
| Místní čas v automatizacích | YYYY-MM-DDTHH:MM, HH:MM | "2026-12-01T09:00", "08:00" |
| Peníze | desetinný řetězec vedle currency | "1290.00" a "CZK" |
| Svátek kontaktu | MM-DD | "10-31" |
- Časy zapisované do API (
sendAt,createdAtobjednávky) posílejte s časovou zónou (Znebo+02:00). - Dny v segmentech a podmínkách („za posledních 30 dní“) jsou kalendářní dny v časové zóně firmy (Europe/Prague, Europe/Bratislava).
- Měny se nikdy nesčítají ani nepřevádějí. Každý e-shop má jednu měnu; objednávka v jiné měně, než má její e-shop, je chyba 400. Součty (obraty, konverze) jsou vždy po měnách.
Stránkování, hledání a řazení
- Seznamy objektů mají
page(od 1) apageSize(1 až 100, výchozí 25). Odpověď je{"items": [...], "total": 240, "page": 1, "pageSize": 25}. - Projděte všechny stránky, dokud
page * pageSize < total. qhledá v názvu nebo adrese bez ohledu na velikost písmen a diakritiku (nejvýš 200 znaků). U automatizacíq=#123najde automatizaci podle ID.shopomezí přehled na jeden e-shop (ID e-shopu).sortu přehledů, které ho mají: pole oddělená čárkou,-na začátku = sestupně, nejvýš 3 pole (sort=name,-createdAt). Výchozí řazení je od nejnovějšího. Neznámé pole = 400validation/sort.
Chyby
Každá chyba má stejný tvar a vhodný HTTP stav:
{"error": {"code": "conflict", "message": "version", "params": {"current": 4}}}code: stálý strojový kód (validation,unauthorized,forbidden,not_found,conflict,rate_limited,unavailablea další). Podle něj se rozhodujte.message: technický údaj, obvykle název pole (email,definition.1.0.listId,graph) nebo důvod (version,status). Není to text pro lidi a může být prázdný.params: podrobnosti, napříkladissuesu grafu automatizace,expectedaactualu počtu příjemců,reason.- API neposílá texty pro lidi; texty v češtině a slovenštině si skládá aplikace.
Úplný seznam kódů s významem a nápravou: Chyby a limity.
Limity požadavků
- Na firmu (všechny klíče dohromady): zásobník 2 500 požadavků, který se doplňuje 4 požadavky za sekundu, a 100 000 požadavků za den (doplňuje se průběžně, žádný reset o půlnoci).
- Každá odpověď na požadavek s klíčem nese
X-RateLimit-Limit,X-RateLimit-RemainingaX-RateLimit-Reset(unixový čas, kdy bude zásobník zase plný) zásobníku, kterému zbývá méně. - Po překročení přijde 429
rate_limiteds hlavičkouRetry-After(za kolik sekund). Odmítnuté požadavky se nepočítají. - Některé akce mají vlastní limity (testovací e-maily, události kontaktu, MCP); jsou v Chybách a limitech.
Opakování požadavků a idempotence
API nepoužívá hlavičku Idempotency-Key. Po výpadku sítě nebo chybě 5xx proto opakujte jen to, co je bezpečné opakovat:
- GET opakujte vždy.
- PUT nahrazuje celý objekt (obsah šablony, graf automatizace, stavy objednávek): opakování se stejnými daty nic nepokazí; u obsahu a grafu ale hlídá verzi (viz níže).
- DELETE opakujte; druhé volání vrátí 404, což znamená „už smazáno“.
- POST /orders je upsert podle dvojice (
shopId,idobjednávky): opakování se stejnými daty vrátíchange: "unchanged". - POST /lists/{id}/members je idempotentní: kontakt, který už je členem, se počítá do
alreadyMember. - POST /contacts: druhé založení stejné adresy vrátí 409
conflict/email. Před opakováním kontakt vyhledejte (GET /contacts?q=adresa) a případně upravte přesPATCH. - POST /contact-events idempotentní není: každá událost se zapíše znovu. Po časovém limitu raději jednu událost ztraťte, než ji pošlete dvakrát.
- POST /campaigns/{id}/approve chrání stav kampaně: druhé schválení vrátí 409
conflict/status. - Při 429 počkejte
Retry-After; při 5xx opakujte s rostoucí prodlevou (1, 2, 4, 8 s) a nejvýš pětkrát.
Souběžné úpravy (verze)
Obsah šablon a kampaní, patičky a grafy automatizací mají číslo verze. Ukládání posílá baseVersion = verzi, kterou jste naposledy načetli. Když mezitím uložil někdo jiný, server vrátí 409 conflict / version s params.current; načtěte objekt znovu, sloučte změny a uložte s novou verzí.
Oprávnění
- Každá operace patří do modulu (
contacts,campaigns,content,settings,billing) a potřebuje úroveňreadnebofull. Reference to u každé operace uvádí. - Klíč s přístupem jen pro čtení dosáhne jen na operace s úrovní
read(i POST, který jen počítá, například náhled segmentu). Jinak 403forbidden/scope. - Klíč v cizí firmě: 403
forbidden/tenant. Chybějící role: 403forbiddens názvem modulu vmessage. Objekt jiné firmy se tváří jako neexistující (404). - Bez přihlášené osoby (tedy ani klíčem) nejde: správa členů, pozvánek, API klíčů a připojených aplikací, hlavní vypínač odesílání a změny tarifu.
Neznámá pole
Posílejte jen zdokumentovaná pole. Většina tras neznámá pole ignoruje, některé je odmítnou s názvem pole v message (například POST /orders), nastavení uzlů automatizace se při uložení zahodí. Nová pole v odpovědích mohou přibývat, klient je má ignorovat.