SaldoDokumentace Otevřít Saldo

Reference API

Automatizace, fronta a podklady

Přepínače automatizací a jejich ruční spuštění, přehled všech firem pro účetní, fronta úkolů napříč firmami a žádosti o chybějící doklady nebo vysvětlení.

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

GET Nastavení automatizací a jejich výsledky za tento měsíc

/entities/{entity_id}/automation

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

Vrátí přepínače automatizací firmy a co která automatizace udělala v aktuálním kalendářním měsíci, spolu s tím, co právě čeká: splatná opakování faktur, faktury k upomínce a nové kontakty ke kontrole. Nic nespouští.

Parametry

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

Odpověď

200 application/json Nastavení a stav automatizací.

PoleVýznam
monthPrvní den aktuálního měsíce; počty month níže platí pro něj
settingsPřepínače bank_rules, auto_match, fio_on_open, recurring, reminders, partner_checks (výchozí true) a reminder_days (výchozí 7)
bank_rulesrules, active (aktivní pravidla), month (použití pravidel), last_at
auto_matchmonth (plateb spárovaných při importu výpisů), open (nespárovaných bankovních pohybů)
fioconnected (účty napojené na Fio API), month (pohybů staženo z Fio), accounts s časem a chybou poslední synchronizace
recurringactive, due (splatná k dnešku), upcoming (nejbližších 6 opakování se šablonou a částkou), month (dokladů vytvořených z opakování)
remindersdays, count a totals podle měn (vydané faktury k upomínce), month (upomínek zaznamenaných tento měsíc – Saldo je samo neposílá), rows (prvních 8 faktur)
partner_checksnew (kontakty za 30 dní), unchecked, demo, month (provedených kontrol), flagged (až 8 nespolehlivých, insolventních nebo v ARES nenalezených kontaktů)

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/automation

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/automation', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "month": "2026-09-01",
  "settings": {
    "bank_rules": true,
    "auto_match": true,
    "fio_on_open": true,
    "recurring": true,
    "reminders": true,
    "reminder_days": 7,
    "partner_checks": true
  },
  "bank_rules": {
    "rules": 5,
    "active": 5,
    "month": 36,
    "last_at": "2026-09-28T10:00:00.000Z"
  },
  "auto_match": {
    "month": 0,
    "open": 6
  },
  "fio": {
    "connected": 0,
    "month": 0,
    "accounts": []
  },
  "recurring": {
    "active": 1,
    "due": 0,
    "upcoming": [
      {
        "id": 1,
        "next_on": "2026-10-03",
        "frequency": "monthly",
        "auto_issue": false,
        "template_id": 22,
        "number": "FV20260022",
        "partner": "Kavárna U Zeleného stromu s.r.o.",
        "total": 77440.0,
        "currency": "CZK",
        "due": false
      }
    ],
    "month": 0
  },
  "reminders": {
    "days": 7,
    "count": 0,
    "totals": {},
    "month": 0,
    "rows": []
  },
  "partner_checks": {
    "new": 17,
    "unchecked": 22,
    "demo": true,
    "month": 0,
    "flagged": []
  }
}

PATCH Zapnutí a vypnutí automatizací

/entities/{entity_id}/automation

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

Změní přepínače automatizací firmy; neuvedené a neznámé klíče se nemění. bank_rules a auto_match řídí, zda se při importu bankovního výpisu použijí pravidla pro banku a spárují platby s doklady (auto_match platí i pro import ISDOC). recurring, reminders a partner_checks řídí, co udělá POST …/automation/run. fio_on_open čte jen aplikace, která podle něj při otevření banky stáhne pohyby z Fio; server podle něj nic nespouští.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
automationobjektano
automation.bank_rulesano/nenePravidla pro banku při importu výpisu
automation.auto_matchano/nenePárování plateb s doklady při importu výpisu a ISDOC
automation.fio_on_openano/neneStažení pohybů z Fio při otevření banky v aplikaci
automation.recurringano/neneVytváření opakovaných faktur při běhu automatizací
automation.remindersano/nenePřehled faktur k upomínce při běhu automatizací
automation.reminder_dayscelé čísloneKolik dní po splatnosti (a od poslední upomínky) je faktura k upomínce; 1–90
automation.partner_checksano/neneKontrola nových kontaktů v registrech při běhu automatizací

Odpověď

200 application/json Nastavení po změně.

PoleVýznam
settingsVšech sedm přepínačů včetně nezměněných

Chyby této operace

StavKódKdy
422–reminder_days není celé číslo 1–90 („Upomínky lze chystat 1 až 90 dní po splatnosti …“)

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

Chování

Co změní
Pokud se něco změnilo, uloží nastavení firmy (settings.automation) a zapíše událost automation.updated se seznamem změn. Hodnoty přepínačů se převedou na true/false (jiná hodnota než pravdivá znamená false).
Opakování
Stejné hodnoty podruhé nic neuloží ani nezapíší.

Příklad

cURL

curl \
  -X PATCH \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"automation":{"reminder_days":14,"partner_checks":true}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/automation

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/automation', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'PATCH',
  body: JSON.stringify({
    "automation": {
      "reminder_days": 14,
      "partner_checks": true
    }
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "settings": {
    "bank_rules": true,
    "auto_match": true,
    "fio_on_open": true,
    "recurring": true,
    "reminders": true,
    "reminder_days": 14,
    "partner_checks": true
  }
}

POST Spuštění automatizací firmy

/entities/{entity_id}/automation/run

Oprávnění
Zvláštní pravidlo
Pravidlo
Volat smí každý člen firmy. Automatizace ale spustí jen vlastník, účetní nebo editor; divákovi vrátí 200 s ran false a důvodem a nic neudělá (ne 403).
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Spustí automatizace, které aplikace pouští při otevření firmy: opakované faktury (recurring), kontrolu nových kontaktů v registrech (partner_checks) a přepočet faktur k upomínce (reminders). Každá běží jen, je-li v nastavení zapnutá; s only jen ta jedna. Upomínky se jen spočítají, nic se neodesílá. Hodnoty only bank_rules, auto_match, fio_on_open a reminder_days nespustí nic; neznámá hodnota se ignoruje a běží vše zapnuté.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
onlytextneSpustit jen tuto automatizaci; účinek mají recurring, reminders a partner_checks Hodnoty: bank_rules, auto_match, fio_on_open, recurring, reminders, reminder_days, partner_checks.
forceano/neneZkontrolovat kontakty i během 10minutové pauzy po předchozí kontrole Výchozí false.

Odpověď

200 application/json Výsledek každé spuštěné automatizace; klíč chybí u automatizace, která neběžela.

PoleVýznam
rantrue; false u člena jen pro čtení
reasonJen při ran false: proč se nic nespustilo
recurringcount, documents (id, number, kind, status, partner_name, total_payable, currency) a failed (recurrence_id, template, error)
partnersvat, isir, ares (počty ověřených kontaktů), errors a flagged (id, name); nebo skipped true (pauza) či skipped a demo true (ukázková firma)
reminderscount – počet vydaných faktur k upomínce

Chování

Co změní
recurring: pro každé aktivní opakování s termínem dnes nebo dříve vytvoří doklad podle šablony (datum vystavení = termín, splatnost podle kontaktu nebo firmy, u cizí měny kurz ČNB, je-li dostupný). S auto_issue ho vystaví (v podvojném účetnictví i zaúčtuje), nebo pošle ke schválení, pokud ho pokrývá pravidlo schvalování; jinak zůstane koncept. Termín opakování posune (po ends_on ho deaktivuje); při chybě se doklad nevytvoří, opakování se neposune a chyba je ve failed. partner_checks: u kontaktů založených za posledních 30 dní ověří všechna dosud neověřená česká DIČ v registru plátců DPH (uloží spolehlivost a plátcovství), až 5 IČO v ISIR (uloží insolvenci) a až 5 IČO v ARES (doplní chybějící DIČ, ulici, obec a PSČ, zapíše událost partner.ares_checked); když něco ověřila nebo narazila na chybu, zapíše souhrnnou událost automation.partner_checks. U ukázkové firmy se registry nevolají. reminders nic nezapisuje. Volá externí služby ARES, ISIR, registr plátců DPH a ČNB.
Limity
Nejvýše 24 dokladů na jedno opakování v jednom běhu (dohánění zmeškaných termínů); ISIR a ARES nejvýše 5 kontaktů na běh; bez force se kontrola kontaktů přeskočí, pokud byla v posledních 10 minutách zapsána událost automation.partner_checks.
Opakování
Tentýž termín opakování nevytvoří dva doklady: běh si každý termín atomicky zarezervuje posunem data dalšího opakování. Další volání vytvoří doklad jen za termín, který mezitím nastal, nebo za termíny nad limit 24 z předchozího běhu. Kontrola kontaktů se do 10 minut po zapsané kontrole přeskočí (skipped); s force proběhne znovu, ale jen pro dosud neověřené kontakty.

Příklad

Ukázková firma má další opakování až příští měsíc, proto count je 0.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"only":"recurring"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/automation/run

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/automation/run', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "only": "recurring"
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "recurring": {
    "count": 0,
    "failed": [],
    "documents": []
  },
  "ran": true
}

GET Přehled všech firem volajícího podle naléhavosti

/clients

Oprávnění
Přihlášený uživatel nebo jeho API klíč, bez vazby na jednu firmu
Klíč jen pro čtení
Stačí

Vrátí všechny firmy, kde je volající přijatým členem (archivované na konci), s tím, co vyžaduje pozornost: stav přiznání k DPH za poslední skončené období a další lhůtu, pohledávky po splatnosti, nespárované bankovní pohyby, koncepty, uzamčení období a poslední aktivitu. Seřazeno podle naléhavosti (urgency), při shodě podle názvu. Stav DPH počítá jen s podáními druhu dph; podání označené jako odeslané bez ověřené doručenky nebo schválené výjimky je unverified, ne filed.

Odpověď

200 application/json Souhrn a seznam firem.

PoleVýznam
todayDnešní datum
totalPočet vrácených firem
truncatedtrue, když má volající víc než 200 firem
limitNejvyšší počet vrácených firem (200)
summaryJen nearchivované firmy: attention, critical, vat_due (DPH do 7 dnů nebo po lhůtě), overdue_count, overdue_amount (Kč), unmatched, drafts
clients[]id, name, ico, legal_form, legal_form_label, role, role_label, archived, demo, bookkeeping, vat, overdue (count, amount v Kč), unmatched, drafts, locked_until, last_activity, level, urgency
clients[].vat.statenone (neregistrovaná), filed (odesláno a doloženo), unverified (odesláno bez doložení), draft (jen připraveno), optional (podání není povinné), late (nepodáno po lhůtě), open (nepodáno, lhůta běží)
clients[].vatTaké period, deadline, days, filed_on, proof_state a další období next_period, next_deadline, next_days
clients[].levelcritical, warning, ok nebo archived

Chování

Co změní
Nic nezapisuje.
Limity
Nejvýše 200 firem; výběr proběhne podle archivace a názvu ještě před řazením podle naléhavosti, takže nad 200 firem se naléhavější firma dál v abecedě nemusí vrátit.

Příklad

cURL

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/clients', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "today": "2026-09-28",
  "total": 2,
  "truncated": false,
  "limit": 200,
  "summary": {
    "attention": 2,
    "critical": 0,
    "vat_due": 1,
    "overdue_count": 2,
    "overdue_amount": 132600.0,
    "unmatched": 9,
    "drafts": 2
  },
  "clients": [
    {
      "id": 1,
      "name": "Ukázková firma s.r.o.",
      "ico": "99999994",
      "legal_form": "sro",
      "legal_form_label": "s.r.o.",
      "role": "owner",
      "role_label": "Vlastník",
      "archived": false,
      "demo": true,
      "bookkeeping": "double_entry",
      "vat": {
        "status": "monthly",
        "label": "Plátce DPH – měsíčně",
        "payer": true,
        "period": "2026-08",
        "period_label": "srpen 2026",
        "deadline": "2026-09-25",
        "days": -3,
        "filing": "filed",
        "filed_on": "2026-09-24",
        "proof_state": "awaiting_proof",
        "state": "unverified",
        "next_period": "2026-09",
        "next_period_label": "září 2026",
        "next_deadline": "2026-10-26",
        "next_days": 28
      },
      "overdue": {
        "count": 1,
        "amount": 72600.0
      },
      "unmatched": 6,
      "drafts": 2,
      "locked_until": null,
      "last_activity": {
        "at": "2026-09-28T10:00:00.000Z",
        "action": "filing.evidence_attached",
        "summary": "DPH 2026-08: přiložen potvrzeni-podani.pdf",
        "user": "ukazka"
      },
      "level": "warning",
      "urgency": 85
    },
    {
      "id": 2,
      "name": "Jan Ukázka – grafické studio (ukázka)",
      "ico": "99999986",
      "legal_form": "osvc",
      "legal_form_label": "OSVČ",
      "role": "owner",
      "role_label": "Vlastník",
      "archived": false,
      "demo": true,
      "bookkeeping": "tax_records",
      "vat": {
        "status": "none",
        "label": "Neplátce DPH",
        "payer": false,
        "state": "none"
      },
      "overdue": {
        "count": 1,
        "amount": 60000.0
      },
      "unmatched": 3,
      "drafts": 0,
      "locked_until": null,
      "last_activity": {
        "at": "2026-09-28T10:00:00.000Z",
        "action": "bank.rule_applied",
        "summary": "Pravidlo „Zdravotní pojištění“: pohyb -3306,00 CZK ze dne 7. 9. 2026 zaúčtován na V91",
        "user": "ukazka"
      },
      "level": "warning",
      "urgency": 25
    }
  ]
}

GET Fronta úkolů účetní napříč firmami

/work_items

Oprávnění
Přihlášený uživatel nebo jeho API klíč, bez vazby na jednu firmu
Klíč jen pro čtení
Stačí

Vrátí konkrétní kroky ve všech nearchivovaných firmách volajícího: koncepty účetních dokladů (draft), nespárované bankovní pohyby (bank), vystavené přijaté faktury, dobropisy a výdajové pokladní doklady bez přílohy od 1. 1. předchozího roku, kromě načtených z ISDOC (missing), u plátců DPH nepodaná přiznání k DPH za každé skončené období od příchodu firmy do Salda a za období před ním, pokud jeho lhůta tehdy ještě běžela (filing; počítá se i podání se stavem filed pokrývající jen část období), a podání označená jako odeslaná bez ověřené doručenky či schválené výjimky (proof, podání všech druhů). Nepodaná kontrolní a souhrnná hlášení fronta nesleduje. Před výpisem frontu synchronizuje s daty (refresh): nové a vrácené kroky otevře, otevřený krok vyřeší, jen když kontrola jeho vlastního zdroje ukáže, že je hotový, a zruší přidělení lidem, kteří ve firmě ztratili právo zápisu. S refresh=0 nebo s API klíčem jen pro čtení vrátí frontu tak, jak byla naposledy synchronizována.

Parametry

NázevKdeTypPovinnýPopis
entity_iddotazcelé čísloneJen kroky této firmy (firma bez členství vrátí prázdný seznam) Příklad 12.
assigneedotaztextneme (přidělené mně), unassigned (nepřidělené) nebo číselné ID uživatele; jiná hodnota nefiltruje Příklad me.
prioritydotaztextneJen kroky s touto prioritou Hodnoty: high, normal, low. Příklad high.
duedotaztextneoverdue = termín už minul; week = termín nejpozději za 7 dní (včetně prošlých) Hodnoty: overdue, week. Příklad week.
statedotaztextneresolved = vyřešené za posledních 90 dní, nejnovější první; jiná hodnota znamená open Hodnoty: open, resolved. Výchozí open. Příklad open.
refreshdotaztextne0 = bez synchronizace; jakákoli jiná hodnota nebo vynechání synchronizuje Hodnoty: 0, 1. Výchozí 1. Příklad 1.

Odpověď

200 application/json Kroky, počty a lidé, kterým lze kroky přidělit.

PoleVýznam
todayDnešní datum, ke kterému se počítá overdue
rowsKroky: id, entity_id, entity_name, kind, kind_label, title, detail, href (odkaz do aplikace), due_on, period, year, overdue, priority, priority_label, assignee_id, assignee, can_assign, state, first_seen_at, resolved_at, reopened_count
rows[].kindfiling, proof, bank, draft, missing
truncatedtrue, když je kroků víc než 1000
limitNejvyšší počet vrácených kroků (1000)
countsOtevřené kroky ve všech firmách bez ohledu na filtr: open, mine, unassigned, high, overdue
firmsFirmy ve frontě: id, name, manage (volající smí přidělovat)
peopleLidé s právem zápisu v některé z firem
membersID firmy → lidé s právem zápisu v ní

Chyby této operace

StavKódKdy
400–Parametr entity_id, assignee, priority, due, state nebo refresh je pole či objekt („Parametr … musí být jedna hodnota“)

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

Chování

Co změní
Synchronizace zapisuje jen do fronty úkolů (nové kroky, aktualizace názvu, termínu a priority, vyřešení, znovuotevření s reopened_count, zrušení přidělení); účetní data nemění. S refresh=0 nebo klíčem jen pro čtení nic nezapisuje.
Limity
Nejvýše 200 nearchivovaných firem (podle názvu) a 1000 řádků. Nové kroky se hledají nejvýše po 500 na firmu a druh; krok proof jen u podání odeslaných za posledních 365 dní nebo bez data odeslání. Vyřešené kroky se vypisují 90 dní.
Opakování
Opakovaná synchronizace bez změny dat nic nového nezaloží.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/work_items?state=open"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/work_items?state=open', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "today": "2026-09-28",
  "rows": [
    {
      "id": 3,
      "entity_id": 1,
      "entity_name": "Ukázková firma s.r.o.",
      "kind": "bank",
      "kind_label": "Bankovní výjimka",
      "title": "Spárovat nebo zaúčtovat pohyb 1 500,00 Kč",
      "detail": "Vratka přeplatku · 15. 7. 2026",
      "href": "#/banka?account=2",
      "due_on": "2026-08-15",
      "period": null,
      "year": null,
      "overdue": true,
      "priority": "high",
      "priority_label": "Vysoká",
      "assignee_id": null,
      "assignee": null,
      "can_assign": true,
      "state": "open",
      "first_seen_at": "2026-09-28T10:00:00.000Z",
      "resolved_at": null,
      "reopened_count": 0
    },
    {
      "id": 4,
      "entity_id": 1,
      "entity_name": "Ukázková firma s.r.o.",
      "kind": "bank",
      "kind_label": "Bankovní výjimka",
      "title": "Spárovat nebo zaúčtovat pohyb 12 100,00 Kč",
      "detail": "Nordwood Studio s.r.o. · Úhrada faktury · 12. 8. 2026",
      "href": "#/banka?account=2",
      "due_on": "2026-09-15",
      "period": null,
      "year": null,
      "overdue": true,
      "priority": "high",
      "priority_label": "Vysoká",
      "assignee_id": null,
      "assignee": null,
      "can_assign": true,
      "state": "open",
      "first_seen_at": "2026-09-28T10:00:00.000Z",
      "resolved_at": null,
      "reopened_count": 0
    }
  ],
  "truncated": false,
  "limit": 1000,
  "counts": {
    "open": 97,
    "mine": 0,
    "unassigned": 97,
    "high": 3,
    "overdue": 3
  },
  "firms": [
    {
      "id": 2,
      "name": "Jan Ukázka – grafické studio (ukázka)",
      "manage": true
    },
    {
      "id": 1,
      "name": "Ukázková firma s.r.o.",
      "manage": true
    }
  ],
  "people": [
    {
      "id": 2,
      "name": "ucetni_ukazka"
    },
    {
      "id": 1,
      "name": "ukazka"
    }
  ],
  "members": {
    "1": [
      {
        "id": 1,
        "name": "ukazka"
      },
      {
        "id": 2,
        "name": "ucetni_ukazka"
      }
    ],
    "2": [
      {
        "id": 1,
        "name": "ukazka"
      }
    ]
  }
}

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

PATCH Přidělení kroku z fronty úkolů

/work_items/{id}

Oprávnění
Zvláštní pravidlo
Pravidlo
Krok musí patřit nearchivované firmě, kde je volající přijatým členem (jinak 404). Přidělovat smí jen vlastník nebo účetní té firmy; ostatním vrátí 422, ne 403.
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Přidělí krok fronty úkolů odpovědné osobě, nebo přidělení zruší (assignee_id null). Přidělit lze jen členovi firmy s právem zápisu (vlastník, účetní, editor).

Parametry

NázevKdeTypPovinnýPopis
idcestacelé čísloanoID kroku fronty Příklad 301.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
assignee_idcelé čísloneID uživatele; null nebo prázdná hodnota přidělení zruší

Odpověď

200 application/json Krok po přidělení (tvar jako rows[] v GET /work_items).

Chyby této operace

StavKódKdy
400–assignee_id je pole či objekt („Parametr assignee_id musí být jedna hodnota“)
422–Volající není vlastník ani účetní firmy („Úkoly smí přidělovat vlastník nebo účetní firmy“)
422–Uživatel není členem firmy s právem zápisu („Úkol lze přidělit jen členovi firmy s právem zápisu“)

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

Chování

Co změní
Uloží odpovědnou osobu, kdo a kdy přidělil, a zapíše do historie firmy událost work_item.assigned. Účetní data nemění.
Opakování
Každé volání znovu uloží čas a autora přidělení a zapíše novou událost, i při stejné osobě.

Příklad

cURL

curl \
  -X PATCH \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"assignee_id":2}' \
  https://techtools.cz/ucetnictvi-api/work_items/1

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/work_items/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'PATCH',
  body: JSON.stringify({
    "assignee_id": 2
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "entity_id": 1,
  "entity_name": "Ukázková firma s.r.o.",
  "kind": "draft",
  "kind_label": "Koncept dokladu",
  "title": "Dokončit a vystavit koncept: Přijatá faktura 2026090418",
  "detail": "Coworking Karlín s.r.o. · 17 545,00 Kč · 25. 9. 2026",
  "href": "#/doklad/146",
  "due_on": null,
  "period": null,
  "year": null,
  "overdue": false,
  "priority": "low",
  "priority_label": "Nízká",
  "assignee_id": 2,
  "assignee": "ucetni_ukazka",
  "can_assign": true,
  "state": "open",
  "first_seen_at": "2026-09-28T10:00:00.000Z",
  "resolved_at": null,
  "reopened_count": 0
}

GET Žádosti o podklady ve firmě

/entities/{entity_id}/document_requests

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

Vrátí žádosti o chybějící doklad nebo vysvětlení k bankovnímu pohybu či dokladu, bez zpráv. Otevřené (waiting, delivered) jsou seřazené podle termínu (žádosti bez termínu na konci, při shodě nejnovější první), uzavřené (verified, cancelled) od posledně uzavřené; s filter=all jsou otevřené první. filter=action vrátí jen otevřené žádosti, které čekají na volajícího.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
filterdotaztextneopen = čekající a dodané; action = z nich ty, na které má volající odpovědět nebo které smí ověřit; closed = ověřené a zrušené; all = vše. Jiná hodnota znamená open. Hodnoty: open, action, closed, all. Výchozí open. Příklad open.
subject_typedotaztextneJen žádosti k tomuto druhu položky – vyžaduje subject_ids Hodnoty: bank_transaction, document. Příklad bank_transaction.
subject_idsdotaztextneID položek oddělená čárkou (nejvýše 500); bez subject_type se ignorují, bez nich je výsledek prázdný Příklad 4711,4712.

Odpověď

200 application/json Žádosti a počty.

PoleVýznam
rowsŽádosti: id, title, status, status_label, subject, requested_by, assignee_id, assignee, due_on, overdue, created_at, updated_at, closed_at, action_needed, can_reply, can_verify, can_cancel, files_count
rows[].statuswaiting (čeká na podklad), delivered (podklad dodán), verified (ověřeno), cancelled (zrušeno)
rows[].subjecttype, id, label, amount, currency, date, partner, href; u pohybu i message a tx_status; u smazané položky missing true
rows[].assignee_idOdpovědná osoba, jen dokud má ve firmě právo zápisu, jinak null. Určuje, na koho žádost čeká (action_needed); odpovědět smí kterýkoli člen s právem zápisu
truncatedtrue, když žádostí je víc než limit
limit500
action_neededPočet všech otevřených žádostí firmy, které čekají na volajícího (bez ohledu na filtr)
membersČlenové s právem zápisu (id, name, role); žádost lze přidělit kterémukoli z nich kromě sebe

Chyby této operace

StavKódKdy
422–Neznámý subject_type („Neznámý druh položky“)

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
Nejvýše 500 žádostí; u filter=action se limit uplatní před výběrem žádostí čekajících na volajícího.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/document_requests?filter=all"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/document_requests?filter=all', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "rows": [
    {
      "id": 1,
      "title": "Doklad k příchozí platbě",
      "status": "delivered",
      "status_label": "Podklad dodán",
      "subject": {
        "type": "bank_transaction",
        "id": 64,
        "label": "Platba 18 150,00 Kč z 25. 9. 2026",
        "amount": 18150.0,
        "currency": "CZK",
        "date": "2026-09-25",
        "partner": "Atelier Lumen s.r.o.",
        "message": "Úhrada – viz smlouva",
        "tx_status": "unmatched",
        "href": "#/banka?tx=64"
      },
      "requested_by": "ukazka",
      "assignee_id": 2,
      "assignee": "ucetni_ukazka",
      "due_on": "2026-10-05",
      "overdue": false,
      "created_at": "2026-09-28T10:00:00.000Z",
      "updated_at": "2026-09-28T10:00:00.000Z",
      "closed_at": null,
      "action_needed": true,
      "can_reply": true,
      "can_verify": true,
      "can_cancel": true,
      "files_count": 1
    }
  ],
  "truncated": false,
  "limit": 500,
  "action_needed": 1,
  "members": [
    {
      "id": 1,
      "name": "ukazka",
      "role": "owner"
    },
    {
      "id": 2,
      "name": "ucetni_ukazka",
      "role": "accountant"
    }
  ]
}

POST Žádost o doklad nebo vysvětlení k pohybu či dokladu

/entities/{entity_id}/document_requests

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

Založí žádost o podklad k bankovnímu pohybu nebo účetnímu dokladu (i konceptu) s první zprávou. K jedné položce může být otevřená jen jedna žádost; k nabídce, objednávce a dodacímu listu žádost založit nelze. Odpovědnou osobou může být jiný člen firmy s právem zápisu, ne sám žadatel. Smazání pohybu nebo dokladu jeho otevřenou žádost zruší se systémovou zprávou.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
subject_typetextanoDruh položky Hodnoty: bank_transaction, document.
subject_idcelé čísloanoID bankovního pohybu nebo dokladu v této firmě
questiontextanoCo je potřeba dodat, nejvýše 2000 znaků
titletextneNázev žádosti, nejvýše 200 znaků (delší se zkrátí); výchozí „Doklad nebo vysvětlení k platbě“ nebo „Chybějící podklad k dokladu“
assignee_idcelé čísloneID uživatele, který má odpovědět – jiný člen s právem zápisu
due_ondatumneTermín, dnes nebo později

Odpověď

201 application/json Nová žádost se zprávami (tvar jako GET …/document_requests/{id}), status waiting.

Chyby této operace

StavKódKdy
422–Neznámý subject_type („Žádost lze založit k bankovnímu pohybu nebo dokladu“)
422–Položka je nabídka, objednávka nebo dodací list
422–K položce už je otevřená žádost („K této položce už je otevřená žádost … – pokračujte v ní“)
422–Prázdná otázka nebo delší než 2000 znaků
422–Termín v minulosti („Termín nemůže být v minulosti“)
422–Odpovědnou osobou je sám žadatel, nebo člen bez práva zápisu

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

Chování

Co změní
Vytvoří žádost ve stavu waiting a zprávu s otázkou a zapíše událost document_request.created. Bankovní pohyb ani doklad nemění a nic neúčtuje.
Opakování
Druhá žádost ke stejné položce vrátí 422, dokud je první otevřená; po uzavření lze založit novou.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subject_type":"bank_transaction","subject_id":22,"title":"Doklad k platbě","question":"Prosím o fakturu nebo účtenku k této platbě."}' \
  https://techtools.cz/ucetnictvi-api/entities/1/document_requests

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/document_requests', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "subject_type": "bank_transaction",
    "subject_id": 22,
    "title": "Doklad k platbě",
    "question": "Prosím o fakturu nebo účtenku k této platbě."
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "id": 2,
  "title": "Doklad k platbě",
  "status": "waiting",
  "status_label": "Čeká na podklad",
  "subject": {
    "type": "bank_transaction",
    "id": 22,
    "label": "Platba 77 440,00 Kč z 22. 9. 2026",
    "amount": 77440.0,
    "currency": "CZK",
    "date": "2026-09-22",
    "partner": "Kavárna U Zeleného stromu s.r.o.",
    "message": "Úhrada faktury FV20260022",
    "tx_status": "matched",
    "href": "#/banka?tx=22"
  },
  "requested_by": "ukazka",
  "assignee_id": null,
  "assignee": null,
  "due_on": null,
  "overdue": false,
  "created_at": "2026-09-28T10:00:00.000Z",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "closed_at": null,
  "action_needed": false,
  "can_reply": true,
  "can_verify": false,
  "can_cancel": true,
  "files_count": 0,
  "attachable_files": 0,
  "messages": [
    {
      "id": 3,
      "kind": "question",
      "user": "ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "body": "Prosím o fakturu nebo účtenku k této platbě.",
      "files": []
    }
  ]
}

GET Detail žádosti o podklad se zprávami a soubory

/entities/{entity_id}/document_requests/{id}

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

Vrátí žádost se všemi zprávami (otázka, odpovědi, ověření, zrušení) a jejich soubory a s tím, co smí volající udělat (can_reply, can_verify, can_cancel).

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
idcestacelé čísloanoID žádosti Příklad 88.

Odpověď

200 application/json Žádost (pole jako v rows[] seznamu) a zprávy.

PoleVýznam
messagesZprávy od nejstarší: id, kind (question, reply, verified, cancelled), user (null u systémové zprávy po smazání položky), at, body, files (id, filename, content_type, byte_size)
attachable_filesKolik souborů dodaných jinými než žadatelem by ověření s attach přiložilo k dokladu (0 u pohybu nebo když volající ověřit nesmí)

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/document_requests/1

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/document_requests/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "title": "Doklad k příchozí platbě",
  "status": "delivered",
  "status_label": "Podklad dodán",
  "subject": {
    "type": "bank_transaction",
    "id": 64,
    "label": "Platba 18 150,00 Kč z 25. 9. 2026",
    "amount": 18150.0,
    "currency": "CZK",
    "date": "2026-09-25",
    "partner": "Atelier Lumen s.r.o.",
    "message": "Úhrada – viz smlouva",
    "tx_status": "unmatched",
    "href": "#/banka?tx=64"
  },
  "requested_by": "ukazka",
  "assignee_id": 2,
  "assignee": "ucetni_ukazka",
  "due_on": "2026-10-05",
  "overdue": false,
  "created_at": "2026-09-28T10:00:00.000Z",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "closed_at": null,
  "action_needed": true,
  "can_reply": true,
  "can_verify": true,
  "can_cancel": true,
  "files_count": 1,
  "attachable_files": 0,
  "messages": [
    {
      "id": 1,
      "kind": "question",
      "user": "ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "body": "Pošlete prosím fakturu nebo smlouvu k platbě 7 260 Kč.",
      "files": []
    },
    {
      "id": 2,
      "kind": "reply",
      "user": "ucetni_ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "body": "Posílám smlouvu.",
      "files": [
        {
          "id": 4,
          "filename": "faktura.pdf",
          "content_type": "application/pdf",
          "byte_size": 142
        }
      ]
    }
  ]
}

GET Počty otevřených žádostí a žádostí čekajících na volajícího

/entities/{entity_id}/document_requests/counts

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

Vrátí jen počty bez žádostí a zpráv – pro odznaky v aplikaci. action_needed počítá žádosti, na které má volající odpovědět (není žadatel a žádost je přidělená jemu nebo nikomu), a dodané žádosti, které smí ověřit; člen bez práva zápisu má vždy 0.

Parametry

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

Odpověď

200 application/json Počty.

PoleVýznam
openOtevřené žádosti firmy (waiting a delivered)
action_neededZ nich ty, které čekají na volajícího

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/document_requests/counts

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/document_requests/counts', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "open": 1,
  "action_needed": 1
}

POST Odpověď na žádost o podklad, případně se soubory

/entities/{entity_id}/document_requests/{id}/reply

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

Přidá do otevřené žádosti odpověď s textem a/nebo soubory. Odpověď kohokoli jiného než žadatele žádost označí jako dodanou (delivered); odpověď žadatele (doplňující dotaz) ji vrátí do stavu waiting. Soubory zůstávají u žádosti – k dokladu se přiloží až při ověření s attach. Soubory se posílají jako multipart/form-data v poli files[] (nebo files[0], files[1] …); odpověď bez souborů lze poslat i jako JSON.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
idcestacelé čísloanoID žádosti Příklad 88.

Tělo požadavku

Formát multipart/form-data.

PoleTypPovinnéPopis
bodytextneText odpovědi, nejvýše 2000 znaků; povinný, není-li přiložen soubor
filespole (text)neNejvýše 5 souborů PDF, JPEG, PNG, WebP, GIF, HEIC/HEIF nebo XML (typ se určí z obsahu), každý nejvýše 15 MB, dohromady nejvýše 20 MB

Odpověď

200 application/json Žádost se zprávami po odpovědi (tvar jako GET …/document_requests/{id}).

Chyby této operace

StavKódKdy
422–Žádost je uzavřená („Žádost je uzavřená – případně založte novou“)
422–Chybí text i soubor, nebo je text delší než 2000 znaků
422–Víc než 5 souborů, prázdný soubor, soubor nad 15 MB, nepovolený typ nebo víc než 20 MB dohromady
422–V poli files není soubor („Soubory se nepodařilo přečíst – pošlete je jako multipart/form-data v poli files[]“)

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

Chování

Co změní
Uloží zprávu a soubory a změní stav žádosti (delivered s časem a autorem dodání, nebo waiting); zapíše událost document_request.delivered nebo document_request.followed_up. Doklad ani pohyb nemění, nic neúčtuje. Když cokoli selže, nahrané soubory se smažou.
Limity
5 souborů, 15 MB na soubor, 20 MB na odpověď, 2000 znaků textu.
Opakování
Každé volání přidá novou zprávu; stejné soubory se neslučují.

Příklad

V ukázce odpovídá sám žadatel (doplňující dotaz), proto se žádost vrátí do stavu waiting; odpověď jiného člena by ji označila jako delivered.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -F "body=Posílám účtenku z čerpací stanice." \
  -F "files[]=@uctenka.jpg" \
  https://techtools.cz/ucetnictvi-api/entities/1/document_requests/1/reply

JavaScript

const form = new FormData();
form.append('files[]', fileInput.files[0], 'uctenka.jpg');
form.append('body', 'Posílám účtenku z čerpací stanice.');
const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/document_requests/1/reply', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'POST',
  body: form
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "title": "Doklad k příchozí platbě",
  "status": "waiting",
  "status_label": "Čeká na podklad",
  "subject": {
    "type": "bank_transaction",
    "id": 64,
    "label": "Platba 18 150,00 Kč z 25. 9. 2026",
    "amount": 18150.0,
    "currency": "CZK",
    "date": "2026-09-25",
    "partner": "Atelier Lumen s.r.o.",
    "message": "Úhrada – viz smlouva",
    "tx_status": "unmatched",
    "href": "#/banka?tx=64"
  },
  "requested_by": "ukazka",
  "assignee_id": 2,
  "assignee": "ucetni_ukazka",
  "due_on": "2026-10-05",
  "overdue": false,
  "created_at": "2026-09-28T10:00:00.000Z",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "closed_at": null,
  "action_needed": false,
  "can_reply": true,
  "can_verify": false,
  "can_cancel": true,
  "files_count": 2,
  "attachable_files": 0,
  "messages": [
    {
      "id": 1,
      "kind": "question",
      "user": "ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "body": "Pošlete prosím fakturu nebo smlouvu k platbě 7 260 Kč.",
      "files": []
    },
    {
      "id": 2,
      "kind": "reply",
      "user": "ucetni_ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "body": "Posílám smlouvu.",
      "files": [
        {
          "id": 4,
          "filename": "faktura.pdf",
          "content_type": "application/pdf",
          "byte_size": 142
        }
      ]
    }
  ]
}

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

POST Ověření dodaného podkladu a uzavření žádosti

/entities/{entity_id}/document_requests/{id}/verify

Oprávnění
Zvláštní pravidlo
Pravidlo
Vyžaduje právo zápisu. Ověřit smí žadatel, dokud má ve firmě právo zápisu; jinak vlastník nebo účetní. Nikdy člen, který podklad dodal. Nesplnění vrátí 422.
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Uzavře dodanou žádost jako ověřenou. U žádosti k dokladu s attach=true zkopíruje k dokladu jako přílohy soubory, které v odpovědích dodal někdo jiný než žadatel a které doklad ještě nemá (podle kontrolního součtu). Nic se neúčtuje a stav bankovního pohybu se nemění.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
idcestacelé čísloanoID žádosti Příklad 88.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
attachano/nenePřiložit dodané soubory k dokladu (jen u žádosti k dokladu) Výchozí false.

Odpověď

200 application/json Žádost se zprávami po ověření (status verified).

Chyby této operace

StavKódKdy
422–Volající nesmí ověřit („Ověřit smí ten, kdo o podklad požádal; vlastník nebo účetní jen za žadatele, který už nemá právo zápisu“)
422–Žádost je uzavřená („Žádost je už uzavřená“)
422–Žádost není ve stavu delivered („Ověřit lze až dodaný podklad …“)
422–Volající podklad sám dodal („Vámi dodaný podklad musí ověřit někdo jiný“)
422–Doklad by měl víc než 20 příloh

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

Chování

Co změní
Zapíše zprávu verified, nastaví stav verified s časem a autorem ověření a zapíše událost document_request.verified; s attach přiloží soubory k dokladu a u každého zapíše událost document.attached. Nic neúčtuje.
Limity
Doklad může mít nejvýše 20 příloh.
Opakování
Druhé volání vrátí 422, protože žádost je uzavřená.

Příklad

Potřebuje žádost ve stavu delivered, kterou založil volající a dodal jiný člen.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"attach":false}' \
  https://techtools.cz/ucetnictvi-api/entities/1/document_requests/1/verify

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/document_requests/1/verify', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "attach": false
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "title": "Doklad k příchozí platbě",
  "status": "verified",
  "status_label": "Ověřeno",
  "subject": {
    "type": "bank_transaction",
    "id": 64,
    "label": "Platba 18 150,00 Kč z 25. 9. 2026",
    "amount": 18150.0,
    "currency": "CZK",
    "date": "2026-09-25",
    "partner": "Atelier Lumen s.r.o.",
    "message": "Úhrada – viz smlouva",
    "tx_status": "unmatched",
    "href": "#/banka?tx=64"
  },
  "requested_by": "ukazka",
  "assignee_id": 2,
  "assignee": "ucetni_ukazka",
  "due_on": "2026-10-05",
  "overdue": false,
  "created_at": "2026-09-28T10:00:00.000Z",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "closed_at": "2026-09-28T10:00:00.000Z",
  "action_needed": false,
  "can_reply": false,
  "can_verify": false,
  "can_cancel": false,
  "files_count": 1,
  "attachable_files": 0,
  "messages": [
    {
      "id": 1,
      "kind": "question",
      "user": "ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "body": "Pošlete prosím fakturu nebo smlouvu k platbě 7 260 Kč.",
      "files": []
    },
    {
      "id": 2,
      "kind": "reply",
      "user": "ucetni_ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "body": "Posílám smlouvu.",
      "files": [
        {
          "id": 4,
          "filename": "faktura.pdf",
          "content_type": "application/pdf",
          "byte_size": 142
        }
      ]
    }
  ]
}

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

POST Zrušení otevřené žádosti o podklad

/entities/{entity_id}/document_requests/{id}/cancel

Oprávnění
Zvláštní pravidlo
Pravidlo
Vyžaduje právo zápisu. Zrušit smí žadatel, dokud má ve firmě právo zápisu; jinak vlastník nebo účetní. Nesplnění vrátí 422.
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Uzavře otevřenou žádost jako zrušenou, s nepovinným důvodem.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
idcestacelé čísloanoID žádosti Příklad 88.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
reasontextneDůvod zrušení; delší než 2000 znaků se zkrátí

Odpověď

200 application/json Žádost se zprávami po zrušení (status cancelled).

Chyby této operace

StavKódKdy
422–Volající nesmí zrušit („Zrušit smí ten, kdo o podklad požádal; …“)
422–Žádost je uzavřená („Žádost je už uzavřená“)

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

Chování

Co změní
Zapíše zprávu cancelled s důvodem, nastaví stav cancelled a čas uzavření a zapíše událost document_request.cancelled.
Opakování
Druhé volání vrátí 422, protože žádost je uzavřená.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Doklad dorazil poštou."}' \
  https://techtools.cz/ucetnictvi-api/entities/1/document_requests/1/cancel

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/document_requests/1/cancel', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "reason": "Doklad dorazil poštou."
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "title": "Doklad k příchozí platbě",
  "status": "cancelled",
  "status_label": "Zrušeno",
  "subject": {
    "type": "bank_transaction",
    "id": 64,
    "label": "Platba 18 150,00 Kč z 25. 9. 2026",
    "amount": 18150.0,
    "currency": "CZK",
    "date": "2026-09-25",
    "partner": "Atelier Lumen s.r.o.",
    "message": "Úhrada – viz smlouva",
    "tx_status": "unmatched",
    "href": "#/banka?tx=64"
  },
  "requested_by": "ukazka",
  "assignee_id": 2,
  "assignee": "ucetni_ukazka",
  "due_on": "2026-10-05",
  "overdue": false,
  "created_at": "2026-09-28T10:00:00.000Z",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "closed_at": "2026-09-28T10:00:00.000Z",
  "action_needed": false,
  "can_reply": false,
  "can_verify": false,
  "can_cancel": false,
  "files_count": 1,
  "attachable_files": 0,
  "messages": [
    {
      "id": 1,
      "kind": "question",
      "user": "ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "body": "Pošlete prosím fakturu nebo smlouvu k platbě 7 260 Kč.",
      "files": []
    },
    {
      "id": 2,
      "kind": "reply",
      "user": "ucetni_ukazka",
      "at": "2026-09-28T10:00:00.000Z",
      "body": "Posílám smlouvu.",
      "files": [
        {
          "id": 4,
          "filename": "faktura.pdf",
          "content_type": "application/pdf",
          "byte_size": 142
        }
      ]
    }
  ]
}

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

GET Stažení souboru ze žádosti o podklad

/entities/{entity_id}/document_requests/{id}/files/{file_id}

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

Vrátí soubor přiložený k některé zprávě žádosti. PDF, JPEG, PNG, WebP a GIF se posílají k zobrazení (inline), HEIC, HEIF a XML jako příloha; vždy s hlavičkou Cache-Control private, no-store. Soubor, který k žádosti nepatří, vrátí 404.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
idcestacelé čísloanoID žádosti Příklad 88.
file_idcestacelé čísloanoID souboru z messages[].files[].id Příklad 902.

Odpověď

200 application/octet-stream Obsah souboru s uloženým Content-Type a původním názvem.

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/document_requests/1/files/4

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/document_requests/1/files/4', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
application/pdf, 142 bajtů (soubor faktura.pdf)