SaldoDokumentace Otevřít Saldo

Reference API

Daně, podání a doručenky

Daňové sestavy, XML pro EPO a přehledy OSVČ, kontrola na portálu finanční správy a předběžná kontrola přehledu u ČSSZ, platby úřadům, evidence podání, doručenky a výjimky bez doručenky a daňový kalendář. Saldo samo nic úřadu nepodává.

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

GET Daňový výkaz nebo přehled podle hodnoty report

/entities/{entity_id}/taxes/{report}

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

Sestaví a vrátí jeden daňový výkaz z aktuálních dat účetní jednotky; který, určuje hodnota report (viz varianty). Počítá se při každém volání z vystavených dokladů, účetních zápisů, bankovních pohybů a nastavení firmy. Operace nic neukládá a nic nepodává – XML, kontrolu v EPO a uložení podání obstarávají operace …/xml, …/epo, …/filing a /filings.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
reportcestatextanoDruh výkazu (viz varianty) Hodnoty: vat_return, control_statement, recap_statement, income_tax, regime, filings_check, depreciation, payments. Příklad vat_return.

Odpověď

200 application/json JSON podle varianty.

Chyby této operace

StavKódKdy
404–Neznámá hodnota report (error „Neznámý daňový výkaz“)

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

Chování

Co změní
Nic nezapisuje.

/entities/{entity_id}/taxes/vat_return – Přiznání k DPH za období

Sestaví přiznání k DPH (řádky formuláře DPHDP3) z vystavených dokladů druhů invoice_out, invoice_in, credit_out, credit_in, advance_out, advance_in, cash_in a cash_out, jejichž datum pro DPH spadá do období; koncepty a stornované doklady se nezapočítají. Období určí period; bez něj year a month, u čtvrtletního plátce bez month čtvrtletí quarter. Výchozí je běžící měsíc (čtvrtletí) aktuálního roku, u jiného roku prosinec (4. čtvrtletí). Bez period má identifikovaná osoba vždy měsíční období.

Parametry

NázevKdeTypPovinnýPopis
perioddotaztextneObdobí ve tvaru YYYY-MM nebo YYYY-Qn (např. 2026-08, 2026-Q3); má přednost před year, month a quarter. Neplatná hodnota skončí chybou 500. Příklad 2026-08.
yeardotazcelé čísloneRok období, když chybí period; výchozí (i při nečíselné hodnotě) aktuální rok Rozsah od 2000 do 2100. Příklad 2026.
monthdotazcelé čísloneMěsíc období, když chybí period; mimo 1–12 skončí chybou 500 Rozsah od 1 do 12. Příklad 8.
quarterdotazcelé čísloneČtvrtletí; použije se jen u čtvrtletního plátce, když chybí period i month Rozsah od 1 do 4. Příklad 3.

Pole odpovědi

PoleVýznam
periodObdobí: year, month, quarter, from, to, label, deadline (lhůta pro podání), key
report.periodObdobí, za které je přiznání sestavené (stejné jako period)
report.formOznačení tiskopisu přiznání, podle kterého jsou řádky sestavené (např. „25 5401 MFin 5401 vzor č. 26“)
report.rowsČástky podle čísel řádků přiznání
report.own_taxVlastní daňová povinnost (řádek 64)
report.excess_deductionNadměrný odpočet (řádek 65)
report.documentsČíslo řádku → ID dokladů, které do něj přispěly
report.warningsUpozornění k dokladům, které se nepodařilo zařadit nebo vyžadují kontrolu

Chyby této operace

StavKódKdy
422–Účetní jednotka není plátcem ani identifikovanou osobou (vat_status none) – „Účetní jednotka není registrovaná k DPH“
500–Neplatné period, month nebo quarter (výjimka z Vat::Period se neošetřuje)

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/taxes/vat_return?period=2026-08"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/taxes/vat_return?period=2026-08', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "period": {
    "year": 2026,
    "month": 8,
    "quarter": null,
    "from": "2026-08-01",
    "to": "2026-08-31",
    "label": "srpen 2026",
    "deadline": "2026-09-25",
    "key": "2026-08"
  },
  "report": {
    "period": {
      "year": 2026,
      "month": 8,
      "quarter": null,
      "from": "2026-08-01",
      "to": "2026-08-31",
      "label": "srpen 2026",
      "deadline": "2026-09-25",
      "key": "2026-08"
    },
    "form": "25 5401 MFin 5401 vzor č. 26",
    "rows": {
      "1": {
        "base": 211500.0,
        "tax": 44415.0
      },
      "2": {
        "base": 0.0,
        "tax": 0.0
      },
      "3": {
        "base": 0.0,
        "tax": 0.0
      },
      "4": {
        "base": 0.0,
        "tax": 0.0
      },
      "5": {
        "base": 28003.0,
        "tax": 5881.0
      },
      "6": {
        "base": 0.0,
        "tax": 0.0
      },
      "7": {
        "base": 0.0,
        "tax": 0.0
      },
      "8": {
        "base": 0.0,
        "tax": 0.0
      },
      "9": {
        "base": 0.0,
        "tax": 0.0
      },
      "10": {
        "base": 0.0,
        "tax": 0.0
      },
      "11": {
        "base": 0.0,
        "tax": 0.0
      },
      "12": {
        "base": 0.0,
        "tax": 0.0
      },
      "13": {
        "base": 0.0,
        "tax": 0.0
      },
      "14": {
        "base": 0.0,
        "tax": 0.0
      },
      "20": 0.0,
      "21": 0.0,
      "22": 0.0,
      "23": 0.0,
      "24": 0.0,
      "25": 0.0,
      "26": 0.0,
      "30": 0.0,
      "31": 0.0,
      "32": 0.0,
      "33": 0.0,
      "34": 0.0,
      "40": {
        "base": 20700.0,
        "full": 4347.0,
        "reduced": 0.0
      },
      "41": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "42": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "43": {
        "base": 28003.0,
        "full": 5881.0,
        "reduced": 0.0
      },
      "44": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "45": {
        "full": 0.0,
        "reduced": 0.0
      },
      "46": {
        "full": 10228.0,
        "reduced": 0.0
      },
      "47": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "48": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "50": 0.0,
      "51": {
        "with_credit": 0.0,
        "without_credit": 0.0
      },
      "52": {
        "coefficient": null,
        "deduction": 0.0
      },
      "53": {
        "coefficient": null,
        "change": 0.0
      },
      "60": 0.0,
      "61": 0.0,
      "62": 50296.0,
      "63": 10228.0,
      "64": 40068.0,
      "65": 0.0,
      "66": 0.0
    },
    "own_tax": 40068.0,
    "excess_deduction": 0.0,
    "documents": {
      "1": [
        19,
        20
      ],
      "5": [
        65
      ],
      "40": [
        62,
        63
      ],
      "43": [
        65
      ]
    },
    "warnings": []
  }
}

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

/entities/{entity_id}/taxes/control_statement – Kontrolní hlášení za období

Sestaví kontrolní hlášení (oddíly A.1–A.5 a B.1–B.3) ze stejných dokladů jako přiznání k DPH a přidá kontrolní součty proti řádkům přiznání. Období se volí stejně jako u vat_return. Identifikovaná osoba kontrolní hlášení nepodává (422 IDENTIFIED_KH); právnická osoba ho podává za každý měsíc, čtvrtletní období proto odmítne (422 MONTHLY_KH).

Parametry

NázevKdeTypPovinnýPopis
perioddotaztextneObdobí YYYY-MM nebo YYYY-Qn; má přednost před year, month a quarter. Neplatná hodnota skončí chybou 500. Příklad 2026-08.
yeardotazcelé čísloneRok období, když chybí period; výchozí aktuální rok Rozsah od 2000 do 2100. Příklad 2026.
monthdotazcelé čísloneMěsíc období, když chybí period Rozsah od 1 do 12. Příklad 8.
quarterdotazcelé čísloneČtvrtletí u čtvrtletního plátce – jen pro fyzickou osobu Rozsah od 1 do 4. Příklad 3.

Pole odpovědi

PoleVýznam
periodObdobí (jako u vat_return)
report.sectionsOddíly a1, a2, a3, a4, b1, b2 jako seznamy dokladů; a5 a b3 jako souhrnné částky s document_ids
report.controlKontrolní součty: base a return_rows – řádky přiznání, se kterými se porovnávají
report.warningsUpozornění k dokladům

Chyby této operace

StavKódKdy
422–Účetní jednotka není registrovaná k DPH
422IDENTIFIED_KHIdentifikovaná osoba kontrolní hlášení nepodává (§ 101c ZDPH)
422MONTHLY_KHPrávnická osoba zvolila čtvrtletí – kontrolní hlášení podává za každý měsíc (§ 101e ZDPH)
500–Neplatné period, month nebo quarter

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/taxes/control_statement?period=2026-08"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/taxes/control_statement?period=2026-08', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "period": {
    "year": 2026,
    "month": 8,
    "quarter": null,
    "from": "2026-08-01",
    "to": "2026-08-31",
    "label": "srpen 2026",
    "deadline": "2026-09-25",
    "key": "2026-08"
  },
  "report": {
    "period": {
      "year": 2026,
      "month": 8,
      "quarter": null,
      "from": "2026-08-01",
      "to": "2026-08-31",
      "label": "srpen 2026",
      "deadline": "2026-09-25",
      "key": "2026-08"
    },
    "sections": {
      "a1": [],
      "a2": [
        {
          "document_id": 65,
          "country": "DE",
          "vat_id": "998877665",
          "number": "2026083526",
          "dppd": "2026-08-07",
          "base1": 28002.5,
          "tax1": 5880.53,
          "base2": 0.0,
          "tax2": 0.0,
          "base3": 0.0,
          "tax3": 0.0
        }
      ],
      "a3": [],
      "a4": [
        {
          "document_id": 20,
          "partner_dic": "90000013",
          "number": "FV20260020",
          "dppd": "2026-08-15",
          "base1": 115500.0,
          "tax1": 24255.0,
          "base2": 0.0,
          "tax2": 0.0,
          "base3": 0.0,
          "tax3": 0.0,
          "bad_debt": false
        }
      ],
      "a5": {
        "base1": 96000.0,
        "tax1": 20160.0,
        "base2": 0.0,
        "tax2": 0.0,
        "base3": 0.0,
        "tax3": 0.0,
        "document_ids": [
          19
        ]
      },
      "b1": [],
      "b2": [
        {
          "document_id": 62,
          "partner_dic": "90000056",
          "number": "2026085713",
          "dppd": "2026-08-02",
          "base1": 14500.0,
          "tax1": 3045.0,
          "base2": 0.0,
          "tax2": 0.0,
          "base3": 0.0,
          "tax3": 0.0,
          "proportional": false,
          "bad_debt": false
        }
      ],
      "b3": {
        "base1": 6200.0,
        "tax1": 1302.0,
        "base2": 0.0,
        "tax2": 0.0,
        "base3": 0.0,
        "tax3": 0.0,
        "document_ids": [
          63,
          64
        ]
      }
    },
    "control": {
      "a4_a5_basic": {
        "base": 211500.0,
        "return_rows": [
          1
        ]
      },
      "a4_a5_reduced": {
        "base": 0.0,
        "return_rows": [
          2
        ]
      },
      "b2_b3_basic": {
        "base": 20700.0,
        "return_rows": [
          40
        ]
      },
      "b2_b3_reduced": {
        "base": 0.0,
        "return_rows": [
          41
        ]
      },
      "a1": {
        "base": 0.0,
        "return_rows": [
          25
        ]
      },
      "b1_basic": {
        "base": 0.0,
        "return_rows": [
          10
        ]
      },
      "b1_reduced": {
        "base": 0.0,
        "return_rows": [
          11
        ]
      },
      "a2": {
        "base": 28002.5,
        "return_rows": [
          3,
          4
        ]
      }
    },
    "warnings": []
  }
}

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

/entities/{entity_id}/taxes/recap_statement – Souhrnné hlášení za období

Sestaví souhrnné hlášení VIES z vystavených prodejních dokladů v režimu dodání zboží, poskytnutí služby nebo třístranného obchodu do jiného státu EU, seskupených podle státu, DIČ odběratele a kódu plnění. Období se volí stejně jako u vat_return.

Parametry

NázevKdeTypPovinnýPopis
perioddotaztextneObdobí YYYY-MM nebo YYYY-Qn; má přednost před year, month a quarter. Neplatná hodnota skončí chybou 500. Příklad 2026-08.
yeardotazcelé čísloneRok období, když chybí period; výchozí aktuální rok Rozsah od 2000 do 2100. Příklad 2026.
monthdotazcelé čísloneMěsíc období, když chybí period Rozsah od 1 do 12. Příklad 8.
quarterdotazcelé čísloneČtvrtletí u čtvrtletního plátce Rozsah od 1 do 4. Příklad 3.

Pole odpovědi

PoleVýznam
report.rowsŘádky: country, vat_id, code (kód plnění), count, value (Kč), document_ids
report.total_valueSoučet hodnot všech řádků
report.warningsUpozornění, např. čtvrtletní období u dodání zboží

Chyby této operace

StavKódKdy
422–Účetní jednotka není registrovaná k DPH
500–Neplatné period, month nebo quarter

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/taxes/recap_statement?period=2026-08"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/taxes/recap_statement?period=2026-08', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "period": {
    "year": 2026,
    "month": 8,
    "quarter": null,
    "from": "2026-08-01",
    "to": "2026-08-31",
    "label": "srpen 2026",
    "deadline": "2026-09-25",
    "key": "2026-08"
  },
  "report": {
    "period": {
      "year": 2026,
      "month": 8,
      "quarter": null,
      "from": "2026-08-01",
      "to": "2026-08-31",
      "label": "srpen 2026",
      "deadline": "2026-09-25",
      "key": "2026-08"
    },
    "rows": [],
    "total_value": 0.0,
    "warnings": []
  }
}

/entities/{entity_id}/taxes/income_tax – Výpočet daně z příjmů za rok

Spočítá daň z příjmů za rok year. U OSVČ (kind dpfo) z peněžního deníku nebo účetnictví a daňového profilu: základ daně, slevy, daňové zvýhodnění, sociální a zdravotní pojištění a zálohy na další rok. U právnické osoby (kind dppo) z účetní závěrky za účetní období začínající v roce year: úpravy základu daně včetně rozdílu účetních a daňových odpisů, daň, zálohy a doplatek. Rok bez zákonných sazeb v Saldu (mimo 2024–2026) vrátí 422.

Parametry

NázevKdeTypPovinnýPopis
yeardotazcelé čísloneZdaňovací období (rok); výchozí aktuální rok Rozsah od 2000 do 2100. Příklad 2026.

Pole odpovědi

PoleVýznam
kinddpfo (OSVČ) nebo dppo (právnická osoba)
booksJen dpfo: income, expenses, depreciation a source (peněžní deník nebo účetnictví)
resultVýpočet: mimo jiné tax, form_rows (řádky přiznání) a warnings; u dpfo také sp, zp, tax_advances a tax_balance, u dppo advances a balance
profileDaňový profil firmy, ze kterého výpočet vychází
statements_resultJen dppo: výsledek hospodaření z výkazu zisku a ztráty
non_deductibleJen dppo: daňově neuznatelné náklady podle účtů
statementsJen dppo: účetní závěrka (rozvaha a výkaz zisku a ztráty)

Chyby této operace

StavKódKdy
422–Pro rok nejsou v Saldu zákonné sazby („Pro rok … nejsou k dispozici zákonné sazby“)

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/2/taxes/income_tax?year=2026"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/income_tax?year=2026', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "kind": "dpfo",
  "books": {
    "income": 784689.6,
    "expenses": 163711.05,
    "depreciation": 16998.0,
    "source": "peněžní deník"
  },
  "result": {
    "year": 2026,
    "income": 784689.6,
    "expenses": 180709.05,
    "expense_method": {
      "kind": "actual",
      "parts": []
    },
    "profit": 603980.55,
    "employment_income": 0.0,
    "tax_base": 603980.55,
    "deductions": [],
    "tax_base_rounded": 603900.0,
    "tax_before_credits": 90585.0,
    "credits": [
      {
        "key": "taxpayer",
        "label": "Základní sleva na poplatníka",
        "row": "64",
        "months": 12,
        "amount": 30840.0,
        "basis": "§ 35ba odst. 1 písm. a) ZDP"
      }
    ],
    "child_benefit": {
      "total": 15204.0,
      "used_as_credit": 15204.0,
      "bonus": 0.0,
      "children": [
        {
          "order": 1,
          "months": 12,
          "ztpp": false,
          "amount": 15204.0
        }
      ]
    },
    "tax": 44541.0,
    "bonus": 0.0,
    "tax_withheld": 0.0,
    "tax_advances_paid": 0.0,
    "tax_balance": 44541.0,
    "tax_advances": {
      "last_known_tax": 44541.0,
      "frequency": "half_yearly",
      "amount": 17900.0,
      "period": {
        "from": "2027-05-04",
        "to": "2028-05-02"
      },
      "schedule": [
        {
          "due_on": "2027-06-15",
          "amount": 17900.0
        },
        {
          "due_on": "2027-12-15",
          "amount": 17900.0
        }
      ],
      "basis": "§ 38a ZDP"
    },
    "sp": {
      "participates": true,
      "decisive_amount": null,
      "assessment_base": 332190.0,
      "minimum_base": 205668.0,
      "maximum_base": 2350416.0,
      "applied_base": 332190.0,
      "rate": 0.292,
      "premium": 97000.0,
      "discount": 0.0,
      "premium_after_discount": 97000.0,
      "advances_paid": 0.0,
      "balance": 97000.0,
      "monthly_advance_next": 8084.0,
      "sickness": null,
      "basis": "§ 5b, § 7 odst. 1 písm. e) bod 1, § 14 a § 15a zákona č. 589/1992 Sb."
    },
    "zp": {
      "minimum_applies": true,
      "assessment_base": 301990.275,
      "minimum_base": 293802.0,
      "applied_base": 301990.275,
      "rate": 0.135,
      "premium": 40769.0,
      "advances_paid": 0.0,
      "balance": 40769.0,
      "monthly_advance_next": 3398.0,
      "basis": "§ 2, § 3a a § 8 zákona č. 592/1992 Sb."
    },
    "total_levies": 182310.0,
    "net_income": 421670.55,
    "effective_rate": 0.2323,
    "form_rows": {
      "37": 603980.55,
      "41": 603980.55,
      "42": 603980.55,
      "45": 603980.55,
      "55": 603980.55,
      "56": 603900.0,
      "57": 90585.0,
      "58": 90585.0,
      "60": 90585.0,
      "70": 30840.0,
      "71": 59745.0,
      "72": 15204.0,
      "73": 15204.0,
      "74": 44541.0,
      "75": 44541.0,
      "77": 44541.0,
      "91": 44541.0,
      "64": 30840.0,
      "101": 784689.6,
      "102": 180709.05,
      "104": 603980.55,
      "113": 603980.55
    },
    "warnings": [
      "Minima pro rok 2027 zatím nejsou v sazbách, nové zálohy jsou spočteny s minimy roku 2026.",
      "Minimální zálohy hlavní činnosti za leden až červen 2026 činily 5 720 Kč (40 % průměrné mzdy). Zákon č. 90/2026 Sb. snížil minimum od 1. 7. 2026 na 35 % (5 005 Kč) a přehled za rok 2026 se počítá s minimem 35 % za celý rok. Kdo měl platit minimální zálohu, může do 31. 12. 2026 písemně požádat o vrácení rozdílu, jinak se přeplatek zohlední v přehledu; nedoplatek do výše rozdílu a penále z něj zanikly, byla-li zaplacena aspoň nová výše zálohy (čl. II body 2, 3 a 5)."
    ]
  },
  "profile": {
    "children": [
      {
        "order": 1,
        "first_name": "Eliška",
        "last_name": "Ukázková",
        "birth_number": "1855120003"
      }
    ],
    "main_activity": true,
    "birth_number": "8001010006",
    "ossz_code": "110",
    "cssz_variable_symbol": "12345678",
    "health_insurer": "111"
  }
}

/entities/{entity_id}/taxes/regime – Srovnání daňových režimů OSVČ za rok

Porovná za rok year odvody OSVČ (daň, sociální a zdravotní pojištění) při skutečných výdajích, výdajových paušálech a paušální dani a doporučí nejvýhodnější variantu, na kterou má nárok. Vychází z příjmů a výdajů v knihách a z daňového profilu. U právnické osoby se volání neodmítne, výsledek má ale smysl jen u OSVČ.

Parametry

NázevKdeTypPovinnýPopis
yeardotazcelé čísloneRok srovnání; výchozí aktuální rok Rozsah od 2000 do 2100. Příklad 2026.

Pole odpovědi

PoleVýznam
yearRok srovnání
incomePříjmy za rok
actual_expensesSkutečné výdaje včetně daňových odpisů
income_kindDruh příjmů pro výdajový paušál (např. trade)
currentKlíč současného režimu: actual_expenses, flat_rate_80, flat_rate_60, flat_rate_40, flat_rate_30 (výdajový paušál v procentech), flat_rate_mixed nebo flat_tax
recommendedKlíč doporučeného režimu (stejné hodnoty jako current)
savingsÚspora doporučeného režimu proti současnému
optionsVšechny varianty s odvody, eligible a savings_vs_current
summarySlovní shrnutí
warningsUpozornění
booksPříjmy a výdaje z knih, ze kterých srovnání vychází

Chyby této operace

StavKódKdy
422–Pro rok nejsou v Saldu zákonné sazby

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/2/taxes/regime?year=2026"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/regime?year=2026', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "year": 2026,
  "income": 784689.6,
  "actual_expenses": 180709.05,
  "income_kind": "trade",
  "current": "actual_expenses",
  "recommended": "flat_rate_60",
  "savings": 81564.0,
  "options": [
    {
      "key": "flat_rate_60",
      "label": "Výdajový paušál 60 %",
      "eligible": true,
      "rank": 1,
      "basis": "§ 7 odst. 7 písm. b) ZDP",
      "expenses": 470813.76,
      "profit": 313875.84,
      "tax": 1026.0,
      "bonus": 0.0,
      "sp": 60056.0,
      "zp": 39664.0,
      "sickness": 0.0,
      "total_levies": 100746.0,
      "net_income": 503234.55,
      "effective_rate": 0.1284,
      "reasons": [],
      "notes": [
        "Minima pro rok 2027 zatím nejsou v sazbách, nové zálohy jsou spočteny s minimy roku 2026.",
        "Minimální zálohy hlavní činnosti za leden až červen 2026 činily 5 720 Kč (40 % průměrné mzdy). Zákon č. 90/2026 Sb. snížil minimum od 1. 7. 2026 na 35 % (5 005 Kč) a přehled za rok 2026 se počítá s minimem 35 % za celý rok. Kdo měl platit minimální zálohu, může do 31. 12. 2026 písemně požádat o vrácení rozdílu, jinak se přeplatek zohlední v přehledu; nedoplatek do výše rozdílu a penále z něj zanikly, byla-li zaplacena aspoň nová výše zálohy (čl. II body 2, 3 a 5)."
      ],
      "savings_vs_current": 81564.0
    },
    {
      "key": "flat_tax",
      "label": "Paušální daň – 1. pásmo",
      "eligible": true,
      "rank": 2,
      "basis": "§ 2a, § 7a a § 38lk ZDP",
      "band": 1,
      "monthly": 9162.0,
      "tax": 1200.0,
      "bonus": 0.0,
      "sp": 69072.0,
      "zp": 39672.0,
      "sickness": 0.0,
      "total_levies": 109944.0,
      "net_income": 494036.55,
      "effective_rate": 0.1401,
      "reasons": [],
      "notes": [
        "Paušální daň zahrnuje daň, sociální i zdravotní pojištění; je-li vaše daň rovna paušální dani, nepodáváte daňové přiznání ani přehledy pro ČSSZ a zdravotní pojišťovnu (§ 38lh ZDP, § 15 odst. 1 zákona č. 589/1992 Sb., § 24 odst. 2 zákona č. 592/1992 Sb.).",
        "V paušálním režimu nelze uplatnit slevy na dani, daňové zvýhodnění na děti, daňový bonus ani odpočty od základu daně."
      ],
      "savings_vs_current": 72366.0
    }
  ],
  "summary": "Nejvýhodnější je výdajový paušál 60 %: odvody 100 746 Kč ročně, o 81 564 Kč méně než současný režim (skutečné výdaje v daňové evidenci).",
  "warnings": [],
  "books": {
    "income": 784689.6,
    "expenses": 163711.05,
    "depreciation": 16998.0,
    "source": "peněžní deník"
  }
}

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

/entities/{entity_id}/taxes/filings_check – Připravenost ročních podání za rok

Zkusí za rok year sestavit přiznání k dani z příjmů (DPFDP7 u OSVČ, DPPDP9 u právnické osoby) a u OSVČ i přehled pro ČSSZ (OSVC25) a pro zdravotní pojišťovnu (formát v6). U každého formuláře vrátí, co chybí a kde to doplnit, upozornění, souhrn částek, lhůtu podle způsobu podání, adresáta a už uložená podání. Mezi problémy se objeví i omezení Salda: DPFO jen za roky 2024–2025, přehledy jen za rok 2025 a DPPO za celé zdaňovací období 2026 zatím ne. Nic neukládá ani nepodává.

Parametry

NázevKdeTypPovinnýPopis
yeardotazcelé čísloneRok podání; výchozí aktuální rok Rozsah od 2000 do 2100. Příklad 2025.

Pole odpovědi

PoleVýznam
yearRok
formsFormuláře: kind (dpfo, dppo, prehled_sp, prehled_zp), title, form, ready, problems, warnings, summary, deadline, recipient, filings
forms[].problemsmessage a fix – kde údaj doplnit: settings (nastavení firmy), profile (daňový profil), books (účetnictví) nebo null; u přehledů i field
forms[].deadlinedate, mode, label a options – lhůty pro jednotlivé způsoby podání, posunuté na pracovní den
forms[].filingsUložená podání tohoto druhu za rok
optionsJen OSVČ: seznam správ sociálního zabezpečení a zdravotních pojišťoven; jinak prázdný objekt

Chyby této operace

StavKódKdy
422–Pro rok nejsou v Saldu zákonné sazby

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

Příklad

Rok 2025 je poslední, za který Saldo sestaví všechny tři formuláře OSVČ.

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/2/taxes/filings_check?year=2025"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/filings_check?year=2025', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "year": 2025,
  "forms": [
    {
      "kind": "dpfo",
      "title": "Daňové přiznání",
      "form": "DPFDP7",
      "ready": true,
      "problems": [],
      "warnings": [
        "Daňový bonus nenáleží: příjmy podle § 6 a § 7 nedosáhly 6násobku minimální mzdy (124 800 Kč, § 35c ZDP).",
        "Minimální záloha hlavní činnosti činila v roce 2026 do června 5 720 Kč, od července 5 005 Kč (čl. I a čl. II bod 1 zákona č. 90/2026 Sb.)."
      ],
      "summary": [
        {
          "label": "Daň",
          "value": 0.0
        },
        {
          "label": "Doplatek daně",
          "value": 0.0
        }
      ],
      "deadline": {
        "date": "2026-05-04",
        "mode": "electronic",
        "label": "elektronicky",
        "options": [
          {
            "mode": "paper",
            "label": "do 1. dubna",
            "date": "2026-04-01"
          },
          {
            "mode": "electronic",
            "label": "elektronicky",
            "date": "2026-05-04"
          }
        ]
      },
      "recipient": {
        "name": "Finanční správa – EPO",
        "portal": "https://mojedane.gov.cz/",
        "channel": "epo",
        "office": "Finanční úřad pro hlavní město Prahu, Územní pracoviště pro Prahu 2"
      },
      "filings": []
    },
    {
      "kind": "prehled_sp",
      "title": "Přehled pro ČSSZ",
      "form": "OSVC25",
      "ready": true,
      "problems": [],
      "warnings": [],
      "summary": [
        {
          "label": "Pojistné",
          "value": 57098.0
        },
        {
          "label": "Doplatek",
          "value": 57098.0
        }
      ],
      "deadline": {
        "date": "2026-05-04",
        "mode": "paper",
        "label": "přiznání podané do 1. dubna",
        "options": [
          {
            "mode": "paper",
            "label": "přiznání podané do 1. dubna",
            "date": "2026-05-04"
          },
          {
            "mode": "electronic",
            "label": "přiznání podané elektronicky po 1. dubnu",
            "date": "2026-06-04"
          }
        ]
      },
      "recipient": {
        "name": "Česká správa sociálního zabezpečení – e-Podání",
        "databox": "5ffu6xk",
        "portal": "https://eportal.cssz.cz/web/portal/-/tiskopisy/osvc-2025",
        "office": {
          "code": "110",
          "name": "PSSZ Praha 10"
        }
      },
      "filings": []
    }
  ],
  "options": {
    "offices": [
      {
        "code": "110",
        "name": "PSSZ Praha 10"
      },
      {
        "code": "111",
        "name": "PSSZ Praha 1"
      }
    ],
    "insurers": [
      {
        "code": "111",
        "name": "Všeobecná zdravotní pojišťovna ČR",
        "databox": "i48ae3q"
      },
      {
        "code": "201",
        "name": "Vojenská zdravotní pojišťovna ČR",
        "databox": "p3aaext"
      }
    ]
  }
}

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

/entities/{entity_id}/taxes/depreciation – Daňové odpisy za rok

Vrátí součet daňově uznatelných odpisů za rok year z veškerého odpisovaného majetku, který má daňovou odpisovou skupinu.

Parametry

NázevKdeTypPovinnýPopis
yeardotazcelé čísloneRok; výchozí aktuální rok Rozsah od 2000 do 2100. Příklad 2026.

Pole odpovědi

PoleVýznam
yearRok
amountDaňové odpisy celkem (Kč)

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/taxes/depreciation?year=2026"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/taxes/depreciation?year=2026', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "year": 2026,
  "amount": 154798.0
}

/entities/{entity_id}/taxes/payments – Platby finančnímu úřadu, ČSSZ a zdravotním pojišťovnám

Vrátí platby se splatností v měsících from–to: DPH nebo nadměrný odpočet, zálohy na daň z příjmů, paušální daň, zálohy OSVČ na sociální a zdravotní pojištění, nemocenské pojištění, odvody za zaměstnance, srážkovou a silniční daň. U každé platby účet, IBAN, symboly, termín posunutý na pracovní den, QR Platbu (SPAYD) a stav. Za zaplacenou se platba považuje, když mezi odchozími bankovními pohyby v Kč je pohyb se správnou částkou a shodným účtem nebo variabilním symbolem, s datem od začátku sledovaného období do 60 dnů po splatnosti (u silniční daně bez částky musí sedět účet i symbol). Chybějící údaje vrátí v missing, u OSVČ i s návrhem nalezeným v jejích platbách.

Parametry

NázevKdeTypPovinnýPopis
fromdotaztextnePrvní měsíc ve tvaru YYYY-MM (nebo datum YYYY-MM-DD; použije se jeho měsíc); výchozí předchozí měsíc Příklad 2026-08.
todotaztextnePoslední měsíc ve tvaru YYYY-MM (nebo datum YYYY-MM-DD; použije se konec jeho měsíce); výchozí měsíc o dva po aktuálním Příklad 2026-11.

Pole odpovědi

PoleVýznam
fromPrvní den rozsahu
toPoslední den rozsahu
todayDnešní datum, ke kterému je stav plateb spočten
nextKlíč nejbližší nezaplacené platby (přednostně po splatnosti)
summaryPočet a součet plateb podle stavu due, overdue, paid, refund a počet odhadů (estimate)
itemsPlatby: key, kind, authority (fu, cssz, zp), title, period, due_date, statutory_date, shifted, shift_basis, recipient, account, iban, bic, amount, currency, variable_symbol, constant_symbol, specific_symbol, message, basis, source, status, paid, accepts a reduced (další částky, které se také uznají jako úhrada), ready, explanation, spayd, estimate, estimate_note, missing, notes
items[].statuspaid (spárováno s pohybem), due, overdue, nothing (nic k platbě), refund (vratka nadměrného odpočtu)
missingChybějící údaje: field, label, fix, where, items a suggestion (value, display, count, last_on) nalezený v bankovních pohybech
notesPoznámky k výpočtu
optionsČíselníky správ sociálního zabezpečení a pojišťoven a zvolené hodnoty
sourcesZdroje čísel účtů a symbolů

Chyby této operace

StavKódKdy
422–Konec rozsahu je před začátkem („Konec období musí být po jeho začátku“)
422–Rozsah je delší než 24 měsíců

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

Chování

Limity
Nejvýše 24 měsíců v jednom dotazu.

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/2/taxes/payments?from=2026-08"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/payments?from=2026-08', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "from": "2026-08-01",
  "to": "2026-11-30",
  "today": "2026-09-28",
  "next": "social-2026-09",
  "summary": {
    "due": {
      "count": 4,
      "total": 18321.0
    },
    "overdue": {
      "count": 0,
      "total": 0.0
    },
    "paid": {
      "count": 4,
      "total": 14923.0
    },
    "refund": {
      "count": 0,
      "total": 0.0
    },
    "estimate": 0
  },
  "items": [
    {
      "key": "health-2026-07",
      "kind": "health_advance",
      "authority": "zp",
      "title": "Záloha na zdravotní pojištění",
      "period": {
        "key": "2026-07",
        "label": "červenec 2026",
        "phrase": "za červenec 2026"
      },
      "due_date": "2026-08-10",
      "statutory_date": "2026-08-08",
      "shifted": true,
      "recipient": {
        "name": "Všeobecná zdravotní pojišťovna ČR",
        "short": "VZP",
        "code": "111"
      },
      "account": "1112001221/0710",
      "iban": "CZ7407100000001112001221",
      "bic": "CNBACZPP",
      "amount": 3306.0,
      "currency": "CZK",
      "variable_symbol": "8001010006",
      "constant_symbol": "558",
      "specific_symbol": null,
      "message": "Záloha ZP červenec 2026",
      "basis": "§ 7 odst. 2 zákona č. 592/1992 Sb.: záloha je splatná od prvního dne měsíce, za který se platí, do osmého dne následujícího měsíce; Pojistné samoplátců (OSVČ, OBZP) na účet VZP podle kraje; VS zpravidla rodné číslo, případně číslo přidělené pojišťovnou; KS 558 pro převodní příkaz",
      "source": "https://www.vzp.cz/platci/cisla-uctu",
      "shift_basis": "Připadne-li poslední den splatnosti na sobotu, neděli nebo svátek, je posledním dnem nejbližší pracovní den (metodika VZP 2.2 a 2.4, RBP)",
      "missing": [],
      "notes": [
        "Minimální záloha. Pokud vám pojišťovna podle přehledu stanovila vyšší zálohu, platíte ji.",
        "VZP má pro každý kraj jiný účet – Saldo vybralo účet podle vašeho finančního úřadu (Finanční úřad pro hlavní město Prahu). Pokud jste u pobočky v jiném kraji, ověřte účet na https://www.vzp.cz/platci/cisla-uctu."
      ],
      "estimate": false,
      "estimate_note": null,
      "status": "paid",
      "accepts": [],
      "reduced": null,
      "paid": {
        "on": "2026-07-07",
        "amount": 3306.0,
        "transaction_id": 181,
        "bank_account_id": 4,
        "late": false
      },
      "ready": true,
      "explanation": "Záloha na zdravotní pojištění za červenec 2026 – splatné do 10. 8. (8. 8. je sobota)",
      "spayd": "SPD*1.0*ACC:CZ7407100000001112001221*AM:3306.00*CC:CZK*RN:Vseobecna zdravotni pojistovna CR*MSG:Zaloha ZP cervenec 2026*X-VS:8001010006*X-KS:558"
    },
    {
      "key": "social-2026-08",
      "kind": "social_advance",
      "authority": "cssz",
      "title": "Záloha na sociální pojištění",
      "period": {
        "key": "2026-08",
        "label": "srpen 2026",
        "phrase": "za srpen 2026"
      },
      "due_date": "2026-08-31",
      "statutory_date": "2026-08-31",
      "shifted": false,
      "recipient": {
        "name": "PSSZ Praha 10",
        "short": "PSSZ Praha 10",
        "code": "110"
      },
      "account": "1011-7921101/0710",
      "iban": "CZ0707100010110007921101",
      "bic": "CNBACZPP",
      "amount": 5005.0,
      "currency": "CZK",
      "variable_symbol": "12345678",
      "constant_symbol": null,
      "specific_symbol": null,
      "message": "Záloha SP srpen 2026",
      "basis": "§ 14a odst. 1 zákona č. 589/1992 Sb.: záloha je splatná od prvního do posledního dne kalendářního měsíce, za který se platí; záloha za měsíc zahájení činnosti je splatná do konce následujícího měsíce",
      "source": "https://www.cssz.gov.cz/web/cz/kontakty/region/ossz/praha",
      "shift_basis": null,
      "missing": [],
      "notes": [
        "Minimální záloha hlavní činnosti. Pokud vám správa podle přehledu stanovila vyšší zálohu, platíte ji.",
        "ČSSZ doporučuje zadat příkaz nejpozději 26. dne měsíce; za den platby se považuje den připsání na účet správy"
      ],
      "estimate": false,
      "estimate_note": null,
      "status": "paid",
      "accepts": [],
      "reduced": null,
      "paid": {
        "on": "2026-08-28",
        "amount": 5005.0,
        "transaction_id": 184,
        "bank_account_id": 4,
        "late": false
      },
      "ready": true,
      "explanation": "Záloha na sociální pojištění za srpen 2026 – splatné do 31. 8.",
      "spayd": "SPD*1.0*ACC:CZ0707100010110007921101*AM:5005.00*CC:CZK*RN:PSSZ Praha 10*MSG:Zaloha SP srpen 2026*X-VS:12345678"
    }
  ],
  "missing": [],
  "notes": [
    "Zálohy na daň z příjmů: Saldo nemá účetnictví za rok 2025, poslední známou daň proto nezná. Přesáhla-li 30 000 Kč, platíte zálohy (§ 38a ZDP) na účet 721-77628031/0710."
  ],
  "options": {
    "offices": [
      {
        "code": "110",
        "name": "PSSZ Praha 10"
      },
      {
        "code": "111",
        "name": "PSSZ Praha 1"
      }
    ],
    "insurers": [
      {
        "code": "111",
        "name": "Všeobecná zdravotní pojišťovna ČR"
      },
      {
        "code": "201",
        "name": "Vojenská zdravotní pojišťovna ČR"
      }
    ],
    "ossz_code": "110",
    "employer_ossz_code": null,
    "health_insurer": "111",
    "employer_variable_symbol": null
  },
  "sources": {
    "offices": "https://financnisprava.gov.cz/assets/cs/prilohy/d-placeni-dani/Priloha_1_bankovni_ucty_fu_sfu_01012026.pdf",
    "prefixes": "https://financnisprava.gov.cz/assets/cs/prilohy/d-placeni-dani/Priloha_2_pbu_fu_mimo_sfu_01012026.pdf",
    "symbols": "https://financnisprava.gov.cz/assets/cs/prilohy/d-placeni-dani/Jak_spravne_zaplatit_dan_FU_v_roce_2026.pdf",
    "cssz": "https://www.cssz.gov.cz/web/cz/kontakty/region/ossz",
    "health_insurers": {
      "111": "https://www.vzp.cz/platci/cisla-uctu",
      "201": "https://www.vozp.cz/bankovni-spojeni",
      "205": "https://www.cpzp.cz/clanek/4754-0-Bankovni-ucty-pro-platce-pojistneho.html",
      "207": "https://www.ozp.cz/pro-platce/obe
…

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

GET XML podání pro EPO nebo přehled OSVČ ke stažení

/entities/{entity_id}/taxes/{report}/xml

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

Sestaví a vrátí soubor XML s podáním: přiznání k DPH, kontrolní a souhrnné hlášení a přiznání k dani z příjmů ve formátu EPO (portál Moje daně), přehledy OSVČ ve formátech ČSSZ a zdravotních pojišťoven. Soubor se jen vrátí ke stažení: Saldo ho nikam neposílá a jako podání ho neukládá (k tomu slouží POST /filings a POST …/taxes/{report}/filing). Na rozdíl od GET …/taxes/vat_return operace nekontroluje registraci k DPH; u firmy neregistrované k DPH vznikne u dph, kh a sh podání bez dokladů.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
reportcestatextanoDruh podání (viz varianty) Hodnoty: dph, kh, sh, income_tax, prehled_sp, prehled_zp. Příklad dph.
yeardotazcelé čísloneRok – u DPH, když chybí period; u daně z příjmů a přehledů zdaňovací období; výchozí aktuální rok Rozsah od 2000 do 2100. Příklad 2026.
filing_typedotaztextneDruh podání: B řádné, O opravné, D dodatečné, E opravné dodatečné, N následné. Význam se liší podle varianty (viz varianty); neznámá hodnota se bere jako B. Hodnoty: B, O, D, E, N. Výchozí B. Příklad B.
datedotazdatumneDatum podání (vyplnění) uvedené v XML; výchozí dnešní datum Příklad 2026-09-25.
reasons_found_ondotazdatumneDen zjištění důvodů pro dodatečné či následné podání (u přehledu ČSSZ datum zjištění nové výše vyměřovacího základu u opravného přehledu) Příklad 2026-09-10.

Odpověď

200 application/xml Soubor XML (Content-Disposition attachment). Název: {druh}-{DIČ nebo IČO}-{období}.xml u DPH, KH, SH a daně z příjmů (druh dph, kh, sh, dpfo, dppo), prehled-osvc-{rok}-cssz.xml a prehled-osvc-{rok}-{pojišťovna}.xml u přehledů (u opravného s příponou -opravny).

Chyby této operace

StavKódKdy
422–Nelze sestavit XML (chybí nebo je neplatný údaj firmy či dokladu, chybí den zjištění důvodů u dodatečného podání, rok není podporovaný…); error obsahuje důvod česky
422–Neznámá hodnota report („Neznámý typ podání“)

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

Chování

Co změní
Po úspěšném sestavení zapíše do historie firmy událost tax.xml („Vytvořeno XML …“), a to i při GET, u člena jen pro čtení a u API klíče jen pro čtení. Nic jiného neukládá a nic nikam neposílá.

/entities/{entity_id}/taxes/dph/xml – Přiznání k DPH (DPHDP3) jako XML

XML přiznání k DPH ve formátu EPO DPHDP3 verze 03.01 za období zvolené jako u GET …/taxes/vat_return. filing_type: B řádné, O opravné, D dodatečné, E opravné dodatečné; N se zapíše jako dodatečné. U D, E a N je povinný reasons_found_on.

Parametry

NázevKdeTypPovinnýPopis
perioddotaztextneObdobí YYYY-MM nebo YYYY-Qn; má přednost před year, month a quarter. Neplatná hodnota skončí chybou 500. Příklad 2026-08.
monthdotazcelé čísloneMěsíc, když chybí period Rozsah od 1 do 12. Příklad 8.
quarterdotazcelé čísloneČtvrtletí čtvrtletního plátce, když chybí period i month Rozsah od 1 do 4. Příklad 3.

Chyby této operace

StavKódKdy
422–Dodatečné podání bez reasons_found_on („Dodatečné či následné podání vyžaduje den zjištění důvodů pro jeho podání“)
422–Neplatné DIČ, finanční úřad, územní pracoviště nebo kód CZ-NACE firmy
500–Neplatné period, month nebo quarter

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/taxes/dph/xml?period=2026-08"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/taxes/dph/xml?period=2026-08', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<Pisemnost nazevSW="Saldo" verzeSW="1.0">
  <DPHDP3 verzePis="03.01">
    <VetaD dokument="DP3" k_uladis="DPH" typ_platce="P" dapdph_forma="B" rok="2026" mesic="8" d_poddp="28.09.2026" c_okec="621000" trans="A"/>
    <VetaP c_ufo="451" c_pracufo="2001" dic="99999994" typ_ds="P" zkrobchjm="Ukázková firma s.r.o." ulice="Na Příkopě" c_pop="859" c_orient="22" naz_obce="Praha" psc="11000" stat="ČESKÁ REPUBLIKA" email="demo@example.cz" c_telef="+420777000000" opr_jmeno="Jana" opr_prijmeni="Ukázková" opr_postaveni="jednatelka" sest_jmeno="Jana" sest_prijmeni="Ukázková"/>
    <Veta1 obrat23="211500" dan23="44415" p_sl23_e="28003" dan_psl23_e="5881"/>
    <Veta4 pln23="20700" odp_tuz23_nar="4347" nar_zdp23="28003" od_zdp23="5881" odp_sum_nar="10228"/>
    <Veta6 dan_zocelk="50296" odp_zocelk="10228" dano_da="40068"/>
  </DPHDP3>
</Pisemnost>

/entities/{entity_id}/taxes/kh/xml – Kontrolní hlášení (DPHKH1) jako XML

XML kontrolního hlášení ve formátu EPO DPHKH1 verze 03.01. filing_type: B řádné, O opravné, N následné (D se zapíše jako následné), E opravné následné; u D, E a N je povinný reasons_found_on. Identifikované osobě a právnické osobě se čtvrtletním obdobím vrátí 422 – na rozdíl od GET …/taxes/control_statement bez pole code.

Parametry

NázevKdeTypPovinnýPopis
perioddotaztextneObdobí YYYY-MM nebo YYYY-Qn; má přednost před year, month a quarter. Neplatná hodnota skončí chybou 500. Příklad 2026-08.
monthdotazcelé čísloneMěsíc, když chybí period Rozsah od 1 do 12. Příklad 8.
quarterdotazcelé čísloneČtvrtletí, když chybí period i month (jen fyzická osoba) Rozsah od 1 do 4. Příklad 3.

Chyby této operace

StavKódKdy
422–Identifikovaná osoba („Identifikovaná osoba kontrolní hlášení nepodává (§ 101c ZDPH).“)
422–Právnická osoba a čtvrtletní období („Právnická osoba podává kontrolní hlášení za kalendářní měsíc (§ 101e odst. 1 ZDPH)“)
422–Dokladu v hlášení chybí DIČ partnera, evidenční číslo nebo kód předmětu plnění
500–Neplatné period, month nebo quarter

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/taxes/kh/xml?period=2026-08"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/taxes/kh/xml?period=2026-08', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<Pisemnost nazevSW="Saldo" verzeSW="1.0">
  <DPHKH1 verzePis="03.01">
    <VetaD dokument="KH1" k_uladis="DPH" rok="2026" mesic="8" d_poddp="28.09.2026" khdph_forma="B"/>
    <VetaP c_ufo="451" c_pracufo="2001" dic="99999994" typ_ds="P" zkrobchjm="Ukázková firma s.r.o." ulice="Na Příkopě" c_pop="859" c_orient="22" naz_obce="Praha" psc="11000" stat="ČESKÁ REPUBLIKA" email="demo@example.cz" c_telef="+420777000000" opr_jmeno="Jana" opr_prijmeni="Ukázková" opr_postaveni="jednatelka" sest_jmeno="Jana" sest_prijmeni="Ukázková"/>
    <VetaA2 k_stat="DE" vatid_dod="998877665" c_evid_dd="2026083526" dppd="07.08.2026" zakl_dane1="28002.50" dan1="5880.53"/>
    <VetaA4 dic_odb="90000013" c_evid_dd="FV20260020" dppd="15.08.2026" zakl_dane1="115500.00" dan1="24255.00" kod_rezim_pl="0" zdph_44="N"/>
    <VetaA5 zakl_dane1="96000.00" dan1="20160.00"/>
    <VetaB2 dic_dod="90000056" c_evid_dd="2026085713" dppd="02.08.2026" zakl_dane1="14500.00" dan1="3045.00" pomer="N" zdph_44="N"/>
    <VetaB3 zakl_dane1="6200.00" dan1="1302.00"/>
    <VetaC obrat23="211500.00" pln23="20700.00" celk_zd_a2="28002.50"/>
  </DPHKH1>
</Pisemnost>

/entities/{entity_id}/taxes/sh/xml – Souhrnné hlášení (DPHSHV) jako XML

XML souhrnného hlášení ve formátu EPO DPHSHV verze 02.01. filing_type B vytvoří řádné hlášení (R), O, D a N následné (N); E (opravné dodatečné) souhrnné hlášení nezná a vrátí 422. Den zjištění důvodů se nevyžaduje.

Parametry

NázevKdeTypPovinnýPopis
perioddotaztextneObdobí YYYY-MM nebo YYYY-Qn; má přednost před year, month a quarter. Neplatná hodnota skončí chybou 500. Příklad 2026-08.
monthdotazcelé čísloneMěsíc, když chybí period Rozsah od 1 do 12. Příklad 8.
quarterdotazcelé čísloneČtvrtletí, když chybí period i month Rozsah od 1 do 4. Příklad 3.

Chyby této operace

StavKódKdy
422–filing_type E („Neznámý druh podání :supplementary_corrective“)
422–Odběratel nemá platné DIČ („Souhrnné hlášení – neplatné DIČ pořizovatele …“)
500–Neplatné period, month nebo quarter

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/taxes/sh/xml?period=2026-08"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/taxes/sh/xml?period=2026-08', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<Pisemnost nazevSW="Saldo" verzeSW="1.0">
  <DPHSHV verzePis="02.01">
    <VetaD k_uladis="DPH" dokument="SHV" rok="2026" mesic="8" shvies_forma="R" d_poddp="28.09.2026"/>
    <VetaP c_ufo="451" c_pracufo="2001" dic="99999994" typ_ds="P" zkrobchjm="Ukázková firma s.r.o." ulice="Na Příkopě" c_pop="859" c_orient="22" naz_obce="Praha" psc="11000" stat="ČESKÁ REPUBLIKA" opr_jmeno="Jana" opr_prijmeni="Ukázková" opr_postaveni="jednatelka" sest_jmeno="Jana" sest_prijmeni="Ukázková"/>
  </DPHSHV>
</Pisemnost>

/entities/{entity_id}/taxes/income_tax/xml – Přiznání k dani z příjmů (DPFDP7 nebo DPPDP9) jako XML

XML přiznání k dani z příjmů za rok year: u OSVČ DPFDP7 verze 01.01.02 (jen roky 2024–2025), u právnické osoby DPPDP9 verze 05.01.01 s rozvahou a výkazem zisku a ztráty. DPPO vyžaduje vyrovnanou rozvahu; za celé zdaňovací období 2026 ho Saldo zatím odmítne, struktura formuláře pokrývá rok 2026 jen pro jeho části. filing_type: B, O, D, E (N se zapíše jako D); u D, E i N je povinný reasons_found_on a last_known_tax.

Parametry

NázevKdeTypPovinnýPopis
last_known_taxdotazčíslonePoslední známá daň – povinná u dodatečného přiznání (D, E, N) Příklad 48210.
publishdotazano/neneJen DPPO – přesně hodnota false vynechá žádost o zveřejnění rozvahy a výkazu zisku a ztráty ve sbírce listin; jiná hodnota (i 0) žádost ponechá Výchozí true. Příklad true.
accounts_approveddotazano/neneJen DPPO – true uvede, že účetní závěrka je schválená Výchozí false. Příklad false.
accounts_auditeddotazano/neneJen DPPO s povinným auditem – true uvede, že závěrka je ověřená auditorem Výchozí false. Příklad false.

Chyby této operace

StavKódKdy
422–Rok mimo formulář („… lze sestavit jen za roky 2024–2025“ u DPFO, 2021–2026 u DPPO) nebo bez zákonných sazeb v Saldu
422–DPPO za celé zdaňovací období 2026 („Přiznání za celé zdaňovací období 2026 zatím sestavit nelze …“)
422–Chybějící údaje („Doplňte DIČ v Nastavení → Firma; …“), nevyrovnaná rozvaha nebo neúplné údaje zástupce
422–Dodatečné přiznání (D, E, N) bez last_known_tax nebo bez reasons_found_on

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/2/taxes/income_tax/xml?year=2025"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/income_tax/xml?year=2025', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<Pisemnost nazevSW="Saldo" verzeSW="1.0">
  <DPFDP7 verzePis="01.01.02">
    <VetaD dokument="DP7" k_uladis="DPF" dap_typ="B" rok="2025" c_ufo_cil="451" pln_moc="N" audit="N" zdobd_od="01.01.2025" zdobd_do="31.12.2025" m_deti="12" kc_op15_1a="30840" uhrn_slevy35ba="30840" kc_dazvyhod="15204"/>
    <VetaP c_pracufo="2002" dic="8001010006" prijmeni="Ukázka" jmeno="Jan" ulice="Vinohradská" c_pop="1" naz_obce="Praha" psc="12000" stat="ČESKÁ REPUBLIKA" email="demo@example.cz" c_telef="+420777000000" rod_c="8001010006" k_stat="CZ"/>
    <VetaA vyzdite_jmeno="Eliška" vyzdite_prijmeni="Ukázková" vyzdite_r_cislo="1855120003" vyzdite_pocmes="12"/>
    <VetaB priloha1="1" priloh_celk="1"/>
    <VetaT c_nace="741200" m_podnik="12" vyd7proc="N" uc_soust="1"/>
  </DPFDP7>
</Pisemnost>

/entities/{entity_id}/taxes/prehled_sp/xml – Přehled OSVČ pro ČSSZ (OSVC25) jako XML

XML přehledu o příjmech a výdajích OSVČ pro ČSSZ ve formátu e-Podání OSVC25 (jmenný prostor http://schemas.cssz.cz/OSVC2025). Jen pro OSVČ a jen za rok 2025. filing_type O vytvoří opravný přehled (vyžaduje reasons_found_on a reason), jakákoli jiná hodnota řádný. Před vrácením projde XML kontrolami podle pravidel ČSSZ; nalezené problémy vrátí v poli problems.

Parametry

NázevKdeTypPovinnýPopis
reasondotaztextneDůvod opravného přehledu (povinný u filing_type O) Příklad Opravné daňové přiznání.
tax_returndotaztextneJak se podává daňové přiznání (ovlivní lhůtu přehledu); výchozí advisor, má-li firma v nastavení daňového poradce, jinak standard; neznámá hodnota se ignoruje Hodnoty: standard, electronic, advisor, none, extended. Příklad electronic.
tax_return_extended_untildotazdatumneDen, do kterého finanční úřad prodloužil lhůtu – povinný u tax_return extended Příklad 2026-07-01.

Chyby této operace

StavKódKdy
422–Firma není OSVČ („Přehledy pro ČSSZ a zdravotní pojišťovnu podává jen OSVČ“)
422–Rok jiný než 2025, chybějící údaje daňového profilu nebo nesplněné kontroly ČSSZ; odpověď { error, problems } s jednotlivými nálezy

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/2/taxes/prehled_sp/xml?year=2025"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/prehled_sp/xml?year=2025', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<OSVC xmlns="http://schemas.cssz.cz/OSVC2025" version="1.0">
  <VENDOR productName="Saldo" productVersion="1.0"/>
  <prehledosvc vsdp="12345678" for="prehledosvc" dep="110" rok="2025" typ="N">
    <client>
      <name sur="Ukázka" fir="Jan" tit=""/>
      <birth bno="8001010006" den="1980-01-01"/>
      <adr str="Vinohradská" num="1" pnu="12000" cit="Praha" cnt="CZ"/>
      <email>demo@example.cz</email>
      <tel>+420 777 000 000</tel>
      <druc>H</druc>
      <hlavc>
        <m1/>
        <m2/>
        <m3/>
        <m4/>
        <m5/>
        <m6/>
        <m7/>
        <m8/>
        <m9/>
        <m10/>
        <m11/>
        <m12/>
        <m13>A</m13>
      </hlavc>
      <vedc>
        <m1/>
        <m2/>
        <m3/>
        <m4/>
        <m5/>
        <m6/>
        <m7/>
        <m8/>
        <m9/>
        <m10/>
        <m11/>
        <m12/>
        <m13/>
        <zam/>
        <duchod/>
        <pdite/>
        <ppm/>
        <pece/>
        <ndite/>
      </vedc>
      <narok>
        <m1/>
        <m2/>
        <m3/>
        <m4/>
        <m5/>
        <m6/>
        <m7/>
        <m8/>
        <m9/>
        <m10/>
        <m11/>
        <m12/>
        <m13/>
      </narok>
      <sleva>
        <m1/>
        <m2/>
        <m3/>
        <m4/>
        <m5/>
        <m6/>
        <m7/>
        <m8/>
        <m9/>
        <m10/>
        <m11/>
        <m12/>
        <m13/>
      </sleva>
      <vzpm/>
    </client>
    <pvv pri="0">
      <mesc h="12" v=""/>
      <mesv h="12" v=""/>
      <mesp>0</mesp>
      <rdza h="0" v="0"/>
      <vvz h="0" v="0"/>
      <dvz h="0" v="0"/>
      <mvz>195540</mvz>
      <uvz>195540</uvz>
      <vzza/>
      <vzsu>195540</vzsu>
      <vzsvc>195540</vzsvc>
      <poj>57098</poj>
      <slev>0</slev>
      <pojposlev>57098</pojposlev>
      <zal>0</zal>
      <ned>57098</ned>
    </pvv>
    <prihldp/>
    <zal ved="H" pau="" vzpm="" duch="" vz="17139" dp="5005" np="0"/>
    <pre vra="0" kam="">
      <rok/>
      <iban/>
      <bs pu="" cu="" kb="" ss="" vs=""/>
      <adr str="" num="" pnu="" cit="" cnt=""/>
    </pre>
    <prizn>
      <pau/>
      <pov>A</pov>
      <elektr>N</elektr>
      <por>N</por>
      <meldat/>
    </prizn>
    <opr datopr="" duvod=""/>
    <spo bno="" den="">
      <name sur="" fir="" tit=""/>
      <adr str="" num="" pnu="" cit="" cnt=""/>
    </spo>
    <dat dre="2026-09-28"/>
  </prehledosvc>
</OSVC>

/entities/{entity_id}/taxes/prehled_zp/xml – Přehled OSVČ pro zdravotní pojišťovnu jako XML

XML přehledu OSVČ pro zdravotní pojišťovnu ve společném formátu pojišťoven (prehledOSVC v6, jmenný prostor http://xmlns.vzp.cz/prehledOSVC/v6). Jen pro OSVČ a jen za rok 2025. filing_type O vytvoří opravný přehled, jiná hodnota řádný. Před vrácením projde XML kontrolami; problémy vrátí v poli problems.

Parametry

NázevKdeTypPovinnýPopis
tax_returndotaztextneJak se podává daňové přiznání; výchozí advisor nebo standard podle nastavení firmy Hodnoty: standard, electronic, advisor, none, extended. Příklad electronic.
tax_return_extended_untildotazdatumneDen, do kterého finanční úřad prodloužil lhůtu – povinný u tax_return extended Příklad 2026-07-01.

Chyby této operace

StavKódKdy
422–Firma není OSVČ
422–Rok jiný než 2025, chybějící údaje daňového profilu nebo nesplněné kontroly; odpověď { error, problems }

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

Příklad

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/2/taxes/prehled_zp/xml?year=2025"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/prehled_zp/xml?year=2025', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<prehledOSVC xmlns="http://xmlns.vzp.cz/prehledOSVC/v6">
  <identifikacePredmetuPodaniText>Přehled OSVČ pro ZP 2026+</identifikacePredmetuPodaniText>
  <identifikacePredmetuPodaniKod>3e0520e9-2dea-4073-8252-ed57cb5d1c89</identifikacePredmetuPodaniKod>
  <kodZdravotniPojistovny>111</kodZdravotniPojistovny>
  <rokPrehledu>2025</rokPrehledu>
  <typPrehledu>radny</typPrehledu>
  <pojistenec>
    <cisloPojistence>8001010006</cisloPojistence>
    <ic>99999986</ic>
    <prijmeni>Ukázka</prijmeni>
    <jmeno>Jan</jmeno>
    <adresa>
      <ulice>Vinohradská</ulice>
      <cisloDomu>1</cisloDomu>
      <psc>12000</psc>
      <obec>Praha</obec>
    </adresa>
    <telefon>420777000000</telefon>
    <email>demo@example.cz</email>
  </pojistenec>
  <prohlaseniRezimPojistneho>
    <prohlaseni>
      <klicProhlaseni>prohlaseniPp</klicProhlaseni>
      <seznamMesicu/>
    </prohlaseni>
  </prohlaseniRezimPojistneho>
  <prohlaseniPojistenceDP>
    <zpusobPodaniDP>priznaniDPFO</zpusobPodaniDP>
  </prohlaseniPojistenceDP>
  <stanovenePojistneOSVC>
    <radekHodnoty>
      <klicRadku>3</klicRadku>
      <hodnotaRadku>0.00</hodnotaRadku>
    </radekHodnoty>
    <radekHodnoty>
      <klicRadku>4</klicRadku>
      <hodnotaRadku>12</hodnotaRadku>
    </radekHodnoty>
    <radekHodnoty>
      <klicRadku>5</klicRadku>
      <hodnotaRadku>12</hodnotaRadku>
    </radekHodnoty>
    <radekHodnoty>
      <klicRadku>6</klicRadku>
      <hodnotaRadku>12</hodnotaRadku>
    </radekHodnoty>
    <radekHodnoty>
      <klicRadku>9</klicRadku>
      <hodnotaRadku>279342.00</hodnotaRadku>
    </radekHodnoty>
    <radekHodnoty>
      <klicRadku>14</klicRadku>
      <hodnotaRadku>279342.00</hodnotaRadku>
    </radekHodnoty>
    <radekHodnoty>
      <klicRadku>16</klicRadku>
      <hodnotaRadku>37712</hodnotaRadku>
    </radekHodnoty>
  </stanovenePojistneOSVC>
  <vyrovnaniZalohPojistne>
    <seznamRadku>
      <radekHodnoty>
        <klicRadku>41</klicRadku>
        <hodnotaRadku>0</hodnotaRadku>
      </radekHodnoty>
      <radekHodnoty>
        <klicRadku>43</klicRadku>
        <hodnotaRadku>-37712</hodnotaRadku>
      </radekHodnoty>
    </seznamRadku>
  </vyrovnaniZalohPojistne>
  <vyseZalohy>
    <seznamRadkuSekceZalohy>
      <radekHodnoty>
        <klicRadku>51</klicRadku>
        <hodnotaRadku>0</hodnotaRadku>
      </radekHodnoty>
    </seznamRadkuSekceZalohy>
    <typZalohy>zalohaMinimalni</typZalohy>
    <novaVyseZalohy>3306</novaVyseZalohy>
  </vyseZalohy>
</prehledOSVC>

POST Kontrola podání v EPO nebo otevření předvyplněného formuláře

/entities/{entity_id}/taxes/{report}/epo

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

Sestaví XML podání stejně jako GET …/taxes/{report}/xml a předá ho rozhraní EPO portálu Moje daně. S check=true ho portál jen zkontroluje v testovacím režimu a vrátí nalezené chyby. Bez check portál vrátí odkaz na formulář předvyplněný tímto XML. Ani jedna možnost nic nepodá: podání odešle až uživatel sám v portálu Moje daně a Saldo o tom nic neví. Stav podání v Saldu se nemění a podání se neukládá. Vstupy lze poslat v těle JSON i v query stringu.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
reportcestatextanoDruh podání; prehled_sp a prehled_zp vrátí 422 Hodnoty: dph, kh, sh, income_tax. Příklad dph.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
checkano/nenetrue = jen kontrola v testovacím režimu EPO; false = odkaz na předvyplněný formulář Výchozí false.
yearcelé čísloneRok (u DPH, když chybí period; u daně z příjmů zdaňovací období); výchozí aktuální rok
filing_typetextneDruh podání jako u GET …/xml; výchozí B Hodnoty: B, O, D, E, N.
datedatumneDatum podání uvedené v XML; výchozí dnešní datum
reasons_found_ondatumneDen zjištění důvodů – povinný u dodatečného či následného podání

Odpověď

200 application/json S check=true výsledek kontroly (errors, raw), jinak odkaz na formulář (url, valid_until). Chyby nalezené portálem vrací operace se stavem 200 v poli errors.

PoleVýznam
errorsJen s check=true: chyby hlášené portálem ve tvaru „Typ: text“; prázdné pole = bez chyb
rawJen s check=true: odpověď portálu, nejvýše 4000 znaků
urlJen bez check: adresa předvyplněného formuláře na mojedane.gov.cz
valid_untilJen bez check: čas volání + 30 minut – platnost odkazu, jak ji předpokládá Saldo (portál ji nevrací)

Chyby této operace

StavKódKdy
422–report je prehled_sp nebo prehled_zp („Přehledy OSVČ se podávají ČSSZ a zdravotní pojišťovně, ne přes portál Moje daně“); XML se sestaví dřív, takže chybějící údaje přehledu vrátí 422 s problems
422–Nelze sestavit XML – stejné důvody jako u GET …/taxes/{report}/xml
422–Neznámá hodnota report („Neznámý typ podání“)
502–Portál Moje daně je nedostupný nebo odpověděl chybovým stavem HTTP („Portál Moje daně …“), nebo bez check nevrátil odkaz na formulář (error pak obsahuje první chybu hlášenou portálem)

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

Chování

Co změní
Pošle XML metodou POST na https://mojedane.gov.cz/dpr/epo_podani: s check=true s parametrem test=1 (kontrolní hlášení zabalené do ZIP jako podani.xml), bez check s parametrem otevriFormular=1. Saldo tím podání neodesílá: test=1 je kontrola v testovacím režimu, otevriFormular=1 formulář jen předvyplní a odeslat ho musí uživatel v portálu; o odeslání se Saldo nedozví. Po úspěšné odpovědi portálu zapíše do historie událost tax.epo; jinak nezapisuje nic.
Limity
Spojení s portálem má limit 10 s na navázání a 40 s na odpověď.
Opakování
Každé volání znovu kontaktuje portál a zapíše novou událost; nic se nehromadí ani nepodává.

/entities/{entity_id}/taxes/dph/epo – Přiznání k DPH v EPO

XML přiznání k DPH (DPHDP3) za zvolené období.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
periodtextneObdobí YYYY-MM nebo YYYY-Qn; má přednost před year, month a quarter. Neplatná hodnota skončí chybou 500.
monthcelé čísloneMěsíc 1–12, když chybí period
quartercelé čísloneČtvrtletí 1–4 čtvrtletního plátce, když chybí period i month

Příklad

Volání portálu Moje daně je v ukázce nahrazeno záznamem.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"period":"2026-08","check":true}' \
  https://techtools.cz/ucetnictvi-api/entities/1/taxes/dph/epo

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/taxes/dph/epo', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "period": "2026-08",
    "check": true
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "errors": [],
  "raw": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Odpoved><Vysledek>Kontrola proběhla bez chyb.</Vysledek></Odpoved>"
}

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

/entities/{entity_id}/taxes/kh/epo – Kontrolní hlášení v EPO

XML kontrolního hlášení (DPHKH1). Pro kontrolu (check=true) se posílá zabalené do ZIP. Identifikovaná osoba a právnická osoba se čtvrtletním obdobím dostanou 422.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
periodtextneObdobí YYYY-MM nebo YYYY-Qn. Neplatná hodnota skončí chybou 500.
monthcelé čísloneMěsíc 1–12, když chybí period
quartercelé čísloneČtvrtletí 1–4, když chybí period i month (jen fyzická osoba)

Chyby této operace

StavKódKdy
422–Identifikovaná osoba nebo právnická osoba se čtvrtletním obdobím

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

Příklad

Volání portálu Moje daně je v ukázce nahrazeno záznamem.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"period":"2026-08","check":true}' \
  https://techtools.cz/ucetnictvi-api/entities/1/taxes/kh/epo

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/taxes/kh/epo', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "period": "2026-08",
    "check": true
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "errors": [],
  "raw": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Odpoved><Vysledek>Kontrola proběhla bez chyb.</Vysledek></Odpoved>"
}

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

/entities/{entity_id}/taxes/sh/epo – Souhrnné hlášení v EPO

XML souhrnného hlášení (DPHSHV); filing_type E vrátí 422.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
periodtextneObdobí YYYY-MM nebo YYYY-Qn. Neplatná hodnota skončí chybou 500.
monthcelé čísloneMěsíc 1–12, když chybí period
quartercelé čísloneČtvrtletí 1–4, když chybí period i month

Příklad

Bez check – vrátí odkaz na předvyplněný formulář. Volání portálu je v ukázce nahrazeno záznamem.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"period":"2026-08"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/taxes/sh/epo

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/taxes/sh/epo', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "period": "2026-08"
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "url": "https://adisspr.mfcr.cz/pmd/epo/formular/ukazka",
  "valid_until": "2026-09-28T10:30:00.000Z"
}

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

/entities/{entity_id}/taxes/income_tax/epo – Přiznání k dani z příjmů v EPO

XML přiznání k dani z příjmů (DPFDP7 u OSVČ, DPPDP9 u právnické osoby) se stejnými omezeními jako u GET …/xml.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
last_known_taxčíslonePoslední známá daň – povinná u dodatečného přiznání (D, E, N)
publishtextneJen DPPO – řetězec "false" vynechá žádost o zveřejnění závěrky. Hodnota se porovnává jako text: JSON false se nerozpozná a závěrka se zveřejní. Bez pole se zveřejní. Hodnoty: false.
accounts_approvedano/neneJen DPPO – závěrka je schválená; výchozí false
accounts_auditedano/neneJen DPPO s auditem – závěrka je ověřená; výchozí false

Chyby této operace

StavKódKdy
422–DPFO mimo roky 2024–2025, DPPO za celé zdaňovací období 2026, chybějící údaje nebo nevyrovnaná rozvaha

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

Příklad

Bez check – vrátí odkaz na předvyplněný formulář. Volání portálu je v ukázce nahrazeno záznamem.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"year":2025}' \
  https://techtools.cz/ucetnictvi-api/entities/2/taxes/income_tax/epo

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/income_tax/epo', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "year": 2025
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "url": "https://adisspr.mfcr.cz/pmd/epo/formular/ukazka",
  "valid_until": "2026-09-28T10:30:00.000Z"
}

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

POST Předběžná kontrola přehledu OSVČ u ČSSZ

/entities/{entity_id}/taxes/{report}/validate

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

Sestaví XML přehledu OSVČ pro ČSSZ (jako GET …/taxes/prehled_sp/xml) a pošle ho k anonymní předběžné kontrole validační službě ČSSZ. Vrátí, zda přehled kontrolou prošel, a nálezy s kódy ČSSZ. Přehled se tím nepodává a v Saldu se neukládá. Jiná hodnota report než prehled_sp vrátí 422. Vstupy lze poslat v těle JSON i v query stringu.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
reportcestatextanoJediná podporovaná hodnota Hodnoty: prehled_sp. Příklad prehled_sp.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
yearcelé čísloneRok přehledu – Saldo sestaví jen rok 2025; výchozí aktuální rok
filing_typetextneO = opravný přehled, jinak řádný
datedatumneDatum vyplnění; výchozí dnešní datum
reasons_found_ondatumneDatum zjištění nové výše vyměřovacího základu (u opravného)
reasontextneDůvod opravného přehledu
tax_returntextneJak se podává daňové přiznání Hodnoty: standard, electronic, advisor, none, extended.
tax_return_extended_untildatumneProdloužená lhůta – povinná u tax_return extended

Odpověď

200 application/json Výsledek kontroly ČSSZ.

PoleVýznam
oktrue, když služba vrátila výsledek OK
findingsNálezy: category, code (kód chyby ČSSZ), message, form

Chyby této operace

StavKódKdy
422–report není prehled_sp („Předběžnou kontrolu nabízí jen ČSSZ pro přehled OSVČ“)
422–XML přehledu nelze sestavit (firma není OSVČ, rok jiný než 2025, chybějící údaje); odpověď { error, problems }
502–Validační služba ČSSZ neodpověděla včas, je nedostupná nebo nevrátila výsledek

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

Chování

Co změní
Pošle XML přehledu na https://epodani.cssz.cz/ePodaniValidace.svc (SOAP ValidujPodani, bez přihlášení). Služba přehled jen kontroluje, nic se nepodá. Po odpovědi služby zapíše do historie událost tax.validate.
Limity
Spojení se službou ČSSZ má limit 10 s na navázání a 40 s na odpověď.
Opakování
Každé volání pošle přehled ke kontrole znovu a zapíše novou událost.

Příklad

Volání služby ČSSZ je v ukázce nahrazeno záznamem.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"year":2025}' \
  https://techtools.cz/ucetnictvi-api/entities/2/taxes/prehled_sp/validate

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/prehled_sp/validate', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "year": 2025
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "ok": true,
  "findings": []
}

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

POST Uložení podání daně z příjmů nebo přehledu OSVČ

/entities/{entity_id}/taxes/{report}/filing

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

Sestaví XML jako GET …/taxes/{report}/xml a uloží ho jako podání ve stavu draft (Připraveno) spolu se snímkem výpočtu. Podání tím nikam neodchází; odeslání uživatel potvrdí později přes PATCH /filings/{id} se stavem filed. Podání k DPH (dph, kh, sh) se ukládají přes POST /filings. Vstupy lze poslat v těle JSON i v query stringu.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
reportcestatextanoDruh podání; jiné hodnoty vrátí 422 Hodnoty: income_tax, prehled_sp, prehled_zp. Příklad income_tax.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
yearcelé čísloneZdaňovací období (rok); výchozí aktuální rok
filing_typetextneDruh podání (viz varianty); výchozí B
datedatumneDatum podání uvedené v XML; výchozí dnešní datum
reasons_found_ondatumneDen zjištění důvodů (dodatečné přiznání, opravný přehled ČSSZ)

Odpověď

201 application/json Uložené podání (bez XML).

PoleVýznam
idID podání
kinddpfo, dppo, prehled_sp nebo prehled_zp
periodRok (YYYY)
filing_typeDruh podání
statusdraft
dataSnímek výpočtu (u daně výsledek výpočtu, u přehledu řádky přehledu)
proof_statedraft
has_xmltrue

Chyby této operace

StavKódKdy
422–report není income_tax, prehled_sp ani prehled_zp („Podání k DPH ukládejte přes /filings“)
422–XML nelze sestavit – stejné důvody jako u GET …/taxes/{report}/xml

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

Chování

Co změní
Vytvoří záznam podání (kind dpfo nebo dppo podle firmy, případně prehled_sp nebo prehled_zp) ve stavu draft s XML a daty a zapíše událost filing.created. Nic nikam neposílá, nic neúčtuje.
Opakování
Každé volání vytvoří nové podání; duplicity se nekontrolují.

/entities/{entity_id}/taxes/income_tax/filing – Uložení přiznání k dani z příjmů

Uloží přiznání DPFO (OSVČ) nebo DPPO (právnická osoba) za rok year. filing_type se uloží tak, jak přišel (B, O, D, E, N, S), XML ale zná jen B, O, D a E – N se v XML zapíše jako D a S jako B.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
last_known_taxčíslonePoslední známá daň – povinná u dodatečného přiznání (D, E, N)
publishtextneJen DPPO – řetězec "false" vynechá žádost o zveřejnění závěrky. Hodnota se porovnává jako text: JSON false se nerozpozná a závěrka se zveřejní. Bez pole se zveřejní. Hodnoty: false.
accounts_approvedano/neneJen DPPO – závěrka je schválená; výchozí false
accounts_auditedano/neneJen DPPO s auditem – závěrka je ověřená; výchozí false

Chyby této operace

StavKódKdy
422–DPFO mimo roky 2024–2025, DPPO za celé zdaňovací období 2026, chybějící údaje nebo nevyrovnaná rozvaha
422–filing_type mimo B, O, D, E, N, S – validace podání { error, errors }

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

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"year":2025}' \
  https://techtools.cz/ucetnictvi-api/entities/2/taxes/income_tax/filing

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/income_tax/filing', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "year": 2025
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "id": 3,
  "created_at": "2026-09-28T10:00:00.000Z",
  "created_by_id": 1,
  "data": {
    "year": 2025,
    "income": 0.0,
    "expenses": 0.0,
    "expense_method": {
      "kind": "actual",
      "parts": []
    },
    "profit": 0.0,
    "employment_income": 0.0,
    "tax_base": 0.0,
    "deductions": [],
    "tax_base_rounded": 0.0,
    "tax_before_credits": 0.0,
    "credits": [
      {
        "key": "taxpayer",
        "label": "Základní sleva na poplatníka",
        "row": "64",
        "months": 12,
        "amount": 30840.0,
        "basis": "§ 35ba odst. 1 písm. a) ZDP"
      }
    ],
    "child_benefit": {
      "total": 15204.0,
      "used_as_credit": 0.0,
      "bonus": 0.0,
      "children": [
        {
          "order": 1,
          "months": 12,
          "ztpp": false,
          "amount": 15204.0
        }
      ]
    },
    "tax": 0.0,
    "bonus": 0.0,
    "tax_withheld": 0.0,
    "tax_advances_paid": 0.0,
    "tax_balance": 0.0,
    "tax_advances": {
      "last_known_tax": 0.0,
      "frequency": "none",
      "amount": 0.0,
      "period": {
        "from": "2026-05-05",
        "to": "2027-05-03"
      },
      "schedule": [],
      "basis": "§ 38a ZDP"
    },
    "sp": {
      "participates": true,
      "decisive_amount": null,
      "assessment_base": 0.0,
      "minimum_base": 195540.0,
      "maximum_base": 2234736.0,
      "applied_base": 195540.0,
      "rate": 0.292,
      "premium": 57098.0,
      "discount": 0.0,
      "premium_after_discount": 57098.0,
      "advances_paid": 0.0,
      "balance": 57098.0,
      "monthly_advance_next": 5005.0,
      "sickness": null,
      "basis": "§ 5b, § 7 odst. 1 písm. e) bod 1, § 14 a § 15a zákona č. 589/1992 Sb."
    },
    "zp": {
      "minimum_applies": true,
      "assessment_base": 0.0,
      "minimum_base": 279342.0,
      "applied_base": 279342.0,
      "rate": 0.135,
      "premium": 37712.0,
      "advances_paid": 0.0,
      "balance": 37712.0,
      "monthly_advance_next": 3306.0,
      "basis": "§ 2, § 3a a § 8 zákona č. 592/1992 Sb."
    },
    "total_levies": 94810.0,
    "net_income": -94810.0,
    "effective_rate": 0.0,
    "form_rows": {
      "37": 0.0,
      "41": 0.0,
      "42": 0.0,
      "45": 0.0,
      "55": 0.0,
      "56": 0.0,
      "57": 0.0,
      "58": 0.0,
      "60": 0.0,
      "70": 30840.0,
      "71": 0.0,
      "72": 15204.0,
      "74": 0.0,
      "75": 0.0,
      "91": 0.0,
      "64": 30840.0,
      "101": 0.0,
      "102": 0.0,
      "104": 0.0,
      "113": 0.0
    },
    "warnings": [
      "Daňový bonus nenáleží: příjmy podle § 6 a § 7 nedosáhly 6násobku minimální mzdy (124 800 Kč, § 35c ZDP).",
      "Minimální záloha hlavní činnosti činila v roce 2026 do června 5 720 Kč, od července 5 005 Kč (čl. I a čl. II bod 1 zákona č. 90/2026 Sb.)."
    ]
  },
  "exception_approved_at": null,
  "exception_approved_by_id": null,
  "exception_reason": null,
  "filed_on": null,
  "filing_type": "B",
  "first_filed_at": null,
  "kind": "dpfo",
  "period": "2025",
  "status": "draft",
  "submission_version": 0,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "kind_label": "Přiznání k dani z příjmů FO",
  "has_xml": true,
  "proof_state": "draft",
  "evidence_count": 0
}

/entities/{entity_id}/taxes/prehled_sp/filing – Uložení přehledu OSVČ pro ČSSZ

Uloží přehled pro ČSSZ za rok 2025; filing_type O uloží opravný přehled (typ O), cokoli jiného řádný (typ B).

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
reasontextneDůvod opravného přehledu (povinný u O)
tax_returntextneJak se podává daňové přiznání Hodnoty: standard, electronic, advisor, none, extended.
tax_return_extended_untildatumneProdloužená lhůta – povinná u tax_return extended

Chyby této operace

StavKódKdy
422–Rok jiný než 2025, chybějící údaje nebo nesplněné kontroly; odpověď { error, problems }

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

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"year":2025}' \
  https://techtools.cz/ucetnictvi-api/entities/2/taxes/prehled_sp/filing

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/prehled_sp/filing', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "year": 2025
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "id": 3,
  "created_at": "2026-09-28T10:00:00.000Z",
  "created_by_id": 1,
  "data": {
    "druc": "H",
    "pri": 0.0,
    "mesc": {
      "h": 12,
      "v": 0
    },
    "mesv": {
      "h": 12,
      "v": 0
    },
    "mesp": 0.0,
    "rdza": {
      "h": 0.0,
      "v": 0.0
    },
    "vvz": {
      "h": 0.0,
      "v": 0.0
    },
    "dvz": {
      "h": 0.0,
      "v": 0.0
    },
    "mvz": 195540.0,
    "uvz": 195540.0,
    "vzza": null,
    "vzsu": 195540.0,
    "vzsvc": 195540.0,
    "poj": 57098.0,
    "slev": 0.0,
    "pojposlev": 57098.0,
    "zal": 0.0,
    "ned": 57098.0,
    "secondary_participates": false,
    "decisive_amount": null,
    "maximum_base": 2234736.0,
    "next_year": {
      "ved": "H",
      "pau": "",
      "vzpm": "",
      "duch": "",
      "vz": 17139.0,
      "dp": 5005.0,
      "np": 0.0
    }
  },
  "exception_approved_at": null,
  "exception_approved_by_id": null,
  "exception_reason": null,
  "filed_on": null,
  "filing_type": "B",
  "first_filed_at": null,
  "kind": "prehled_sp",
  "period": "2025",
  "status": "draft",
  "submission_version": 0,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "kind_label": "Přehled pro ČSSZ",
  "has_xml": true,
  "proof_state": "draft",
  "evidence_count": 0
}

/entities/{entity_id}/taxes/prehled_zp/filing – Uložení přehledu OSVČ pro zdravotní pojišťovnu

Uloží přehled pro zdravotní pojišťovnu za rok 2025; filing_type O uloží opravný přehled, cokoli jiného řádný.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
tax_returntextneJak se podává daňové přiznání Hodnoty: standard, electronic, advisor, none, extended.
tax_return_extended_untildatumneProdloužená lhůta – povinná u tax_return extended

Chyby této operace

StavKódKdy
422–Rok jiný než 2025, chybějící údaje nebo nesplněné kontroly; odpověď { error, problems }

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

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"year":2025}' \
  https://techtools.cz/ucetnictvi-api/entities/2/taxes/prehled_zp/filing

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/2/taxes/prehled_zp/filing', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "year": 2025
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "id": 3,
  "created_at": "2026-09-28T10:00:00.000Z",
  "created_by_id": 1,
  "data": {
    "3": 0.0,
    "4": 12,
    "5": 12,
    "6": 12,
    "9": 279342.0,
    "14": 279342.0,
    "16": 37712.0,
    "41": 0.0,
    "43": -37712.0,
    "51": 0.0,
    "advance_type": "minimum",
    "new_advance": 3306.0,
    "minimum_advance": 3306.0,
    "monthly_minimum_base": 23278.5
  },
  "exception_approved_at": null,
  "exception_approved_by_id": null,
  "exception_reason": null,
  "filed_on": null,
  "filing_type": "B",
  "first_filed_at": null,
  "kind": "prehled_zp",
  "period": "2025",
  "status": "draft",
  "submission_version": 0,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "kind_label": "Přehled pro zdravotní pojišťovnu",
  "has_xml": true,
  "proof_state": "draft",
  "evidence_count": 0
}

POST Doplnění daňového profilu OSVČ z bankovních pohybů

/entities/{entity_id}/taxes/profile_from_bank

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

Projde odchozí bankovní pohyby OSVČ za posledních 24 měsíců a podle plateb na účty správ sociálního zabezpečení a zdravotních pojišťoven najde kód OSSZ, variabilní symbol ČSSZ, zdravotní pojišťovnu a rodné číslo. Do daňového profilu zapíše jen údaje, které v něm chybějí (rodné číslo ne, je-li DIČ rodným číslem). U právnické osoby nebo bez nálezu vrátí prázdné applied a nic nezmění. Stejné návrhy ukazuje GET …/taxes/payments v missing[].suggestion.

Parametry

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

Odpověď

200 application/json Doplněné údaje.

PoleVýznam
appliedPole → zobrazená hodnota: ossz_code, cssz_variable_symbol, health_insurer, birth_number (ve tvaru 850101/1233)

Chování

Co změní
Uloží nalezené hodnoty do nastavení firmy (settings.tax_profile) a zapíše událost entity.updated („Z výpisu z banky doplněno: …“). Nic neúčtuje.
Opakování
Opakované volání už nic nedoplní, protože údaje v profilu jsou; vrátí prázdné applied.

Příklad

Ukázková OSVČ má profil vyplněný, proto vrátí prázdné applied.

cURL

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

JavaScript

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

GET Seznam uložených podání

/entities/{entity_id}/filings

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

Vrátí uložená podání firmy všech druhů (DPH, KH, SH, daň z příjmů, přehledy OSVČ i JMHZ) od nejnověji vytvořeného, bez XML. U každého podání je stav v Saldu (status draft nebo filed) a zvlášť stav doložení doručení proof_state – status filed je jen tvrzení uživatele, že podání odeslal.

Parametry

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

Odpověď

200 application/json Pole podání.

PoleVýznam
[].idID podání
[].kinddph, kh, sh, dpfo, dppo, prehled_sp, prehled_zp, jmhz; kind_label česky
[].periodObdobí: YYYY-MM, YYYY-Qn nebo YYYY
[].filing_typeB řádné, O opravné, D dodatečné, E opravné dodatečné, N následné, S storno
[].statusdraft (Připraveno) nebo filed (označeno jako odeslané)
[].filed_onDatum odeslání zadané uživatelem
[].first_filed_atKdy bylo podání poprvé označeno jako odeslané
[].submission_versionKolikrát bylo podání označeno jako odeslané (zvyšuje se při každém přechodu na filed)
[].proof_statedraft; awaiting_proof (odesláno bez ověřené doručenky či výjimky); verified (ověřená doručenka nebo potvrzení přijetí k aktuálnímu XML a verzi odeslání); exception (schváleno bez doručenky)
[].exception_approved_atSchválení bez doručenky: kdy, kdo (exception_approved_by_id) a proč (exception_reason)
[].evidence_countPočet přiložených důkazních souborů včetně vyřazených
[].dataSnímek výkazu nebo výpočtu z doby přípravy
[].has_xmlZda je uložené XML

Chování

Co změní
Nic nezapisuje.
Limity
Nejvýše 200 nejnovějších podání; stránkování není.

Příklad

cURL

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
[
  {
    "id": 1,
    "created_at": "2026-09-28T10:00:00.000Z",
    "created_by_id": 1,
    "data": {
      "period": {
        "year": 2026,
        "month": 8,
        "quarter": null,
        "from": "2026-08-01",
        "to": "2026-08-31",
        "label": "srpen 2026",
        "deadline": "2026-09-25",
        "key": "2026-08"
      },
      "form": "25 5401 MFin 5401 vzor č. 26",
      "rows": {
        "1": {
          "base": 211500.0,
          "tax": 44415.0
        },
        "2": {
          "base": 0.0,
          "tax": 0.0
        },
        "3": {
          "base": 0.0,
          "tax": 0.0
        },
        "4": {
          "base": 0.0,
          "tax": 0.0
        },
        "5": {
          "base": 28003.0,
          "tax": 5881.0
        },
        "6": {
          "base": 0.0,
          "tax": 0.0
        },
        "7": {
          "base": 0.0,
          "tax": 0.0
        },
        "8": {
          "base": 0.0,
          "tax": 0.0
        },
        "9": {
          "base": 0.0,
          "tax": 0.0
        },
        "10": {
          "base": 0.0,
          "tax": 0.0
        },
        "11": {
          "base": 0.0,
          "tax": 0.0
        },
        "12": {
          "base": 0.0,
          "tax": 0.0
        },
        "13": {
          "base": 0.0,
          "tax": 0.0
        },
        "14": {
          "base": 0.0,
          "tax": 0.0
        },
        "20": 0.0,
        "21": 0.0,
        "22": 0.0,
        "23": 0.0,
        "24": 0.0,
        "25": 0.0,
        "26": 0.0,
        "30": 0.0,
        "31": 0.0,
        "32": 0.0,
        "33": 0.0,
        "34": 0.0,
        "40": {
          "base": 20700.0,
          "full": 4347.0,
          "reduced": 0.0
        },
        "41": {
          "base": 0.0,
          "full": 0.0,
          "reduced": 0.0
        },
        "42": {
          "base": 0.0,
          "full": 0.0,
          "reduced": 0.0
        },
        "43": {
          "base": 28003.0,
          "full": 5881.0,
          "reduced": 0.0
        },
        "44": {
          "base": 0.0,
          "full": 0.0,
          "reduced": 0.0
        },
        "45": {
          "full": 0.0,
          "reduced": 0.0
        },
        "46": {
          "full": 10228.0,
          "reduced": 0.0
        },
        "47": {
          "base": 0.0,
          "full": 0.0,
          "reduced": 0.0
        },
        "48": {
          "base": 0.0,
          "full": 0.0,
          "reduced": 0.0
        },
        "50": 0.0,
        "51": {
          "with_credit": 0.0,
          "without_credit": 0.0
        },
        "52": {
          "coefficient": null,
          "deduction": 0.0
        },
        "53": {
          "coefficient": null,
          "change": 0.0
        },
        "60": 0.0,
        "61": 0.0,
        "62": 50296.0,
        "63": 10228.0,
        "64": 40068.0,
        "65": 0.0,
        "66": 0.0
      },
      "own_tax": 40068.0,
      "excess_deduction": 0.0,
      "documents": {
        "1": [
          19,
          20
        ],
        "5": [
          65
        ],
        "40": [
          62,
          63
        ],
        "43": [
          65
        ]
      },
      "warnings": []
    },
    "exception_approved_at": null,
    "exception_approved_by_id": null,
    "exception_reason": null,
    "filed_on": "2026-09-24",
    "filing_type": "B",
    "first_filed_at": "2026-09-28T10:00:00.000Z",
    "kind": "dph",
    "period": "2026-08",
    "status": "filed",
    "submission_version": 1,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "kind_label": "Přiznání k DPH",
    "has_xml": true,
    "proof_state": "awaiting_proof",
    "evidence_count": 1
  },
  {
    "id": 2,
    "created_at": "2026-09-28T10:00:00.000Z",
    "created_by_id": 1,
    "data": {
      "period": {
        "year": 2026,
        "month": 8,
        "quarter": null,
        "from": "2026-08-01",
        "to": "2026-08-31",
        "label": "srpen 2026",
        "deadline": "2026-09-25",
        "key": "2026-08"
      },
      "sections": {
        "a1": [],
        "a2": [
          {
            "document_id": 65,
            "country": "DE",
            "vat_id": "998877665",
            "number": "2026083526",
            "dppd": "2026-08-07",
            "base1": 28002.5,
            "tax1": 5880.53,
            "base2": 0.0,
            "tax2": 0.0,
            "base3": 0.0,
            "tax3": 0.0
          }
        ],
        "a3": [],
        "a4": [
          {
            "document_id": 20,
            "partner_dic": "90000013",
            "number": "FV20260020",
            "dppd": "2026-08-15",
            "base1": 115500.0,
            "tax1": 24255.0,
            "base2": 0.0,
            "tax2": 0.0,
            "base3": 0.0,
            "tax3": 0.0,
            "bad_debt": false
          }
        ],
        "a5": {
          "base1": 96000.0,
          "tax1": 20160.0,
          "base2": 0.0,
          "tax2": 0.0,
          "base3": 0.0,
          "tax3": 0.0,
          "document_ids": [
            19
          ]
        },
        "b1": [],
        "b2": [
          {
            "document_id": 62,
            "partner_dic": "90000056",
            "number": "2026085713",
            "dppd": "2026-08-02",
            "base1": 14500.0,
            "tax1": 3045.0,
            "base2": 0.0,
            "tax2": 0.0,
            "base3": 0.0,
            "tax3": 0.0,
            "proportional": false,
            "bad_debt": false
          }
        ],
        "b3": {
          "base1": 6200.0,
          "tax1": 1302.0,
          "base2": 0.0,
          "tax2": 0.0,
          "base3": 0.0,
          "tax3": 0.0,
          "document_ids": [
            63,
            64
          ]
        }
      },
      "control": {
        "a4_a5_basic": {
          "base": 211500.0,
          "return_rows": [
            1
          ]
        },
        "a4_a5_reduced": {
          "base": 0.0,
          "return_rows": [
            2
       
…

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

POST Uložení podání k DPH (přiznání, kontrolní nebo souhrnné hlášení)

/entities/{entity_id}/filings

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

Sestaví výkaz a XML přiznání k DPH, kontrolního nebo souhrnného hlášení za období a uloží je jako podání ve stavu draft (Připraveno). Podání nikam neodchází; že bylo odesláno, potvrdí uživatel přes PATCH /filings/{id}. Datum podání v XML je vždy dnešní. Operace nekontroluje registraci k DPH.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
kindtextanoDruh podání Hodnoty: dph, kh, sh.
periodtextanoObdobí YYYY-MM nebo YYYY-Qn; neplatná hodnota skončí chybou 500
filing_typetextneDruh podání; jiná hodnota se uloží jako B. Uloží se tak, jak přišel, XML ale S nezná a sestaví ho jako řádné; význam D, E, N je u každého formuláře jiný (viz GET …/taxes/{report}/xml) Hodnoty: B, O, D, E, N, S. Výchozí B.
reasons_found_ondatumneDen zjištění důvodů – povinný u dodatečného či následného podání DPH a KH

Odpověď

201 application/json Uložené podání bez XML (tvar jako v GET /filings).

PoleVýznam
idID podání
statusdraft
dataSestavený výkaz (přiznání, kontrolní nebo souhrnné hlášení)
proof_statedraft

Chyby této operace

StavKódKdy
422–kind není dph, kh ani sh („Tento typ podání zatím nelze připravit“)
422–XML nelze sestavit – identifikovaná osoba u KH, právnická osoba se čtvrtletním KH, SH s filing_type E, chybí den zjištění důvodů, neplatné údaje firmy nebo dokladu
500–Neplatný formát period

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

Chování

Co změní
Vytvoří podání (Filing) ve stavu draft s daty výkazu a XML a zapíše událost filing.created. Nic nikam neposílá, nic neúčtuje.
Opakování
Každé volání vytvoří nové podání, i za stejné období a druh.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"dph","period":"2026-08","filing_type":"B"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/filings

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "kind": "dph",
    "period": "2026-08",
    "filing_type": "B"
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "id": 3,
  "created_at": "2026-09-28T10:00:00.000Z",
  "created_by_id": 1,
  "data": {
    "period": {
      "year": 2026,
      "month": 8,
      "quarter": null,
      "from": "2026-08-01",
      "to": "2026-08-31",
      "label": "srpen 2026",
      "deadline": "2026-09-25",
      "key": "2026-08"
    },
    "form": "25 5401 MFin 5401 vzor č. 26",
    "rows": {
      "1": {
        "base": 211500.0,
        "tax": 44415.0
      },
      "2": {
        "base": 0.0,
        "tax": 0.0
      },
      "3": {
        "base": 0.0,
        "tax": 0.0
      },
      "4": {
        "base": 0.0,
        "tax": 0.0
      },
      "5": {
        "base": 28003.0,
        "tax": 5881.0
      },
      "6": {
        "base": 0.0,
        "tax": 0.0
      },
      "7": {
        "base": 0.0,
        "tax": 0.0
      },
      "8": {
        "base": 0.0,
        "tax": 0.0
      },
      "9": {
        "base": 0.0,
        "tax": 0.0
      },
      "10": {
        "base": 0.0,
        "tax": 0.0
      },
      "11": {
        "base": 0.0,
        "tax": 0.0
      },
      "12": {
        "base": 0.0,
        "tax": 0.0
      },
      "13": {
        "base": 0.0,
        "tax": 0.0
      },
      "14": {
        "base": 0.0,
        "tax": 0.0
      },
      "20": 0.0,
      "21": 0.0,
      "22": 0.0,
      "23": 0.0,
      "24": 0.0,
      "25": 0.0,
      "26": 0.0,
      "30": 0.0,
      "31": 0.0,
      "32": 0.0,
      "33": 0.0,
      "34": 0.0,
      "40": {
        "base": 20700.0,
        "full": 4347.0,
        "reduced": 0.0
      },
      "41": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "42": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "43": {
        "base": 28003.0,
        "full": 5881.0,
        "reduced": 0.0
      },
      "44": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "45": {
        "full": 0.0,
        "reduced": 0.0
      },
      "46": {
        "full": 10228.0,
        "reduced": 0.0
      },
      "47": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "48": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "50": 0.0,
      "51": {
        "with_credit": 0.0,
        "without_credit": 0.0
      },
      "52": {
        "coefficient": null,
        "deduction": 0.0
      },
      "53": {
        "coefficient": null,
        "change": 0.0
      },
      "60": 0.0,
      "61": 0.0,
      "62": 50296.0,
      "63": 10228.0,
      "64": 40068.0,
      "65": 0.0,
      "66": 0.0
    },
    "own_tax": 40068.0,
    "excess_deduction": 0.0,
    "documents": {
      "1": [
        19,
        20
      ],
      "5": [
        65
      ],
      "40": [
        62,
        63
      ],
      "43": [
        65
      ]
    },
    "warnings": []
  },
  "exception_approved_at": null,
  "exception_approved_by_id": null,
  "exception_reason": null,
  "filed_on": null,
  "filing_type": "B",
  "first_filed_at": null,
  "kind": "dph",
  "period": "2026-08",
  "status": "draft",
  "submission_version": 0,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "kind_label": "Přiznání k DPH",
  "has_xml": true,
  "proof_state": "draft",
  "evidence_count": 0
}

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

GET Detail podání nebo jeho uložené XML

/entities/{entity_id}/filings/{id}

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

Vrátí podání včetně uloženého XML v poli xml. S format=xml (nebo koncovkou .xml v cestě) vrátí přímo uložený soubor XML – přesně ten, který byl sestaven při přípravě podání.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
idcestacelé čísloanoID podání Příklad 55.
formatdotaztextnexml = vrátit soubor XML místo JSON Hodnoty: xml. Příklad xml.

Odpověď

200 application/json Podání (pole jako v GET /filings) a navíc xml. S format=xml soubor application/xml s názvem {kind}-{period}.xml (Content-Disposition attachment).

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "created_at": "2026-09-28T10:00:00.000Z",
  "created_by_id": 1,
  "data": {
    "period": {
      "year": 2026,
      "month": 8,
      "quarter": null,
      "from": "2026-08-01",
      "to": "2026-08-31",
      "label": "srpen 2026",
      "deadline": "2026-09-25",
      "key": "2026-08"
    },
    "form": "25 5401 MFin 5401 vzor č. 26",
    "rows": {
      "1": {
        "base": 211500.0,
        "tax": 44415.0
      },
      "2": {
        "base": 0.0,
        "tax": 0.0
      },
      "3": {
        "base": 0.0,
        "tax": 0.0
      },
      "4": {
        "base": 0.0,
        "tax": 0.0
      },
      "5": {
        "base": 28003.0,
        "tax": 5881.0
      },
      "6": {
        "base": 0.0,
        "tax": 0.0
      },
      "7": {
        "base": 0.0,
        "tax": 0.0
      },
      "8": {
        "base": 0.0,
        "tax": 0.0
      },
      "9": {
        "base": 0.0,
        "tax": 0.0
      },
      "10": {
        "base": 0.0,
        "tax": 0.0
      },
      "11": {
        "base": 0.0,
        "tax": 0.0
      },
      "12": {
        "base": 0.0,
        "tax": 0.0
      },
      "13": {
        "base": 0.0,
        "tax": 0.0
      },
      "14": {
        "base": 0.0,
        "tax": 0.0
      },
      "20": 0.0,
      "21": 0.0,
      "22": 0.0,
      "23": 0.0,
      "24": 0.0,
      "25": 0.0,
      "26": 0.0,
      "30": 0.0,
      "31": 0.0,
      "32": 0.0,
      "33": 0.0,
      "34": 0.0,
      "40": {
        "base": 20700.0,
        "full": 4347.0,
        "reduced": 0.0
      },
      "41": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "42": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "43": {
        "base": 28003.0,
        "full": 5881.0,
        "reduced": 0.0
      },
      "44": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "45": {
        "full": 0.0,
        "reduced": 0.0
      },
      "46": {
        "full": 10228.0,
        "reduced": 0.0
      },
      "47": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "48": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "50": 0.0,
      "51": {
        "with_credit": 0.0,
        "without_credit": 0.0
      },
      "52": {
        "coefficient": null,
        "deduction": 0.0
      },
      "53": {
        "coefficient": null,
        "change": 0.0
      },
      "60": 0.0,
      "61": 0.0,
      "62": 50296.0,
      "63": 10228.0,
      "64": 40068.0,
      "65": 0.0,
      "66": 0.0
    },
    "own_tax": 40068.0,
    "excess_deduction": 0.0,
    "documents": {
      "1": [
        19,
        20
      ],
      "5": [
        65
      ],
      "40": [
        62,
        63
      ],
      "43": [
        65
      ]
    },
    "warnings": []
  },
  "exception_approved_at": null,
  "exception_approved_by_id": null,
  "exception_reason": null,
  "filed_on": "2026-09-24",
  "filing_type": "B",
  "first_filed_at": "2026-09-28T10:00:00.000Z",
  "kind": "dph",
  "period": "2026-08",
  "status": "filed",
  "submission_version": 1,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Pisemnost nazevSW=\"Saldo\" verzeSW=\"1.0\">\n  <DPHDP3 verzePis=\"03.01\">\n    <VetaD dokument=\"DP3\" k_uladis=\"DPH\" typ_platce=\"P\" dapdph_forma=\"B\" rok=\"2026\" mesic=\"8\" d_poddp=\"28.09.2026\" c_okec=\"621000\" trans=\"A\"/>\n    <VetaP c_ufo=\"451\" c_pracufo=\"2001\" dic=\"99999994\" typ_ds=\"P\" zkrobchjm=\"Ukázková firma s.r.o.\" ulice=\"Na Příkopě\" c_pop=\"859\" c_orient=\"22\" naz_obce=\"Praha\" psc=\"11000\" stat=\"ČESKÁ REPUBLIKA\" email=\"demo@example.cz\" c_telef=\"+420777000000\" opr_jmeno=\"Jana\" opr_prijmeni=\"Ukázková\" opr_postaveni=\"jednatelka\" sest_jmeno=\"Jana\" sest_prijmeni=\"Uk…",
  "kind_label": "Přiznání k DPH",
  "has_xml": true,
  "proof_state": "awaiting_proof",
  "evidence_count": 1
}

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

PATCH Označení podání jako odeslaného nebo vrácení mezi připravená

/entities/{entity_id}/filings/{id}

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

Změní stav podání evidovaný v Saldu. status filed znamená, že uživatel prohlašuje, že podání odeslal (Saldo to neověřuje a samo nic neposílá); doložení doručení je samostatný krok přes …/evidences a …/verify. Při přechodu z draft na filed se zvýší submission_version, takže dřívější ověřené doručenky přestanou platit a proof_state je znovu awaiting_proof. status draft vrátí podání mezi připravená, smaže filed_on a zruší schválenou výjimku bez doručenky; přiložené soubory zůstanou.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
statustextanoNový stav Hodnoty: draft, filed.
filed_ondatumneDatum odeslání (jen se status filed); bez něj zůstane dosavadní datum u už odeslaného podání, jinak dnešní datum

Odpověď

200 application/json Podání po změně (tvar jako v GET /filings).

Chyby této operace

StavKódKdy
422–status není draft ani filed („Neplatný stav podání“)

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

Chování

Co změní
Uloží status a filed_on, při prvním odeslání first_filed_at, při přechodu na filed zvýší submission_version; při návratu na draft vymaže schválenou výjimku. Zapíše událost filing.updated s předchozím datem odeslání a případně zrušenou výjimkou. Nic nikam neposílá.
Opakování
Opakované filed u už odeslaného podání verzi nezvyšuje (jen případně změní filed_on); každý přechod draft → filed ji zvýší. Každé volání zapíše událost.

Příklad

cURL

curl \
  -X PATCH \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"filed","filed_on":"2026-09-24"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/filings/1

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'PATCH',
  body: JSON.stringify({
    "status": "filed",
    "filed_on": "2026-09-24"
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "status": "filed",
  "filed_on": "2026-09-24",
  "id": 1,
  "created_at": "2026-09-28T10:00:00.000Z",
  "created_by_id": 1,
  "data": {
    "period": {
      "year": 2026,
      "month": 8,
      "quarter": null,
      "from": "2026-08-01",
      "to": "2026-08-31",
      "label": "srpen 2026",
      "deadline": "2026-09-25",
      "key": "2026-08"
    },
    "form": "25 5401 MFin 5401 vzor č. 26",
    "rows": {
      "1": {
        "base": 211500.0,
        "tax": 44415.0
      },
      "2": {
        "base": 0.0,
        "tax": 0.0
      },
      "3": {
        "base": 0.0,
        "tax": 0.0
      },
      "4": {
        "base": 0.0,
        "tax": 0.0
      },
      "5": {
        "base": 28003.0,
        "tax": 5881.0
      },
      "6": {
        "base": 0.0,
        "tax": 0.0
      },
      "7": {
        "base": 0.0,
        "tax": 0.0
      },
      "8": {
        "base": 0.0,
        "tax": 0.0
      },
      "9": {
        "base": 0.0,
        "tax": 0.0
      },
      "10": {
        "base": 0.0,
        "tax": 0.0
      },
      "11": {
        "base": 0.0,
        "tax": 0.0
      },
      "12": {
        "base": 0.0,
        "tax": 0.0
      },
      "13": {
        "base": 0.0,
        "tax": 0.0
      },
      "14": {
        "base": 0.0,
        "tax": 0.0
      },
      "20": 0.0,
      "21": 0.0,
      "22": 0.0,
      "23": 0.0,
      "24": 0.0,
      "25": 0.0,
      "26": 0.0,
      "30": 0.0,
      "31": 0.0,
      "32": 0.0,
      "33": 0.0,
      "34": 0.0,
      "40": {
        "base": 20700.0,
        "full": 4347.0,
        "reduced": 0.0
      },
      "41": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "42": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "43": {
        "base": 28003.0,
        "full": 5881.0,
        "reduced": 0.0
      },
      "44": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "45": {
        "full": 0.0,
        "reduced": 0.0
      },
      "46": {
        "full": 10228.0,
        "reduced": 0.0
      },
      "47": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "48": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "50": 0.0,
      "51": {
        "with_credit": 0.0,
        "without_credit": 0.0
      },
      "52": {
        "coefficient": null,
        "deduction": 0.0
      },
      "53": {
        "coefficient": null,
        "change": 0.0
      },
      "60": 0.0,
      "61": 0.0,
      "62": 50296.0,
      "63": 10228.0,
      "64": 40068.0,
      "65": 0.0,
      "66": 0.0
    },
    "own_tax": 40068.0,
    "excess_deduction": 0.0,
    "documents": {
      "1": [
        19,
        20
      ],
      "5": [
        65
      ],
      "40": [
        62,
        63
      ],
      "43": [
        65
      ]
    },
    "warnings": []
  },
  "exception_approved_at": null,
  "exception_approved_by_id": null,
  "exception_reason": null,
  "filing_type": "B",
  "first_filed_at": "2026-09-28T10:00:00.000Z",
  "kind": "dph",
  "period": "2026-08",
  "submission_version": 1,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "kind_label": "Přiznání k DPH",
  "has_xml": true,
  "proof_state": "awaiting_proof",
  "evidence_count": 1
}

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

DELETE Smazání připraveného podání

/entities/{entity_id}/filings/{id}

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

Smaže podání, které nikdy nebylo označeno jako odeslané a nemá žádný důkazní soubor. Podání, které už někdy bylo ve stavu filed (i když je teď draft), zůstává kvůli historii.

Parametry

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

Odpověď

204 Bez obsahu.

Chyby této operace

StavKódKdy
422–Podání je nebo někdy bylo označeno jako odeslané („… nelze smazat; zachovejte jeho historii“)
422–K podání jsou přiložené důkazní soubory („Podání s důkazními soubory nelze smazat“)

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

Chování

Co změní
Zapíše událost filing.deleted a podání smaže včetně XML.

Příklad

Potřebuje podání ve stavu draft, které nikdy nebylo odeslané a nemá důkazy.

cURL

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

JavaScript

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

POST Schválení odeslaného podání bez doručenky

/entities/{entity_id}/filings/{id}/exception

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

Výslovně schválí, že odeslané podání se pro uzávěrku považuje za doložené, i když k němu není ověřená doručenka; proof_state pak je exception (ověřená doručenka má přednost a proof_state zůstává verified). Vyžaduje stav filed, potvrzení confirmed_without_receipt a důvod. Nové schválení nahradí předchozí.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
confirmed_without_receiptano/neanoMusí být true
reasontextanoDůvod schválení, alespoň 10 znaků

Odpověď

200 application/json Podání po schválení (proof_state exception, pokud nemá ověřenou doručenku).

Chyby této operace

StavKódKdy
422–Podání není ve stavu filed („Nejprve označte podání jako odeslané“)
422–confirmed_without_receipt není true („Potvrďte schválení bez doručenky“)
422–Důvod je kratší než 10 znaků

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

Chování

Co změní
Uloží exception_approved_at, exception_approved_by_id a exception_reason a zapíše událost filing.exception_approved s důvodem a případně nahrazenou výjimkou.
Opakování
Každé volání přepíše schválení novým (čas, osoba, důvod) a zapíše novou událost.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"confirmed_without_receipt":true,"reason":"Podání je v portálu potvrzené, doručenka zatím nedorazila."}' \
  https://techtools.cz/ucetnictvi-api/entities/1/filings/1/exception

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/1/exception', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "confirmed_without_receipt": true,
    "reason": "Podání je v portálu potvrzené, doručenka zatím nedorazila."
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "exception_approved_at": "2026-09-28T10:00:00.000Z",
  "exception_approved_by_id": 1,
  "exception_reason": "Podání je v portálu potvrzené, doručenka zatím nedorazila.",
  "status": "filed",
  "id": 1,
  "created_at": "2026-09-28T10:00:00.000Z",
  "created_by_id": 1,
  "data": {
    "period": {
      "year": 2026,
      "month": 8,
      "quarter": null,
      "from": "2026-08-01",
      "to": "2026-08-31",
      "label": "srpen 2026",
      "deadline": "2026-09-25",
      "key": "2026-08"
    },
    "form": "25 5401 MFin 5401 vzor č. 26",
    "rows": {
      "1": {
        "base": 211500.0,
        "tax": 44415.0
      },
      "2": {
        "base": 0.0,
        "tax": 0.0
      },
      "3": {
        "base": 0.0,
        "tax": 0.0
      },
      "4": {
        "base": 0.0,
        "tax": 0.0
      },
      "5": {
        "base": 28003.0,
        "tax": 5881.0
      },
      "6": {
        "base": 0.0,
        "tax": 0.0
      },
      "7": {
        "base": 0.0,
        "tax": 0.0
      },
      "8": {
        "base": 0.0,
        "tax": 0.0
      },
      "9": {
        "base": 0.0,
        "tax": 0.0
      },
      "10": {
        "base": 0.0,
        "tax": 0.0
      },
      "11": {
        "base": 0.0,
        "tax": 0.0
      },
      "12": {
        "base": 0.0,
        "tax": 0.0
      },
      "13": {
        "base": 0.0,
        "tax": 0.0
      },
      "14": {
        "base": 0.0,
        "tax": 0.0
      },
      "20": 0.0,
      "21": 0.0,
      "22": 0.0,
      "23": 0.0,
      "24": 0.0,
      "25": 0.0,
      "26": 0.0,
      "30": 0.0,
      "31": 0.0,
      "32": 0.0,
      "33": 0.0,
      "34": 0.0,
      "40": {
        "base": 20700.0,
        "full": 4347.0,
        "reduced": 0.0
      },
      "41": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "42": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "43": {
        "base": 28003.0,
        "full": 5881.0,
        "reduced": 0.0
      },
      "44": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "45": {
        "full": 0.0,
        "reduced": 0.0
      },
      "46": {
        "full": 10228.0,
        "reduced": 0.0
      },
      "47": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "48": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "50": 0.0,
      "51": {
        "with_credit": 0.0,
        "without_credit": 0.0
      },
      "52": {
        "coefficient": null,
        "deduction": 0.0
      },
      "53": {
        "coefficient": null,
        "change": 0.0
      },
      "60": 0.0,
      "61": 0.0,
      "62": 50296.0,
      "63": 10228.0,
      "64": 40068.0,
      "65": 0.0,
      "66": 0.0
    },
    "own_tax": 40068.0,
    "excess_deduction": 0.0,
    "documents": {
      "1": [
        19,
        20
      ],
      "5": [
        65
      ],
      "40": [
        62,
        63
      ],
      "43": [
        65
      ]
    },
    "warnings": []
  },
  "filed_on": "2026-09-24",
  "filing_type": "B",
  "first_filed_at": "2026-09-28T10:00:00.000Z",
  "kind": "dph",
  "period": "2026-08",
  "submission_version": 1,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "kind_label": "Přiznání k DPH",
  "has_xml": true,
  "proof_state": "exception",
  "evidence_count": 1
}

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

DELETE Zrušení schválení podání bez doručenky

/entities/{entity_id}/filings/{id}/exception

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

Zruší schválenou výjimku; podání bez ověřené doručenky se vrátí do stavu awaiting_proof.

Parametry

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

Odpověď

200 application/json Podání po zrušení výjimky.

Chyby této operace

StavKódKdy
422–Výjimka není schválená („Výjimka není schválená“)

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

Chování

Co změní
Vymaže údaje výjimky a zapíše událost filing.exception_revoked s jejím původním obsahem.
Opakování
Druhé volání vrátí 422, protože výjimka už schválená není.

Příklad

Předpokládá výjimku schválenou přes POST …/exception, jinak vrátí 422.

cURL

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/1/exception', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'DELETE'
});
const data = await response.json();
Odpověď 200 OK
{
  "exception_approved_at": null,
  "exception_approved_by_id": null,
  "exception_reason": null,
  "status": "filed",
  "id": 1,
  "created_at": "2026-09-28T10:00:00.000Z",
  "created_by_id": 1,
  "data": {
    "period": {
      "year": 2026,
      "month": 8,
      "quarter": null,
      "from": "2026-08-01",
      "to": "2026-08-31",
      "label": "srpen 2026",
      "deadline": "2026-09-25",
      "key": "2026-08"
    },
    "form": "25 5401 MFin 5401 vzor č. 26",
    "rows": {
      "1": {
        "base": 211500.0,
        "tax": 44415.0
      },
      "2": {
        "base": 0.0,
        "tax": 0.0
      },
      "3": {
        "base": 0.0,
        "tax": 0.0
      },
      "4": {
        "base": 0.0,
        "tax": 0.0
      },
      "5": {
        "base": 28003.0,
        "tax": 5881.0
      },
      "6": {
        "base": 0.0,
        "tax": 0.0
      },
      "7": {
        "base": 0.0,
        "tax": 0.0
      },
      "8": {
        "base": 0.0,
        "tax": 0.0
      },
      "9": {
        "base": 0.0,
        "tax": 0.0
      },
      "10": {
        "base": 0.0,
        "tax": 0.0
      },
      "11": {
        "base": 0.0,
        "tax": 0.0
      },
      "12": {
        "base": 0.0,
        "tax": 0.0
      },
      "13": {
        "base": 0.0,
        "tax": 0.0
      },
      "14": {
        "base": 0.0,
        "tax": 0.0
      },
      "20": 0.0,
      "21": 0.0,
      "22": 0.0,
      "23": 0.0,
      "24": 0.0,
      "25": 0.0,
      "26": 0.0,
      "30": 0.0,
      "31": 0.0,
      "32": 0.0,
      "33": 0.0,
      "34": 0.0,
      "40": {
        "base": 20700.0,
        "full": 4347.0,
        "reduced": 0.0
      },
      "41": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "42": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "43": {
        "base": 28003.0,
        "full": 5881.0,
        "reduced": 0.0
      },
      "44": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "45": {
        "full": 0.0,
        "reduced": 0.0
      },
      "46": {
        "full": 10228.0,
        "reduced": 0.0
      },
      "47": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "48": {
        "base": 0.0,
        "full": 0.0,
        "reduced": 0.0
      },
      "50": 0.0,
      "51": {
        "with_credit": 0.0,
        "without_credit": 0.0
      },
      "52": {
        "coefficient": null,
        "deduction": 0.0
      },
      "53": {
        "coefficient": null,
        "change": 0.0
      },
      "60": 0.0,
      "61": 0.0,
      "62": 50296.0,
      "63": 10228.0,
      "64": 40068.0,
      "65": 0.0,
      "66": 0.0
    },
    "own_tax": 40068.0,
    "excess_deduction": 0.0,
    "documents": {
      "1": [
        19,
        20
      ],
      "5": [
        65
      ],
      "40": [
        62,
        63
      ],
      "43": [
        65
      ]
    },
    "warnings": []
  },
  "filed_on": "2026-09-24",
  "filing_type": "B",
  "first_filed_at": "2026-09-28T10:00:00.000Z",
  "kind": "dph",
  "period": "2026-08",
  "submission_version": 1,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "kind_label": "Přiznání k DPH",
  "has_xml": true,
  "proof_state": "awaiting_proof",
  "evidence_count": 1
}

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

GET Důkazní soubory podání (doručenky a potvrzení)

/entities/{entity_id}/filings/{filing_id}/evidences

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

Vrátí všechny soubory přiložené k podání jako doklad o doručení, včetně vyřazených, v pořadí nahrání. U každého je stav ověření; verified je true jen u nevyřazeného ověřeného souboru s uloženým originálem, jehož ověření patří k aktuálnímu XML a aktuální verzi odeslání podání.

Parametry

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

Odpověď

200 application/json Objekt s polem evidences.

PoleVýznam
evidences[].idID důkazního souboru
evidences[].kinddelivery_receipt (doručenka), acceptance (potvrzení přijetí), other (jiný podklad); kind_label česky
evidences[].filenamePůvodní název souboru; content_type, byte_size, sha256
evidences[].delivered_onDatum doručení zadané při ověření
evidences[].delivery_referenceIdentifikátor podání nebo zprávy zadaný při ověření
evidences[].verified_atKdy a kdo (verified_by_id) ověřil; filing_xml_sha256 a submission_version, ke kterým ověření patří; verification_note
evidences[].voided_atVyřazení: kdy, kdo (voided_by_id), důvod (void_reason)
evidences[].verifiedOvěření platí pro aktuální XML a verzi odeslání a soubor není vyřazený
evidences[].has_fileZda je originál uložený

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/filings/1/evidences

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/1/evidences', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "evidences": [
    {
      "id": 1,
      "byte_size": 142,
      "content_type": "application/pdf",
      "created_at": "2026-09-28T10:00:00.000Z",
      "delivered_on": null,
      "delivery_reference": null,
      "filename": "potvrzeni-podani.pdf",
      "filing_id": 1,
      "filing_xml_sha256": null,
      "kind": "delivery_receipt",
      "sha256": "93e31154c364805a3ef8c904bc257f5ef77600c31b67d392704cd6e1e9cd0657",
      "submission_version": null,
      "updated_at": "2026-09-28T10:00:00.000Z",
      "uploaded_by_id": 1,
      "verification_note": null,
      "verified_at": null,
      "verified_by_id": null,
      "void_reason": null,
      "voided_at": null,
      "voided_by_id": null,
      "kind_label": "Doručenka",
      "has_file": true,
      "verified": false
    }
  ]
}

POST Přiložení doručenky nebo potvrzení k podání

/entities/{entity_id}/filings/{filing_id}/evidences

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

Uloží originální soubor dokladující doručení odeslaného podání (PDF, XML nebo ZFO z datové schránky). Typ se určí podle přípony a obsah se zkontroluje (PDF musí mít strukturu PDF, XML být platné XML, ZFO podepsaná obálka CMS – pečeť ani vztah k podání se nekontrolují). Přiložení samo doručení nedokládá: proof_state zůstane awaiting_proof, dokud vlastník nebo účetní soubor neověří přes …/verify.

Parametry

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

Tělo požadavku

Formát multipart/form-data.

PoleTypPovinnéPopis
filesouboranoSoubor .pdf, .xml nebo .zfo, 1 B až 15 MB
kindtextneDruh podkladu; neznámá hodnota se bere jako delivery_receipt Hodnoty: delivery_receipt, acceptance, other. Výchozí delivery_receipt.

Odpověď

201 application/json Nový důkazní soubor (tvar jako v GET …/evidences). Stejný soubor znovu vrátí 200 s existujícím záznamem.

Chyby této operace

StavKódKdy
422–Podání není ve stavu filed („Nejprve označte podání jako odeslané“)
400–Chybí soubor v poli file („Vyberte doručenku nebo potvrzení“)
413–Soubor je prázdný nebo větší než 15 MB
422–Přípona není .pdf, .xml ani .zfo nebo obsah neodpovídá formátu
422–K podání je už 10 nevyřazených důkazních souborů

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

Chování

Co změní
Uloží originál a záznam s jeho SHA-256, typem a nahrávající osobou a zapíše událost filing.evidence_attached. Stav podání ani proof_state nemění.
Limity
Soubor nejvýše 15 MB; nejvýše 10 nevyřazených souborů na podání (vyřazené se nepočítají).
Opakování
Soubor se stejným obsahem (SHA-256) u téhož podání se znovu neuloží – vrátí 200 s existujícím záznamem, i když je vyřazený, a nezapíše událost.

Příklad

Ukázka nejdřív označí připravené kontrolní hlášení jako odeslané a přiloží k němu soubor, který u něj ještě není.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -F "kind=delivery_receipt" \
  -F "file=@potvrzeni-podani.pdf" \
  https://techtools.cz/ucetnictvi-api/entities/1/filings/2/evidences

JavaScript

const form = new FormData();
form.append('file', fileInput.files[0], 'potvrzeni-podani.pdf');
form.append('kind', 'delivery_receipt');
const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/2/evidences', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'POST',
  body: form
});
const data = await response.json();
Odpověď 201 Created
{
  "id": 2,
  "byte_size": 142,
  "content_type": "application/pdf",
  "created_at": "2026-09-28T10:00:00.000Z",
  "delivered_on": null,
  "delivery_reference": null,
  "filename": "potvrzeni-podani.pdf",
  "filing_id": 2,
  "filing_xml_sha256": null,
  "kind": "delivery_receipt",
  "sha256": "93e31154c364805a3ef8c904bc257f5ef77600c31b67d392704cd6e1e9cd0657",
  "submission_version": null,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "uploaded_by_id": 1,
  "verification_note": null,
  "verified_at": null,
  "verified_by_id": null,
  "void_reason": null,
  "voided_at": null,
  "voided_by_id": null,
  "kind_label": "Doručenka",
  "has_file": true,
  "verified": false
}

GET Detail důkazního souboru podání

/entities/{entity_id}/filings/{filing_id}/evidences/{id}

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

Vrátí jeden důkazní soubor podání s jeho stavem ověření a vyřazení (bez obsahu souboru).

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
filing_idcestacelé čísloanoID podání Příklad 55.
idcestacelé čísloanoID důkazního souboru Příklad 7.

Odpověď

200 application/json Důkazní soubor (pole jako v GET …/evidences).

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/filings/1/evidences/1

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/1/evidences/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "byte_size": 142,
  "content_type": "application/pdf",
  "created_at": "2026-09-28T10:00:00.000Z",
  "delivered_on": null,
  "delivery_reference": null,
  "filename": "potvrzeni-podani.pdf",
  "filing_id": 1,
  "filing_xml_sha256": null,
  "kind": "delivery_receipt",
  "sha256": "93e31154c364805a3ef8c904bc257f5ef77600c31b67d392704cd6e1e9cd0657",
  "submission_version": null,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "uploaded_by_id": 1,
  "verification_note": null,
  "verified_at": null,
  "verified_by_id": null,
  "void_reason": null,
  "voided_at": null,
  "voided_by_id": null,
  "kind_label": "Doručenka",
  "has_file": true,
  "verified": false
}

GET Stažení originálu doručenky

/entities/{entity_id}/filings/{filing_id}/evidences/{id}/file

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

Vrátí uložený originál přesně tak, jak byl nahrán, i u vyřazeného souboru. Vždy jako příloha typu application/octet-stream s hlavičkami Cache-Control private, no-store a X-Content-Type-Options nosniff.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
filing_idcestacelé čísloanoID podání Příklad 55.
idcestacelé čísloanoID důkazního souboru Příklad 7.

Odpověď

200 application/octet-stream Obsah souboru s původním názvem (Content-Disposition attachment).

Chyby této operace

StavKódKdy
404–K záznamu není uložený soubor

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/filings/1/evidences/1/file

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/1/evidences/1/file', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
application/octet-stream, 142 bajtů (soubor potvrzeni-podani.pdf)

POST Ověření doručenky k odeslanému podání

/entities/{entity_id}/filings/{filing_id}/evidences/{id}/verify

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

Vlastník nebo účetní potvrdí, že soubor dokládá doručení právě tohoto podání (subjekt, druh a období souhlasí), a zadá datum doručení a identifikátor podání nebo zprávy. Ověření se váže k aktuálnímu XML podání (SHA-256) a verzi odeslání; po novém označení podání jako odeslaného přestane platit. Podklad druhu other ověřit nelze – pro něj slouží schválení výjimky. Opakované ověření již ověřeného souboru vyžaduje důvod opravy.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
filing_idcestacelé čísloanoID podání Příklad 55.
idcestacelé čísloanoID důkazního souboru Příklad 7.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
confirmed_matchano/neanoMusí být true – potvrzení shody subjektu, druhu a období s podáním
delivery_referencetextanoIdentifikátor podání nebo zprávy (např. ID datové zprávy)
delivered_ondatumanoDatum doručení; neplatné datum vrátí 422
verification_notetextnePoznámka k ověření
correction_reasontextneDůvod opravy, alespoň 10 znaků – povinný, pokud už soubor ověřený byl

Odpověď

200 application/json Důkazní soubor po ověření (verified true); proof_state podání je verified.

Chyby této operace

StavKódKdy
422–Soubor je vyřazený („Vyřazený podklad nelze potvrdit“)
422–Soubor je druhu other („Jiný podklad není doručenkou; použijte výslovné schválení účetní“)
422–Chybí původní soubor
422–Podání není ve stavu filed („Podání musí být označené jako odeslané“)
422–confirmed_match není true, chybí delivery_reference nebo delivered_on
422–Opakované ověření bez důvodu opravy alespoň 10 znaky
422–Neplatné datum delivered_on (error „invalid date“)

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

Chování

Co změní
Uloží datum doručení, identifikátor, poznámku, ověřující osobu a čas a SHA-256 XML a verzi odeslání podání. Zapíše událost filing.evidence_verified s novým i předchozím ověřením. Podání ani soubor nikam neposílá.
Opakování
Opakované ověření přepíše údaje, ale jen s důvodem opravy; každé zapíše novou událost.

Příklad

Předpokládá dosud neověřený soubor; u ověřeného je nutný i correction_reason.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"confirmed_match":true,"delivery_reference":"DS-4816235","delivered_on":"2026-09-24","verification_note":"Doručenka z datové schránky"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/filings/1/evidences/1/verify

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/1/evidences/1/verify', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "confirmed_match": true,
    "delivery_reference": "DS-4816235",
    "delivered_on": "2026-09-24",
    "verification_note": "Doručenka z datové schránky"
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "filing_id": 1,
  "delivery_reference": "DS-4816235",
  "delivered_on": "2026-09-24",
  "verified_by_id": 1,
  "verified_at": "2026-09-28T10:00:00.000Z",
  "filing_xml_sha256": "2841cae7085c494ec117a79d5a1d49e67a625a99b136188ebc9f000e85bca3b9",
  "submission_version": 1,
  "verification_note": "Doručenka z datové schránky",
  "byte_size": 142,
  "sha256": "93e31154c364805a3ef8c904bc257f5ef77600c31b67d392704cd6e1e9cd0657",
  "id": 1,
  "content_type": "application/pdf",
  "created_at": "2026-09-28T10:00:00.000Z",
  "filename": "potvrzeni-podani.pdf",
  "kind": "delivery_receipt",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "uploaded_by_id": 1,
  "void_reason": null,
  "voided_at": null,
  "voided_by_id": null,
  "kind_label": "Doručenka",
  "has_file": true,
  "verified": true
}

POST Vyřazení chybného důkazního souboru

/entities/{entity_id}/filings/{filing_id}/evidences/{id}/void

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

Označí soubor jako vyřazený (např. doručenka patří k jinému podání). Originál ani údaje o dřívějším ověření se nemažou, ověření ale přestane platit a proof_state podání se přepočítá. Vyřazený soubor se nepočítá do limitu 10 souborů.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
filing_idcestacelé čísloanoID podání Příklad 55.
idcestacelé čísloanoID důkazního souboru Příklad 7.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
reasontextanoDůvod vyřazení, alespoň 10 znaků

Odpověď

200 application/json Důkazní soubor po vyřazení.

Chyby této operace

StavKódKdy
422–Soubor je už vyřazený („Podklad je již vyřazený“)
422–Důvod je kratší než 10 znaků

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

Chování

Co změní
Uloží voided_at, voided_by_id a void_reason a zapíše událost filing.evidence_voided s předchozím ověřením.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Doručenka patří k jinému podání"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/filings/1/evidences/1/void

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/1/evidences/1/void', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "reason": "Doručenka patří k jinému podání"
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "filing_id": 1,
  "voided_at": "2026-09-28T10:00:00.000Z",
  "voided_by_id": 1,
  "void_reason": "Doručenka patří k jinému podání",
  "byte_size": 142,
  "sha256": "93e31154c364805a3ef8c904bc257f5ef77600c31b67d392704cd6e1e9cd0657",
  "id": 1,
  "content_type": "application/pdf",
  "created_at": "2026-09-28T10:00:00.000Z",
  "delivered_on": null,
  "delivery_reference": null,
  "filename": "potvrzeni-podani.pdf",
  "filing_xml_sha256": null,
  "kind": "delivery_receipt",
  "submission_version": null,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "uploaded_by_id": 1,
  "verification_note": null,
  "verified_at": null,
  "verified_by_id": null,
  "kind_label": "Doručenka",
  "has_file": true,
  "verified": false
}

POST Oprava druhu nebo obnovení vyřazeného důkazního souboru

/entities/{entity_id}/filings/{filing_id}/evidences/{id}/correct

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

Opraví druh podkladu nebo obnoví omylem vyřazený soubor, aniž by se mazal originál či dřívější události. Oprava vždy zruší vyřazení i dosavadní ověření – soubor je potřeba znovu ověřit přes …/verify.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
filing_idcestacelé čísloanoID podání Příklad 55.
idcestacelé čísloanoID důkazního souboru Příklad 7.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
kindtextanoSprávný druh podkladu; u nevyřazeného souboru musí být jiný než dosavadní Hodnoty: delivery_receipt, acceptance, other.
reasontextanoDůvod opravy, alespoň 10 znaků

Odpověď

200 application/json Důkazní soubor po opravě (nevyřazený, neověřený).

Chyby této operace

StavKódKdy
422–Důvod je kratší než 10 znaků
422–Neplatný druh („Neplatný typ podkladu“)
422–Stejný druh u nevyřazeného souboru („Zvolte jiný typ nebo obnovte vyřazený podklad“)
422–Obnovení vyřazeného souboru by překročilo 10 nevyřazených souborů

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

Chování

Co změní
Změní kind, vymaže údaje o vyřazení i ověření a zapíše událost filing.evidence_corrected s předchozím stavem a důvodem.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"acceptance","reason":"Soubor je potvrzení přijetí, ne doručenka"}' \
  https://techtools.cz/ucetnictvi-api/entities/1/filings/1/evidences/1/correct

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/filings/1/evidences/1/correct', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "kind": "acceptance",
    "reason": "Soubor je potvrzení přijetí, ne doručenka"
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "filing_id": 1,
  "kind": "acceptance",
  "voided_at": null,
  "voided_by_id": null,
  "void_reason": null,
  "verified_at": null,
  "verified_by_id": null,
  "delivered_on": null,
  "delivery_reference": null,
  "filing_xml_sha256": null,
  "submission_version": null,
  "verification_note": null,
  "byte_size": 142,
  "sha256": "93e31154c364805a3ef8c904bc257f5ef77600c31b67d392704cd6e1e9cd0657",
  "id": 1,
  "content_type": "application/pdf",
  "created_at": "2026-09-28T10:00:00.000Z",
  "filename": "potvrzeni-podani.pdf",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "uploaded_by_id": 1,
  "kind_label": "Potvrzení přijetí",
  "has_file": true,
  "verified": false
}

GET Daňový kalendář firmy (JSON nebo iCalendar)

/entities/{entity_id}/calendar

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

Vrátí daňové a pojistné lhůty firmy za rok: DPH a hlášení, daň z příjmů a zálohy, pojistné OSVČ, paušální daň, mzdové odvody a hlášení, daň z nemovitých věcí, silniční daň a účetní závěrku – podle profilu odvozeného z nastavení a dat firmy. Termíny připadající na víkend nebo svátek jsou posunuté na nejbližší následující pracovní den. S format=ics (nebo koncovkou .ics) vrátí soubor iCalendar s celodenními událostmi a připomenutím 3 dny předem. Soubor se stahuje s přihlášením (relace nebo API klíč v hlavičce); veřejný odkaz pro odběr v kalendáři neexistuje.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky Příklad 12.
yeardotazcelé čísloneKalendářní rok; výchozí (i při nečíselné hodnotě) aktuální rok Rozsah od 2000 do 2100. Příklad 2026.
formatdotaztextneics = soubor iCalendar místo JSON Hodnoty: ics. Příklad ics.

Odpověď

200 application/json JSON s rokem, profilem a událostmi. S format=ics soubor text/calendar; charset=utf-8 s názvem danovy-kalendar-{rok}.ics.

PoleVýznam
yearRok
profileZ čeho kalendář vychází: legal_form, vat, recap_statement, recap_goods, fiscal_year_start, employees, advisor, databox, electronic, flat_tax, audit, real_estate, road_tax
eventsLhůty seřazené podle data: date, statutory_date, shifted, key, title, detail, description, category (income_tax, vat, insurance, payroll, property, accounts, other), basis

Chyby této operace

StavKódKdy
422–Pro rok nejsou v Saldu zákonné sazby (Saldo je má pro roky 2024–2026)

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/calendar?year=2026"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/calendar?year=2026', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "year": 2026,
  "profile": {
    "legal_form": "sro",
    "vat": "monthly",
    "recap_statement": true,
    "recap_goods": false,
    "fiscal_year_start": 1,
    "employees": true,
    "advisor": false,
    "databox": false,
    "electronic": true,
    "flat_tax": false,
    "audit": false,
    "real_estate": false,
    "road_tax": false
  },
  "events": [
    {
      "date": "2026-01-20",
      "statutory_date": "2026-01-20",
      "shifted": false,
      "key": "payroll_2025_12",
      "title": "Odvody za zaměstnance a měsíční hlášení",
      "detail": "za prosinec 2025",
      "description": "Odveďte zálohy na daň ze mzdy, pojistné na sociální pojištění ČSSZ a zdravotní pojištění pojišťovnám spolu s přehledem o platbě pojistného. Podejte přehled o výši pojistného pro ČSSZ. Srážkovou daň odveďte do konce následujícího měsíce.",
      "category": "payroll",
      "basis": "§ 38h odst. 10 ZDP; § 9 odst. 1 zákona č. 589/1992 Sb.; § 5 odst. 2 a § 25 odst. 3 zákona č. 592/1992 Sb.; § 9 odst. 2 zákona č. 589/1992 Sb. ve znění do 31. 12. 2025; za prosinec 2025 čl. IX bod 1 zákona č. 360/2025 Sb."
    },
    {
      "date": "2026-01-26",
      "statutory_date": "2026-01-25",
      "shifted": true,
      "key": "vat_control_statement_2025_12",
      "title": "Kontrolní hlášení DPH",
      "detail": "za prosinec 2025",
      "description": "Podejte elektronicky kontrolní hlášení s přehledem vydaných a přijatých daňových dokladů. Právnická osoba ho podává vždy za měsíc, fyzická osoba ve lhůtě pro přiznání.",
      "category": "vat",
      "basis": "§ 101e zákona č. 235/2004 Sb."
    }
  ]
}

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