SaldoDokumentace Otevřít Saldo

Reference API

Majetek, mzdy a cesty

Evidence dlouhodobého majetku a odpisů, zaměstnanci, výpočet a zaúčtování mezd, měsíční hlášení JMHZ a cestovní náhrady.

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

GET Seznam dlouhodobého majetku s odpisy za rok

/entities/{entity_id}/assets

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

Vrátí všechny karty dlouhodobého majetku firmy včetně drobného a vyřazeného majetku, seřazené podle data uvedení do užívání a ID. Ke každé kartě připojí účet oprávek a odpisy za zvolený kalendářní rok: daňový odpis podle odpisové skupiny (celá částka, u osobního automobilu M1 před krácením na uznatelnou část), účetní odpis (součet měsíčních odpisů v roce) a zůstatek daňové vstupní ceny na konci roku.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
yeardotazcelé čísloneKalendářní rok pro pole tax_this_year, accounting_this_year a remaining_tax. Bez parametru nebo při nečíselné hodnotě aktuální rok; hodnoty mimo rozsah se zarovnají na 2000 až 2100. Rozsah od 2000 do 2100. Příklad 2026.

Odpověď

200 application/json Pole karet majetku.

PoleVýznam
id, name, inventory_number, noteIdentifikace karty
categorytangible (hmotný), intangible (nehmotný) nebo low_value (drobný – neodpisuje se)
account_code, accumulated_accountÚčet majetku a z něj odvozený účet oprávek
acquired_on, in_use_from, disposed_on, disposal_kindPořízení, uvedení do užívání a vyřazení
price, residual_value, useful_life_monthsPořizovací cena, zbytková hodnota a doba účetního odpisování v měsících
tax_group, tax_method, vehicle_m1Parametry daňového odpisování
document_idDoklad o pořízení, nebo null
tax_this_yearDaňový odpis v zadaném roce; 0, když se v roce daňově neodpisuje
accounting_this_yearÚčetní odpis v zadaném roce; 0, když se v roce neodpisuje
remaining_taxZůstatek daňové vstupní ceny po odpisu roku; null, když rok v daňovém plánu není

Chyby této operace

StavKódKdy
500–Některá odpisovaná karta má zbytkovou hodnotu mimo 0 až pořizovací cenu, nebo při zadané odpisové skupině rok vyřazení před rokem uvedení do užívání – výpočet plánu selže a seznam se nevrátí (známá chyba, viz createAsset)

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/assets?year=2026', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
[
  {
    "id": 2,
    "account_code": "022",
    "acquired_on": "2026-02-23",
    "category": "tangible",
    "created_at": "2026-09-28T10:00:00.000Z",
    "disposal_kind": null,
    "disposed_on": null,
    "document_id": 72,
    "in_use_from": "2026-02-25",
    "inventory_number": "DM-002",
    "name": "Osobní automobil Škoda Octavia Combi",
    "note": null,
    "price": 689000.0,
    "residual_value": 120000.0,
    "tax_group": 2,
    "tax_method": "accelerated",
    "updated_at": "2026-09-28T10:00:00.000Z",
    "useful_life_months": 60,
    "vehicle_m1": false,
    "accumulated_account": "082",
    "tax_this_year": 137800.0,
    "accounting_this_year": 94840.0,
    "remaining_tax": 551200.0
  },
  {
    "id": 1,
    "account_code": "022",
    "acquired_on": "2026-03-03",
    "category": "tangible",
    "created_at": "2026-09-28T10:00:00.000Z",
    "disposal_kind": null,
    "disposed_on": null,
    "document_id": 71,
    "in_use_from": "2026-03-05",
    "inventory_number": "DM-001",
    "name": "Notebook MacBook Pro 16\"",
    "note": null,
    "price": 84990.0,
    "residual_value": 0.0,
    "tax_group": 1,
    "tax_method": "straight",
    "updated_at": "2026-09-28T10:00:00.000Z",
    "useful_life_months": 36,
    "vehicle_m1": false,
    "accumulated_account": "082",
    "tax_this_year": 16998.0,
    "accounting_this_year": 21249.0,
    "remaining_tax": 67992.0
  }
]

POST Zařazení majetku do evidence

/entities/{entity_id}/assets

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

Založí kartu dlouhodobého majetku a vrátí ji s odpisovými plány. Účetní odpisy jsou rovnoměrné měsíční od měsíce následujícího po uvedení do užívání po dobu useful_life_months ze základu pořizovací cena minus zbytková hodnota, zaokrouhlené na celé koruny nahoru (u majetku uvedeného do užívání před 1. 1. 2026 matematicky); poslední měsíc dorovná zbytek. Daňový plán se počítá jen se zadanou odpisovou skupinou, z pořizovací ceny, od roku uvedení do užívání, rovnoměrně (§ 31 ZDP) nebo zrychleně (§ 32 ZDP). Drobný majetek (low_value) žádný plán nemá. API nepodporuje technické zhodnocení, přerušení odpisování, zvýšený odpis v prvním roce, daňové odpisy nehmotného majetku podle § 32a ZDP, fyzickou inventuru ani evidenci zásob.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
assetobjektano
asset.nametextanoNázev majetku, nejvýše 200 znaků
asset.inventory_numbertextneInventární číslo (jen evidence, jedinečnost se nekontroluje)
asset.categorytextneDruh majetku: tangible hmotný, intangible nehmotný, low_value drobný (bez odpisových plánů a bez zaúčtování odpisů). Hmotný a nehmotný se počítají stejně – se zadanou skupinou se i nehmotný majetek odpisuje daňově podle § 31 nebo § 32 ZDP. Hodnoty: tangible, intangible, low_value. Výchozí tangible.
asset.account_codetextneÚčet majetku: začíná nulou a má 3 až 9 číslic (např. 022). Z prvních tří číslic se odvodí účet oprávek: 013→073, 014→074, 015→075, 019→079, 021→081, 022→082, 025→085, 026→086, 029→089, jinak 082. Výchozí 022.
asset.acquired_ondatumneDatum pořízení; jen evidence, odpisy se počítají od in_use_from
asset.in_use_fromdatumanoDatum uvedení do užívání – účetní odpisy začínají následujícím měsícem, daňové rokem uvedení
asset.pricečísloanoPořizovací (vstupní) cena v Kč, větší než 0; základ účetních i daňových odpisů
asset.tax_groupcelé čísloneOdpisová skupina podle přílohy č. 1 ZDP; null = daňově se neodpisuje Hodnoty: 1, 2, 3, 4, 5, 6.
asset.tax_methodtextneDaňové odpisování: straight rovnoměrné (§ 31 ZDP), accelerated zrychlené (§ 32 ZDP) Hodnoty: straight, accelerated. Výchozí straight.
asset.useful_life_monthscelé čísloneDoba účetního odpisování v měsících Výchozí 36. Rozsah od 1 do 1200.
asset.residual_valuečísloneZbytková hodnota vyloučená z účetních odpisů; musí ležet mezi 0 a pořizovací cenou. API to při uložení neověří – hodnotu mimo rozsah uloží a u hmotného a nehmotného majetku pak výpočet plánů skončí chybou 500 (viz chyby). Výchozí 0.
asset.disposed_ondatumneDatum vyřazení: účetní odpisy běží včetně měsíce vyřazení, daňový odpis roku vyřazení je poloviční (v roce uvedení do užívání nulový). Vyřazení samo nic nezaúčtuje. Rok vyřazení nesmí předcházet roku uvedení do užívání; API to neověří a při zadané odpisové skupině výpočet daňového plánu skončí chybou 500 (viz chyby).
asset.disposal_kindtextneDůvod vyřazení, volný text bez vlivu na výpočet; aplikace používá sale, scrap, damage a gift
asset.document_idcelé čísloneID dokladu o pořízení v této firmě; neexistující ID se uloží jako null
asset.notetextnePoznámka
asset.vehicle_m1ano/neneOsobní automobil kategorie M1: je-li uveden do užívání od zdaňovacího období začínajícího 1. 1. 2024, do daňových výdajů jde jen poměrná část odpisu 2 000 000 Kč / vstupní cena (pole deductible v daňovém plánu). Výchozí false.

Odpověď

201 application/json Založená karta majetku s odpisovými plány.

PoleVýznam
id, name, category, account_code, accumulated_account, in_use_from, price, …Pole karty jako v seznamu majetku
taxDaňový plán po letech: year, rate_or_coefficient, kind (first_year, following_year, disposal), amount, deductible, accumulated, remaining
accountingÚčetní plán po měsících: month (první den měsíce), year, amount, accumulated, remaining (pořizovací cena minus oprávky)
accounting_yearlyÚčetní plán sečtený po kalendářních letech: year, amount, accumulated, remaining

Chyby této operace

StavKódKdy
500–Hmotný nebo nehmotný majetek se zbytkovou hodnotou mimo 0 až pořizovací cenu, nebo s odpisovou skupinou a rokem vyřazení před rokem uvedení do užívání. Karta i událost asset.created se přesto uloží a dokud se hodnoty neopraví (PATCH) nebo karta nesmaže, vrací chybu 500 i seznam, detail a plán majetku a zaúčtování odpisů (známá chyba: výpočet plánu vyhodí výjimku místo chyby 422).

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

Chování

Co změní
Vytvoří kartu majetku a zapíše událost asset.created do historie firmy. Nic nezaúčtuje – ani pořízení, ani odpisy; odpisy se zaúčtují až voláním POST /entities/{entity_id}/assets/depreciate.
Opakování
Každé volání založí novou kartu; duplicity se nekontrolují.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset":{"name":"Server Dell PowerEdge T160","inventory_number":"DM-010","category":"tangible","account_code":"022","acquired_on":"2026-02-10","in_use_from":"2026-02-15","price":145000,"tax_group":1,"tax_method":"straight","useful_life_months":48,"residual_value":0}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/assets

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/assets', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "asset": {
      "name": "Server Dell PowerEdge T160",
      "inventory_number": "DM-010",
      "category": "tangible",
      "account_code": "022",
      "acquired_on": "2026-02-10",
      "in_use_from": "2026-02-15",
      "price": 145000,
      "tax_group": 1,
      "tax_method": "straight",
      "useful_life_months": 48,
      "residual_value": 0
    }
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "id": 4,
  "account_code": "022",
  "acquired_on": "2026-02-10",
  "category": "tangible",
  "created_at": "2026-09-28T10:00:00.000Z",
  "disposal_kind": null,
  "disposed_on": null,
  "document_id": null,
  "in_use_from": "2026-02-15",
  "inventory_number": "DM-010",
  "name": "Server Dell PowerEdge T160",
  "note": null,
  "price": 145000.0,
  "residual_value": 0.0,
  "tax_group": 1,
  "tax_method": "straight",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "useful_life_months": 48,
  "vehicle_m1": false,
  "accumulated_account": "082",
  "tax": [
    {
      "year": 2026,
      "rate_or_coefficient": 20.0,
      "kind": "first_year",
      "amount": 29000.0,
      "deductible": 29000.0,
      "accumulated": 29000.0,
      "remaining": 116000.0
    },
    {
      "year": 2027,
      "rate_or_coefficient": 40.0,
      "kind": "following_year",
      "amount": 58000.0,
      "deductible": 58000.0,
      "accumulated": 87000.0,
      "remaining": 58000.0
    }
  ],
  "accounting": [
    {
      "month": "2026-03-01",
      "year": 2026,
      "amount": 3021.0,
      "accumulated": 3021.0,
      "remaining": 141979.0
    },
    {
      "month": "2026-04-01",
      "year": 2026,
      "amount": 3021.0,
      "accumulated": 6042.0,
      "remaining": 138958.0
    }
  ],
  "accounting_yearly": [
    {
      "year": 2026,
      "amount": 30210.0,
      "accumulated": 30210.0,
      "remaining": 114790.0
    },
    {
      "year": 2027,
      "amount": 36252.0,
      "accumulated": 66462.0,
      "remaining": 78538.0
    }
  ]
}

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

GET Detail majetku s odpisovými plány

/entities/{entity_id}/assets/{id}

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

Vrátí kartu majetku s daňovým odpisovým plánem po letech, účetním plánem po měsících a jeho ročním souhrnem. Stejná data vrací GET /entities/{entity_id}/assets/{id}/schedule.

Parametry

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

Odpověď

200 application/json Karta majetku s plány tax, accounting a accounting_yearly (stejná struktura jako při založení).

PoleVýznam
taxDaňový plán po letech; prázdný bez odpisové skupiny a u drobného majetku
accountingÚčetní plán po měsících; prázdný u drobného majetku
accounting_yearlyÚčetní odpisy po kalendářních letech

Chyby této operace

StavKódKdy
500–Karta má zbytkovou hodnotu mimo 0 až pořizovací cenu, nebo při zadané odpisové skupině rok vyřazení před rokem uvedení do užívání (známá chyba, viz createAsset)

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/assets/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "account_code": "022",
  "acquired_on": "2026-03-03",
  "category": "tangible",
  "created_at": "2026-09-28T10:00:00.000Z",
  "disposal_kind": null,
  "disposed_on": null,
  "document_id": 71,
  "in_use_from": "2026-03-05",
  "inventory_number": "DM-001",
  "name": "Notebook MacBook Pro 16\"",
  "note": null,
  "price": 84990.0,
  "residual_value": 0.0,
  "tax_group": 1,
  "tax_method": "straight",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "useful_life_months": 36,
  "vehicle_m1": false,
  "accumulated_account": "082",
  "tax": [
    {
      "year": 2026,
      "rate_or_coefficient": 20.0,
      "kind": "first_year",
      "amount": 16998.0,
      "deductible": 16998.0,
      "accumulated": 16998.0,
      "remaining": 67992.0
    },
    {
      "year": 2027,
      "rate_or_coefficient": 40.0,
      "kind": "following_year",
      "amount": 33996.0,
      "deductible": 33996.0,
      "accumulated": 50994.0,
      "remaining": 33996.0
    }
  ],
  "accounting": [
    {
      "month": "2026-04-01",
      "year": 2026,
      "amount": 2361.0,
      "accumulated": 2361.0,
      "remaining": 82629.0
    },
    {
      "month": "2026-05-01",
      "year": 2026,
      "amount": 2361.0,
      "accumulated": 4722.0,
      "remaining": 80268.0
    }
  ],
  "accounting_yearly": [
    {
      "year": 2026,
      "amount": 21249.0,
      "accumulated": 21249.0,
      "remaining": 63741.0
    },
    {
      "year": 2027,
      "amount": 28332.0,
      "accumulated": 49581.0,
      "remaining": 35409.0
    }
  ]
}

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

PATCH Úprava nebo vyřazení karty majetku

/entities/{entity_id}/assets/{id}

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

Změní zaslaná pole karty (neposlaná zůstanou beze změny) a vrátí kartu s přepočtenými plány. Vyřazení se zadává polem disposed_on (a disposal_kind). Už zaúčtované odpisy se nezmění – pro jejich přepočet zavolejte POST /entities/{entity_id}/assets/depreciate za dotčený rok.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
assetobjektano
asset.nametextneNázev majetku, nejvýše 200 znaků
asset.inventory_numbertextneInventární číslo
asset.categorytextneDruh majetku (low_value = drobný bez odpisů) Hodnoty: tangible, intangible, low_value.
asset.account_codetextneÚčet majetku začínající nulou, 3 až 9 číslic
asset.acquired_ondatumneDatum pořízení
asset.in_use_fromdatumneDatum uvedení do užívání
asset.pricečíslonePořizovací cena v Kč, větší než 0
asset.tax_groupcelé čísloneOdpisová skupina; null zruší daňové odpisy Hodnoty: 1, 2, 3, 4, 5, 6.
asset.tax_methodtextneRovnoměrné nebo zrychlené daňové odpisování Hodnoty: straight, accelerated.
asset.useful_life_monthscelé čísloneDoba účetního odpisování v měsících Rozsah od 1 do 1200.
asset.residual_valuečísloneZbytková hodnota, mezi 0 a pořizovací cenou; hodnotu mimo rozsah API uloží a výpočet plánů skončí chybou 500 (viz chyby)
asset.disposed_ondatumneDatum vyřazení; null vyřazení zruší. Rok vyřazení před rokem uvedení do užívání API uloží a při zadané odpisové skupině výpočet skončí chybou 500
asset.disposal_kindtextneDůvod vyřazení (volný text; aplikace používá sale, scrap, damage, gift)
asset.document_idcelé čísloneDoklad o pořízení; neexistující ID se uloží jako null
asset.notetextnePoznámka
asset.vehicle_m1ano/neneOsobní automobil M1 s krácením daňově uznatelného odpisu

Odpověď

200 application/json Upravená karta s přepočtenými plány tax, accounting a accounting_yearly.

Chyby této operace

StavKódKdy
500–Karta má po úpravě zbytkovou hodnotu mimo 0 až pořizovací cenu, nebo při zadané odpisové skupině rok vyřazení před rokem uvedení do užívání – změny i událost asset.updated se přesto uloží (známá chyba, viz createAsset)

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

Chování

Co změní
Uloží změny karty a zapíše událost asset.updated. Zaúčtované odpisy ani jiné účetní zápisy nemění; vyřazení se nezaúčtuje.
Opakování
Opakování se stejnými daty kartu nezmění, ale pokaždé zapíše událost asset.updated.

Příklad

cURL

curl \
  -X PATCH \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset":{"note":"Umístění – kancelář Brno","useful_life_months":48}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/assets/1

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/assets/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'PATCH',
  body: JSON.stringify({
    "asset": {
      "note": "Umístění – kancelář Brno",
      "useful_life_months": 48
    }
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "useful_life_months": 48,
  "note": "Umístění – kancelář Brno",
  "price": 84990.0,
  "id": 1,
  "account_code": "022",
  "acquired_on": "2026-03-03",
  "category": "tangible",
  "created_at": "2026-09-28T10:00:00.000Z",
  "disposal_kind": null,
  "disposed_on": null,
  "document_id": 71,
  "in_use_from": "2026-03-05",
  "inventory_number": "DM-001",
  "name": "Notebook MacBook Pro 16\"",
  "residual_value": 0.0,
  "tax_group": 1,
  "tax_method": "straight",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "vehicle_m1": false,
  "accumulated_account": "082",
  "tax": [
    {
      "year": 2026,
      "rate_or_coefficient": 20.0,
      "kind": "first_year",
      "amount": 16998.0,
      "deductible": 16998.0,
      "accumulated": 16998.0,
      "remaining": 67992.0
    },
    {
      "year": 2027,
      "rate_or_coefficient": 40.0,
      "kind": "following_year",
      "amount": 33996.0,
      "deductible": 33996.0,
      "accumulated": 50994.0,
      "remaining": 33996.0
    }
  ],
  "accounting": [
    {
      "month": "2026-04-01",
      "year": 2026,
      "amount": 1771.0,
      "accumulated": 1771.0,
      "remaining": 83219.0
    },
    {
      "month": "2026-05-01",
      "year": 2026,
      "amount": 1771.0,
      "accumulated": 3542.0,
      "remaining": 81448.0
    }
  ],
  "accounting_yearly": [
    {
      "year": 2026,
      "amount": 15939.0,
      "accumulated": 15939.0,
      "remaining": 69051.0
    },
    {
      "year": 2027,
      "amount": 21252.0,
      "accumulated": 37191.0,
      "remaining": 47799.0
    }
  ]
}

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

DELETE Smazání majetku včetně jeho odpisových zápisů

/entities/{entity_id}/assets/{id}

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

Smaže kartu majetku spolu se všemi účetními zápisy jejích odpisů ze všech let. Leží-li kterýkoli z těchto zápisů v uzamčeném období, nic nesmaže. Majetek, který má v účetnictví zůstat, místo mazání vyřaďte polem disposed_on.

Parametry

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

Odpověď

204 Prázdná odpověď.

Chyby této operace

StavKódKdy
422–Některý odpisový zápis majetku leží v uzamčeném období – „Období do D. M. RRRR je uzamčeno – zaúčtování nelze změnit“

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

Chování

Co změní
Smaže kartu a všechny její odpisové zápisy (zdroj asset) bez ohledu na rok a zapíše událost asset.deleted. Doklad o pořízení a jeho zaúčtování zůstanou.
Opakování
Druhé smazání vrátí 404.

Příklad

cURL

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

JavaScript

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

POST Zaúčtování ročních účetních odpisů majetku

/entities/{entity_id}/assets/depreciate

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

Zaúčtuje účetní odpisy všech karet majetku za kalendářní rok year. Každé kartě nejdřív smaže dosavadní odpisové zápisy s datem v tomto roce a pak vytvoří jeden zápis k 31. 12. roku: MD 551 / D účet oprávek (07x nebo 08x podle účtu majetku) ve výši součtu měsíčních účetních odpisů připadajících na kalendářní rok. Karty bez odpisu v roce (drobný majetek, doodepsaný nebo dosud nezařazený) se jen vynechají. Daňové odpisy se neúčtují – slouží jen výpočtu daně z příjmů. Funguje jen v podvojném účetnictví; hospodářský rok firmy se nezohledňuje.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
yeardotazcelé čísloneKalendářní rok odpisů. Bez parametru nebo při nečíselné hodnotě aktuální rok; hodnoty mimo rozsah se zarovnají na 2000 až 2100. Budoucí rok se neodmítá. Rozsah od 2000 do 2100. Příklad 2026.

Odpověď

200 application/json Souhrn zaúčtovaných odpisů.

PoleVýznam
yearZaúčtovaný rok
postedVytvořené zápisy: asset_id, name, amount
totalSoučet zaúčtovaných odpisů v Kč

Chyby této operace

StavKódKdy
422–Firma nevede podvojné účetnictví – „Odpisy se účtují jen v podvojném účetnictví“
422–31. 12. zadaného roku leží v uzamčeném období – „Rok RRRR je uzamčený – odpisy už nelze měnit“
500–Některá karta má zbytkovou hodnotu mimo 0 až pořizovací cenu, nebo při zadané odpisové skupině rok vyřazení před rokem uvedení do užívání – transakce se vrátí a nic se nezaúčtuje (známá chyba, viz createAsset)

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

Chování

Co změní
V jedné transakci smaže odpisové zápisy (zdroj asset) s datem v daném roce a vytvoří nové zápisy MD 551 / D 07x–08x k 31. 12.; zapíše událost asset.depreciated. Nic nevyplácí ani nepodává.
Opakování
Opakované volání za stejný rok smaže dřívější odpisové zápisy roku a vytvoří je znovu podle aktuálních karet (bez změny karet se stejnými částkami); každé volání zapíše novou událost do historie.

Příklad

cURL

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/assets/depreciate?year=2026', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'POST'
});
const data = await response.json();
Odpověď 200 OK
{
  "year": 2026,
  "posted": [
    {
      "asset_id": 1,
      "name": "Notebook MacBook Pro 16\"",
      "amount": 21249.0
    },
    {
      "asset_id": 2,
      "name": "Osobní automobil Škoda Octavia Combi",
      "amount": 94840.0
    }
  ],
  "total": 116089.0
}

GET Odpisové plány majetku

/entities/{entity_id}/assets/{id}/schedule

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

Vrátí totéž co detail majetku (GET /entities/{entity_id}/assets/{id}): kartu s daňovým plánem po letech (tax), účetním plánem po měsících (accounting) a účetními odpisy po kalendářních letech (accounting_yearly).

Parametry

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

Odpověď

200 application/json Karta majetku s plány tax, accounting a accounting_yearly.

PoleVýznam
taxyear, rate_or_coefficient (sazba v % nebo koeficient), kind, amount, deductible (u M1 po krácení), accumulated, remaining
accountingmonth, year, amount, accumulated, remaining
accounting_yearlyyear, amount, accumulated, remaining

Chyby této operace

StavKódKdy
500–Karta má zbytkovou hodnotu mimo 0 až pořizovací cenu, nebo při zadané odpisové skupině rok vyřazení před rokem uvedení do užívání (známá chyba, viz createAsset)

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/assets/1/schedule

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/assets/1/schedule', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "id": 1,
  "account_code": "022",
  "acquired_on": "2026-03-03",
  "category": "tangible",
  "created_at": "2026-09-28T10:00:00.000Z",
  "disposal_kind": null,
  "disposed_on": null,
  "document_id": 71,
  "in_use_from": "2026-03-05",
  "inventory_number": "DM-001",
  "name": "Notebook MacBook Pro 16\"",
  "note": null,
  "price": 84990.0,
  "residual_value": 0.0,
  "tax_group": 1,
  "tax_method": "straight",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "useful_life_months": 36,
  "vehicle_m1": false,
  "accumulated_account": "082",
  "tax": [
    {
      "year": 2026,
      "rate_or_coefficient": 20.0,
      "kind": "first_year",
      "amount": 16998.0,
      "deductible": 16998.0,
      "accumulated": 16998.0,
      "remaining": 67992.0
    },
    {
      "year": 2027,
      "rate_or_coefficient": 40.0,
      "kind": "following_year",
      "amount": 33996.0,
      "deductible": 33996.0,
      "accumulated": 50994.0,
      "remaining": 33996.0
    }
  ],
  "accounting": [
    {
      "month": "2026-04-01",
      "year": 2026,
      "amount": 2361.0,
      "accumulated": 2361.0,
      "remaining": 82629.0
    },
    {
      "month": "2026-05-01",
      "year": 2026,
      "amount": 2361.0,
      "accumulated": 4722.0,
      "remaining": 80268.0
    }
  ],
  "accounting_yearly": [
    {
      "year": 2026,
      "amount": 21249.0,
      "accumulated": 21249.0,
      "remaining": 63741.0
    },
    {
      "year": 2027,
      "amount": 28332.0,
      "accumulated": 49581.0,
      "remaining": 35409.0
    }
  ]
}

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

GET Seznam pracovníků

/entities/{entity_id}/employees

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

Vrátí všechny pracovníky firmy včetně těch s ukončeným vztahem, seřazené podle příjmení a jména. Obsahuje i osobní údaje z karty (údaje pro JMHZ v details, číslo účtu), které vidí každý člen firmy včetně role viewer.

Parametry

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

Odpověď

200 application/json Pole karet pracovníků.

PoleVýznam
id, first_name, last_name, full_name, personal_numberIdentifikace pracovníka
contracthpp, dpc nebo dpp
gross_wageSjednaná měsíční mzda nebo odměna v Kč
started_on, ended_onTrvání pracovněprávního vztahu
declaration, disability, ztpp, studentÚdaje pro slevy na dani a pojistné
health_insurer, bank_account, email, noteKontaktní a evidenční údaje
childrenDěti pro daňové zvýhodnění
detailsÚdaje pro JMHZ a další příznaky (objekt); null, dokud nebyly zadány

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/employees', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
[
  {
    "id": 3,
    "bank_account": null,
    "children": [],
    "contract": "dpp",
    "created_at": "2026-09-28T10:00:00.000Z",
    "declaration": false,
    "details": null,
    "disability": null,
    "email": null,
    "ended_on": null,
    "first_name": "Tereza",
    "gross_wage": 6000.0,
    "health_insurer": "111",
    "last_name": "Nová",
    "note": null,
    "personal_number": null,
    "started_on": "2026-10-01",
    "student": false,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "ztpp": false,
    "full_name": "Tereza Nová"
  },
  {
    "id": 1,
    "bank_account": "7385178468/0800",
    "children": [
      {
        "order": 1,
        "first_name": "Eliška",
        "last_name": "Ukázková",
        "birth_number": "1855120003"
      }
    ],
    "contract": "hpp",
    "created_at": "2026-09-28T10:00:00.000Z",
    "declaration": true,
    "details": {
      "birth_date": "1990-04-12"
    },
    "disability": null,
    "email": null,
    "ended_on": null,
    "first_name": "Anna",
    "gross_wage": 52000.0,
    "health_insurer": "111",
    "last_name": "Ukázková",
    "note": null,
    "personal_number": null,
    "started_on": "2025-04-01",
    "student": false,
    "updated_at": "2026-09-28T10:00:00.000Z",
    "ztpp": false,
    "full_name": "Anna Ukázková"
  }
]

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

POST Nový pracovník

/entities/{entity_id}/employees

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

Založí kartu pracovníka s druhem pracovněprávního vztahu (HPP, DPČ nebo DPP), sjednanou mzdou a údaji pro výpočet mzdy a pro hlášení JMHZ. Karta sama nevytvoří výplatní pásku ani nepřihlásí pracovníka u ČSSZ či zdravotní pojišťovny – pásky vzniknou voláním POST /entities/{entity_id}/payslips/generate.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
employeeobjektano
employee.first_nametextanoJméno, nejvýše 80 znaků
employee.last_nametextanoPříjmení, nejvýše 80 znaků
employee.personal_numbertextneOsobní číslo
employee.contracttextnehpp pracovní poměr, dpc dohoda o pracovní činnosti, dpp dohoda o provedení práce Hodnoty: hpp, dpc, dpp. Výchozí hpp.
employee.gross_wagečísloneSjednaná měsíční hrubá mzda (HPP) nebo měsíční odměna (DPČ, DPP), nejméně 0. Z ní vychází generování pásek; u HPP a DPČ se při vztahu jen po část měsíce krátí podle pracovních dnů (pondělí až pátek), u DPP ne. Výchozí 0.
employee.started_ondatumneDatum nástupu; neplatné datum se uloží jako prázdné
employee.ended_ondatumneDatum ukončení; pásky se generují jen za měsíce, kdy vztah trval
employee.declarationano/nenePodepsané prohlášení poplatníka. Bez něj se měsíčně neuplatní slevy ani daňové zvýhodnění a z příjmu pod zákonným limitem (DPP, malý rozsah) se sráží 15% srážková daň. Výchozí true.
employee.disabilitytextneInvalidita: first I. nebo II. stupně (základní sleva), third III. stupně (rozšířená sleva); prázdné = žádná Hodnoty: first, third.
employee.ztppano/neneDržitel průkazu ZTP/P (sleva na dani, bez minimálního vyměřovacího základu ZP) Výchozí false.
employee.studentano/neneStudent – projeví se jen ve zdravotním pojištění (bez minimálního vyměřovacího základu) Výchozí false.
employee.health_insurertextneKód zdravotní pojišťovny (111 VZP, 201 VoZP, 205 ČPZP, 207 OZP, 209 ZPŠ, 211 ZPMV, 213 RBP) Hodnoty: 111, 201, 205, 207, 209, 211, 213.
employee.bank_accounttextneČíslo účtu pracovníka (jen evidence, Saldo mzdy nevyplácí)
employee.emailtextneE-mail v platném tvaru
employee.notetextnePoznámka
employee.childrenpole (objekt)neDěti pro daňové zvýhodnění; odeslaný seznam nahradí uložený celý
employee.children[].ordercelé číslonePořadí dítěte (1, 2, 3); určuje výši zvýhodnění. Karta ho neověřuje – nečíselná hodnota se uloží a výpočet mzdy pak skončí chybou 500
employee.children[].ztppano/neneDítě je držitelem průkazu ZTP/P
employee.children[].monthspole (celé číslo)neMěsíce 1–12, za které se zvýhodnění uplatní; bez pole každý měsíc
employee.children[].first_nametextneJméno dítěte (pro JMHZ)
employee.children[].last_nametextnePříjmení dítěte (pro JMHZ)
employee.children[].birth_datedatumneDatum narození dítěte (pro JMHZ)
employee.children[].birth_numbertextneRodné číslo dítěte (pro JMHZ)
employee.detailsobjektneÚdaje pro JMHZ a další příznaky. Při úpravě se slučují s uloženými: odeslaný klíč přepíše uložený, prázdná hodnota (null, "" nebo prázdný objekt) klíč odstraní, neposlané klíče zůstanou; neznámé klíče se zahodí.
employee.details.oictextneOIČ (IK MPSV) z registrace zaměstnance – 10 číslic
employee.details.employment_idtextneID pracovněprávního vztahu z registrace – až 22 číslic
employee.details.birth_datedatumneDatum narození
employee.details.birth_numbertextneRodné číslo; spojuje karty téže osoby pro roční maximální vyměřovací základ
employee.details.activity_codetextneDruh činnosti podle registrace (1–9 pracovní poměr, A–J DPČ, T–ZC DPP)
employee.details.eldp_codetextneKód ELDP
employee.details.primaryano/nenePrimární pracovněprávní vztah u zaměstnavatele
employee.details.workplaceobjektneMísto výkonu práce
employee.details.workplace.municipalitytextneObec
employee.details.workplace.municipality_codetextneKód obce, 6 číslic (číselník ČSÚ)
employee.details.workplace.countrytextneStát, dvoupísmenný kód (např. CZ)
employee.details.weekly_hoursčísloneSjednaná týdenní pracovní doba (hodin)
employee.details.standard_weekly_hoursčísloneStanovená týdenní pracovní doba podle § 79 zákoníku práce
employee.details.monthly_hoursčísloneSjednaný rozsah dohody za měsíc (hodin)
employee.details.hourly_ratečísloneHodinová odměna z dohody (Kč)
employee.details.average_hourly_earningsčíslonePrůměrný hodinový výdělek (Kč)
employee.details.garnishmentano/neneSrážky ze mzdy (exekuce, insolvence, dohoda o srážkách)
employee.details.shared_childrenano/neneTytéž děti vyživuje i jiná osoba ve společné domácnosti
employee.details.other_parentobjektneJiná osoba vyživující tytéž děti
employee.details.other_parent.first_nametextneJméno
employee.details.other_parent.last_nametextnePříjmení
employee.details.other_parent.birth_datedatumneDatum narození
employee.details.other_parent.birth_numbertextneRodné číslo
employee.details.functional_emolumentsano/neneFunkční požitky podle § 6 odst. 10 ZDP
employee.details.pensionerano/nenePoživatel starobního důchodu – sleva 6,5 % na sociálním pojistném zaměstnance (od 2025)
employee.details.health_minimum_exemptano/nenePo celý měsíc neplatí minimální vyměřovací základ zdravotního pojištění

Odpověď

201 application/json Založená karta pracovníka (stejná pole jako v seznamu).

Chování

Co změní
Vytvoří kartu pracovníka a zapíše událost employee.created. Pásky ani účetní zápisy nevytváří.
Opakování
Každé volání založí nového pracovníka; duplicity se nekontrolují.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"employee":{"first_name":"Jana","last_name":"Nováková","contract":"hpp","gross_wage":42000,"started_on":"2026-03-01","declaration":true,"health_insurer":"111","children":[{"first_name":"Tomáš","last_name":"Novák","birth_date":"2018-05-12","order":1}],"details":{"weekly_hours":40,"workplace":{"municipality":"Brno","municipality_code":"582786","country":"CZ"}}}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/employees

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/employees', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "employee": {
      "first_name": "Jana",
      "last_name": "Nováková",
      "contract": "hpp",
      "gross_wage": 42000,
      "started_on": "2026-03-01",
      "declaration": true,
      "health_insurer": "111",
      "children": [
        {
          "first_name": "Tomáš",
          "last_name": "Novák",
          "birth_date": "2018-05-12",
          "order": 1
        }
      ],
      "details": {
        "weekly_hours": 40,
        "workplace": {
          "municipality": "Brno",
          "municipality_code": "582786",
          "country": "CZ"
        }
      }
    }
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "id": 4,
  "bank_account": null,
  "children": [
    {
      "first_name": "Tomáš",
      "last_name": "Novák",
      "birth_date": "2018-05-12",
      "order": 1
    }
  ],
  "contract": "hpp",
  "created_at": "2026-09-28T10:00:00.000Z",
  "declaration": true,
  "details": {
    "weekly_hours": 40,
    "workplace": {
      "municipality": "Brno",
      "municipality_code": "582786",
      "country": "CZ"
    }
  },
  "disability": null,
  "email": null,
  "ended_on": null,
  "first_name": "Jana",
  "gross_wage": 42000.0,
  "health_insurer": "111",
  "last_name": "Nováková",
  "note": null,
  "personal_number": null,
  "started_on": "2026-03-01",
  "student": false,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "ztpp": false,
  "full_name": "Jana Nováková"
}

PATCH Úprava karty pracovníka

/entities/{entity_id}/employees/{id}

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

Změní zaslaná pole karty. Pole children se nahradí celým odeslaným seznamem; details se slučují s uloženými (odeslané klíče přepíší, prázdné hodnoty odstraní, neposlané zůstanou; příznaky se převedou na true/false). Změna se do existujících pásek promítne až jejich přepočtem (POST /entities/{entity_id}/payslips/generate nebo PATCH pásky s gross či bonuses).

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
employeeobjektano
employee.first_nametextneJméno, nejvýše 80 znaků
employee.last_nametextnePříjmení, nejvýše 80 znaků
employee.personal_numbertextneOsobní číslo
employee.contracttextnehpp pracovní poměr, dpc dohoda o pracovní činnosti, dpp dohoda o provedení práce Hodnoty: hpp, dpc, dpp.
employee.gross_wagečísloneSjednaná měsíční hrubá mzda (HPP) nebo měsíční odměna (DPČ, DPP), nejméně 0
employee.started_ondatumneDatum nástupu; neplatné datum se uloží jako prázdné
employee.ended_ondatumneDatum ukončení; pásky se generují jen za měsíce, kdy vztah trval
employee.declarationano/nenePodepsané prohlášení poplatníka
employee.disabilitytextneInvalidita: first I. nebo II. stupně, third III. stupně; prázdné = žádná Hodnoty: first, third.
employee.ztppano/neneDržitel průkazu ZTP/P
employee.studentano/neneStudent – projeví se jen ve zdravotním pojištění
employee.health_insurertextneKód zdravotní pojišťovny Hodnoty: 111, 201, 205, 207, 209, 211, 213.
employee.bank_accounttextneČíslo účtu pracovníka (jen evidence)
employee.emailtextneE-mail v platném tvaru
employee.notetextnePoznámka
employee.childrenpole (objekt)neDěti pro daňové zvýhodnění; odeslaný seznam nahradí uložený celý
employee.children[].ordercelé číslonePořadí dítěte (1, 2, 3); nečíselná hodnota se uloží a výpočet mzdy pak skončí chybou 500
employee.children[].ztppano/neneDítě je držitelem průkazu ZTP/P
employee.children[].monthspole (celé číslo)neMěsíce 1–12, za které se zvýhodnění uplatní; bez pole každý měsíc
employee.children[].first_nametextneJméno dítěte
employee.children[].last_nametextnePříjmení dítěte
employee.children[].birth_datedatumneDatum narození dítěte
employee.children[].birth_numbertextneRodné číslo dítěte
employee.detailsobjektneÚdaje pro JMHZ a příznaky se stejnými klíči jako při založení (oic, employment_id, birth_date, birth_number, activity_code, eldp_code, primary, workplace, weekly_hours, standard_weekly_hours, monthly_hours, hourly_rate, average_hourly_earnings, garnishment, shared_children, other_parent, functional_emoluments, pensioner, health_minimum_exempt). Odeslané klíče přepíší uložené, prázdná hodnota (null, "" nebo prázdný objekt) klíč odstraní, neposlané klíče zůstanou, příznaky se převedou na true/false a neznámé klíče se zahodí.

Odpověď

200 application/json Upravená karta pracovníka.

Chování

Co změní
Uloží kartu pracovníka. Událost do historie nezapisuje; výplatní pásky ani zaúčtování nemění.
Opakování
Opakování se stejnými daty vede ke stejnému stavu.

Příklad

cURL

curl \
  -X PATCH \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"employee":{"gross_wage":54000,"details":{"weekly_hours":40,"pensioner":false}}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/employees/1

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/employees/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'PATCH',
  body: JSON.stringify({
    "employee": {
      "gross_wage": 54000,
      "details": {
        "weekly_hours": 40,
        "pensioner": false
      }
    }
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "gross_wage": 54000.0,
  "details": {
    "birth_date": "1990-04-12",
    "weekly_hours": 40,
    "pensioner": false
  },
  "id": 1,
  "bank_account": "7385178468/0800",
  "children": [
    {
      "order": 1,
      "first_name": "Eliška",
      "last_name": "Ukázková",
      "birth_number": "1855120003"
    }
  ],
  "contract": "hpp",
  "created_at": "2026-09-28T10:00:00.000Z",
  "declaration": true,
  "disability": null,
  "email": null,
  "ended_on": null,
  "first_name": "Anna",
  "health_insurer": "111",
  "last_name": "Ukázková",
  "note": null,
  "personal_number": null,
  "started_on": "2025-04-01",
  "student": false,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "ztpp": false,
  "full_name": "Anna Ukázková"
}

DELETE Smazání pracovníka bez výplatních pásek

/entities/{entity_id}/employees/{id}

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

Smaže kartu pracovníka, který nemá žádnou výplatní pásku. Pracovníka s páskami nelze smazat – ukončete vztah polem ended_on. Cestovní příkazy s tímto pracovníkem zůstanou (s uloženým jménem cestujícího, employee_name bude null).

Parametry

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

Odpověď

204 Prázdná odpověď.

Chyby této operace

StavKódKdy
422–Pracovník má aspoň jednu výplatní pásku – „Pracovník má výplatní pásky – nastavte datum ukončení“

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

Chování

Co změní
Smaže kartu pracovníka. Událost do historie nezapisuje.
Opakování
Druhé smazání vrátí 404.

Příklad

Maže pracovníka bez výplatních pásek; pracovníka s páskami API odmítne s chybou 422.

cURL

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

JavaScript

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

GET Výplatní pásky za rok nebo měsíc

/entities/{entity_id}/payslips

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

Vrátí výplatní pásky firmy za kalendářní rok, volitelně jen za jeden měsíc, seřazené podle měsíce a ID pracovníka. Páska nese hrubou a čistou mzdu, náklady zaměstnavatele, stav (draft koncept, approved schváleno, posted zaúčtováno) a v data celý výpočet: pojistné, daň, účetní předpis, krácení, docházku a upozornění.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
yeardotazcelé čísloneRok pásek; bez parametru nebo při nečíselné hodnotě aktuální rok, mimo rozsah se zarovná na 2000 až 2100. Rozsah od 2000 do 2100. Příklad 2026.
monthdotazcelé čísloneMěsíc 1–12; bez něj vrátí pásky celého roku. Příklad 8.

Odpověď

200 application/json Pole výplatních pásek.

PoleVýznam
id, employee_id, employee_name, year, monthPáska a pracovník
gross, net, employer_costHrubá mzda, čistá mzda a celkové náklady zaměstnavatele v Kč
statusdraft, approved nebo posted
dataVýpočet: insured, assessment_base, employee, employer, health_min_base_topup, tax, net, payout, postings, warnings, base_gross, bonuses, případně proration a attendance

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/payslips?year=2026', {
  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",
    "data": {
      "gross": 52000.0,
      "insured": {
        "social": true,
        "health": true
      },
      "assessment_base": {
        "social": 52000.0,
        "health": 52000.0
      },
      "employee": {
        "social": 3692.0,
        "health": 2340.0,
        "total": 6032.0
      },
      "employer": {
        "social": 12896.0,
        "health": 4680.0,
        "total": 17576.0
      },
      "health_min_base_topup": 0.0,
      "tax": {
        "base": 52000.0,
        "rounded_base": 52000.0,
        "rate_split": [
          {
            "rate": 0.15,
            "base": 52000.0,
            "tax": 7800.0
          }
        ],
        "advance_before_credits": 7800.0,
        "credits": [
          {
            "key": "taxpayer",
            "label": "Základní sleva na poplatníka",
            "amount": 2570.0,
            "entitlement": 2570.0
          }
        ],
        "child_benefit": {
          "total": 1267.0,
          "as_credit": 1267.0,
          "bonus": 0.0
        },
        "advance": 3963.0,
        "withholding": 0.0,
        "kind": "advance"
      },
      "net": 42005.0,
      "payout": 42005.0,
      "employer_cost": 69576.0,
      "postings": [
        {
          "debit": "521",
          "credit": "331",
          "amount": 52000.0,
          "text": "Hrubá mzda"
        },
        {
          "debit": "524",
          "credit": "336",
          "amount": 12896.0,
          "text": "Sociální pojištění hrazené zaměstnavatelem"
        }
      ],
      "warnings": [],
      "base_gross": 52000.0,
      "bonuses": 0.0
    },
    "employee_id": 1,
    "employer_cost": 69576.0,
    "gross": 52000.0,
    "month": 1,
    "net": 42005.0,
    "status": "posted",
    "updated_at": "2026-09-28T10:00:00.000Z",
    "year": 2026,
    "employee_name": "Anna Ukázková"
  },
  {
    "id": 2,
    "created_at": "2026-09-28T10:00:00.000Z",
    "data": {
      "gross": 52000.0,
      "insured": {
        "social": true,
        "health": true
      },
      "assessment_base": {
        "social": 52000.0,
        "health": 52000.0
      },
      "employee": {
        "social": 3692.0,
        "health": 2340.0,
        "total": 6032.0
      },
      "employer": {
        "social": 12896.0,
        "health": 4680.0,
        "total": 17576.0
      },
      "health_min_base_topup": 0.0,
      "tax": {
        "base": 52000.0,
        "rounded_base": 52000.0,
        "rate_split": [
          {
            "rate": 0.15,
            "base": 52000.0,
            "tax": 7800.0
          }
        ],
        "advance_before_credits": 7800.0,
        "credits": [
          {
            "key": "taxpayer",
            "label": "Základní sleva na poplatníka",
            "amount": 2570.0,
            "entitlement": 2570.0
          }
        ],
        "child_benefit": {
          "total": 1267.0,
          "as_credit": 1267.0,
          "bonus": 0.0
        },
        "advance": 3963.0,
        "withholding": 0.0,
        "kind": "advance"
      },
      "net": 42005.0,
      "payout": 42005.0,
      "employer_cost": 69576.0,
      "postings": [
        {
          "debit": "521",
          "credit": "331",
          "amount": 52000.0,
          "text": "Hrubá mzda"
        },
        {
          "debit": "524",
          "credit": "336",
          "amount": 12896.0,
          "text": "Sociální pojištění hrazené zaměstnavatelem"
        }
      ],
      "warnings": [],
      "base_gross": 52000.0,
      "bonuses": 0.0
    },
    "employee_id": 1,
    "employer_cost": 69576.0,
    "gross": 52000.0,
    "month": 2,
    "net": 42005.0,
    "status": "posted",
    "updated_at": "2026-09-28T10:00:00.000Z",
    "year": 2026,
    "employee_name": "Anna Ukázková"
  }
]

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

POST Orientační výpočet mzdy bez uložení

/entities/{entity_id}/payslips/calculate

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

Spočítá výplatní pásku z anonymních vstupů bez vazby na pracovníka a nic neuloží: pojistné zaměstnance i zaměstnavatele, zálohu nebo srážkovou daň se slevami a daňovým zvýhodněním, čistou mzdu, částku k výplatě, náklady zaměstnavatele a účetní předpis. Na rozdíl od veřejné kalkulačky POST /calc/payroll nepřijímá agreed_wage, ytd_social_base, pensioner_discount ani health_minimum_exempt (ignorují se).

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
yearcelé čísloneRok sazeb; bez hodnoty aktuální rok
monthcelé čísloneMěsíc 1–12; bez hodnoty aktuální měsíc. Výsledek tohoto výpočtu na měsíci nezávisí, jiná hodnota ale skončí chybou 500
contracttextneDruh pracovněprávního vztahu; jiná hodnota skončí chybou 500 Hodnoty: hpp, dpc, dpp. Výchozí hpp.
grossčísloneHrubá mzda v Kč, nezáporná (záporná skončí chybou 500); bez hodnoty nebo nečíselná 0
declarationano/nenePodepsané prohlášení poplatníka Výchozí true.
disabilitytextneStupeň invalidity; first/second a 1/2 = I. a II. stupeň, third a 3 = III. stupeň, 0 nebo prázdné = žádná Hodnoty: first, second, third, 1, 2, 3, 0.
ztppano/neneDržitel průkazu ZTP/P Výchozí false.
studentano/neneStudent Výchozí false.
childrenpole (objekt)neDěti pro daňové zvýhodnění (uplatní se ve všech měsících)
children[].ordercelé číslonePořadí dítěte (1, 2, 3)
children[].ztppano/neneDítě je držitelem průkazu ZTP/P

Odpověď

200 application/json Výpočet výplatní pásky.

PoleVýznam
grossHrubá mzda
insuredÚčast na pojištění: social, health
assessment_baseVyměřovací základy: social, health
employee, employerPojistné zaměstnance a zaměstnavatele: social, health, total
health_min_base_topupDoplatek zdravotního pojistného do minimálního vyměřovacího základu
taxDaň: base, rounded_base, rate_split, advance_before_credits, credits, child_benefit (total, as_credit, bonus), advance, withholding, kind (advance nebo withholding)
netČistá mzda
payoutK výplatě: čistá mzda plus daňový bonus
employer_costHrubá mzda plus pojistné zaměstnavatele
postingsÚčetní předpis, který by se zaúčtoval: debit, credit, amount, text
warningsUpozornění (česky)

Chyby této operace

StavKódKdy
422–Pro zadaný rok nejsou v Saldu zákonné sazby – „Pro rok RRRR nejsou k dispozici zákonné sazby“
500–Vstup, který výpočet odmítne, ale API předem neověří: záporná gross, month mimo 1–12 (i nečíselný), neznámý contract nebo disability, nečíselné children[].order (známá chyba: výjimka místo chyby 422)

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 \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"year":2026,"month":9,"contract":"hpp","gross":52000,"declaration":true,"children":[{"order":1}]}' \
  https://techtools.cz/ucetnictvi-api/entities/1/payslips/calculate

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/payslips/calculate', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "year": 2026,
    "month": 9,
    "contract": "hpp",
    "gross": 52000,
    "declaration": true,
    "children": [
      {
        "order": 1
      }
    ]
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "gross": 52000.0,
  "insured": {
    "social": true,
    "health": true
  },
  "assessment_base": {
    "social": 52000.0,
    "health": 52000.0
  },
  "employee": {
    "social": 3692.0,
    "health": 2340.0,
    "total": 6032.0
  },
  "employer": {
    "social": 12896.0,
    "health": 4680.0,
    "total": 17576.0
  },
  "health_min_base_topup": 0.0,
  "tax": {
    "base": 52000.0,
    "rounded_base": 52000.0,
    "rate_split": [
      {
        "rate": 0.15,
        "base": 52000.0,
        "tax": 7800.0
      }
    ],
    "advance_before_credits": 7800.0,
    "credits": [
      {
        "key": "taxpayer",
        "label": "Základní sleva na poplatníka",
        "amount": 2570.0,
        "entitlement": 2570.0
      }
    ],
    "child_benefit": {
      "total": 1267.0,
      "as_credit": 1267.0,
      "bonus": 0.0
    },
    "advance": 3963.0,
    "withholding": 0.0,
    "kind": "advance"
  },
  "net": 42005.0,
  "payout": 42005.0,
  "employer_cost": 69576.0,
  "postings": [
    {
      "debit": "521",
      "credit": "331",
      "amount": 52000.0,
      "text": "Hrubá mzda"
    },
    {
      "debit": "524",
      "credit": "336",
      "amount": 12896.0,
      "text": "Sociální pojištění hrazené zaměstnavatelem"
    }
  ],
  "warnings": []
}

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

POST Vygenerování výplatních pásek za měsíc

/entities/{entity_id}/payslips/generate

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

Vytvoří nebo přepočítá výplatní pásky všech pracovníků, jejichž vztah v daném měsíci trval aspoň jeden den. Základem je mzda z karty pracovníka; u HPP a DPČ trvajících jen část měsíce se krátí podle pracovních dnů (pondělí až pátek), u DPP ne. Zachová uložené prémie, docházku a roční zúčtování pásky, ruční změnu hrubé mzdy přepíše a nezaúčtované pásky vrátí do stavu draft. Zaúčtované pásky ponechá beze změny. Rok se zadává v query, měsíc v těle.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
yeardotazcelé čísloneRok pásek; bez parametru nebo při nečíselné hodnotě aktuální rok, mimo rozsah se zarovná na 2000 až 2100. Rozsah od 2000 do 2100. Příklad 2026.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
monthcelé čísloanoMěsíc pásek 1–12; chybějící nebo nečíselný měsíc, 0 nebo číslo nad 12 vrátí 400. Záporné číslo API neodmítne – s aktivními pracovníky skončí chybou 500 (známá chyba) Rozsah od 1 do 12.

Odpověď

201 application/json Pásky měsíce po generování.

PoleVýznam
year, monthObdobí
payslipsPásky pracovníků, jejichž vztah v měsíci trval (nové, přepočtené i nezměněné zaúčtované), ve tvaru jako v seznamu

Chyby této operace

StavKódKdy
422–Pro rok nejsou v Saldu zákonné sazby – „Pro rok RRRR nejsou k dispozici zákonné sazby“
500–Výpočet některé pásky selže (např. nečíselné pořadí dítěte na kartě pracovníka nebo záporný měsíc) – známá chyba; pásky pracovníků zpracovaných před ním zůstanou uložené

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

Chování

Co změní
Vytvoří nebo přepíše nezaúčtované výplatní pásky měsíce (stav draft) a zapíše událost payroll.generated. Nic nezaúčtuje, nevyplatí ani nepodá (JMHZ se připravuje zvlášť). Uzamčení období se nekontroluje, protože pásky samy nejsou účetními zápisy. Pásky se ukládají po jedné bez společné transakce.
Opakování
Duplicitní pásky nevzniknou (jedna páska na pracovníka a měsíc); opakované volání znovu přepočítá nezaúčtované pásky a zapíše novou událost.

Příklad

Prosinec aktuálního roku ukázková firma ještě nemá, takže příklad vytvoří nové pásky ve stavu draft.

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"month":12}' \
  "https://techtools.cz/ucetnictvi-api/entities/1/payslips/generate?year=2026"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/payslips/generate?year=2026', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "month": 12
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "year": 2026,
  "month": 12,
  "payslips": [
    {
      "id": 18,
      "created_at": "2026-09-28T10:00:00.000Z",
      "data": {
        "gross": 52000.0,
        "insured": {
          "social": true,
          "health": true
        },
        "assessment_base": {
          "social": 52000.0,
          "health": 52000.0
        },
        "employee": {
          "social": 3692.0,
          "health": 2340.0,
          "total": 6032.0
        },
        "employer": {
          "social": 12896.0,
          "health": 4680.0,
          "total": 17576.0
        },
        "health_min_base_topup": 0.0,
        "tax": {
          "base": 52000.0,
          "rounded_base": 52000.0,
          "rate_split": [
            {
              "rate": 0.15,
              "base": 52000.0,
              "tax": 7800.0
            }
          ],
          "advance_before_credits": 7800.0,
          "credits": [
            {
              "key": "taxpayer",
              "label": "Základní sleva na poplatníka",
              "amount": 2570.0,
              "entitlement": 2570.0
            }
          ],
          "child_benefit": {
            "total": 1267.0,
            "as_credit": 1267.0,
            "bonus": 0.0
          },
          "advance": 3963.0,
          "withholding": 0.0,
          "kind": "advance"
        },
        "net": 42005.0,
        "payout": 42005.0,
        "employer_cost": 69576.0,
        "postings": [
          {
            "debit": "521",
            "credit": "331",
            "amount": 52000.0,
            "text": "Hrubá mzda"
          },
          {
            "debit": "524",
            "credit": "336",
            "amount": 12896.0,
            "text": "Sociální pojištění hrazené zaměstnavatelem"
          }
        ],
        "warnings": [],
        "base_gross": 52000.0,
        "bonuses": 0.0
      },
      "employee_id": 1,
      "employer_cost": 69576.0,
      "gross": 52000.0,
      "month": 12,
      "net": 42005.0,
      "status": "draft",
      "updated_at": "2026-09-28T10:00:00.000Z",
      "year": 2026,
      "employee_name": "Anna Ukázková"
    },
    {
      "id": 19,
      "created_at": "2026-09-28T10:00:00.000Z",
      "data": {
        "gross": 8500.0,
        "insured": {
          "social": false,
          "health": false
        },
        "assessment_base": {
          "social": 0.0,
          "health": 0.0
        },
        "employee": {
          "social": 0.0,
          "health": 0.0,
          "total": 0.0
        },
        "employer": {
          "social": 0.0,
          "health": 0.0,
          "total": 0.0
        },
        "health_min_base_topup": 0.0,
        "tax": {
          "base": 8500.0,
          "rounded_base": 8500.0,
          "rate_split": [
            {
              "rate": 0.15,
              "base": 8500.0,
              "tax": 1275.0
            }
          ],
          "advance_before_credits": 0.0,
          "credits": [],
          "child_benefit": {
            "total": 0.0,
            "as_credit": 0.0,
            "bonus": 0.0
          },
          "advance": 0.0,
          "withholding": 1275.0,
          "kind": "withholding"
        },
        "net": 7225.0,
        "payout": 7225.0,
        "employer_cost": 8500.0,
        "postings": [
          {
            "debit": "521",
            "credit": "331",
            "amount": 8500.0,
            "text": "Hrubá mzda"
          },
          {
            "debit": "331",
            "credit": "342",
            "amount": 1275.0,
            "text": "Srážková daň z příjmů ze závislé činnosti"
          }
        ],
        "warnings": [],
        "base_gross": 8500.0,
        "bonuses": 0.0
      },
      "employee_id": 2,
      "employer_cost": 8500.0,
      "gross": 8500.0,
      "month": 12,
      "net": 7225.0,
      "status": "draft",
      "updated_at": "2026-09-28T10:00:00.000Z",
      "year": 2026,
      "employee_name": "Petr Vzorový"
    }
  ]
}

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

PATCH Úprava výplatní pásky – mzda, prémie, stav a docházka

/entities/{entity_id}/payslips/{id}

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

Pole se posílají přímo v těle bez obalu. gross nebo bonuses pásku přepočítají podle aktuální karty pracovníka a vrátí ji do stavu draft: gross nastaví novou základní mzdu a zruší krácení, bonuses nastaví prémie. Přepočet bez bonuses nastaví prémie na 0, přepočet jen s bonuses zachová dosavadní základ i krácení. status přepne draft/approved (jiné hodnoty se ignorují). attendance nahradí uloženou docházku, která slouží jen pro JMHZ a výpočet mzdy nemění. U zaúčtované pásky lze měnit jen docházku.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID výplatní pásky Příklad 41.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
grossčísloneNová základní hrubá mzda pásky v Kč (bez prémií); nečíselná hodnota se počítá jako 0; záporný součet s bonuses skončí chybou 500 (viz chyby)
bonusesčíslonePrémie a odměny přičtené k základní mzdě v Kč
statustextneStav pásky; zaúčtování provede POST …/post_entries Hodnoty: draft, approved.
attendanceobjektneDocházka pro JMHZ; prázdné hodnoty se vynechají, desetinná čárka je dovolena, jiné klíče se zahodí
attendance.worked_hoursčísloneOdpracované hodiny
attendance.overtime_hoursčíslonePřesčasové hodiny (z odpracovaných)
attendance.overtime_payčíslonePříplatky za práci přesčas (Kč)
attendance.vacation_hoursčísloneHodiny čerpané dovolené
attendance.vacation_payčísloneNáhrada mzdy za dovolenou (Kč)
attendance.unpaid_hoursčísloneHodiny neplaceného volna

Odpověď

200 application/json Upravená výplatní páska (tvar jako v seznamu).

Chyby této operace

StavKódKdy
422–Páska je zaúčtovaná a požadavek mění něco jiného než docházku – „Zaúčtovanou pásku nelze měnit – smažte ji a vytvořte znovu“
500–Přepočet selže – záporný součet gross a bonuses nebo nečíselné pořadí dítěte na kartě (známá chyba); docházka z téhož požadavku už zůstane uložená

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

Chování

Co změní
Uloží pásku (přepočet, stav, docházku) a zapíše událost payroll.updated. Účetní zápisy nemění – změněnou pásku je třeba znovu zaúčtovat. Uzamčení období se nekontroluje.
Opakování
Opakování se stejnými hodnotami vede ke stejnému výsledku; každé volání zapíše událost payroll.updated.

Příklad

Docházku lze zapsat i do zaúčtované pásky; změna gross nebo bonuses vyžaduje nezaúčtovanou pásku.

cURL

curl \
  -X PATCH \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"attendance":{"worked_hours":160,"overtime_hours":4,"vacation_hours":8,"vacation_pay":2150}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/payslips/16

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/payslips/16', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'PATCH',
  body: JSON.stringify({
    "attendance": {
      "worked_hours": 160,
      "overtime_hours": 4,
      "vacation_hours": 8,
      "vacation_pay": 2150
    }
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "data": {
    "gross": 52000.0,
    "insured": {
      "social": true,
      "health": true
    },
    "assessment_base": {
      "social": 52000.0,
      "health": 52000.0
    },
    "employee": {
      "social": 3692.0,
      "health": 2340.0,
      "total": 6032.0
    },
    "employer": {
      "social": 12896.0,
      "health": 4680.0,
      "total": 17576.0
    },
    "health_min_base_topup": 0.0,
    "tax": {
      "base": 52000.0,
      "rounded_base": 52000.0,
      "rate_split": [
        {
          "rate": 0.15,
          "base": 52000.0,
          "tax": 7800.0
        }
      ],
      "advance_before_credits": 7800.0,
      "credits": [
        {
          "key": "taxpayer",
          "label": "Základní sleva na poplatníka",
          "amount": 2570.0,
          "entitlement": 2570.0
        }
      ],
      "child_benefit": {
        "total": 1267.0,
        "as_credit": 1267.0,
        "bonus": 0.0
      },
      "advance": 3963.0,
      "withholding": 0.0,
      "kind": "advance"
    },
    "net": 42005.0,
    "payout": 42005.0,
    "employer_cost": 69576.0,
    "postings": [
      {
        "debit": "521",
        "credit": "331",
        "amount": 52000.0,
        "text": "Hrubá mzda"
      },
      {
        "debit": "524",
        "credit": "336",
        "amount": 12896.0,
        "text": "Sociální pojištění hrazené zaměstnavatelem"
      }
    ],
    "warnings": [],
    "base_gross": 52000.0,
    "bonuses": 0.0,
    "attendance": {
      "worked_hours": 160.0,
      "overtime_hours": 4.0,
      "vacation_hours": 8.0,
      "vacation_pay": 2150.0
    }
  },
  "employee_id": 1,
  "year": 2026,
  "month": 9,
  "gross": 52000.0,
  "id": 16,
  "created_at": "2026-09-28T10:00:00.000Z",
  "employer_cost": 69576.0,
  "net": 42005.0,
  "status": "draft",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "employee_name": "Anna Ukázková"
}

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

DELETE Smazání výplatní pásky

/entities/{entity_id}/payslips/{id}

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

Smaže výplatní pásku včetně jejích účetních zápisů; u zaúčtované pásky pak přepočte zápis zaokrouhlení sociálního pojistného zaměstnavatele za měsíc. V uzamčeném období nelze.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID výplatní pásky Příklad 41.

Odpověď

204 Prázdná odpověď.

Chyby této operace

StavKódKdy
422–Poslední den měsíce pásky leží v uzamčeném období – „Období je uzamčeno – pásku nelze smazat“

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

Chování

Co změní
V jedné transakci smaže účetní zápisy pásky (zdroj payroll), pásku samotnou a u zaúčtované pásky přepočte zápis zaokrouhlení sociálního pojistného zaměstnavatele za měsíc; zapíše událost payroll.deleted.
Opakování
Druhé smazání vrátí 404.

Příklad

cURL

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

JavaScript

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

POST Zaúčtování výplatní pásky

/entities/{entity_id}/payslips/{id}/post_entries

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

Zaúčtuje mzdový předpis pásky k poslednímu dni jejího měsíce a nastaví stav posted; schválení se nevyžaduje. Zápisy vzniknou z výpočtu pásky (data.postings): hrubá mzda MD 521 / D 331, pojistné zaměstnavatele MD 524 / D 336, pojistné zaměstnance MD 331 / D 336, záloha nebo srážková daň MD 331 / D 342, daňový bonus MD 342 / D 331. Pak přepočte zápis zaokrouhlení sociálního pojistného zaměstnavatele za měsíc (rozdíl mezi součtem z pásek a pojistným zaokrouhleným jednou z úhrnu vyměřovacích základů, jako v hlášení ČSSZ). Mzdu nevyplácí ani neodvádí pojistné a daň – úhrady se párují z banky.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID výplatní pásky Příklad 41.

Odpověď

200 application/json Zaúčtovaná výplatní páska se stavem posted.

Chyby této operace

StavKódKdy
422–Firma nevede podvojné účetnictví – „Mzdy se účtují jen v podvojném účetnictví“
422–Poslední den měsíce pásky leží v uzamčeném období – „Období je uzamčeno“

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

Chování

Co změní
V jedné transakci smaže dřívější zápisy pásky, vytvoří nové účetní zápisy (zdroj payroll) s datem posledního dne měsíce, nastaví stav posted a přepočte zápis zaokrouhlení sociálního pojistného zaměstnavatele za měsíc; zapíše událost payroll.posted.
Opakování
Opakované zaúčtování nahradí zápisy pásky stejnými novými; stav zůstane posted.

Příklad

cURL

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/payslips/16/post_entries', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY },
  method: 'POST'
});
const data = await response.json();
Odpověď 200 OK
{
  "status": "posted",
  "employee_id": 1,
  "year": 2026,
  "month": 9,
  "gross": 52000.0,
  "id": 16,
  "created_at": "2026-09-28T10:00:00.000Z",
  "data": {
    "gross": 52000.0,
    "insured": {
      "social": true,
      "health": true
    },
    "assessment_base": {
      "social": 52000.0,
      "health": 52000.0
    },
    "employee": {
      "social": 3692.0,
      "health": 2340.0,
      "total": 6032.0
    },
    "employer": {
      "social": 12896.0,
      "health": 4680.0,
      "total": 17576.0
    },
    "health_min_base_topup": 0.0,
    "tax": {
      "base": 52000.0,
      "rounded_base": 52000.0,
      "rate_split": [
        {
          "rate": 0.15,
          "base": 52000.0,
          "tax": 7800.0
        }
      ],
      "advance_before_credits": 7800.0,
      "credits": [
        {
          "key": "taxpayer",
          "label": "Základní sleva na poplatníka",
          "amount": 2570.0,
          "entitlement": 2570.0
        }
      ],
      "child_benefit": {
        "total": 1267.0,
        "as_credit": 1267.0,
        "bonus": 0.0
      },
      "advance": 3963.0,
      "withholding": 0.0,
      "kind": "advance"
    },
    "net": 42005.0,
    "payout": 42005.0,
    "employer_cost": 69576.0,
    "postings": [
      {
        "debit": "521",
        "credit": "331",
        "amount": 52000.0,
        "text": "Hrubá mzda"
      },
      {
        "debit": "524",
        "credit": "336",
        "amount": 12896.0,
        "text": "Sociální pojištění hrazené zaměstnavatelem"
      }
    ],
    "warnings": [],
    "base_gross": 52000.0,
    "bonuses": 0.0
  },
  "employer_cost": 69576.0,
  "net": 42005.0,
  "updated_at": "2026-09-28T10:00:00.000Z",
  "employee_name": "Anna Ukázková"
}

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

GET Kontrola a stav hlášení JMHZ za měsíc

/entities/{entity_id}/payslips/jmhz

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

Zkontroluje data pro jednotné měsíční hlášení zaměstnavatele (JMHZ) za měsíc a vrátí jeho stav: chyby, které brání sestavení XML, upozornění, lhůtu pro podání (20. den následujícího měsíce posunutý na pracovní den, za leden až březen 2026 do 30. 6. 2026), lhůtu pro storno, souhrny daně a pojistného z pásek, druh hlášení, které by se teď vytvořilo, a historii uložených podání. Hlášení se podává za měsíce od ledna 2026 a až po skončení měsíce.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
yeardotazcelé čísloneRok hlášení; bez parametru nebo při nečíselné hodnotě aktuální rok, mimo rozsah se zarovná na 2000 až 2100. Rozsah od 2000 do 2100. Příklad 2026.
monthdotazcelé čísloanoMěsíc hlášení Rozsah od 1 do 12. Příklad 8.

Odpověď

200 application/json Stav a kontrola hlášení JMHZ.

PoleVýznam
year, month, periodObdobí; period ve tvaru RRRR-MM
statenone (nic uloženo), draft (připraveno), filed (řádné označeno jako podané), cancelled (stornováno)
kindDruh, který by se teď vytvořil: regular, nebo corrective po podaném řádném hlášení
readytrue, když kontrola nenašla chyby
errors, warningsNálezy kontroly: level, code, subject, field, message, employee_id
due_date, cancellation_deadline, can_cancelLhůta podání, poslední den pro storno a zda lze ještě stornovat
totalsSouhrny: tax, insurance, payslips a employer_rounding; null pro rok bez sazeb
employments, personsPočet pracovněprávních vztahů a osob v hlášení
submission_id, proof_stateGUID řádného podání a stav doložení posledního podaného hlášení
planJen pro opravné hlášení: corrected, added, cancelled, stale (vztahy podle názvu)
filingsUložená podání JMHZ měsíce od nejnovějšího: id, filing_type (B, O, S), status, proof_state, filed_on, submission_id, forms (počet formulářů), filled_at

Chyby této operace

StavKódKdy
422–Chybí nebo je neplatný měsíc – „Měsíc hlášení musí být číslo 1 až 12.“

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

Ukázková firma má pro leden vyplněné údaje pro JMHZ, kontrola proto nenašla chyby (ready true) a vrací jen upozornění na uplynulou lhůtu a chybějící OIČ.

cURL

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/payslips/jmhz?year=2026&month=1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
{
  "year": 2026,
  "month": 1,
  "period": "2026-01",
  "state": "none",
  "kind": "regular",
  "proof_state": null,
  "due_date": "2026-06-30",
  "cancellation_deadline": "2026-02-20",
  "can_cancel": false,
  "ready": true,
  "errors": [],
  "warnings": [
    {
      "level": "warning",
      "code": "late",
      "subject": "Zaměstnavatel",
      "field": null,
      "message": "Lhůta pro hlášení za 1/2026 uplynula 30. 6. 2026; podejte je bez odkladu.",
      "employee_id": null
    },
    {
      "level": "warning",
      "code": "unidentified",
      "subject": "Anna Ukázková (HPP)",
      "field": "oic",
      "message": "Chybí OIČ a ID pracovněprávního vztahu z registrace zaměstnance – formulář se podá se jménem, datem narození, datem nástupu a druhem činnosti a ČSSZ jej ztotožní; po přidělení je doplňte.",
      "employee_id": 1
    }
  ],
  "totals": {
    "tax": {
      "advance": 3963.0,
      "bonus": 0.0,
      "withholding": 0.0,
      "withholding_base": 0.0
    },
    "insurance": {
      "base": 52000.0,
      "employer": 12896.0,
      "employee": 3692.0,
      "total": 16588.0,
      "discount_persons": 0,
      "discount_base": 0.0,
      "discount": 0.0,
      "payable": 16588.0
    },
    "payslips": {
      "gross": 52000.0,
      "employer_social": 12896.0,
      "employee_social": 3692.0,
      "employer_health": 4680.0,
      "employee_health": 2340.0,
      "net": 42005.0
    },
    "employer_rounding": 0.0
  },
  "employments": 1,
  "persons": 1,
  "submission_id": null,
  "plan": null,
  "filings": []
}

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

GET Stažení XML hlášení JMHZ a jeho uložení jako podání

/entities/{entity_id}/payslips/jmhz/xml

Oprávnění
Vlastník, účetní nebo editor
Pravidlo
Přestože jde o GET, požadavek zakládá podání, a proto ho odmítne i API klíč jen pro čtení (403 READ_ONLY_KEY) a požadavek z cizího webu podle hlavičky Sec-Fetch-Site (403 CROSS_SITE).
Klíč jen pro čtení
Nestačí, vrátí 403 READ_ONLY_KEY

Sestaví XML jednotného měsíčního hlášení zaměstnavatele podle schématu ČSSZ jmhzPodani 1.4.3, uloží je jako podání JMHZ ve stavu draft a vrátí jako soubor. Řádné hlášení (regular) jde vytvořit, dokud řádné hlášení měsíce není označené jako podané, a znovu po podaném stornu; opravné (corrective) a storno (cancellation) navazují na podané řádné hlášení a přebírají jeho GUID. Opravné hlášení opraví známé formuláře, přidá nové a formuláře vztahů, které z hlášení zmizely, do lhůty pro storno stornuje. Storno ruší celé hlášení a lze je jen do 20. dne následujícího měsíce. ČSSZ nic neodesílá – podání se označí jako podané až přes PATCH /entities/{entity_id}/filings/{id} se status filed.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
yeardotazcelé čísloneRok hlášení; bez parametru nebo při nečíselné hodnotě aktuální rok, mimo rozsah se zarovná na 2000 až 2100. Rozsah od 2000 do 2100. Příklad 2026.
monthdotazcelé čísloanoMěsíc hlášení Rozsah od 1 do 12. Příklad 8.
kinddotaztextneDruh hlášení – řádné, opravné nebo storno Hodnoty: regular, corrective, cancellation. Výchozí regular. Příklad regular.

Odpověď

200 application/xml XML hlášení jako příloha jmhz-RRRR-MM-radne.xml, jmhz-RRRR-MM-opravne.xml nebo jmhz-RRRR-MM-storno.xml.

Chyby této operace

StavKódKdy
422–Kontrola JMHZ našla chyby (neukončený měsíc, období před lednem 2026, chybějící údaje, storno po lhůtě) – error „Hlášení nelze sestavit – nejprve opravte chyby z kontroly JMHZ.“ a pole issues s nálezy kontroly
422–Chybí nebo je neplatný měsíc – „Měsíc hlášení musí být číslo 1 až 12.“
422–Neznámý druh – „Druh hlášení musí být regular, corrective nebo cancellation.“
422–Řádné hlášení je už podané – „Řádné hlášení za M/RRRR je podané – změny podejte opravným hlášením…“
422–Opravné hlášení nebo storno bez řádného hlášení – „Za M/RRRR zatím není řádné hlášení – … navazuje na podané řádné hlášení.“
422–Řádné hlášení není označené jako podané – „Řádné hlášení za M/RRRR není označené jako podané – …“
422–Hlášení je stornované a chce se opravné nebo storno – „Hlášení za M/RRRR je stornované – podejte nové řádné hlášení.“
403READ_ONLY_KEYAPI klíč jen pro čtení
403CROSS_SITEHlavička Sec-Fetch-Site je jiná než same-origin nebo none

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

Chování

Co změní
Vytvoří nebo přepíše podání JMHZ (kind jmhz, period RRRR-MM, filing_type B řádné, O opravné, S storno, stav draft) s XML, GUID podání, seznamem formulářů a časem vyplnění; zapíše událost payroll.jmhz. ČSSZ nic neodesílá ani nepodává, účetnictví nemění.
Limity
Jeden soubor pojme nejvýše 1 500 formulářů pracovněprávních vztahů; větší hlášení tento endpoint nesestaví a skončí chybou 500.
Opakování
Dokud je podání daného druhu ve stavu draft, opakované stažení přepíše totéž podání novým XML a časem vyplnění a zachová GUID podání. GUID formulářů zůstanou u řádného hlášení a u formulářů známých z podaných hlášení; vztahy nově přidané v opravném hlášení dostanou při každém stažení nové GUID. Nové podání vznikne, jen když rozpracované podání daného druhu neexistuje (například další opravné hlášení po podaném opravném nebo nové řádné po podaném stornu).

Příklad

Ukázková firma má pro leden vyplněné údaje pro JMHZ, příklad proto vrací XML řádného hlášení a uloží je jako podání ve stavu draft.

cURL

curl \
  -H "X-API-Key: $SALDO_API_KEY" \
  "https://techtools.cz/ucetnictvi-api/entities/1/payslips/jmhz/xml?year=2026&month=1&kind=regular"

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/payslips/jmhz/xml?year=2026&month=1&kind=regular', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY }
});
const data = await response.json();
Odpověď 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<n1:jmhz xmlns:n1="http://schemas.cssz.cz/JMHZ/podani/1.0" xmlns:so="http://schemas.cssz.cz/JMHZ/souhrn/1.0" xmlns:pvpoj="http://schemas.cssz.cz/JMHZ/PVPOJ/1.0" xmlns:form="http://schemas.cssz.cz/JMHZ/form/1.0">
  <n1:VENDOR productName="Saldo" productVersion="1.0"/>
  <n1:hlavicka>
    <n1:idPodani>01a0e5f0-f986-70b4-87b9-bf839613fbac</n1:idPodani>
    <n1:typPodani>R</n1:typPodani>
    <n1:variabilniSymbol>1234567890</n1:variabilniSymbol>
    <n1:mesic>1</n1:mesic>
    <n1:rok>2026</n1:rok>
    <n1:datumVyplneni>2026-09-28T10:00:00Z</n1:datumVyplneni>
    <n1:balikPoradi>1</n1:balikPoradi>
    <n1:balikyPocet>1</n1:balikyPocet>
    <n1:formularePocetVBaliku>3</n1:formularePocetVBaliku>
    <n1:formularePocetCelkem>3</n1:formularePocetCelkem>
  </n1:hlavicka>
  <so:souhrn>
    <so:danUdajeMesic>
      <so:danZalohaPoSleve>3963</so:danZalohaPoSleve>
      <so:danBonus>0</so:danBonus>
    </so:danUdajeMesic>
  </so:souhrn>
  <pvpoj:PVPOJ>
    <pvpoj:pojistne>
      <pvpoj:zakladZamestnavateleA>52000</pvpoj:zakladZamestnavateleA>
      <pvpoj:pojistneZamestnavateleA>12896</pvpoj:pojistneZamestnavateleA>
      <pvpoj:zakladZamestnavateleB>0</pvpoj:zakladZamestnavateleB>
      <pvpoj:pojistneZamestnavateleB>0</pvpoj:pojistneZamestnavateleB>
      <pvpoj:zakladZamestnavateleC>0</pvpoj:zakladZamestnavateleC>
      <pvpoj:pojistneZamestnavateleC>0</pvpoj:pojistneZamestnavateleC>
      <pvpoj:pojistneZamestnavateleCelkem>12896</pvpoj:pojistneZamestnavateleCelkem>
      <pvpoj:pojistneZamestnance>3692</pvpoj:pojistneZamestnance>
      <pvpoj:pojistneCelkem>16588</pvpoj:pojistneCelkem>
    </pvpoj:pojistne>
    <pvpoj:pojistneUhrada>16588</pvpoj:pojistneUhrada>
  </pvpoj:PVPOJ>
  <n1:formulareOsob>
    <n1:formularOsoby>
      <n1:hlavicka>
        <n1:idFormulare>01a0e5f0-f986-7765-9242-2848a7934754</n1:idFormulare>
        <n1:typFormulare>R</n1:typFormulare>
        <n1:primarniPpv>true</n1:primarniPpv>
      </n1:hlavicka>
      <form:bezPriznaku>
        <form:identifikace>
          <form:prijmeni>Ukázková</form:prijmeni>
          <form:jmeno>Anna</form:jmeno>
          <form:datumNarozeni>1990-04-12</form:datumNarozeni>
          <form:datumNastupu>2025-04-01</form:datumNastupu>
          <form:druhCinnosti>1</form:druhCinnosti>
        </form:identifikace>
        <form:souhrnDataZec>
          <form:prijmy>
            <form:zuctovanoCelkem>52000</form:zuctovanoCelkem>
          </form:prijmy>
          <form:zalohaNaDan>
            <form:zakladDane>52000</form:zakladDane>
            <form:vypoctenaZaloha>7800</form:vypoctenaZaloha>
            <form:danZalohaPoSleve>3963</form:danZalohaPoSleve>
            <form:danBonus>0</form:danBonus>
          </form:zalohaNaDan>
          <form:prohlaseniPoplatnika>true</form:prohlaseniPoplatnika>
          <form:prohlaseniPoplatnikaDane>
            <form:zakladniSleva>2570</form:zakladniSleva>
            <form:danoveZvyhodneniDetiMesic>1267</form:danoveZvyhodneni
…

POST Předběžná kontrola hlášení JMHZ validační službou ČSSZ

/entities/{entity_id}/payslips/jmhz/validation

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

Sestaví XML hlášení JMHZ stejně jako stažení, ale neuloží je, a odešle je anonymní validační službě ČSSZ ePodaniValidace. Vrátí, zda služba hlášení přijala bez chyb, a její nálezy s přiřazeným pracovníkem. Nic nepodává. Parametry year, month a kind se posílají v těle JSON.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
yearcelé čísloneRok hlášení; bez hodnoty aktuální rok, mimo rozsah se zarovná Rozsah od 2000 do 2100.
monthcelé čísloanoMěsíc hlášení Rozsah od 1 do 12.
kindtextneDruh hlášení; bez hodnoty regular, nebo corrective, je-li řádné hlášení podané Hodnoty: regular, corrective, cancellation.

Odpověď

200 application/json Výsledek kontroly ČSSZ.

PoleVýznam
oktrue, když služba vrátila výsledek OK
request_idID požadavku u ČSSZ
errorsNálezy služby: category, code (číslo chyby ČSSZ), message, form (GUID formuláře), employee (pracovník a vztah)
kindKontrolovaný druh hlášení
checked_atČas kontroly

Chyby této operace

StavKódKdy
502–Validační služba ČSSZ je nedostupná, neodpověděla včas, vrátila chybu nebo odpověď bez výsledku (česká zpráva v error)
422–Kontrola JMHZ našla chyby – error „Hlášení nelze sestavit – nejprve opravte chyby z kontroly JMHZ.“ a pole issues
422–Chybí nebo je neplatný měsíc – „Měsíc hlášení musí být číslo 1 až 12.“
422–Neznámý druh – „Druh hlášení musí být regular, corrective nebo cancellation.“
422–Druh neodpovídá stavu podání (řádné už podané, opravné nebo storno bez podaného řádného, stornované hlášení)

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

Chování

Co změní
Odešle XML hlášení včetně osobních údajů zaměstnanců na produkční validační službu ČSSZ (https://epodani.cssz.cz/ePodaniValidace.svc), která je jen zkontroluje. Nic nepodá ani neuloží jako podání; zapíše událost payroll.jmhz_validation do historie.
Limity
Časové limity spojení se službou ČSSZ – navázání 10 s, odeslání 20 s, čekání na odpověď 45 s. Hlášení nad 1 500 formulářů se nesestaví (chyba 500).
Opakování
Každé volání znovu odešle XML ke kontrole a zapíše novou událost.

Příklad

Ukázková firma má pro leden vyplněné údaje pro JMHZ. Volání služby ČSSZ se při záznamu příkladu nahrazuje smyšlenou odpovědí ve formátu služby (výsledek OK).

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"year":2026,"month":1}' \
  https://techtools.cz/ucetnictvi-api/entities/1/payslips/jmhz/validation

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/payslips/jmhz/validation', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "year": 2026,
    "month": 1
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "ok": true,
  "request_id": "6649AE42-D62E-4614-B287-099B191081C2",
  "errors": [],
  "kind": "regular",
  "checked_at": "2026-09-28T10:00:00.000Z"
}

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

GET Seznam cestovních příkazů

/entities/{entity_id}/trips

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

Vrátí cestovní příkazy firmy od nejpozdějšího odjezdu, každý s uloženými vstupy a výsledkem výpočtu náhrad. S parametrem year jen cesty s odjezdem v hospodářském roce firmy začínajícím v tomto roce (u kalendářního roku 1. 1. až 31. 12.).

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
yeardotazcelé čísloneRok odjezdu; bez parametru cesty všech let, nečíselná hodnota znamená aktuální rok. Rozsah od 2000 do 2100. Příklad 2026.

Odpověď

200 application/json Pole cestovních příkazů.

PoleVýznam
id, employee_id, employee_name, traveller_namePříkaz a cestující
purpose, destination, departed_at, returned_atÚčel, místo a čas cesty
statusdraft (koncept), approved (schváleno), paid (proplaceno) – jen označení
totalNáhrady celkem v Kč (bez zahraničního stravného v cizí měně)
input, resultUložené vstupy formuláře a výsledek výpočtu (tvar jako u výpočtu); null u příkazu, který nevznikl přes API ani aplikaci (např. ukázková data), a total je pak 0

Chování

Co změní
Nic nezapisuje.
Limity
Vrátí nejvýše 500 cest, bez stránkování.

Příklad

cURL

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

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/trips?year=2026', {
  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",
    "departed_at": "2026-08-12T06:40:00.000Z",
    "destination": "Brno",
    "employee_id": 1,
    "input": null,
    "purpose": "Workshop u klienta",
    "result": null,
    "returned_at": "2026-08-12T19:05:00.000Z",
    "status": "approved",
    "total": 0.0,
    "traveller_name": "Anna Ukázková",
    "updated_at": "2026-09-28T10:00:00.000Z",
    "employee_name": "Anna Ukázková"
  }
]

POST Nový cestovní příkaz s výpočtem náhrad

/entities/{entity_id}/trips

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

Spočítá náhrady stejně jako POST /entities/{entity_id}/trips/calculate a uloží cestovní příkaz se vstupy, výsledkem a celkovou částkou. Stav se zadává v trip.status (výchozí draft).

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
tripobjektano
trip.employee_idcelé číslonePracovník této firmy; neexistující vrátí 404
trip.traveller_nametextneJméno cestujícího; bez hodnoty jméno pracovníka
trip.travellertextneemployee zaměstnanec (náhrady podle zákoníku práce), self_employed OSVČ (výdaje podle § 24 odst. 2 písm. k) ZDP). Bez hodnoty employee, je-li zadán employee_id nebo jde o právnickou osobu, jinak self_employed. Hodnoty: employee, self_employed.
trip.purposetextneÚčel cesty; výpočet neovlivní
trip.destinationtextanoMísto cesty; při uložení povinné, nejvýše 200 znaků
trip.departuretextanoOdjezd, datum a čas ISO 8601 (např. 2026-09-21T06:30). Zadávejte místní čas bez časového pásma – server jej uloží beze změny jako UTC a podle něj dělí cestu na kalendářní dny.
trip.arrivaltextanoNávrat ve stejném tvaru; musí být po odjezdu a nejvýš 366 dní po něm
trip.kmčísloneUjeté km soukromým vozidlem; bez hodnoty nebo 0 se náhrada za vozidlo nepočítá
trip.vehicle_kindtextneSoukromé vozidlo; truck má u zaměstnance dvojnásobnou sazbu osobního auta, electric počítá s elektřinou Hodnoty: car, motorcycle, truck, electric. Výchozí car.
trip.consumptiončíslonePrůměrná spotřeba na 100 km podle technického průkazu (l nebo kWh)
trip.fueltextneDruh paliva Hodnoty: petrol95, petrol98, diesel, lpg, electricity. Výchozí petrol95.
trip.fuel_pricečísloneCena paliva za litr nebo kWh podle dokladu; bez ní průměrná cena z vyhlášky platná v den odjezdu. Palivo bez průměrné ceny (např. lpg) bez fuel_price dá náhradu za PHM 0 a upozornění.
trip.accommodationčísloneUbytování v Kč, nezáporné
trip.otherčísloneOstatní nutné vedlejší výdaje v Kč, nezáporné
trip.foreign_countrytextneKód cílové země (ISO 3166-1 alpha-2, jiný než CZ); zapne zahraniční stravné
trip.hours_abroadčísloneHodiny strávené v zahraničí, nejvýš délka cesty; přechod hranice se umístí doprostřed cesty. Bez hodnoty 0
trip.mealspole (objekt)neBezplatně poskytnutá jídla, která krátí stravné. V této verzi každá položka pole skončí chybou 400 „invalid date“ (aplikace datum jídla nepřečte), proto výpočet s jídly zatím nejde
trip.meals[].datedatumanoDen (RRRR-MM-DD)
trip.meals[].countcelé číslonePočet jídel v daném dni
trip.statustextnedraft koncept, approved schváleno, paid proplaceno – jen označení, nic neúčtuje ani nevyplácí Hodnoty: draft, approved, paid. Výchozí draft.

Odpověď

201 application/json Uložený cestovní příkaz (tvar jako v seznamu).

Chyby této operace

StavKódKdy
404–employee_id nepatří pracovníkovi této firmy – „Záznam nebyl nalezen“
422–Chybí nebo je nečitelný odjezd či návrat, návrat není po odjezdu nebo cesta trvá přes 366 dní (zprávy jako u výpočtu)
422–Pro rok odjezdu nejsou v Saldu sazby – „Pro rok RRRR nejsou k dispozici zákonné sazby“
400–Pole meals obsahuje jakoukoli položku – v této verzi vždy „invalid date“ (známá chyba zpracování jídel)
500–Vstup, který výpočet odmítne, ale API předem neověří (stejné případy jako u výpočtu); příkaz se neuloží – známá chyba

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

Chování

Co změní
Vytvoří cestovní příkaz a zapíše událost trip.created. Nic nezaúčtuje ani nevyplatí; stav paid je jen označení.
Opakování
Každé volání založí nový příkaz; duplicity se nekontrolují.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"trip":{"employee_id":1,"destination":"Brno","purpose":"Jednání s klientem","departure":"2026-09-21T06:30","arrival":"2026-09-21T19:10","km":420,"vehicle_kind":"car","consumption":6.1,"fuel":"diesel","status":"draft"}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/trips

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/trips', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "trip": {
      "employee_id": 1,
      "destination": "Brno",
      "purpose": "Jednání s klientem",
      "departure": "2026-09-21T06:30",
      "arrival": "2026-09-21T19:10",
      "km": 420,
      "vehicle_kind": "car",
      "consumption": 6.1,
      "fuel": "diesel",
      "status": "draft"
    }
  })
});
const data = await response.json();
Odpověď 201 Created
{
  "id": 2,
  "created_at": "2026-09-28T10:00:00.000Z",
  "departed_at": "2026-09-21T06:30:00.000Z",
  "destination": "Brno",
  "employee_id": 1,
  "input": {
    "employee_id": 1,
    "purpose": "Jednání s klientem",
    "destination": "Brno",
    "departure": "2026-09-21T06:30",
    "arrival": "2026-09-21T19:10",
    "vehicle_kind": "car",
    "consumption": 6.1,
    "fuel": "diesel",
    "km": 420
  },
  "purpose": "Jednání s klientem",
  "result": {
    "duration_hours": 12.67,
    "per_diem": {
      "band": "medium",
      "rate": 236.0,
      "reductions": 0.0,
      "amount": 236.0,
      "days": [
        {
          "date": "2026-09-21",
          "dates": [
            "2026-09-21"
          ],
          "hours": 12.67,
          "band": "medium",
          "range": {
            "min": 236.0,
            "max": 284.0
          },
          "rate": 236.0,
          "meals": 0,
          "reductions": 0.0,
          "amount": 236.0
        }
      ]
    },
    "foreign_per_diem": null,
    "mileage": {
      "base_rate": 5.9,
      "km": 420.0,
      "amount": 2478.0
    },
    "fuel": {
      "type": "diesel",
      "price": 44.5,
      "consumption": 6.1,
      "amount": 1140.09
    },
    "accommodation": 0.0,
    "other": 0.0,
    "total": 3855.0,
    "basis": [
      "§ 163 odst. 1 až 3 zákoníku práce, vyhláška č. 573/2025 Sb. § 2",
      "§ 6 odst. 7 písm. a) ZDP, § 176 odst. 1 zákoníku práce, vyhláška č. 573/2025 Sb. § 3"
    ],
    "warnings": []
  },
  "returned_at": "2026-09-21T19:10:00.000Z",
  "status": "draft",
  "total": 3855.0,
  "traveller_name": "Anna Ukázková",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "employee_name": "Anna Ukázková"
}

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

POST Výpočet cestovních náhrad bez uložení

/entities/{entity_id}/trips/calculate

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

Spočítá náhrady za pracovní cestu (celou cestu od odjezdu do návratu bere jako jeden úsek) a nic neuloží: tuzemské stravné po kalendářních dnech krácené o poskytnutá jídla, zahraniční stravné v měně cílové země, základní náhradu za soukromé vozidlo, náhradu za pohonné hmoty, ubytování a ostatní výdaje. Zaměstnanci počítá minimální sazby stravného podle vyhlášky a celkovou částku zaokrouhlí na koruny nahoru; OSVČ počítá horní hranici sazeb a jen dny delší než 12 hodin. Sazby se berou podle roku odjezdu.

Parametry

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

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
tripobjektano
trip.employee_idcelé číslonePracovník firmy; výpočet ho nehledá (neexistující ID nevrátí 404), jen jeho zadání přepne výchozí traveller na employee
trip.traveller_nametextneJméno cestujícího; výpočet ho nepoužije
trip.travellertextneemployee zaměstnanec (náhrady podle zákoníku práce), self_employed OSVČ (výdaje podle § 24 odst. 2 písm. k) ZDP). Bez hodnoty employee, je-li zadán employee_id nebo jde o právnickou osobu, jinak self_employed. Hodnoty: employee, self_employed.
trip.purposetextneÚčel cesty; výpočet neovlivní
trip.destinationtextneMísto cesty; při uložení povinné, nejvýše 200 znaků
trip.departuretextanoOdjezd, datum a čas ISO 8601 (např. 2026-09-21T06:30). Zadávejte místní čas bez časového pásma – server jej uloží beze změny jako UTC a podle něj dělí cestu na kalendářní dny.
trip.arrivaltextanoNávrat ve stejném tvaru; musí být po odjezdu a nejvýš 366 dní po něm
trip.kmčísloneUjeté km soukromým vozidlem; bez hodnoty nebo 0 se náhrada za vozidlo nepočítá
trip.vehicle_kindtextneSoukromé vozidlo; truck má u zaměstnance dvojnásobnou sazbu osobního auta, electric počítá s elektřinou Hodnoty: car, motorcycle, truck, electric. Výchozí car.
trip.consumptiončíslonePrůměrná spotřeba na 100 km podle technického průkazu (l nebo kWh)
trip.fueltextneDruh paliva Hodnoty: petrol95, petrol98, diesel, lpg, electricity. Výchozí petrol95.
trip.fuel_pricečísloneCena paliva za litr nebo kWh podle dokladu; bez ní průměrná cena z vyhlášky platná v den odjezdu. Palivo bez průměrné ceny (např. lpg) bez fuel_price dá náhradu za PHM 0 a upozornění.
trip.accommodationčísloneUbytování v Kč, nezáporné
trip.otherčísloneOstatní nutné vedlejší výdaje v Kč, nezáporné
trip.foreign_countrytextneKód cílové země (ISO 3166-1 alpha-2, jiný než CZ); zapne zahraniční stravné
trip.hours_abroadčísloneHodiny strávené v zahraničí, nejvýš délka cesty; přechod hranice se umístí doprostřed cesty. Bez hodnoty 0
trip.mealspole (objekt)neBezplatně poskytnutá jídla, která krátí stravné. V této verzi každá položka pole skončí chybou 400 „invalid date“ (aplikace datum jídla nepřečte), proto výpočet s jídly zatím nejde
trip.meals[].datedatumanoDen (RRRR-MM-DD)
trip.meals[].countcelé číslonePočet jídel v daném dni

Odpověď

200 application/json Výpočet cestovních náhrad.

PoleVýznam
duration_hoursDélka cesty v hodinách
per_diemTuzemské stravné: band, rate, reductions, amount a days (po dnech: date, hours, band short/medium/long, rate, meals, reductions, amount)
foreign_per_diemZahraniční stravné (nebo null): country, country_name, currency, base_rate, days, amount, pocket_money_max, pocket_money, exchange_rate a amount_czk (vždy null)
mileageZákladní náhrada: base_rate, km, amount
fuelNáhrada za PHM: type, price, consumption, amount
accommodation, otherZadané výdaje
totalNáhrady celkem v Kč; zahraniční stravné v cizí měně v něm není
basisPrávní základ použitých sazeb
warningsUpozornění (česky)

Chyby této operace

StavKódKdy
422–Chybí nebo je nečitelný odjezd či návrat – „Zadejte odjezd i návrat“
422–Návrat není po odjezdu – „Návrat musí být po odjezdu“
422–Cesta je delší než 366 dní – „Cesta smí trvat nejvýš 366 dní“
422–Pro rok odjezdu nejsou v Saldu sazby – „Pro rok RRRR nejsou k dispozici zákonné sazby“
400–Pole meals obsahuje jakoukoli položku – v této verzi vždy „invalid date“ (známá chyba zpracování jídel)
500–Vstup, který výpočet odmítne, ale API předem neověří: neznámé vehicle_kind nebo fuel, záporné km, accommodation nebo other, foreign_country CZ, hours_abroad delší než cesta, datum a čas mimo rozsah (např. měsíc 13) – známá chyba: výjimka místo chyby 422

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

Chování

Co změní
Nic nezapisuje.
Limity
Cesta smí trvat nejvýš 366 dní; více úseků ani časy přechodu hranice API nepřijímá.

Příklad

cURL

curl \
  -X POST \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"trip":{"destination":"Brno","purpose":"Jednání s klientem","departure":"2026-09-21T06:30","arrival":"2026-09-22T19:10","km":420,"vehicle_kind":"car","consumption":6.1,"fuel":"diesel","accommodation":1200}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/trips/calculate

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/trips/calculate', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'POST',
  body: JSON.stringify({
    "trip": {
      "destination": "Brno",
      "purpose": "Jednání s klientem",
      "departure": "2026-09-21T06:30",
      "arrival": "2026-09-22T19:10",
      "km": 420,
      "vehicle_kind": "car",
      "consumption": 6.1,
      "fuel": "diesel",
      "accommodation": 1200
    }
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "duration_hours": 36.67,
  "per_diem": {
    "band": "multi_day",
    "rate": 606.0,
    "reductions": 0.0,
    "amount": 606.0,
    "days": [
      {
        "date": "2026-09-21",
        "dates": [
          "2026-09-21"
        ],
        "hours": 17.5,
        "band": "medium",
        "range": {
          "min": 236.0,
          "max": 284.0
        },
        "rate": 236.0,
        "meals": 0,
        "reductions": 0.0,
        "amount": 236.0
      },
      {
        "date": "2026-09-22",
        "dates": [
          "2026-09-22"
        ],
        "hours": 19.17,
        "band": "long",
        "range": {
          "min": 370.0,
          "max": 442.0
        },
        "rate": 370.0,
        "meals": 0,
        "reductions": 0.0,
        "amount": 370.0
      }
    ]
  },
  "foreign_per_diem": null,
  "mileage": {
    "base_rate": 5.9,
    "km": 420.0,
    "amount": 2478.0
  },
  "fuel": {
    "type": "diesel",
    "price": 44.5,
    "consumption": 6.1,
    "amount": 1140.09
  },
  "accommodation": 1200.0,
  "other": 0.0,
  "total": 5425.0,
  "basis": [
    "§ 163 odst. 1 až 3 zákoníku práce, vyhláška č. 573/2025 Sb. § 2",
    "§ 6 odst. 7 písm. a) ZDP, § 176 odst. 1 zákoníku práce, vyhláška č. 573/2025 Sb. § 3"
  ],
  "warnings": []
}

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

PATCH Přepočet a úprava cestovního příkazu

/entities/{entity_id}/trips/{id}

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

Znovu spočítá náhrady z odeslaného formuláře a přepíše jím celý příkaz: pole, která v trip chybí, se vymažou (například purpose nebo vazba na pracovníka); stav zůstane, pokud trip.status nepošlete. Posílejte proto vždy celý formulář.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID cestovního příkazu Příklad 7.

Tělo požadavku

Formát application/json.

PoleTypPovinnéPopis
tripobjektano
trip.employee_idcelé číslonePracovník této firmy; neexistující vrátí 404
trip.traveller_nametextneJméno cestujícího; bez hodnoty jméno pracovníka
trip.travellertextneemployee zaměstnanec (náhrady podle zákoníku práce), self_employed OSVČ (výdaje podle § 24 odst. 2 písm. k) ZDP). Bez hodnoty employee, je-li zadán employee_id nebo jde o právnickou osobu, jinak self_employed. Hodnoty: employee, self_employed.
trip.purposetextneÚčel cesty; výpočet neovlivní
trip.destinationtextanoMísto cesty; při uložení povinné, nejvýše 200 znaků
trip.departuretextanoOdjezd, datum a čas ISO 8601 (např. 2026-09-21T06:30). Zadávejte místní čas bez časového pásma – server jej uloží beze změny jako UTC a podle něj dělí cestu na kalendářní dny.
trip.arrivaltextanoNávrat ve stejném tvaru; musí být po odjezdu a nejvýš 366 dní po něm
trip.kmčísloneUjeté km soukromým vozidlem; bez hodnoty nebo 0 se náhrada za vozidlo nepočítá
trip.vehicle_kindtextneSoukromé vozidlo; truck má u zaměstnance dvojnásobnou sazbu osobního auta, electric počítá s elektřinou Hodnoty: car, motorcycle, truck, electric. Výchozí car.
trip.consumptiončíslonePrůměrná spotřeba na 100 km podle technického průkazu (l nebo kWh)
trip.fueltextneDruh paliva Hodnoty: petrol95, petrol98, diesel, lpg, electricity. Výchozí petrol95.
trip.fuel_pricečísloneCena paliva za litr nebo kWh podle dokladu; bez ní průměrná cena z vyhlášky platná v den odjezdu. Palivo bez průměrné ceny (např. lpg) bez fuel_price dá náhradu za PHM 0 a upozornění.
trip.accommodationčísloneUbytování v Kč, nezáporné
trip.otherčísloneOstatní nutné vedlejší výdaje v Kč, nezáporné
trip.foreign_countrytextneKód cílové země (ISO 3166-1 alpha-2, jiný než CZ); zapne zahraniční stravné
trip.hours_abroadčísloneHodiny strávené v zahraničí, nejvýš délka cesty; přechod hranice se umístí doprostřed cesty. Bez hodnoty 0
trip.mealspole (objekt)neBezplatně poskytnutá jídla, která krátí stravné. V této verzi každá položka pole skončí chybou 400 „invalid date“ (aplikace datum jídla nepřečte), proto výpočet s jídly zatím nejde
trip.meals[].datedatumanoDen (RRRR-MM-DD)
trip.meals[].countcelé číslonePočet jídel v daném dni
trip.statustextneNový stav; bez hodnoty zůstane dosavadní Hodnoty: draft, approved, paid.

Odpověď

200 application/json Přepočtený cestovní příkaz.

Chyby této operace

StavKódKdy
404–employee_id nepatří pracovníkovi této firmy – „Záznam nebyl nalezen“
422–Chybí nebo je nečitelný odjezd či návrat, návrat není po odjezdu nebo cesta trvá přes 366 dní (zprávy jako u výpočtu)
422–Pro rok odjezdu nejsou v Saldu sazby – „Pro rok RRRR nejsou k dispozici zákonné sazby“
400–Pole meals obsahuje jakoukoli položku – v této verzi vždy „invalid date“ (známá chyba zpracování jídel)
500–Vstup, který výpočet odmítne, ale API předem neověří (stejné případy jako u výpočtu); příkaz se nezmění – známá chyba

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

Chování

Co změní
Přepíše cestovní příkaz. Událost do historie nezapisuje a nic nezaúčtuje.
Opakování
Opakování se stejným formulářem vede ke stejnému výsledku.

Příklad

cURL

curl \
  -X PATCH \
  -H "X-API-Key: $SALDO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"trip":{"employee_id":1,"destination":"Brno","purpose":"Workshop u klienta","departure":"2026-09-12T06:40","arrival":"2026-09-12T19:05","status":"approved"}}' \
  https://techtools.cz/ucetnictvi-api/entities/1/trips/1

JavaScript

const response = await fetch('https://techtools.cz/ucetnictvi-api/entities/1/trips/1', {
  headers: { 'X-API-Key': process.env.SALDO_API_KEY, 'Content-Type': 'application/json' },
  method: 'PATCH',
  body: JSON.stringify({
    "trip": {
      "employee_id": 1,
      "destination": "Brno",
      "purpose": "Workshop u klienta",
      "departure": "2026-09-12T06:40",
      "arrival": "2026-09-12T19:05",
      "status": "approved"
    }
  })
});
const data = await response.json();
Odpověď 200 OK
{
  "employee_id": 1,
  "traveller_name": "Anna Ukázková",
  "purpose": "Workshop u klienta",
  "destination": "Brno",
  "departed_at": "2026-09-12T06:40:00.000Z",
  "returned_at": "2026-09-12T19:05:00.000Z",
  "status": "approved",
  "total": 236.0,
  "input": {
    "employee_id": 1,
    "purpose": "Workshop u klienta",
    "destination": "Brno",
    "departure": "2026-09-12T06:40",
    "arrival": "2026-09-12T19:05"
  },
  "result": {
    "duration_hours": 12.42,
    "per_diem": {
      "band": "medium",
      "rate": 236.0,
      "reductions": 0.0,
      "amount": 236.0,
      "days": [
        {
          "date": "2026-09-12",
          "dates": [
            "2026-09-12"
          ],
          "hours": 12.42,
          "band": "medium",
          "range": {
            "min": 236.0,
            "max": 284.0
          },
          "rate": 236.0,
          "meals": 0,
          "reductions": 0.0,
          "amount": 236.0
        }
      ]
    },
    "foreign_per_diem": null,
    "mileage": {
      "base_rate": 0.0,
      "km": 0.0,
      "amount": 0.0
    },
    "fuel": {
      "type": null,
      "price": null,
      "consumption": 0.0,
      "amount": 0.0
    },
    "accommodation": 0.0,
    "other": 0.0,
    "total": 236.0,
    "basis": [
      "§ 163 odst. 1 až 3 zákoníku práce, vyhláška č. 573/2025 Sb. § 2",
      "§ 6 odst. 7 písm. a) ZDP, § 176 odst. 1 zákoníku práce, vyhláška č. 573/2025 Sb. § 3"
    ],
    "warnings": []
  },
  "id": 1,
  "created_at": "2026-09-28T10:00:00.000Z",
  "updated_at": "2026-09-28T10:00:00.000Z",
  "employee_name": "Anna Ukázková"
}

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

DELETE Smazání cestovního příkazu

/entities/{entity_id}/trips/{id}

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

Smaže cestovní příkaz v jakémkoli stavu.

Parametry

NázevKdeTypPovinnýPopis
entity_idcestacelé čísloanoID účetní jednotky (firmy) Příklad 12.
idcestacelé čísloanoID cestovního příkazu Příklad 7.

Odpověď

204 Prázdná odpověď.

Chování

Co změní
Smaže cestovní příkaz. Událost do historie nezapisuje; uzamčení období nekontroluje, protože příkaz nemá účetní zápisy.
Opakování
Druhé smazání vrátí 404.

Příklad

cURL

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

JavaScript

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