← Dokumentácia / Príručky
Konvencie API
Štruktúra požiadaviek, autorizačné rozsahy, zoznamové dopyty, peňažné sumy, chyby, idempotencia a limity požiadaviek.
Štruktúra požiadaviek
Každá operácia je v štýle RPC volania metódou POST:
POST /v1/{module}/{resource}/{action}
Moduly: reference, partners, catalog, sales, purchases, ledger, bank, declarations, files, webhooks, audit. Akcie sú slovesá: create, get, update, delete, list plus špecifické akcie domény ako issue, register, match, apply-advance, generate.
Autentifikácia a rozsahy (scopes)
Authorization: Bearer <api key>. Kľúče obsahujú rozsahy oprávnení overované pri každej akcii:
{module}:read- akcie na získanie/zoznam{module}:write- zmeny a zápisy{module}:*alebo*- zástupné znaky (wildcards)
Chýbajúci rozsah vedie k chybovému kódu 403 forbidden. Chýbajúci alebo neplatný kľúč vedie k chybovému kódu 401 unauthorized.
Zoznamové dopyty
Všetky akcie typu list zdieľajú rovnakú štruktúru:
{
"page": 1,
"pageSize": 50,
"sort": [{ "field": "createdAt", "dir": "desc" }],
"filter": [{ "field": "paymentStatus", "op": "eq", "value": "unpaid" }]
}
Operátory filtrov: eq (rovná sa), ne (nerovná sa), contains (zhoda textu bez ohľadu na veľkosť písmen, iba pre textové políčka), gte (väčšie alebo rovné), lte (menšie alebo rovné), in (ľubovoľná hodnota zo zoznamu obsahujúceho najviac 500 hodnôt). Políčka, podľa ktorých možno radiť a filtrovať, sú preddefinované na základe whitelistu pre každý koncový bod (pozrite si špecifikáciu OpenAPI); neznáme políčka vrátia chybu 400. Pridaním parametra totals: ["field", …] do požiadavky získate súčet číselných polí pre všetky zodpovedajúce riadky; ak záznamy obsahujú menu, políčko totalsByCurrency poskytuje rovnaké súčty rozdelené podľa kódov mien. Odpovede: { rows, total, page, pageSize, totals?, totalsByCurrency? }.
Peňažné sumy a dátumy
Peňažné hodnoty sú desatinné reťazce s najviac 4 desatinnými miestami ("121.0000"), nikdy nie desatinné čísla s plávacou rádovou čiarkou (floats). DPH sa počítava pre každý riadok osobitne so zaokrúhľovaním nahor pri polovičnej hodnote (half-up rounding). Dátumy majú formát YYYY-MM-DD; časové značky (timestamps) sú v UTC formáte podľa normy ISO 8601.
Chyby
Všade sa používa jednotná obálka:
{
"error": {
"code": "validation",
"message": "Request validation failed",
"requestId": "k1x…",
"key": "request_invalid",
"fieldErrors": { "lines.0.unitPriceExclVat": ["Invalid value"] }
}
}
Kódy: validation (400/422 a 413, ak je odovzdaný súbor alebo telo požiadavky príliš veľké), unauthorized (401), payment_required (402, skúšobné obdobie alebo predplatený kredit vypršal; správa informuje, ako pokračovať), forbidden (403), not_found (404), conflict (409), idempotency_key_reuse (422), idempotency_in_progress (409), rate_limited (429), internal (5xx). Ak je správa jednou z pevných chybových hlásení, políčko key ju identifikuje, aby klient mohol zobraziť vlastný preklad, a políčko params obsahuje hodnoty, ktoré sa do nej dosadia (napríklad { "period": "2026-09" } pre uzatvorené účtovné obdobie). Pri hlásení problémov vždy uveďte identifikátor requestId.
Idempotencia
Pridajte hlavičku Idempotency-Key: <ľubovoľný reťazec ≤255 znakov> do každej mutujúcej požiadavky:
- Opakované volanie s rovnakým kľúčom a payloadom - uložená odpoveď sa pre prehrá presne v pôvodnom znení bajt po bajte s hlavičkou
x-idempotent-replay: true. - Rovnaký kľúč, odlišný payload - chyba 422
idempotency_key_reuse. - Súbežná duplicitná požiadavka, zatiaľ čo prvá sa ešte spracováva - chyba 409
idempotency_in_progress. - Kľúče patria k API kľúču alebo používateľovi, ktorý ich odosiela, v rámci spoločnosti, pre ktorú sa volanie vykonáva, takže dve integrácie jednej spoločnosti môžu použiť rovnaký kľúč. Volania uskutočnené pred vznikom spoločnosti a volania
account/*uchovávajú kľúče pre každého používateľa, takže opakované volanieaccount/companies/createvytvorí iba jednu spoločnosť. - Uložená odpoveď sa vráti až vtedy, keď volajúci opätovne úspešne prejde kontrolami oprávnení (rozsah, rola, spoločnosť a stav fakturácie); v opačnom prípade volanie dostane aktuálnu chybovú odpoveď.
- Kľúče vypršia po 24 hodinách. Chybové odpovede (4xx) sa prehrávajú tiež; odpovede 5xx sa neukladajú, takže opakované pokusy sa zopakujú nanovo.
Limity požiadaviek (Rate limits)
300 požiadaviek za minútu na jeden API kľúč (na predložené poverenie; neautentifikované požiadavky sú obmedzené na základe IP adresy). Pri chybovom kóde 429 rešpektujte hlavičku retry-after. Hlavičky x-ratelimit-* informujú o stave vášho limitu.
Webhooky
Udalosti sa zapisujú do transakčnej schránky (transactional outbox) v rámci tej istej databázovej transakcie ako samotná zmena - vrátená (rolled-back) transakcia nikdy nevygeneruje udalosť a žiadna udalosť sa nestratí. Doručovanie:
POSTpožiadavka na vašu URL adresu s JSON objektom udalostix-nordlet-timestamp: <unix sekundy>, čas, kedy bolo doručenie podpísanéx-nordlet-signature-v2: t=<timestamp>,v1=<hexadecimálny HMAC-SHA256 reťazec pre "<timestamp>.<surový payload>">za použitia tajného kľúča vašej predplatenej službyx-nordlet-signature: sha256=<hexadecimálny HMAC-SHA256 reťazec surového payloadu>, zachované v nezmenenej podobe pre existujúcich príjemcovx-nordlet-deliveryobsahuje ID doručenia, ktoré je rovnaké pri každom opakovanom pokuse o to isté doručenie- Odpoveď iná ako 2xx alebo presmerovanie sa opätovne pokúsi doručiť po 30 sekundách, 2 minútach, 10 minútach, 30 minútach, 1 hodine, 3 hodinách, 6 hodinách a 12 hodinách (približne po 24 hodinách celkovo), predtým než sa doručenie označí ako zlyhané
- Každé doručenie odosiela vždy iba jeden server, takže prevádzka viacerých inštancií API nespôsobí duplicitné odoslanie
Pred dôverou v obsah payloadu overte podpis x-nordlet-signature-v2 porovnaním odolným voči časovým útokom (constant-time comparison) a odmietnite doručenie, ktorého časová značka sa líši od hodín vášho servera o viac ako 5 minút. Časová značka je súčasťou podpísaného textu, takže zachytené doručenie nemožno neskôr prehrať s novou časovou značkou. Ukladajte si spracované ID z hlavičky x-nordlet-delivery, aby ste ignorovali prípadné duplicitné doručenia v danom časovom okne. Zlyhané doručenie je možné odoslať znova pomocou koncového bodu webhooks/deliveries/redeliver.
Audit
Každá zmena sa zaznamenáva (actor, action, entity, diff) a dá sa vyhľadávať prostredníctvom audit/list.
Účtovné záruky
- Účtovné zápisy sú vždy vyrovnané (balanced) - vynucuje sa to odloženým databázovým triggrom v okamihu potvrdenia transakcie (commit), nielen aplikačným kódom.
- Čísla dokladov sú bez medzier v rámci číselného radu a roka; prideľovanie čísel je bezpečné voči súbežným zápisom (concurrency-safe).
- Uzatvorené účtovné obdobia odmietnu akýkoľvek zápis s dátumom spadajúcim do tohto obdobia (409).
- Mäkko zmazané doklady (soft-deleted) si zachovávajú svoju históriu auditu; vystavené alebo zaevidované doklady nie je možné vymazať.