SaldoDokumentace Otevřít Saldo

Reference API

Banka, párování a výpisy

Bankovní účty a pokladny, import výpisů z datových souborů i PDF, archiv originálů s kontrolou zůstatků, napojení Fio, párování pohybů s doklady, přímé zaúčtování a bankovní pravidla.

30 operací · vygenerováno z OpenAPI · ukázky zaznamenané na smyšlené firmě

GET Seznam bankovních účtů a pokladen

/entities/{entity_id}/bank_accounts

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Stačí

Vrátí všechny bankovní účty a pokladny firmy včetně archivovaných; nejdřív aktivní, pak podle druhu (bank před cash) a ID. Každý účet má vlastní analytický účet 221xxx (bankovní účet) nebo 211xxx (pokladna) a zůstatek k dnešnímu dni. V podvojném účetnictví je zůstatek účtu vedeného v CZK zůstatkem jeho analytického účtu podle účetních zápisů; jinak jde o počáteční stav + všechny pohyby účtu (i ignorované) + ručně zadané úhrady, u pokladny navíc vystavené pokladní doklady. Token Fio API se nikdy nevrací, jen příznak api_connected.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Odpověď

200 application/json Pole bankovních účtů a pokladen.

PoleVýznam
kindbank = bankovní účet, cash = pokladna
nameNázev účtu
numberČíslo účtu s případným předčíslím
bank_codeKód banky (4 číslice)
display_numberČíslo účtu ve tvaru číslo/kód banky
ibanIBAN (velkými písmeny bez mezer)
bicBIC/SWIFT
currencyMěna účtu
account_codeAnalytický účet v účtovém rozvrhu (221xxx nebo 211xxx)
opening_balancePočáteční stav v měně účtu
opening_dateDatum počátečního stavu; zůstatky a kontrola výpisů se počítají od něj
is_defaultVýchozí účet svého druhu
archivedArchivovaný účet (nezapočítává se do přehledu peněz a nenabízí se jako výchozí účet dokladů)
balanceZůstatek k dnešnímu dni v měně účtu
balance_czkZůstatek v CZK; u cizoměnového účtu v podvojném účetnictví zůstatek účetních zápisů, v daňové evidenci přepočet kurzem ČNB k dnešku (null, když kurz není k dispozici)
api_connectedZda je k účtu uložený token Fio API
synced_atČas posledního úspěšného stažení z Fio API
sync_errorText poslední chyby stažení z Fio API

Chování

Co změní
Nic nezapisuje. U cizoměnového účtu v daňové evidenci načte kurz ČNB k dnešnímu dni pro balance_czk.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
[
  {
    "id": 2,
    "account_code": "221001",
    "archived": false,
    "bank_code": "2010",
    "bic": null,
    "created_at": "2026-09-28T10:00:00.000Z",
    "currency": "CZK",
    "iban": "CZ3820100000002900001227",
    "is_default": true,
    "kind": "bank",
    "name": "Provozní účet",
    "number": "2900001227",
    "opening_balance": 420000.0,
    "opening_date": "2026-01-01",
    "sync_error": null,
    "synced_at": null,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "display_number": "2900001227/2010",
    "balance": 887525.6,
    "api_connected": false,
    "balance_czk": 887525.6
  },
  {
    "id": 6,
    "account_code": "221002",
    "archived": false,
    "bank_code": "2010",
    "bic": null,
    "created_at": "2026-09-28T10:00:00.000Z",
    "currency": "CZK",
    "iban": null,
    "is_default": false,
    "kind": "bank",
    "name": "Rezervní účet",
    "number": "2900005005",
    "opening_balance": 0.0,
    "opening_date": "2026-01-01",
    "sync_error": null,
    "synced_at": null,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "display_number": "2900005005/2010",
    "balance": 0.0,
    "api_connected": false,
    "balance_czk": 0.0
  }
]

Dlouhé seznamy jsou v ukázce zkrácené na první položky.

POST Přidání bankovního účtu nebo pokladny

/entities/{entity_id}/bank_accounts

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Založí bankovní účet (kind: bank) nebo pokladnu (kind: cash) a přidělí mu nejnižší analytický účet 221001–221999, resp. 211001–211999, který nemá žádný jiný bankovní účet ani pokladna firmy, a tento účet založí v účtovém rozvrhu s názvem „název číslo/kód banky“. V podvojném účetnictví zaúčtuje nenulový počáteční stav (MD analytický účet / D 701) ke dni opening_date, bez něj k prvnímu dni aktuálního účetního roku; počáteční stav v cizí měně přepočte kurzem ČNB k tomuto dni. is_default: true zruší příznak výchozího účtu u ostatních účtů stejného druhu. Do pokladny nelze importovat výpis a její zůstatek zahrnuje i vystavené pokladní doklady.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
bank_accountobjektano
bank_account.kindtextneDruh účtu, výchozí bank; později ho změnit nelze Hodnoty: bank, cash. Výchozí bank.
bank_account.nametextneNázev, nejvýše 120 znaků; prázdný dostane název „Bankovní účet“ nebo „Pokladna“ Nejvýše 120 znaků.
bank_account.numbertextneČíslo účtu s případným předčíslím, např. 19-2000145399
bank_account.bank_codetextneKód banky, přesně 4 číslice
bank_account.ibantextneIBAN; mezery se odstraní a písmena převedou na velká
bank_account.bictextneBIC/SWIFT; mezery se odstraní a písmena převedou na velká
bank_account.currencytextneMěna účtu jako tři velká písmena, výchozí CZK Výchozí CZK.
bank_account.opening_balancečíslonePočáteční stav v měně účtu, výchozí 0 Výchozí 0.
bank_account.opening_datedatumneDatum počátečního stavu
bank_account.is_defaultano/neneVýchozí účet svého druhu

Odpověď

201 application/json Založený účet ve stejném tvaru jako v seznamu účtů (včetně account_code a zůstatku).

Chyby této operace

StavKódKdy
422–Nenulový počáteční stav spadá do uzamčeného období: „Období do … je uzamčeno – počáteční stav účtu nelze změnit“
422–V podvojném účetnictví nejde počáteční stav v cizí měně přepočítat, protože kurz ČNB není k dispozici: „Kurz ČNB pro … ke dni … se nepodařilo načíst – počáteční stav uložte prosím později“
422–Přidělený analytický účet už v účtovém rozvrhu je (řádek zůstal po smazaném účtu stejného druhu): „Číslo účtu už existuje“; založení projde, až se nepoužitý řádek z účtového rozvrhu smaže

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Vytvoří účet, řádek účtového rozvrhu s jeho analytickým účtem a v podvojném účetnictví účetní zápis počátečního stavu (zdroj opening). Zapíše auditní událost bank_account.created.
Opakování
Každé volání založí další účet s dalším volným analytickým účtem.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"bank_account":{"kind":"bank","name":"Spořicí účet","number":"2400112238","bank_code":"2010","currency":"CZK","opening_balance":50000}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "bank_account": {
      "kind": "bank",
      "name": "Spořicí účet",
      "number": "2400112238",
      "bank_code": "2010",
      "currency": "CZK",
      "opening_balance": 50000
    }
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "id": 7,
  "account_code": "221003",
  "archived": false,
  "bank_code": "2010",
  "bic": null,
  "created_at": "2026-09-28T10:00:00.000Z",
  "currency": "CZK",
  "iban": null,
  "is_default": false,
  "kind": "bank",
  "name": "Spořicí účet",
  "number": "2400112238",
  "opening_balance": 50000.0,
  "opening_date": null,
  "sync_error": null,
  "synced_at": null,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "display_number": "2400112238/2010",
  "balance": 50000.0,
  "api_connected": false,
  "balance_czk": 50000.0
}

PATCH Úprava bankovního účtu nebo pokladny

/entities/{entity_id}/bank_accounts/{id}

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Změní údaje účtu nebo pokladny; druh (kind) změnit nelze a pole se ignoruje. Když se změní počáteční stav, jeho datum nebo měna, Saldo ověří, že původní ani nový nenulový počáteční stav nespadá do uzamčeného období, a v podvojném účetnictví zápis počátečního stavu smaže a zaúčtuje znovu. Řádek analytického účtu v účtovém rozvrhu se přejmenuje na „název číslo/kód banky“. archived: true účet archivuje: pohyby i zápisy zůstanou, jen se nezapočítává do přehledu peněz a nenabízí se jako výchozí.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID bankovního účtu nebo pokladny Příklad 31.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
bank_accountobjektano
bank_account.nametextneNázev, nejvýše 120 znaků Nejvýše 120 znaků.
bank_account.numbertextneČíslo účtu s případným předčíslím
bank_account.bank_codetextneKód banky, přesně 4 číslice
bank_account.ibantextneIBAN; mezery se odstraní a písmena převedou na velká
bank_account.bictextneBIC/SWIFT
bank_account.currencytextneMěna účtu jako tři velká písmena; Saldo změně nebrání ani u účtu, který už má pohyby, výpisy nebo úhrady
bank_account.opening_balancečíslonePočáteční stav v měně účtu
bank_account.opening_datedatumneDatum počátečního stavu
bank_account.is_defaultano/neneVýchozí účet svého druhu; ostatním účtům stejného druhu se příznak zruší
bank_account.archivedano/neneArchivovat (true) nebo vrátit mezi aktivní (false)

Odpověď

200 application/json Upravený účet ve stejném tvaru jako v seznamu účtů.

Chyby této operace

StavKódKdy
422–Změna počátečního stavu zasahuje do uzamčeného období: „Období do … je uzamčeno – počáteční stav účtu nelze změnit“
422–Počáteční stav v cizí měně nejde přepočítat bez kurzu ČNB: „Kurz ČNB pro … ke dni … se nepodařilo načíst – počáteční stav uložte prosím později“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Uloží změny účtu. Při změně počátečního stavu, jeho data nebo měny v podvojném účetnictví nahradí zápis počátečního stavu (MD analytický účet / D 701). Přejmenuje řádek analytického účtu v účtovém rozvrhu. Zapíše auditní událost bank_account.updated.
Opakování
Opakování se stejnými daty nic dalšího nezmění, jen zapíše další auditní událost; zápis počátečního stavu se nahrazuje jen při skutečné změně počátečních údajů.

Příklad

cURL

curl \
  -X PATCH \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"bank_account":{"name":"Provozní účet Fio","is_default":true}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts/2

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts/2', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'PATCH',
  body: JSON.stringify({
    "bank_account": {
      "name": "Provozní účet Fio",
      "is_default": true
    }
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "name": "Provozní účet Fio",
  "is_default": true,
  "opening_balance": 420000.0,
  "opening_date": "2026-01-01",
  "currency": "CZK",
  "iban": "CZ3820100000002900001227",
  "bic": null,
  "number": "2900001227",
  "account_code": "221001",
  "id": 2,
  "archived": false,
  "bank_code": "2010",
  "created_at": "2026-09-28T10:00:00.000Z",
  "kind": "bank",
  "sync_error": null,
  "synced_at": null,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "display_number": "2900001227/2010",
  "balance": 887525.6,
  "api_connected": false,
  "balance_czk": 887525.6
}

DELETE Smazání nepoužitého bankovního účtu nebo pokladny

/entities/{entity_id}/bank_accounts/{id}

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Smaže bankovní účet nebo pokladnu, ale jen pokud nemá žádné bankovní pohyby, uložené výpisy, úhrady ani doklady, které na něj odkazují; jinak ho lze jen archivovat (archived: true v úpravě účtu). Se smazáním zmizí i uložený token Fio API a zápis počátečního stavu. Řádek analytického účtu (221xxx nebo 211xxx) v účtovém rozvrhu zůstává: když Saldo tento kód později přidělí nově zakládanému účtu, založení skončí chybou „Číslo účtu už existuje“, dokud se řádek z účtového rozvrhu nesmaže. Pravidla pro banku omezená na smazaný účet zůstanou, žádný pohyb už nezachytí a při úpravě neprojdou kontrolou.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID bankovního účtu nebo pokladny Příklad 33.

Odpověď

204 Prázdná odpověď.

Chyby této operace

StavKódKdy
422–Účet se používá: „Účet má pohyby, výpisy nebo doklady – můžete ho jen archivovat“
422–Nenulový počáteční stav nebo jeho zápis leží v uzamčeném období: „Období do … je uzamčeno – počáteční stav účtu nelze změnit“ nebo „Období do … je uzamčeno – zaúčtování nelze změnit“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Smaže účet a jeho zápis počátečního stavu (zdroj opening). Řádek analytického účtu v účtovém rozvrhu ponechá. Zapíše auditní událost bank_account.deleted.
Opakování
Druhé volání vrátí 404.

Příklad

Smazat jde jen účet bez pohybů, výpisů, úhrad a dokladů, proto příklad maže nově založený prázdný účet.

cURL

curl \
  -X DELETE \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts/6

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts/6', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'DELETE'
});
const data = await response.json();
Odpověď 204 No Content
soubor, 0 bajtů

POST Připojení nebo odpojení Fio API k účtu

/entities/{entity_id}/bank_accounts/{id}/connect

Oprávnění
Vlastník nebo účetní
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Uloží k bankovnímu účtu token Fio API pro automatické stahování pohybů, nebo ho odpojí. Připojit lze jen účet s kódem banky 2010 (Fio banka); účet s jiným kódem banky nebo bez něj (typicky pokladnu) Saldo odmítne. Token musí mít přesně 64 znaků (písmena, číslice, _ a -), uloží se šifrovaně a API ho už nikdy nevrátí, jen api_connected: true. Při připojení Saldo Fio nekontaktuje – platnost tokenu a to, že patří k tomuto účtu, se ověří až při stažení pohybů. Prázdný nebo chybějící token připojení zruší.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID bankovního účtu Příklad 31.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
tokentextneToken Fio API z internetového bankovnictví (Nastavení → API); prázdná hodnota připojení zruší

Odpověď

200 application/json Účet ve stejném tvaru jako v seznamu účtů, s api_connected a vymazaným sync_error.

Chyby této operace

StavKódKdy
422–Účet není u Fio banky: „Automatické stahování zatím umí jen Fio banka (kód banky 2010)“
422–Token nemá tvar tokenu Fio: „Token Fio API má 64 znaků – zkopírujte ho celý z internetového bankovnictví“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Uloží zašifrovaný token a vymaže sync_error, nebo token smaže. Zapíše auditní událost bank.feed_connected, při odpojení bank.feed_removed. Fio API nevolá.
Limity
Token přesně 64 znaků A–Z, a–z, 0–9, _, - (okrajové mezery se ořežou).
Opakování
Nový token přepíše předchozí; každé volání zapíše auditní událost.

Příklad

Token je vymyšlený; při připojení se Fio nekontaktuje.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"token":"SaldoDemoFioToken_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJ"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts/2/connect

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts/2/connect', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "token": "SaldoDemoFioToken_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJ"
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "sync_error": null,
  "iban": "CZ3820100000002900001227",
  "bic": null,
  "number": "2900001227",
  "account_code": "221001",
  "id": 2,
  "archived": false,
  "bank_code": "2010",
  "created_at": "2026-09-28T10:00:00.000Z",
  "currency": "CZK",
  "is_default": true,
  "kind": "bank",
  "name": "Provozní účet",
  "opening_balance": 420000.0,
  "opening_date": "2026-01-01",
  "synced_at": null,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "display_number": "2900001227/2010",
  "balance": 887525.6,
  "api_connected": true,
  "balance_czk": 887525.6
}

POST Stažení nových pohybů z Fio API

/entities/{entity_id}/bank_accounts/{id}/sync

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Stáhne z Fio API pohyby od poslední zarážky (dotaz last, Fio po každém stažení posune zarážku za vydané pohyby) a naimportuje je na účet stejně jako výpis: přeskočí pohyby, jejichž reference (ID pohybu Fio) už účet má, a pohyby s nulovou částkou nebo bez data. Když je zapnutá automatizace auto_match, nové pohyby spáruje s doklady, a když je zapnutá bank_rules, použije na ně pravidla pro banku. Pokud Fio vrátí výpis jiného účtu, nic se neimportuje. Na rozdíl od ručního importu se nevytváří archiv výpisu ani se neukládá soubor.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID bankovního účtu s připojeným Fio API Příklad 31.

Odpověď

200 application/json Výsledek importu z Fio API a účet po stažení.

PoleVýznam
formatfio_api
import_batchIdentifikátor dávky (12 šestnáctkových znaků) uložený u nových pohybů
statementÚdaje výpisu z Fio (účet, období from–to, počáteční a konečný zůstatek, fio s ID pohybů a zarážky)
importedPočet nových pohybů
skippedPočet přeskočených pohybů (už uložené nebo s nulovou částkou); pohyb bez data nebo částky Saldo vynechá už při čtení odpovědi Fio a uvede ho jen ve warnings
matchedPočet nových pohybů spárovaných s doklady
ruledPočet nových pohybů vyřízených pravidly
rulesCo udělala pravidla – transaction_id, rule_id, rule_name, action, result, text
warningsUpozornění ke čtení výpisu
accountÚčet po stažení (s synced_at a sync_error)

Chyby této operace

StavKódKdy
422–Účet nemá uložený token: „Účet nemá připojené Fio API“
422–Stahuje se častěji než jednou za 30 s: „Fio dovoluje stáhnout výpis nejvýš jednou za 30 sekund, zkuste to znovu za … s“; sync_error se neukládá
422–Fio dotaz odmítlo nebo je nedostupné (neplatný token, pohyby starší 90 dní bez odemčené historie, více než 50 000 pohybů, výpadek nebo nečitelná odpověď) nebo token patří jinému účtu („Token patří k účtu …“); text chyby se uloží do sync_error

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Volá Fio API (https://fioapi.fio.cz/v1/rest/last/…/transactions.json). Vytvoří nové bankovní pohyby; podle automatizací zaznamená úhrady dokladů s účetními zápisy a pohyby vyřídí pravidly. Zapíše auditní událost bank.imported (zdroj fio), případně payment.recorded a bank.rule_applied. Uloží synced_at a vymaže sync_error; při chybě Fio uloží její text do sync_error.
Limity
Nejvýš jedno stažení za 30 s na jeden token v rámci procesu serveru; Fio při častějším dotazu vrací HTTP 409, které se hlásí stejně. Spojení 5 s, čtení odpovědi 30 s. Fio vydá najednou nejvýš 50 000 pohybů a pohyby starší 90 dní jen po odemčení historie v internetovém bankovnictví.
Opakování
Další stažení vrátí jen pohyby, které Fio od posledního stažení nevydalo; už uložené pohyby se navíc přeskočí podle reference. Volání dříve než za 30 s skončí chybou 422. Zarážku posune Fio už tím, že pohyby vydá: když pak import skončí chybou (např. „Token patří k účtu …“), tyto pohyby další stažení nevrátí a je potřeba je naimportovat z výpisu.

Příklad

Předpokládá, že účet má uložený token (viz připojení Fio API); odpověď Fio je v záznamu nahrazená ukázkovou.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts/2/sync

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_accounts/2/sync', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'POST'
});
const data = await response.json();
Odpověď 200 OK
{
  "format": "fio_api",
  "import_batch": "3a65670cc2e5",
  "statement": {
    "format": "fio_api",
    "variant": "last",
    "account": {
      "number": "2900001227",
      "bank_code": "2010",
      "iban": "CZ3820100000002900001227",
      "currency": "CZK",
      "name": null
    },
    "statement_number": null,
    "from": "2026-10-01",
    "to": "2026-10-05",
    "opening_balance": 132284.87,
    "closing_balance": 128825.52,
    "fio": {
      "id_from": 26544001234,
      "id_to": 26544107777,
      "id_last_download": 26543512307
    }
  },
  "imported": 5,
  "skipped": 0,
  "matched": 0,
  "ruled": 0,
  "rules": [],
  "warnings": [],
  "account": {
    "id": 2,
    "account_code": "221001",
    "archived": false,
    "bank_code": "2010",
    "bic": null,
    "created_at": "2026-09-28T10:00:00.000Z",
    "currency": "CZK",
    "iban": "CZ3820100000002900001227",
    "is_default": true,
    "kind": "bank",
    "name": "Provozní účet",
    "number": "2900001227",
    "opening_balance": 420000.0,
    "opening_date": "2026-01-01",
    "sync_error": null,
    "synced_at": "2026-09-28T10:00:00.000Z",
    "updated_at": "2026-09-28T10:00:00.000Z",
    "display_number": "2900001227/2010",
    "balance": 887525.6,
    "api_connected": true,
    "balance_czk": 887525.6
  }
}

Odpověď externí služby (Fio banka) je v ukázce nahrazená smyšlenými údaji ve formátu, který služba vrací.

GET Seznam bankovních pohybů

/entities/{entity_id}/bank_transactions

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Stačí

Vrátí bankovní pohyby všech účtů firmy od nejnovějšího (datum zaúčtování, pak ID sestupně) po stránkách po 200; filtry se kombinují. q hledá v názvu protistrany a ve zprávě bez ohledu na velikost písmen (neplatí pro písmena s diakritikou – velké „Č“ v datech hledání „č“ nenajde), ve variabilním symbolu a v čísle protiúčtu. Každý řádek obsahuje spárované doklady, přiřazenou částku a u nespárovaného pohybu zbývající nespárovanou částku.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
bank_account_iddotazcelé čísloneJen pohyby tohoto účtu Příklad 31.
statusdotaztextneStav pohybu: unmatched nespárováno, matched spárováno, posted zaúčtováno, ignored ignorováno Hodnoty: unmatched, matched, posted, ignored. Příklad unmatched.
idsdotaztextneČárkami oddělená ID pohybů (bere se nejvýše 200) Příklad 5012,5013.
fromdotazdatumnePohyby zaúčtované tento den a později Příklad 2026-09-01.
todotazdatumnePohyby zaúčtované nejpozději tento den Příklad 2026-09-30.
qdotaztextneHledaný text (protistrana, zpráva, VS, protiúčet) Příklad nordwood.
pagedotazcelé čísloneČíslo stránky Výchozí 1. Rozsah od 1. Příklad 1.

Odpověď

200 application/json Stránka pohybů se součty a počty podle stavů.

PoleVýznam
totalPočet pohybů odpovídajících filtru
pageČíslo stránky
perVelikost stránky (vždy 200)
sumsincoming = součet příchozích a outgoing = součet odchozích (záporné číslo) za celý filtr, ne jen stránku
status_countsPočty pohybů podle stavu za všechny pohyby firmy bez ohledu na filtr
rowsPohyby: id, bank_account_id, booked_on, amount (kladná = příchozí, záporná = odchozí), currency, counterparty_account, counterparty_bank_code, counterparty (číslo/kód), counterparty_name, variable_symbol, constant_symbol, specific_symbol, message, reference, import_batch, status, account_code (účet nebo kategorie přímého zaúčtování), documents (spárované doklady id, number, amount), assigned_amount a open_amount (nespárovaná část, u jiného stavu než unmatched 0); poslední dvě chybí, když pro přepočet měny nejde načíst kurz ČNB

Chování

Co změní
Nic nezapisuje.
Limity
200 pohybů na stránku; filtr ids bere nejvýše 200 ID.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions?status=unmatched"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions?status=unmatched', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "total": 6,
  "page": 1,
  "per": 200,
  "sums": {
    "incoming": 39010.0,
    "outgoing": -7620.0
  },
  "status_counts": {
    "matched": 63,
    "posted": 38,
    "unmatched": 6
  },
  "rows": [
    {
      "id": 64,
      "account_code": null,
      "amount": 18150.0,
      "bank_account_id": 2,
      "booked_on": "2026-09-25",
      "constant_symbol": null,
      "counterparty_account": "2971512207",
      "counterparty_bank_code": "0710",
      "counterparty_name": "Atelier Lumen s.r.o.",
      "created_at": "2026-09-28T10:00:00.000Z",
      "currency": "CZK",
      "import_batch": null,
      "message": "Úhrada – viz smlouva",
      "reference": "demo-noise-3",
      "specific_symbol": null,
      "status": "unmatched",
      "updated_at": "2026-09-28T10:00:00.000Z",
      "variable_symbol": "777",
      "counterparty": "2971512207/0710",
      "documents": [],
      "assigned_amount": 0.0,
      "open_amount": 18150.0
    },
    {
      "id": 63,
      "account_code": null,
      "amount": -4120.0,
      "bank_account_id": 2,
      "booked_on": "2026-09-23",
      "constant_symbol": null,
      "counterparty_account": "1599688387",
      "counterparty_bank_code": "0710",
      "counterparty_name": "Finanční úřad pro hl. m. Prahu",
      "created_at": "2026-09-28T10:00:00.000Z",
      "currency": "CZK",
      "import_batch": null,
      "message": "Platba daně – finanční úřad",
      "reference": "demo-noise-2",
      "specific_symbol": null,
      "status": "unmatched",
      "updated_at": "2026-09-28T10:00:00.000Z",
      "variable_symbol": "0000000001",
      "counterparty": "1599688387/0710",
      "documents": [],
      "assigned_amount": 0.0,
      "open_amount": 4120.0
    }
  ]
}

Dlouhé seznamy jsou v ukázce zkrácené na první položky.

POST Import bankovního výpisu (datový export nebo PDF)

/entities/{entity_id}/bank_transactions/import

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Naimportuje pohyby z výpisu na bankovní účet a uloží originál výpisu (datový soubor a PDF z banky) k období a dávce importu. file je datový export (GPC/ABO, XML camt.053, MT940/STA nebo CSV; kódování UTF-8, UTF-16 nebo Windows-1250), který se čte přesně, nebo PDF výpis banky, jehož čtení je v betaverzi s ověřeným rozvržením pro Air Bank (3030), Českou národní banku (0710), Českou spořitelnu (0800), ČSOB (0300), Equa bank (6100), Fio banku (2010), Komerční banku (0100), MONETA Money Bank (0600), Oberbank (8040), Raiffeisenbank (5500), Sberbank CZ (6800) a UniCredit Bank (2700); PDF jiných bank se čte také a náhled je označí verified: false. PDF se naimportuje, jen když počáteční zůstatek + pohyby = konečný zůstatek a souhlasí případně uvedený počet položek i součty příjmů a výdajů; naskenované PDF bez textu se odmítne. Období se bere z výpisu (uvedené období, jinak rozsah dat pohybů), period_month je povinný jen u výpisu, který neuvádí období ani datované pohyby; výpis musí patřit zvolenému účtu (IBAN, případně číslo účtu a kód banky) a na pokladnu ho importovat nelze. S preview vrátí náhled po všech kontrolách se stavem 200 a nic nezapíše; bez něj uloží nové pohyby (201), se zapnutou automatizací auto_match je spáruje s doklady a se zapnutou bank_rules na zbylé použije pravidla pro banku.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Tělo požadavku

Formát multipart/form-data.

PoleTypPovinnéPopis
bank_account_idcelé čísloanoID bankovního účtu firmy (kind: bank), na který se výpis importuje
filesouboranoDatový export (nejvýše 5 MB) nebo PDF výpis banky (nejvýše 15 MB). CSV se rozpozná podle hlavičky (exporty Fio, Air Bank, KB, ČSOB, Raiffeisenbank, MONETA, České spořitelny i jiné); ZIP se nepřijímá.
statement_pdfsouborneOriginální PDF výpis k datovému exportu, nejvýše 15 MB, musí jít o platné PDF. Když je file sám PDF, jiné PDF se odmítne.
period_monthtextneMěsíc výpisu RRRR-MM (rok 2000–2100); povinný jen u výpisu bez uvedeného období a datovaných pohybů. Když je zadán, použije se místo období z výpisu, všechny pohyby musí do měsíce patřit a období se považuje za potvrzené.
passwordtextneHeslo zaheslovaného PDF; použije se jen pro toto čtení, neukládá se ani nezapisuje do logu
previewano/nenetrue (nebo 1) vrátí náhled importu a nic nezapíše Výchozí false.

Odpověď

201 application/json Výsledek importu a uložený výpis. S preview vrací stav 200 a místo výsledku náhled s poli preview, format, pdf, period, account, statement_number, opening_balance, closing_balance, movements, total, checks, new_count, skipped_count, already_archived, sample, new_movements, pdf_bank a warnings.

PoleVýznam
formatRozpoznaný formát gpc, camt053, mt940, csv nebo pdf
import_batchIdentifikátor dávky (12 šestnáctkových znaků) uložený u nových pohybů
statementCo výpis uvádí o sobě – účet, číslo výpisu, období from–to, počáteční a konečný zůstatek; u PDF i checks
importedPočet nových pohybů
skippedPočet přeskočených pohybů (už uložené, u PDF i z jiného zdroje, nulové nebo bez data)
matchedPočet nových pohybů spárovaných s doklady
ruledPočet nových pohybů vyřízených pravidly; rules popisuje, co pravidla udělala
warningsUpozornění ke čtení výpisu (např. strany PDF bez přečtených pohybů)
archiveUložený výpis – id, bank_account_id, period_key (RRRR-MM nebo RRRR-MM-DD..RRRR-MM-DD), period_from, period_to, period_confirmed, format, data_filename, pdf_filename, import_batch, imported_count, skipped_count, created_at; u opakovaného importu stejného souboru dosavadní výpis
periodJen náhled: období key, from, to a confirmed (potvrzené měsícem, PDF nebo obdobím uvedeným v PDF)
new_countJen náhled – kolik pohybů by bylo nových; skipped_count kolik by se přeskočilo
already_archivedJen náhled – stejný datový soubor za stejné období už je uložený
checksJen náhled PDF – výsledky kontrol (zůstatky, počet položek, součty, průběžné zůstatky, počet výpisů v PDF)
sampleJen náhled – prvních 5 nových pohybů
new_movementsJen náhled PDF – nové pohyby ke kontrole (nejvýše 5 000); u datového exportu null
pdf_bankJen náhled PDF – banka výpisu code, name a verified (rozvržení ověřené na skutečných výpisech)

Chyby této operace

StavKódKdy
413–Soubor nebo PDF je větší než 15 MB: „Výpis je příliš velký (PDF nejvýše 15 MB, datový soubor 5 MB)“
422–Účet je pokladna: „Výpis lze importovat jen na bankovní účet“
422–Datový export je větší než 5 MB: „Datový výpis přesahuje limit 5 MB“
422–file nebo statement_pdf není nahraný soubor nebo je prázdný: „Výpis chybí“, „Výpis je prázdný“, „PDF výpis chybí“, „PDF výpis je prázdný“
422–PDF není platné: „Příloha bankovního výpisu musí být platný soubor PDF“
422PDF_PASSWORD_REQUIREDPDF je zaheslované a heslo chybí nebo nesouhlasí: „…: PDF výpis je chráněný heslem – zadejte ho“ nebo „…: Heslo k PDF výpisu nesouhlasí“
422–Výpis nejde přečíst – text první chyby čtení, např. nerozpoznaný formát, ZIP, PDF bez textu, PDF nad 400 stran, čtení PDF přes 30 s, pohyby z PDF nesouhlasí se zůstatky, počtem položek nebo součty („… nic se neimportovalo – nahrajte datový export výpisu“), výpisy v jednom PDF na sebe nenavazují nebo patří různým účtům
422–file je PDF a statement_pdf jiné PDF: „Výpis v PDF je zároveň originál od banky – druhé PDF nepřikládejte“
422–Chybné období: „Měsíc výpisu musí být ve tvaru RRRR-MM“, „Rok výpisu je mimo podporovaný rozsah“, „Datový soubor obsahuje pohyby mimo vybraný měsíc“, „Datový soubor uvádí období mimo vybraný měsíc“, „Výpis neuvádí období ani datované pohyby – vyberte měsíc výpisu“
422–Výpis patří jinému účtu: „Datový výpis patří jinému bankovnímu účtu, než je zvolený účet v Saldu“
422–Konflikt s uloženým originálem: „K tomuto datovému výpisu je uložené jiné PDF; existující originál nelze tiše nahradit“, „K tomuto datovému výpisu je PDF už zaevidované pro jiné období“, „Ke stejnému datovému souboru existuje více nepotvrzených období; PDF je nutné přiřadit ručně“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Bez preview v jedné transakci vytvoří nové bankovní pohyby (stav unmatched) a archiv výpisu s datovým souborem a PDF, nebo doplní PDF k dříve uloženému výpisu stejného souboru a potvrdí jeho období; při jakékoli chybě se neuloží nic. Podle automatizací nové pohyby spáruje (úhrady dokladů s účetními zápisy) a vyřídí pravidly (zaúčtování, párování, ignorování). Zapíše auditní události bank.imported, bank.statement_archived nebo bank.statement_pdf_attached, případně payment.recorded a bank.rule_applied. S preview nic nezapisuje.
Limity
Soubor nad 15 MB odmítne stavem 413; datový export nejvýše 5 MB, PDF nejvýše 15 MB a 400 stran, každý krok čtení PDF nejvýše 30 s. Náhled vrací nejvýše 5 000 nových pohybů PDF a 5 ukázkových pohybů.
Opakování
Pohyby, jejichž reference (ID pohybu z banky, jinak otisk údajů pohybu) už účet má, se přeskočí; u PDF se navíc přeskočí pohyby, které účet má z jiného zdroje (stejná částka, nejdřív stejný den, pak ±3 dny, každý uložený pohyb nejvýš jednou). Stejný datový soubor (SHA-256) za stejné období nevytvoří druhý archiv, jen může doplnit chybějící PDF; jiné PDF k výpisu, který už PDF má, se odmítne. Auditní událost bank.imported se zapíše při každém volání bez preview.

Příklad

Datový výpis camt.053 k tomuto bankovnímu účtu; období a zůstatky se čtou ze souboru. Ukázková firma má tento soubor už naimportovaný, takže záznam ukazuje opakovaný import: oba pohyby se přeskočily (imported: 0, skipped: 2) a archive je dosavadní uložený výpis s původní dávkou.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -F "bank_account_id=2" \
  -F "file=@vypis-2026-08.xml" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/import

JavaScript

const form = new FormData();
form.append('file', fileInput.files[0], 'vypis-2026-08.xml');
form.append('bank_account_id', '2');
const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/import', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'POST',
  body: form
});
const data = await response.json();
Odpověď 201 Created
{
  "format": "camt053",
  "import_batch": "9f423b52d8a6",
  "statement": {
    "format": "camt053",
    "variant": "camt.053.001.02",
    "account": {
      "number": "2900001227",
      "bank_code": "2010",
      "iban": "CZ3820100000002900001227",
      "currency": "CZK",
      "name": null
    },
    "statement_number": "2026-08",
    "from": "2026-08-01",
    "to": "2026-08-31",
    "opening_balance": 100000.0,
    "closing_balance": 108600.0
  },
  "imported": 0,
  "skipped": 2,
  "matched": 0,
  "ruled": 0,
  "rules": [],
  "warnings": [],
  "archive": {
    "id": 1,
    "bank_account_id": 2,
    "period_key": "2026-08",
    "period_from": "2026-08-01",
    "period_to": "2026-08-31",
    "period_confirmed": false,
    "format": "camt053",
    "data_filename": "vypis-2026-08.xml",
    "pdf_filename": null,
    "import_batch": "0d43e5520745",
    "imported_count": 2,
    "skipped_count": 0,
    "created_at": "2026-09-28T10:00:00.000Z"
  }
}

POST Automatické párování pohybů s doklady

/entities/{entity_id}/bank_transactions/auto_match

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Spáruje nespárované pohyby s vystavenými doklady, u kterých je shoda jistá, a zaznamená jejich úhradu. Skóre sčítá shodu variabilního symbolu (60), částky (35), čísla účtu kontaktu (15) a názvu protistrany (10); jistá shoda má skóre aspoň 90 a vyšší než druhý nejlepší doklad, takže automaticky se páruje jen při shodě VS i částky. Automaticky se nikdy nepárují pohyby v uzamčeném období, přijaté faktury placené kartou a odchozí platby v CZK, ke kterým může patřit neuhrazený přijatý doklad se stejnou částkou, datem vystavení ±3 dny a odpovídajícím obchodníkem (u platby kartou vystavený, s přiloženým originálem nebo placený kartou, u jiné platby jen placený kartou) – takové pohyby se nabídnou jen v návrzích k ručnímu spárování. Přepínač automatizace auto_match toto ruční spuštění neomezuje.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
transaction_idspole (celé číslo)neJen tyto pohyby (pole ID, bere se nejvýše 1 000; text s ID oddělenými čárkami se nerozdělí). Bez pole se zpracují všechny nespárované pohyby firmy; prázdné pole nespáruje nic.

Odpověď

200 application/json Počet spárovaných pohybů a jejich páry.

PoleVýznam
matchedPočet spárovaných pohybů
detailsPáry transaction_id, document_id, score

Chování

Co změní
Pro každou jistou shodu vytvoří úhradu dokladu (datum pohybu, způsob bank, vazba na pohyb) ve výši menší z nespárované části pohybu a zbývající úhrady dokladu; v podvojném účetnictví ji zaúčtuje (např. MD 221xxx / D 311, případně kurzový rozdíl 563/663), přepočte uhrazenou částku dokladu a plně přiřazený pohyb označí matched. Zapíše auditní událost payment.recorded u každé úhrady. Pohyb, u kterého párování selže, přeskočí.
Limity
Nejvýše 1 000 ID v transaction_ids.
Opakování
Zpracuje jen pohyby ve stavu unmatched; už spárované se znovu nepárují, takže opakované volání spáruje jen to, co mezitím přibylo.

Příklad

Pohyb v ukázce nemá jistou shodu s žádným dokladem, proto se nic nespárovalo (matched: 0).

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"transaction_ids":[64]}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/auto_match

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/auto_match', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "transaction_ids": [
      64
    ]
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "matched": 0,
  "details": []
}

GET Uložené výpisy s kontrolou zůstatků

/entities/{entity_id}/bank_transactions/statements

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Stačí

Vrátí nejvýše 120 naposledy uložených výpisů (od nejnovějšího), volitelně jen jednoho účtu, a u každého výsledek kontroly reconciliation. Kontrola ověřuje, že počáteční zůstatek + pohyby = konečný zůstatek výpisu, návaznost na předchozí výpis účtu, chybějící výpis mezi nimi, jiný výpis za překrývající se období, že pohyby v Saldu za období odpovídají výpisu a že konečný zůstatek souhlasí s účetnictvím ke konci období (v podvojném účetnictví analytický účet 221xxx, u cizoměnového účtu spárované a zaúčtované pohyby v měně účtu, v daňové evidenci počáteční stav + pohyby + ruční úhrady; vždy od data počátečního stavu účtu). Kontrolované období je období uvedené v souboru, jinak rozsah dat jeho pohybů; zvolený měsíc (period_from–period_to) se použije, jen když soubor neuvádí ani jedno. U souboru bez uvedeného období se tak kontroluje jen úsek od prvního do posledního pohybu, i když byl importován s period_month, a zbytek měsíce se může hlásit jako chybějící výpis. Kontrola nikdy nic neúčtuje. status je matched (vše sedí), mismatch (jiná měna než účet, počáteční zůstatek + pohyby ≠ konečný, nenavazuje na předchozí výpis, pohyby v Saldu se liší od výpisu nebo konečný zůstatek nesouhlasí s účetnictvím), gap (chybí výpis – jen když zůstatky nenavazují, Saldo má v mezeře pohyby nebo mezera obsahuje celý měsíc), needs_manual (výpis nemá období, soubor nejde přečíst nebo neuvádí zůstatky), before_opening (výpis končí před počátečním stavem účtu, jen informativně) nebo reviewed (problém označený jako ručně zkontrolovaný, dokud se výsledek kontroly nezmění).

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
bank_account_iddotazcelé čísloneJen výpisy tohoto účtu (účet musí patřit firmě, jinak 404) Příklad 31.

Odpověď

200 application/json Pole uložených výpisů, každý s objektem reconciliation.

PoleVýznam
idID uloženého výpisu (archive_id); bank_account_id jeho účet, created_at čas uložení
period_keyRRRR-MM, nebo RRRR-MM-DD..RRRR-MM-DD pro jiné období; period_from, period_to a period_confirmed k tomu
formatFormát zdroje (gpc, camt053, mt940, csv, pdf)
data_filenameNázev uloženého datového souboru; pdf_filename název PDF (null bez PDF)
import_batchDávka importu; imported_count a skipped_count z prvního importu souboru
reconciliation.statusVýsledek kontroly (viz popis)
reconciliation.issuesPopisy problémů česky, nejdůležitější první; překryv s jiným výpisem je jen upozornění a stav nemění
reconciliation.periodKontrolované období from–to (viz popis); currency je měna výpisu, jinak měna účtu
reconciliation.opening_balancePlatný počáteční zůstatek (ze souboru nebo ručně zadaný), closing_balance konečný; file_opening_balance a file_closing_balance jsou hodnoty ze souboru, source je file, manual nebo null
reconciliation.movements_totalSoučet pohybů ve výpisu, movements_count jejich počet, movements_difference rozdíl proti zůstatkům
reconciliation.previousPředchozí výpis účtu (id, period_key, from, to, closing_balance); continuity_difference rozdíl návaznosti
reconciliation.gapChybějící období from–to, jinak null; overlaps ID výpisů za překrývající se období
reconciliation.importedPohyby v Saldu za období proti souboru – total, difference, ok
reconciliation.booksÚčetnictví na začátku a konci období – label, account_code, ledger, currency, opening, closing, opening_difference, closing_difference; při rozdílu v podvojném účetnictví pending (count, total) s nezaúčtovanými nebo ignorovanými pohyby do konce období
reconciliation.manualKdo a kdy zadal zůstatky ručně a poznámka (by, at, note)
reconciliation.reviewRuční kontrola (by, at, note, current); current je false, když se výsledek kontroly od označení změnil

Chování

Co změní
Nic nezapisuje s jednou výjimkou: u výpisů uložených dřív, než Saldo začalo evidovat údaje ze souboru (zůstatky, období a součet pohybů), je jednou načte z uloženého souboru a uloží k výpisu bez auditní události.
Limity
Nejvýše 120 nejnověji uložených výpisů.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/statements?bank_account_id=2"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/statements?bank_account_id=2', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
[
  {
    "id": 2,
    "bank_account_id": 2,
    "period_key": "2026-07",
    "period_from": "2026-07-01",
    "period_to": "2026-07-31",
    "period_confirmed": true,
    "format": "csv",
    "data_filename": "vypis-2026-07.csv",
    "pdf_filename": null,
    "import_batch": "abee45dce775",
    "imported_count": 1,
    "skipped_count": 0,
    "created_at": "2026-09-28T10:00:00.000Z",
    "reconciliation": {
      "status": "needs_manual",
      "source": null,
      "currency": "CZK",
      "period": {
        "from": "2026-07-15",
        "to": "2026-07-15"
      },
      "opening_balance": null,
      "closing_balance": null,
      "file_opening_balance": null,
      "file_closing_balance": null,
      "movements_total": 1500.0,
      "movements_count": 1,
      "movements_difference": null,
      "previous": null,
      "continuity_difference": null,
      "gap": null,
      "overlaps": [],
      "imported": {
        "total": 1500.0,
        "difference": 0.0,
        "ok": true
      },
      "books": {
        "label": "účet 221001",
        "account_code": "221001",
        "ledger": true,
        "currency": "CZK",
        "opening": 365231.1,
        "closing": 365231.1,
        "opening_difference": null,
        "closing_difference": null
      },
      "issues": [
        "Datový výpis neuvádí počáteční a konečný zůstatek – opište je z PDF výpisu banky"
      ],
      "manual": null,
      "review": null
    }
  },
  {
    "id": 1,
    "bank_account_id": 2,
    "period_key": "2026-08",
    "period_from": "2026-08-01",
    "period_to": "2026-08-31",
    "period_confirmed": false,
    "format": "camt053",
    "data_filename": "vypis-2026-08.xml",
    "pdf_filename": null,
    "import_batch": "0d43e5520745",
    "imported_count": 2,
    "skipped_count": 0,
    "created_at": "2026-09-28T10:00:00.000Z",
    "reconciliation": {
      "status": "mismatch",
      "source": "file",
      "currency": "CZK",
      "period": {
        "from": "2026-08-01",
        "to": "2026-08-31"
      },
      "opening_balance": 100000.0,
      "closing_balance": 108600.0,
      "file_opening_balance": 100000.0,
      "file_closing_balance": 108600.0,
      "movements_total": 8600.0,
      "movements_count": 2,
      "movements_difference": 0.0,
      "previous": {
        "id": 2,
        "period_key": "2026-07",
        "from": "2026-07-15",
        "to": "2026-07-15",
        "closing_balance": null
      },
      "continuity_difference": null,
      "gap": {
        "from": "2026-07-16",
        "to": "2026-07-31"
      },
      "overlaps": [],
      "imported": {
        "total": 215716.5,
        "difference": 207116.5,
        "ok": false
      },
      "books": {
        "label": "účet 221001",
        "account_code": "221001",
        "ledger": true,
        "currency": "CZK",
        "opening": 556774.6,
        "closing": 763891.1,
        "opening_difference": -456774.6,
        "closing_difference": -655291.1,
        "pending": {
          "count": 3,
          "total": 10100.0
        }
      },
      "issues": [
        "Konečný zůstatek 108 600,00 Kč nesouhlasí se zůstatkem – účet 221001 k 31. 8. 2026 je 763 891,10 Kč (rozdíl -655 291,10 Kč)",
        "V účtu 221001 zatím nejsou 3 nezaúčtované nebo ignorované pohyby za 10 100,00 Kč"
      ],
      "manual": null,
      "review": null
    }
  }
]

Dlouhé seznamy jsou v ukázce zkrácené na první položky.

GET Stažení originálu uloženého výpisu

/entities/{entity_id}/bank_transactions/statements/{archive_id}/{kind}

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Stačí

Stáhne uložený originál výpisu: data je importovaný soubor, pdf PDF výpis banky. U výpisu importovaného z PDF je týž soubor uložen jako oba druhy. Odpověď je příloha s původním názvem souboru a hlavičkami Cache-Control: private, no-store a X-Content-Type-Options: nosniff.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
archive_idcestacelé čísloanoID uloženého výpisu Příklad 7.
kindcestatextanodata = importovaný soubor, pdf = originální PDF výpis Hodnoty: data, pdf. Příklad data.

Odpověď

200 application/octet-stream Obsah souboru; pro pdf s typem application/pdf, pro data s typem application/octet-stream.

Chyby této operace

StavKódKdy
404–Výpis nemá uložený soubor tohoto druhu (např. datový export bez PDF) nebo kind není data ani pdf

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Nic nezapisuje.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/statements/1/data

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/statements/1/data', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
application/octet-stream, 1535 bajtů (soubor vypis-2026-08.xml)

PATCH Zadání zůstatků výpisu opsaných z PDF

/entities/{entity_id}/bank_transactions/statements/{archive_id}/balances

Oprávnění
Vlastník nebo účetní
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Uloží počáteční a konečný zůstatek opsaný z PDF výpisu banky pro strany, které datový soubor neuvádí; stranu uvedenou v souboru změnit nelze (zadaná hodnota musí souhlasit, prázdná ji ponechá). Částka se čte jako v aplikaci: mezery a apostrofy se vynechají, poslední tečka nebo čárka je desetinná a smí mít nejvýše dvě desetinná místa (např. 12 500,40). Výpis, jehož období končí v uzamčeném období, měnit nelze. Nic se neúčtuje; změní se jen podklad kontroly, jejíž nový výsledek odpověď vrací.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
archive_idcestacelé čísloanoID uloženého výpisu Příklad 8.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
opening_balancetextnePočáteční zůstatek z PDF (text nebo číslo); povinný, když ho soubor neuvádí
closing_balancetextneKonečný zůstatek z PDF (text nebo číslo); povinný, když ho soubor neuvádí
notetextnePoznámka, nejvýše 250 znaků Nejvýše 250 znaků.

Odpověď

200 application/json Výpis ve stejném tvaru jako v seznamu výpisů, s novým výsledkem kontroly reconciliation (source = manual).

Chyby této operace

StavKódKdy
422–Soubor uvádí oba zůstatky: „Zůstatky z datového výpisu nelze přepsat ručně“
422–Výpis patří do uzamčeného období: „Období do … je uzamčeno – zůstatky tohoto výpisu už nelze měnit“
422–Chybí zůstatek, který soubor neuvádí: „Zadejte počáteční i konečný zůstatek z PDF výpisu“, „Zadejte počáteční zůstatek z PDF výpisu“, „Zadejte konečný zůstatek z PDF výpisu“
422–Zadaná hodnota se liší od zůstatku ze souboru: „Počáteční (Konečný) zůstatek uvádí datový výpis (…) – nelze ho přepsat ručně“
422–Hodnota není číslo: „Počáteční (Konečný) zůstatek zadejte jako číslo s nejvýše dvěma desetinnými místy, např. 12 500,40“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Uloží zůstatky k výpisu se zdrojem manual, kdo a kdy je zadal a poznámku. Zapíše auditní událost bank.statement_balances_entered s původními i novými hodnotami. Neúčtuje.
Opakování
Každé volání hodnoty přepíše a zapíše další auditní událost.

Příklad

Výpis z datového souboru, který zůstatky neuvádí.

cURL

curl \
  -X PATCH \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"opening_balance":"412 380,00","closing_balance":"431 250,50","note":"Opsáno z PDF výpisu č. 9"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/statements/2/balances

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/statements/2/balances', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'PATCH',
  body: JSON.stringify({
    "opening_balance": "412 380,00",
    "closing_balance": "431 250,50",
    "note": "Opsáno z PDF výpisu č. 9"
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 2,
  "bank_account_id": 2,
  "period_key": "2026-07",
  "period_from": "2026-07-01",
  "period_to": "2026-07-31",
  "period_confirmed": true,
  "format": "csv",
  "data_filename": "vypis-2026-07.csv",
  "pdf_filename": null,
  "import_batch": "abee45dce775",
  "imported_count": 1,
  "skipped_count": 0,
  "created_at": "2026-09-28T10:00:00.000Z",
  "reconciliation": {
    "status": "mismatch",
    "source": "manual",
    "currency": "CZK",
    "period": {
      "from": "2026-07-15",
      "to": "2026-07-15"
    },
    "opening_balance": 412380.0,
    "closing_balance": 431250.5,
    "file_opening_balance": null,
    "file_closing_balance": null,
    "movements_total": 1500.0,
    "movements_count": 1,
    "movements_difference": 17370.5,
    "previous": null,
    "continuity_difference": null,
    "gap": null,
    "overlaps": [],
    "imported": {
      "total": 1500.0,
      "difference": 0.0,
      "ok": true
    },
    "books": {
      "label": "účet 221001",
      "account_code": "221001",
      "ledger": true,
      "currency": "CZK",
      "opening": 365231.1,
      "closing": 365231.1,
      "opening_difference": 47148.9,
      "closing_difference": 66019.4,
      "pending": {
        "count": 1,
        "total": 1500.0
      }
    },
    "issues": [
      "Konečný zůstatek 431 250,50 Kč nesouhlasí se zůstatkem – účet 221001 k 15. 7. 2026 je 365 231,10 Kč (rozdíl 66 019,40 Kč)",
      "V účtu 221001 zatím není 1 nezaúčtovaný nebo ignorovaný pohyb za 1 500,00 Kč"
    ],
    "manual": {
      "by": "ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "note": "Opsáno z PDF výpisu č. 9"
    },
    "review": null
  }
}

Dlouhé seznamy jsou v ukázce zkrácené na první položky.

POST Označení problémového výpisu jako ručně zkontrolovaného

/entities/{entity_id}/bank_transactions/statements/{archive_id}/review

Oprávnění
Vlastník nebo účetní
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Označí výpis, u kterého kontrola našla problém (mismatch, gap nebo needs_manual), jako ručně zkontrolovaný s poznámkou, co bylo ověřeno. Saldo si uloží otisk (SHA-256) výsledku kontroly; stav reviewed platí, jen dokud se výsledek kontroly nezmění – pak se vrátí původní problém a review.current je false. Výpis bez problému ani výpis, jehož období končí v uzamčeném období, označit nelze.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
archive_idcestacelé čísloanoID uloženého výpisu Příklad 7.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
notetextanoCo bylo u výpisu ověřeno; po oříznutí mezer 1–250 znaků Nejvýše 250 znaků.

Odpověď

200 application/json Výpis ve stejném tvaru jako v seznamu výpisů, s výsledkem kontroly reconciliation (stav reviewed).

Chyby této operace

StavKódKdy
422–Poznámka chybí: „Napište, co jste u výpisu ověřili“
422–Poznámka je delší než 250 znaků: „Poznámka může mít nejvýše 250 znaků“
422–Kontrola nenašla problém: „Ručně lze označit jen výpis, u kterého kontrola našla problém“
422–Výpis patří do uzamčeného období: „Období do … je uzamčeno – ruční kontrolu tohoto výpisu už nelze měnit“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Uloží k výpisu, kdo a kdy ho zkontroloval, poznámku a otisk výsledku kontroly. Zapíše auditní událost bank.statement_reviewed se stavem a problémy. Neúčtuje.
Opakování
Nové označení přepíše předchozí (poznámku, čas i otisk) a zapíše další auditní událost.

Příklad

Předpokládá, že kontrola výpisu našla problém (např. rozdíl proti účtu 221).

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"note":"Rozdíl tvoří platba zaúčtovaná až v dalším měsíci, ověřeno v internetovém bankovnictví"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/statements/1/review

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/statements/1/review', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "note": "Rozdíl tvoří platba zaúčtovaná až v dalším měsíci, ověřeno v internetovém bankovnictví"
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "bank_account_id": 2,
  "period_key": "2026-08",
  "period_from": "2026-08-01",
  "period_to": "2026-08-31",
  "period_confirmed": false,
  "format": "camt053",
  "data_filename": "vypis-2026-08.xml",
  "pdf_filename": null,
  "import_batch": "0d43e5520745",
  "imported_count": 2,
  "skipped_count": 0,
  "created_at": "2026-09-28T10:00:00.000Z",
  "reconciliation": {
    "status": "reviewed",
    "source": "file",
    "currency": "CZK",
    "period": {
      "from": "2026-08-01",
      "to": "2026-08-31"
    },
    "opening_balance": 100000.0,
    "closing_balance": 108600.0,
    "file_opening_balance": 100000.0,
    "file_closing_balance": 108600.0,
    "movements_total": 8600.0,
    "movements_count": 2,
    "movements_difference": 0.0,
    "previous": {
      "id": 2,
      "period_key": "2026-07",
      "from": "2026-07-15",
      "to": "2026-07-15",
      "closing_balance": null
    },
    "continuity_difference": null,
    "gap": {
      "from": "2026-07-16",
      "to": "2026-07-31"
    },
    "overlaps": [],
    "imported": {
      "total": 215716.5,
      "difference": 207116.5,
      "ok": false
    },
    "books": {
      "label": "účet 221001",
      "account_code": "221001",
      "ledger": true,
      "currency": "CZK",
      "opening": 556774.6,
      "closing": 763891.1,
      "opening_difference": -456774.6,
      "closing_difference": -655291.1,
      "pending": {
        "count": 3,
        "total": 10100.0
      }
    },
    "issues": [
      "Konečný zůstatek 108 600,00 Kč nesouhlasí se zůstatkem – účet 221001 k 31. 8. 2026 je 763 891,10 Kč (rozdíl -655 291,10 Kč)",
      "V účtu 221001 zatím nejsou 3 nezaúčtované nebo ignorované pohyby za 10 100,00 Kč"
    ],
    "manual": null,
    "review": {
      "by": "ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "note": "Rozdíl tvoří platba zaúčtovaná až v dalším měsíci, ověřeno v internetovém bankovnictví",
      "current": true
    }
  }
}

Dlouhé seznamy jsou v ukázce zkrácené na první položky.

DELETE Zrušení ruční kontroly výpisu

/entities/{entity_id}/bank_transactions/statements/{archive_id}/review

Oprávnění
Vlastník nebo účetní
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Zruší ruční kontrolu výpisu, takže se jeho problém znovu počítá. Výpis, jehož období končí v uzamčeném období, změnit nelze.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
archive_idcestacelé čísloanoID uloženého výpisu Příklad 7.

Odpověď

200 application/json Výpis ve stejném tvaru jako v seznamu výpisů, s výsledkem kontroly bez ruční kontroly (review je null).

Chyby této operace

StavKódKdy
422–Výpis není označený: „Výpis není označený jako zkontrolovaný ručně“
422–Výpis patří do uzamčeného období: „Období do … je uzamčeno – ruční kontrolu tohoto výpisu už nelze měnit“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Smaže u výpisu údaje o ruční kontrole. Zapíše auditní událost bank.statement_review_withdrawn s původní kontrolou.
Opakování
Druhé volání skončí chybou 422, protože výpis už označený není.

Příklad

Navazuje na označení výpisu jako ručně zkontrolovaného.

cURL

curl \
  -X DELETE \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/statements/1/review

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/statements/1/review', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'DELETE'
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "bank_account_id": 2,
  "period_key": "2026-08",
  "period_from": "2026-08-01",
  "period_to": "2026-08-31",
  "period_confirmed": false,
  "format": "camt053",
  "data_filename": "vypis-2026-08.xml",
  "pdf_filename": null,
  "import_batch": "0d43e5520745",
  "imported_count": 2,
  "skipped_count": 0,
  "created_at": "2026-09-28T10:00:00.000Z",
  "reconciliation": {
    "status": "mismatch",
    "source": "file",
    "currency": "CZK",
    "period": {
      "from": "2026-08-01",
      "to": "2026-08-31"
    },
    "opening_balance": 100000.0,
    "closing_balance": 108600.0,
    "file_opening_balance": 100000.0,
    "file_closing_balance": 108600.0,
    "movements_total": 8600.0,
    "movements_count": 2,
    "movements_difference": 0.0,
    "previous": {
      "id": 2,
      "period_key": "2026-07",
      "from": "2026-07-15",
      "to": "2026-07-15",
      "closing_balance": null
    },
    "continuity_difference": null,
    "gap": {
      "from": "2026-07-16",
      "to": "2026-07-31"
    },
    "overlaps": [],
    "imported": {
      "total": 215716.5,
      "difference": 207116.5,
      "ok": false
    },
    "books": {
      "label": "účet 221001",
      "account_code": "221001",
      "ledger": true,
      "currency": "CZK",
      "opening": 556774.6,
      "closing": 763891.1,
      "opening_difference": -456774.6,
      "closing_difference": -655291.1,
      "pending": {
        "count": 3,
        "total": 10100.0
      }
    },
    "issues": [
      "Konečný zůstatek 108 600,00 Kč nesouhlasí se zůstatkem – účet 221001 k 31. 8. 2026 je 763 891,10 Kč (rozdíl -655 291,10 Kč)",
      "V účtu 221001 zatím nejsou 3 nezaúčtované nebo ignorované pohyby za 10 100,00 Kč"
    ],
    "manual": null,
    "review": null
  }
}

Dlouhé seznamy jsou v ukázce zkrácené na první položky.

GET Návrhy dokladů ke spárování s pohybem

/entities/{entity_id}/bank_transactions/{id}/suggestions

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Stačí

Vrátí nejvýše 8 dokladů, se kterými lze nespárovaný pohyb spárovat, seřazených podle skóre. Kandidáti jsou otevřené vystavené doklady správného směru (k příchozí platbě vydané faktury, zálohové faktury a přijaté dobropisy, k odchozí přijaté faktury, zálohy a vydané dobropisy; nejvýše 400 nejnovějších); skóre sčítá shodu VS (60), částky (35), účtu kontaktu (15) a názvu protistrany (10) a vrací se jen návrhy se skóre aspoň 10. U odchozí karetní platby v CZK se na začátek zařadí vystavené přijaté faktury s přiloženým originálem, stejnou částkou, datem vystavení ±3 dny a odpovídajícím obchodníkem (source: card_receipt, requires_confirmation: true, skóre nejvýš 89) – takový doklad se nikdy nespáruje automaticky. Pohyb, který není ve stavu unmatched nebo nemá nespárovanou část, dostane prázdné pole.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID bankovního pohybu Příklad 5012.

Odpověď

200 application/json Pole návrhů.

PoleVýznam
document_idID dokladu; number jeho číslo, partner název kontaktu
remainingZbývající úhrada dokladu v jeho měně (currency); due_date splatnost
scoreSkóre shody 10–100
reasonsDůvody česky (variabilní symbol, částka, číslo účtu, název protistrany, originál dokladu, datum karetní platby)
sourcecard_receipt u dokladu k karetní platbě, jinak chybí
requires_confirmationtrue u dokladu, který je nutné spárovat ručně

Chování

Co změní
Nic nezapisuje.
Limity
Nejvýše 8 návrhů z nejvýše 400 nejnovějších kandidátů.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/64/suggestions

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/64/suggestions', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
[
  {
    "document_id": 27,
    "number": "FV20260024",
    "partner": "Atelier Lumen s.r.o.",
    "remaining": 72600.0,
    "currency": "CZK",
    "due_date": "2026-09-27",
    "score": 10,
    "reasons": [
      "název protistrany"
    ]
  }
]

POST Spárování pohybu s dokladem

/entities/{entity_id}/bank_transactions/{id}/match

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Spáruje pohyb s vystaveným dokladem správného směru a zaznamená jeho úhradu s datem pohybu. Bez amount přiřadí menší z nespárované části pohybu a zbývající úhrady dokladu; u dokladu v jiné měně přepočítá kurzem ČNB ke dni pohybu (když kurz ČNB chybí, kurzem dokladu) a když se nespárovaná část od zbytku dokladu liší nejvýš o 3 %, uhradí celý zbytek dokladu. V podvojném účetnictví se úhrada zaúčtuje (vydaná faktura MD 221xxx / D 311, přijatá MD 321 / D 221xxx, zálohy přes 324/314, případně kurzový rozdíl 563/663). Pohyb přejde do stavu matched, až je přiřazený celý; jinak zůstane unmatched a zbytek lze spárovat s dalším dokladem nebo zaúčtovat. Karetní platba spárovaná s přijatou fakturou placenou kartou se zaznamená jako úhrada kartou.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID bankovního pohybu Příklad 5012.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
document_idcelé čísloanoID vystaveného dokladu firmy
amountčísloneČástka úhrady v měně dokladu (znaménko se ignoruje); nesmí převýšit zbývající úhradu dokladu ani nespárovanou část pohybu

Odpověď

200 application/json Pohyb ve stejném tvaru jako řádek seznamu pohybů (se status, documents a open_amount).

Chyby této operace

StavKódKdy
422–Pohyb je v uzamčeném období: „Období do … je uzamčeno – pohyb nelze změnit“
422–Pohyb je vyřízený: „Pohyb už je zaúčtovaný“, „Pohyb je ignorovaný – nejdřív ho vraťte mezi nespárované“, „Pohyb už je spárovaný“
422–Doklad nejde uhradit: „Doklad není vystavený“, „Doklad je už uhrazený“
422–Doklad je opačného směru: „Příchozí platbu lze spárovat jen s vydanou fakturou, zálohou nebo přijatým dobropisem“ nebo „Odchozí platbu lze spárovat jen s přijatou fakturou, zálohou nebo vydaným dobropisem“
422–Chybná částka: „Částka převyšuje zbývající úhradu dokladu“, „Částka převyšuje nespárovanou část pohybu“, „Částka úhrady nesmí být nulová“
422–Pohyb je v cizí měně jiné než doklad a kurz ČNB k datu pohybu není k dispozici: „Kurz ČNB pro … ke dni … se nepodařilo načíst – zkuste to prosím později“ (v měně dokladu se místo chybějícího kurzu ČNB použije kurz dokladu)

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Vytvoří úhradu dokladu navázanou na pohyb a jeho účet, v podvojném účetnictví účetní zápisy úhrady (zdroj payment), přepočte uhrazenou částku dokladu a stav pohybu. Zapíše auditní událost payment.recorded.
Opakování
Každé úspěšné volání vytvoří novou úhradu. Opakování bez amount se odmítne, jakmile je pohyb celý přiřazen („Pohyb už je spárovaný“) nebo doklad uhrazen („Doklad je už uhrazený“); s menší amount vznikají další dílčí úhrady.

Příklad

Příchozí platba spárovaná s vydanou fakturou.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"document_id":143}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/64/match

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/64/match', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "document_id": 143
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 64,
  "account_code": null,
  "amount": 18150.0,
  "bank_account_id": 2,
  "booked_on": "2026-09-25",
  "constant_symbol": null,
  "counterparty_account": "2971512207",
  "counterparty_bank_code": "0710",
  "counterparty_name": "Atelier Lumen s.r.o.",
  "created_at": "2026-09-28T10:00:00.000Z",
  "currency": "CZK",
  "import_batch": null,
  "message": "Úhrada – viz smlouva",
  "reference": "demo-noise-3",
  "specific_symbol": null,
  "status": "matched",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "variable_symbol": "777",
  "counterparty": "2971512207/0710",
  "documents": [
    {
      "id": 143,
      "number": "FV20260025",
      "amount": 18150.0
    }
  ],
  "assigned_amount": 18150.0,
  "open_amount": 0
}

POST Přímé zaúčtování pohybu bez dokladu

/entities/{entity_id}/bank_transactions/{id}/book

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Zaúčtuje pohyb bez dokladu (poplatek, úrok, daň, převod) přímo na zvolený účet nebo kategorii a označí ho posted. V podvojném účetnictví vytvoří jeden zápis ke dni pohybu: u příchozí platby MD analytický účet banky / D account_code, u odchozí MD account_code / D účet banky, na nespárovanou část pohybu v CZK (u cizí měny kurzem ČNB ke dni pohybu, s částkou v měně), takže u částečně spárovaného pohybu jen zbytek. V daňové evidenci se zápis nevytváří a account_code je kategorie příjmu nebo výdaje (např. V15). Saldo kontroluje jen tvar kódu, ne to, zda účet v účtovém rozvrhu existuje.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID bankovního pohybu Příklad 5012.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
account_codetextanoÚčet nebo kategorie; převede se na velká písmena, smí obsahovat číslice, písmena, tečku a pomlčku (nejvýše 12 znaků) a v podvojném účetnictví nesmí být shodný s analytickým účtem banky
texttextneText účetního zápisu, použije se jen v podvojném účetnictví (delší se zkrátí na 250 znaků); výchozí je zpráva pohybu, název protistrany nebo „Bankovní pohyb“

Odpověď

200 application/json Pohyb ve stejném tvaru jako řádek seznamu pohybů (status = posted, account_code).

Chyby této operace

StavKódKdy
422–Pohyb je v uzamčeném období: „Období do … je uzamčeno – pohyb nelze změnit“
422–Pohyb je vyřízený: „Pohyb už je zaúčtovaný“, „Pohyb je ignorovaný – nejdřív ho vraťte mezi nespárované“, „Pohyb už je spárovaný“
422–Pohyb v cizí měně nejde přepočítat: „Kurz ČNB pro … ke dni … se nepodařilo načíst – zkuste to prosím později“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Uloží stav posted a account_code; v podvojném účetnictví vytvoří účetní zápis se zdrojem bank (případné starší zápisy téhož pohybu nahradí). Zapíše auditní událost bank.posted.
Opakování
Druhé volání skončí 422 „Pohyb už je zaúčtovaný“; jiný účet lze zvolit až po vrácení pohybu mezi nespárované.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"account_code":"648","text":"Ostatní provozní výnos"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/64/book

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/64/book', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "account_code": "648",
    "text": "Ostatní provozní výnos"
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 64,
  "account_code": "648",
  "amount": 18150.0,
  "bank_account_id": 2,
  "booked_on": "2026-09-25",
  "constant_symbol": null,
  "counterparty_account": "2971512207",
  "counterparty_bank_code": "0710",
  "counterparty_name": "Atelier Lumen s.r.o.",
  "created_at": "2026-09-28T10:00:00.000Z",
  "currency": "CZK",
  "import_batch": null,
  "message": "Úhrada – viz smlouva",
  "reference": "demo-noise-3",
  "specific_symbol": null,
  "status": "posted",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "variable_symbol": "777",
  "counterparty": "2971512207/0710",
  "documents": [],
  "assigned_amount": 0.0,
  "open_amount": 0
}

POST Ignorování pohybu

/entities/{entity_id}/bank_transactions/{id}/ignore

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Označí pohyb jako ignorovaný (typicky převod mezi vlastními účty), takže se nenabízí k párování ani zaúčtování. Pohyb s přiřazenou úhradou ignorovat nejde, nejdřív je nutné párování zrušit (vrácení pohybu mezi nespárované). U zaúčtovaného pohybu se jeho zápis smaže.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID bankovního pohybu Příklad 5012.

Odpověď

200 application/json Pohyb ve stejném tvaru jako řádek seznamu pohybů (status = ignored).

Chyby této operace

StavKódKdy
422–Pohyb je v uzamčeném období: „Období do … je uzamčeno – pohyb nelze změnit“
422–Pohyb má úhradu: „Pohyb má přiřazené úhrady – nejdřív zrušte párování“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Nastaví stav ignored, vymaže account_code a smaže zápisy pohybu se zdrojem bank. Zapíše auditní událost bank.ignored.
Opakování
Lze opakovat bez chyby; každé volání zapíše další auditní událost.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/64/ignore

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/64/ignore', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'POST'
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 64,
  "account_code": null,
  "amount": 18150.0,
  "bank_account_id": 2,
  "booked_on": "2026-09-25",
  "constant_symbol": null,
  "counterparty_account": "2971512207",
  "counterparty_bank_code": "0710",
  "counterparty_name": "Atelier Lumen s.r.o.",
  "created_at": "2026-09-28T10:00:00.000Z",
  "currency": "CZK",
  "import_batch": null,
  "message": "Úhrada – viz smlouva",
  "reference": "demo-noise-3",
  "specific_symbol": null,
  "status": "ignored",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "variable_symbol": "777",
  "counterparty": "2971512207/0710",
  "documents": [],
  "assigned_amount": 0.0,
  "open_amount": 0
}

POST Vrácení pohybu mezi nespárované

/entities/{entity_id}/bank_transactions/{id}/reset

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Vrátí spárovaný, zaúčtovaný nebo ignorovaný pohyb mezi nespárované: zruší všechny jeho úhrady dokladů včetně jejich účetních zápisů (doklady znovu čekají na úhradu), smaže zápis přímého zaúčtování, vymaže account_code a nastaví stav unmatched. Pohyb ani jeho úhradu v uzamčeném období vrátit nelze.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID bankovního pohybu Příklad 5013.

Odpověď

200 application/json Pohyb ve stejném tvaru jako řádek seznamu pohybů (status = unmatched, prázdné documents).

Chyby této operace

StavKódKdy
422–Pohyb je v uzamčeném období: „Období do … je uzamčeno – pohyb nelze změnit“
422–Úhrada je v uzamčeném období: „Období do … je uzamčeno – úhradu z … nelze měnit“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Smaže úhrady navázané na pohyb a jejich zápisy (zdroj payment), přepočte uhrazené částky dokladů, smaže zápisy se zdrojem bank a nastaví stav unmatched. Zapíše auditní událost payment.deleted za každou úhradu a bank.reset; pohyb pak už nenese značku vyřízení pravidlem.
Opakování
U nespárovaného pohybu bez úhrad nic nezmění, jen zapíše další auditní událost bank.reset.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/22/reset

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_transactions/22/reset', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'POST'
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 22,
  "account_code": null,
  "amount": 77440.0,
  "bank_account_id": 2,
  "booked_on": "2026-09-22",
  "constant_symbol": null,
  "counterparty_account": "190507963",
  "counterparty_bank_code": "0800",
  "counterparty_name": "Kavárna U Zeleného stromu s.r.o.",
  "created_at": "2026-09-28T10:00:00.000Z",
  "currency": "CZK",
  "import_batch": null,
  "message": "Úhrada faktury FV20260022",
  "reference": "demo-22-2026-09-22",
  "specific_symbol": null,
  "status": "unmatched",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "variable_symbol": "20260022",
  "counterparty": "190507963/0800",
  "documents": [],
  "assigned_amount": 0.0,
  "open_amount": 77440.0
}

GET Seznam pravidel pro banku

/entities/{entity_id}/bank_rules

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Stačí

Vrátí všechna pravidla pro banku firmy včetně vypnutých v pořadí, ve kterém se zkoušejí (position, pak ID). Ke každému přidá český popis podmínek (summary) a akce (action_summary), název akce, jméno kontaktu a název účtu.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Odpověď

200 application/json Pole pravidel.

PoleVýznam
idID pravidla
nameNázev
activeZda je pravidlo zapnuté
positionPořadí (menší se zkouší dřív)
actionpost zaúčtovat na účet, match spárovat s fakturami kontaktu, partner přiřadit ke kontaktu, ignore ignorovat
conditionsPodmínky ve tvaru, v jakém je Saldo uložilo (viz vytvoření pravidla)
action_dataData akce (account_code, text, partner_id)
matches_countKolikrát pravidlo vyřídilo pohyb; last_matched_at kdy naposledy
summaryPodmínky česky, např. „Odchozí · zpráva obsahuje „poplat““
action_summaryAkce česky, např. „Zaúčtovat na 568 Ostatní finanční náklady“; action_label název akce
partner_nameJméno kontaktu z action_data; account_name název účtu z action_data

Chování

Co změní
Nic nezapisuje.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_rules

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_rules', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
[
  {
    "id": 1,
    "action": "post",
    "action_data": {
      "account_code": "336",
      "text": "Sociální pojištění"
    },
    "active": true,
    "conditions": {
      "direction": "out",
      "counterparty_account": "21012-7921101/0710"
    },
    "created_at": "2026-09-28T10:00:00.000Z",
    "last_matched_at": "2026-09-28T10:00:00.000Z",
    "matches_count": 8,
    "name": "Sociální pojištění – ČSSZ",
    "position": 1,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "summary": "Odchozí · protiúčet 21012-7921101/0710",
    "action_summary": "Zaúčtovat na 336 Zúčtování s institucemi sociálního zabezpečení a zdravotního pojištění",
    "action_label": "Zaúčtovat na účet",
    "partner_name": null,
    "account_name": "Zúčtování s institucemi sociálního zabezpečení a zdravotního pojištění"
  },
  {
    "id": 2,
    "action": "post",
    "action_data": {
      "account_code": "336",
      "text": "Zdravotní pojištění"
    },
    "active": true,
    "conditions": {
      "direction": "out",
      "counterparty_account": "1111009221/0710"
    },
    "created_at": "2026-09-28T10:00:00.000Z",
    "last_matched_at": "2026-09-28T10:00:00.000Z",
    "matches_count": 8,
    "name": "Zdravotní pojištění",
    "position": 2,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "summary": "Odchozí · protiúčet 1111009221/0710",
    "action_summary": "Zaúčtovat na 336 Zúčtování s institucemi sociálního zabezpečení a zdravotního pojištění",
    "action_label": "Zaúčtovat na účet",
    "partner_name": null,
    "account_name": "Zúčtování s institucemi sociálního zabezpečení a zdravotního pojištění"
  }
]

Dlouhé seznamy jsou v ukázce zkrácené na první položky.

POST Vytvoření pravidla pro banku

/entities/{entity_id}/bank_rules

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Vytvoří pravidlo pro banku a zařadí ho na konec pořadí. Pravidlo zachytí nespárovaný pohyb, který splní všechny zadané podmínky, a musí mít aspoň jednu podmínku kromě směru a účtu (protiúčet, protistrana, zpráva, symbol nebo rozmezí částky). Akce post zaúčtuje pohyb na účet nebo kategorii, která musí být aktivní v účtovém rozvrhu; match ho spáruje s otevřenými doklady kontaktu (jednoznačná shoda VS, jinak nejdříve splatný doklad se shodnou částkou, jinak aspoň dva nejdříve splatné doklady, jejichž součet přesně dá částku pohybu; přijaté faktury placené kartou vynechá) a kontaktu bez čísla účtu uloží protiúčet; partner uloží kontaktu protiúčet, pokud ho nemá, a zkusí spárovat; ignore pohyb ignoruje. S apply: true se zapnuté pravidlo hned použije na nespárované pohyby firmy.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
bank_ruleobjektano
bank_rule.nametextanoNázev pravidla, nejvýše 120 znaků Nejvýše 120 znaků.
bank_rule.activeano/neneZapnuté pravidlo, výchozí true Výchozí true.
bank_rule.actiontextanopost zaúčtovat, match spárovat s fakturami kontaktu, partner přiřadit ke kontaktu, ignore ignorovat Hodnoty: post, match, partner, ignore.
bank_rule.conditionsobjektanoPodmínky, pohyb musí splnit všechny; neznámé klíče a prázdné hodnoty se zahodí. Samotný směr nebo účet nestačí. Text se porovnává bez ohledu na velikost písmen a diakritiku.
bank_rule.conditions.directiontextnein příchozí, out odchozí platba Hodnoty: in, out.
bank_rule.conditions.bank_account_idcelé čísloneJen pohyby tohoto bankovního účtu firmy
bank_rule.conditions.counterparty_accounttextneProtiúčet předčíslí-číslo/kód banky nebo IBAN (český se převede na číslo účtu); bez kódu banky odpovídá číslo u kterékoli banky; nejvýše 60 znaků
bank_rule.conditions.counterparty_nametextneNázev protistrany obsahuje tento text (nejvýše 120 znaků)
bank_rule.conditions.messageobjektneZpráva pro příjemce; op contains (obsahuje) nebo equals (je), value nejvýše 140 znaků. Místo objektu lze poslat jen text, pak platí contains.
bank_rule.conditions.message.optextneZpůsob porovnání, jiná hodnota znamená contains Hodnoty: contains, equals.
bank_rule.conditions.message.valuetextneHledaný text
bank_rule.conditions.variable_symbolobjektneVariabilní symbol, stejný tvar jako message; mezery se ignorují a equals nebere ohled na úvodní nuly
bank_rule.conditions.constant_symbolobjektneKonstantní symbol, stejný tvar a porovnání jako variable_symbol
bank_rule.conditions.specific_symbolobjektneSpecifický symbol, stejný tvar a porovnání jako variable_symbol
bank_rule.conditions.amount_minčísloneNejmenší částka pohybu v absolutní hodnotě (0 se nebere)
bank_rule.conditions.amount_maxčísloneNejvětší částka pohybu v absolutní hodnotě; nesmí být menší než amount_min
bank_rule.action_dataobjektneData akce; pro ignore se nic neukládá
bank_rule.action_data.account_codetextnePro post povinný účet nebo kategorie, která je aktivní v účtovém rozvrhu firmy
bank_rule.action_data.texttextnePro post text účetního zápisu (nejvýše 250 znaků), jinak se použije název pravidla
bank_rule.action_data.partner_idcelé čísloneID kontaktu firmy; povinné pro match a partner, u post volitelné (kontakt se zapíše k účetnímu zápisu)
applyano/nenetrue hned použije nové pravidlo (je-li zapnuté) na nespárované pohyby firmy

Odpověď

201 application/json Vytvořené pravidlo a výsledek okamžitého použití.

PoleVýznam
rulePravidlo ve stejném tvaru jako v seznamu pravidel
appliedPočet pohybů, které pravidlo hned vyřídilo (bez apply 0)
rowsVyřízené pohyby – transaction_id, rule_id, rule_name, action, result, text

Chování

Co změní
Vytvoří pravidlo a zapíše auditní událost bank_rule.created; s apply: true navíc vyřídí zachycené pohyby stejně jako spuštění pravidel.
Opakování
Každé volání vytvoří další pravidlo.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"bank_rule":{"name":"Bankovní poplatky","action":"post","conditions":{"direction":"out","message":{"op":"contains","value":"poplat"}},"action_data":{"account_code":"568","text":"Bankovní poplatky"}},"apply":true}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_rules

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_rules', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "bank_rule": {
      "name": "Bankovní poplatky",
      "action": "post",
      "conditions": {
        "direction": "out",
        "message": {
          "op": "contains",
          "value": "poplat"
        }
      },
      "action_data": {
        "account_code": "568",
        "text": "Bankovní poplatky"
      }
    },
    "apply": true
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "rule": {
    "id": 8,
    "action": "post",
    "action_data": {
      "account_code": "568",
      "text": "Bankovní poplatky"
    },
    "active": true,
    "conditions": {
      "direction": "out",
      "message": {
        "op": "contains",
        "value": "poplat"
      }
    },
    "created_at": "2026-09-28T10:00:00.000Z",
    "last_matched_at": null,
    "matches_count": 0,
    "name": "Bankovní poplatky",
    "position": 6,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "summary": "Odchozí · zpráva obsahuje „poplat“",
    "action_summary": "Zaúčtovat na 568 Ostatní finanční náklady",
    "action_label": "Zaúčtovat na účet",
    "partner_name": null,
    "account_name": "Ostatní finanční náklady"
  },
  "applied": 0,
  "rows": []
}

PATCH Úprava pravidla pro banku

/entities/{entity_id}/bank_rules/{id}

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Změní název, zapnutí, akci, podmínky nebo data akce pravidla; poslané conditions a action_data nahradí dosavadní celé. Platí stejné kontroly jako při vytvoření a týkají se celého pravidla, ne jen změněných polí: pravidlo omezené na smazaný bankovní účet nebo zaúčtovávající na účet, který v účtovém rozvrhu chybí či je vypnutý, proto nejde uložit (ani jen vypnout), dokud se to neopraví; smazat ho lze vždy. S apply: true se pravidlo po uložení hned použije na nespárované pohyby firmy (jen když je zapnuté). Pořadí mění jen operace změny pořadí a na dříve vyřízené pohyby úprava nemá vliv.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID pravidla Příklad 4.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
bank_ruleobjektano
bank_rule.nametextneNázev pravidla, nejvýše 120 znaků Nejvýše 120 znaků.
bank_rule.activeano/neneZapnout nebo vypnout pravidlo
bank_rule.actiontextneAkce pravidla Hodnoty: post, match, partner, ignore.
bank_rule.conditionsobjektneNové podmínky celé, ve stejném tvaru jako při vytvoření
bank_rule.action_dataobjektneNová data akce celá, ve stejném tvaru jako při vytvoření
applyano/nenetrue hned použije upravené pravidlo (je-li zapnuté) na nespárované pohyby firmy

Odpověď

200 application/json Upravené pravidlo (rule) a výsledek okamžitého použití (applied, rows) jako při vytvoření.

Chování

Co změní
Uloží změny a zapíše auditní událost bank_rule.updated; s apply: true navíc vyřídí zachycené pohyby stejně jako spuštění pravidel.
Opakování
Opakování se stejnými daty pravidlo nezmění, jen zapíše další auditní událost.

Příklad

cURL

curl \
  -X PATCH \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"bank_rule":{"active":false}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/1

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'PATCH',
  body: JSON.stringify({
    "bank_rule": {
      "active": false
    }
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "rule": {
    "id": 1,
    "action": "post",
    "action_data": {
      "account_code": "336",
      "text": "Sociální pojištění"
    },
    "active": false,
    "conditions": {
      "direction": "out",
      "counterparty_account": "21012-7921101/0710"
    },
    "created_at": "2026-09-28T10:00:00.000Z",
    "last_matched_at": "2026-09-28T10:00:00.000Z",
    "matches_count": 8,
    "name": "Sociální pojištění – ČSSZ",
    "position": 1,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "summary": "Odchozí · protiúčet 21012-7921101/0710",
    "action_summary": "Zaúčtovat na 336 Zúčtování s institucemi sociálního zabezpečení a zdravotního pojištění",
    "action_label": "Zaúčtovat na účet",
    "partner_name": null,
    "account_name": "Zúčtování s institucemi sociálního zabezpečení a zdravotního pojištění"
  },
  "applied": 0,
  "rows": []
}

DELETE Smazání pravidla pro banku

/entities/{entity_id}/bank_rules/{id}

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Smaže pravidlo. Co pravidlo dříve udělalo (zaúčtování, spárování, ignorování), zůstává beze změny.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID pravidla Příklad 4.

Odpověď

204 Prázdná odpověď.

Chování

Co změní
Smaže pravidlo a zapíše auditní událost bank_rule.deleted.
Opakování
Druhé volání vrátí 404.

Příklad

cURL

curl \
  -X DELETE \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/1

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'DELETE'
});
const data = await response.json();
Odpověď 204 No Content
soubor, 0 bajtů

POST Spuštění pravidel na nespárované pohyby

/entities/{entity_id}/bank_rules/apply

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Použije zapnutá pravidla v pořadí na nespárované pohyby firmy nebo jen na transaction_ids; na pohyb se uplatní první pravidlo, jehož podmínky pohyb splní a jehož akci jde provést – když akce nejde (např. kontakt nemá odpovídající doklad), zkusí se další pravidlo. S rule_id se použije jen toto jedno pravidlo, a to i když je vypnuté. Přeskočí pohyby s přiřazenou úhradou (i částečnou), pohyby v uzamčeném období a odchozí pohyby v CZK, ke kterým existuje neuhrazený přijatý doklad se stejnou částkou, datem vystavení ±3 dny a odpovídajícím obchodníkem (vystavený, nebo koncept s přílohou) – ty čekají na ruční spárování. Přepínač automatizace bank_rules toto ruční spuštění neomezuje.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
rule_idcelé číslonePoužít jen toto pravidlo firmy (i vypnuté)
transaction_idspole (celé číslo)neJen tyto pohyby; lze poslat i jako text s ID oddělenými čárkami. Prázdné pole nebo prázdný text znamená všechny nespárované pohyby firmy (na rozdíl od automatického párování).

Odpověď

200 application/json Počet vyřízených pohybů a co s nimi pravidla udělala.

PoleVýznam
appliedPočet vyřízených pohybů
rowsŘádky transaction_id, rule_id, rule_name, action, result (posted, matched, partner, ignored) a text (např. „zaúčtován na 568“)

Chování

Co změní
Podle akce pohyb zaúčtuje (stav posted, v podvojném účetnictví zápis se zdrojem bank, s kontaktem z pravidla; událost bank.posted), spáruje s doklady kontaktu (úhrady se zápisy, událost payment.recorded; kontaktu bez čísla účtu uloží protiúčet), jen uloží protiúčet ke kontaktu (partner, když spárovat nejde) nebo pohyb ignoruje (stav ignored). U pravidla zvýší matches_count a nastaví last_matched_at; za každý vyřízený pohyb zapíše auditní událost bank.rule_applied.
Opakování
Vyřízené pohyby už nejsou nespárované, takže je další spuštění znovu nezpracuje; pravidlo partner, které jen uložilo číslo účtu, se podruhé neuplatní.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/apply

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/apply', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'POST'
});
const data = await response.json();
Odpověď 200 OK
{
  "applied": 0,
  "rows": []
}

POST Náhled pohybů, které by pravidlo zachytilo

/entities/{entity_id}/bank_rules/preview

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Ukáže, které pohyby z posledních 12 měsíců by pravidlo zachytilo a co by s nimi udělalo, a pravidlo neuloží. Posílá se stejný objekt bank_rule jako při vytvoření; kontroluje se jen to, že má aspoň jednu podmínku kromě směru a účtu. outcome říká, co by se s pohybem stalo (např. „Zaúčtuje na 568“), nebo že je už vyřízený či částečně spárovaný a pravidlo ho přeskočí. Náhled nezohledňuje, že spuštění přeskočí pohyby v uzamčeném období a pohyby s možným přijatým dokladem.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
bank_ruleobjektano
bank_rule.nametextneNázev (pro náhled nepovinný)
bank_rule.actiontextneAkce pravidla Hodnoty: post, match, partner, ignore.
bank_rule.conditionsobjektanoPodmínky ve stejném tvaru jako při vytvoření pravidla
bank_rule.action_dataobjektneData akce ve stejném tvaru jako při vytvoření pravidla

Odpověď

200 application/json Zachycené pohyby a co by s nimi pravidlo udělalo.

PoleVýznam
scannedPočet prohledaných pohybů
countPočet zachycených pohybů
openKolik zachycených pohybů je nespárovaných a bez úhrady
rowsNejvýše 40 pohybů – id, booked_on, amount, currency, counterparty_name, counterparty, variable_symbol, message, status a outcome

Chyby této operace

StavKódKdy
422–Pravidlo nemá podmínku: „Zadejte alespoň jednu podmínku – účet nebo název protistrany, zprávu, symbol nebo rozmezí částky“

Společné chyby všech operací (přihlášení, oprávnění, limity) popisuje Chyby a limity.

Chování

Co změní
Nic nezapisuje.
Limity
Prohledá nejvýše 2 000 nejnovějších pohybů za posledních 12 měsíců a vrátí nejvýše 40 řádků.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"bank_rule":{"name":"Bankovní poplatky","action":"post","conditions":{"direction":"out","message":{"op":"contains","value":"poplat"}},"action_data":{"account_code":"568"}}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/preview

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/preview', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "bank_rule": {
      "name": "Bankovní poplatky",
      "action": "post",
      "conditions": {
        "direction": "out",
        "message": {
          "op": "contains",
          "value": "poplat"
        }
      },
      "action_data": {
        "account_code": "568"
      }
    }
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "scanned": 107,
  "count": 1,
  "open": 0,
  "rows": [
    {
      "id": 61,
      "booked_on": "2026-09-02",
      "amount": -189.0,
      "currency": "CZK",
      "counterparty_name": "Fio banka",
      "counterparty": "9603358056/0710",
      "variable_symbol": null,
      "message": "Poplatek za vedení účtu",
      "status": "posted",
      "outcome": "Už vyřízeno – zaúčtováno"
    }
  ]
}

GET Návrh pravidla z jednoho pohybu

/entities/{entity_id}/bank_rules/draft

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Stačí

Navrhne pravidlo podle jednoho pohybu a nic neuloží. Platbu státu (odchozí platba na účet v ČNB s VS) rozpozná podle předčíslí účtu finančního úřadu, podle ČSSZ nebo zdravotní pojišťovny a navrhne zaúčtování (v podvojném účetnictví 343, 341, 342, 538 nebo 336, v daňové evidenci V94, V03, V11 nebo V91); převod mezi vlastními účty navrhne ignorovat, poplatek zaúčtovat na 568 (V15), úrok na 662 (P90). Karetní platbu navrhne podle obchodníka a ostatní pohyby podle protistrany – s účtem, na který se její pohyby dřív zaúčtovaly, nebo se spárováním s kontaktem, kterému číslo účtu patří. hint vysvětluje důvod návrhu.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
transaction_iddotazcelé čísloanoID bankovního pohybu firmy Příklad 5012.

Odpověď

200 application/json Navržené pravidlo ve tvaru pro vytvoření pravidla.

PoleVýznam
nameNavržený název
conditionsNavržené podmínky
actionNavržená akce
action_dataNavržená data akce (u karetní platby nebo neznámé protistrany může chybět account_code)
hintČesky, proč Saldo pravidlo navrhuje a co zkontrolovat

Chování

Co změní
Nic nezapisuje.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/draft?transaction_id=64"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/draft?transaction_id=64', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "name": "Atelier Lumen s.r.o.",
  "conditions": {
    "direction": "in",
    "counterparty_account": "2971512207/0710"
  },
  "action": "post",
  "action_data": {},
  "hint": "Vyberte, co se má s dalšími pohyby od této protistrany stát."
}

GET Doporučená pravidla z historie pohybů

/entities/{entity_id}/bank_rules/suggestions

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Stačí

Doporučí nejvýše 8 pravidel naučených z pohybů za posledních 12 měsíců: platby státu, převody mezi vlastními účty, bankovní poplatky a úroky, protistrany aspoň dvakrát zaúčtované na stejný účet a aspoň dvě karetní platby u stejného obchodníka. Návrh, jehož pohyby všechny zachytí některé existující pravidlo (i vypnuté) nebo dřívější návrh, se vynechá. complete říká, zda jde pravidlo uložit bez doplnění (např. karetní pravidlo bez známého účtu doplnění potřebuje).

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Odpověď

200 application/json Objekt s polem rows.

PoleVýznam
rowsNávrhy – key, kind (state, transfer, fees, interest, posted, card), title, reason, rule (name, conditions, action, action_data), count (zachycené pohyby), open (z toho nespárované), complete a samples (nejvýše 3 pohyby)

Chování

Co změní
Nic nezapisuje.
Limity
Nejvýše 8 návrhů z nejvýše 2 000 nejnovějších pohybů za 12 měsíců.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/suggestions

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/suggestions', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "rows": [
    {
      "key": "state:1599688387/0710",
      "kind": "state",
      "title": "Platby finančnímu úřadu",
      "reason": "1× platba na účet 1599688387/0710 v ČNB – platba daně",
      "rule": {
        "name": "Platby finančnímu úřadu",
        "conditions": {
          "direction": "out",
          "counterparty_account": "1599688387/0710"
        },
        "action": "post",
        "action_data": {
          "account_code": "343",
          "text": "Platba daně"
        }
      },
      "count": 1,
      "open": 1,
      "complete": true,
      "samples": [
        {
          "id": 63,
          "booked_on": "2026-09-23",
          "amount": -4120.0,
          "currency": "CZK",
          "counterparty_name": "Finanční úřad pro hl. m. Prahu",
          "counterparty": "1599688387/0710",
          "variable_symbol": "0000000001",
          "message": "Platba daně – finanční úřad",
          "status": "unmatched"
        }
      ]
    },
    {
      "key": "fees:message",
      "kind": "fees",
      "title": "Bankovní poplatky",
      "reason": "1× poplatek banky",
      "rule": {
        "name": "Bankovní poplatky",
        "conditions": {
          "direction": "out",
          "message": {
            "op": "contains",
            "value": "poplat"
          }
        },
        "action": "post",
        "action_data": {
          "account_code": "568",
          "text": "Bankovní poplatky"
        }
      },
      "count": 1,
      "open": 0,
      "complete": true,
      "samples": [
        {
          "id": 61,
          "booked_on": "2026-09-02",
          "amount": -189.0,
          "currency": "CZK",
          "counterparty_name": "Fio banka",
          "counterparty": "9603358056/0710",
          "variable_symbol": null,
          "message": "Poplatek za vedení účtu",
          "status": "posted"
        }
      ]
    }
  ]
}

GET Pohyby vyřízené pravidlem

/entities/{entity_id}/bank_rules/applied

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Stačí

Pro zadané pohyby vrátí pravidlo, které je naposledy vyřídilo – jen když pohyb potom nebyl změněn ani vrácen mezi nespárované. Slouží ke značce „pravidlo“ u pohybu; pohyby jiné firmy a neznámá ID se vynechají.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idsdotaztextneID pohybů oddělená čárkami (lze i opakovat ids[]); bere se nejvýše 500 různých Příklad 5012,5013.

Odpověď

200 application/json Objekt, jehož klíče jsou ID pohybů (jako text) a hodnoty rule_id, rule_name a at (kdy pravidlo pohyb vyřídilo); pohyby bez takového pravidla chybí.

Chování

Co změní
Nic nezapisuje.
Limity
Nejvýše 500 ID.

Příklad

Pohyb v ukázce nevyřídilo pravidlo (spároval se s fakturou), proto je odpověď prázdný objekt.

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/applied?ids=22"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/applied?ids=22', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{}

POST Změna pořadí pravidel pro banku

/entities/{entity_id}/bank_rules/reorder

Oprávnění
Vlastník, účetní nebo editor
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Nastaví pořadí pravidel: pravidla z ids (jen ta, která firma má) půjdou v zadaném pořadí na začátek, ostatní za ně v dosavadním pořadí, a pozice se přečíslují od 1. Pořadí určuje, které pravidlo se na pohyb uplatní dřív.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
idspole (celé číslo)anoID pravidel v požadovaném pořadí (pole; neznámá ID se vynechají, text s ID oddělenými čárkami se nerozdělí)

Odpověď

200 application/json Všechna pravidla v novém pořadí ve stejném tvaru jako v seznamu pravidel.

Chování

Co změní
Přepíše pozice pravidel a zapíše auditní událost bank_rule.reordered.
Opakování
Stejné pořadí lze poslat opakovaně; každé volání zapíše auditní událost.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":[1]}' \
  https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/reorder

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/bank_rules/reorder', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "ids": [
      1
    ]
  })
});
const data = await response.json();
Odpověď 200 OK
[
  {
    "id": 1,
    "action": "post",
    "action_data": {
      "account_code": "336",
      "text": "Sociální pojištění"
    },
    "active": true,
    "conditions": {
      "direction": "out",
      "counterparty_account": "21012-7921101/0710"
    },
    "created_at": "2026-09-28T10:00:00.000Z",
    "last_matched_at": "2026-09-28T10:00:00.000Z",
    "matches_count": 8,
    "name": "Sociální pojištění – ČSSZ",
    "position": 1,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "summary": "Odchozí · protiúčet 21012-7921101/0710",
    "action_summary": "Zaúčtovat na 336 Zúčtování s institucemi sociálního zabezpečení a zdravotního pojištění",
    "action_label": "Zaúčtovat na účet",
    "partner_name": null,
    "account_name": "Zúčtování s institucemi sociálního zabezpečení a zdravotního pojištění"
  },
  {
    "id": 2,
    "action": "post",
    "action_data": {
      "account_code": "336",
      "text": "Zdravotní pojištění"
    },
    "active": true,
    "conditions": {
      "direction": "out",
      "counterparty_account": "1111009221/0710"
    },
    "created_at": "2026-09-28T10:00:00.000Z",
    "last_matched_at": "2026-09-28T10:00:00.000Z",
    "matches_count": 8,
    "name": "Zdravotní pojištění",
    "position": 2,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "summary": "Odchozí · protiúčet 1111009221/0710",
    "action_summary": "Zaúčtovat na 336 Zúčtování s institucemi sociálního zabezpečení a zdravotního pojištění",
    "action_label": "Zaúčtovat na účet",
    "partner_name": null,
    "account_name": "Zúčtování s institucemi sociálního zabezpečení a zdravotního pojištění"
  }
]

Dlouhé seznamy jsou v ukázce zkrácené na první položky.

GET Úhrady vydaných dokladů čekající v bance na spárování

/entities/{entity_id}/documents/waiting_payments

Oprávnění
Každý člen firmy včetně role Jen čtení
Klíč jen pro čtení
Stačí

Vrátí otevřené vystavené doklady (vydané faktury, zálohové faktury, přijaté dobropisy), jejichž úhrada už je mezi nespárovanými příchozími pohyby – přesně ty, které by spárovalo automatické párování (shoda VS i částky, jednoznačně, mimo uzamčené období), nejvýše jeden pohyb na doklad. Připojí datum posledního bankovního pohybu firmy a počet importovaných vydaných faktur a záloh po splatnosti (ISDOC, POHODA, import), které nejsou mezi řádky a jejichž splatnost je až po posledním pohybu, takže jejich úhradu bankovní data zatím nemohou ukázat (bez pohybů v bance všechny takové doklady).

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.

Odpověď

200 application/json Doklady s čekající úhradou a údaje o pokrytí bankovními daty.

PoleVýznam
rowsŘádky document_id, number, transaction_id, booked_on, amount, currency (seřazené podle data pohybu)
statements_untilDatum posledního bankovního pohybu firmy, null bez pohybů
beyond_statementsPočet importovaných vydaných faktur a záloh po splatnosti, které nejsou mezi řádky a mají splatnost po statements_until (bez pohybů všechny takové)

Chování

Co změní
Nic nezapisuje. Úhrady nezaznamená – k tomu slouží automatické párování s transaction_ids.

Příklad

V ukázkové firmě teď žádná úhrada vydaného dokladu na spárování nečeká, proto je rows prázdné.

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  https://techtools.cz/ucetnictvi-api/entities/1/documents/waiting_payments

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/documents/waiting_payments', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "rows": [],
  "statements_until": "2026-09-25",
  "beyond_statements": 0
}