{"openapi":"3.1.0","info":{"title":"Taxfolio API","version":"1.7.0","description":"Veřejné API pro AI agenty a skripty: čtení a zápis transakcí, portfolií a podkladů pro české daňové přiznání.\n\n**Autentizace:** API klíč z Nastavení → API, hlavička `Authorization: Bearer tf_live_…`.\n\n**Limity:** každý endpoint stojí kredity z denního rozpočtu (viz cena u endpointu); stav vrací `GET /v1/me/usage` (zdarma) a hlavičky `X-RateLimit-*` u každé odpovědi. Drahé výpočty (daňové podklady) navíc sdílí malý souběh - při 503 `OVERLOADED` počkejte dle `Retry-After`.\n\n**Mutace vyžadují hlavičku `Idempotency-Key`** - opakování se stejným klíčem je bezpečné (vrátí uloženou odpověď).\n\n**Chyby:** vždy `{ code, message }`; rozhodujte se podle `code`, text se může měnit."},"servers":[{"url":"https://taxfolio.cz"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API klíč z Nastavení → API (formát `tf_live_…`). Posílá se v hlavičce `Authorization: Bearer <klíč>`."}},"schemas":{"year":{"type":"string","pattern":"^\\d{4}$","example":"2025"}},"parameters":{"year":{"schema":{"$ref":"#/components/schemas/year"},"required":true,"name":"year","in":"path"}}},"paths":{"/api/v1/me":{"get":{"weight":"me","tags":["Účet"],"summary":"Kdo jsem a co smí tento klíč","description":"\n\nCena: zdarma (nepočítá se do denního rozpočtu).","security":[{"apiKey":[]}],"responses":{"200":{"description":"Identita a oprávnění.","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"subscriptionPhase":{"type":"string","description":"trialing | active | grace | locked"},"tier":{"type":"string","enum":["trial","paid"]},"scopes":{"type":"array","items":{"type":"string","enum":["read","write","delete"]}},"keyName":{"type":"string"},"keyPrefix":{"type":"string"}},"required":["email","subscriptionPhase","tier","scopes","keyName","keyPrefix"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/me/usage":{"get":{"weight":"me.usage","tags":["Účet"],"summary":"Zbývající denní rozpočet a limity","description":"Váha 0 - kontrola rozpočtu nic nestojí. Volejte, když se blížíte limitu, místo narážení do 429.\n\nCena: zdarma (nepočítá se do denního rozpočtu).","security":[{"apiKey":[]}],"responses":{"200":{"description":"Spotřeba a limity.","content":{"application/json":{"schema":{"type":"object","properties":{"creditsLimit":{"type":"number"},"creditsUsed":{"type":"number"},"creditsRemaining":{"type":"number"},"requestsToday":{"type":"number"},"resetsAt":{"type":"string","description":"ISO čas obnovení denního rozpočtu (UTC půlnoc)."},"burstPerMinute":{"type":"number"},"concurrency":{"type":"object","properties":{"perKey":{"type":"number"},"globalExpensive":{"type":"number"}},"required":["perKey","globalExpensive"]}},"required":["creditsLimit","creditsUsed","creditsRemaining","requestsToday","resetsAt","burstPerMinute","concurrency"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/portfolios":{"get":{"weight":"portfolios.list","tags":["Portfolia"],"summary":"Seznam portfolií","description":"\n\nCena: 1 kredit z denního rozpočtu.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Portfolia uživatele.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","description":"standard = drží transakce, composite = souhrn jiných portfolií"},"currency":{"type":"string"},"portfolioIds":{"type":"array","items":{"type":"string"},"description":"Jen composite: ID přímých členů."}},"required":["id","name","type","currency"]}},"nextCursor":{"type":["string","null"],"description":"Pošlete zpět jako ?cursor= pro další stránku; null = konec výpisu."}},"required":["items","nextCursor"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}},"post":{"weight":"portfolios.create","tags":["Portfolia"],"summary":"Založení portfolia","description":"Zakládá jen standardní portfolia (composite jsou pohled pro UI).\n\nCena: 5 kreditů z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":128,"description":"Klíč idempotence (zvolte si, např. UUID). Opakování požadavku se STEJNÝM klíčem vrátí uloženou odpověď (hlavička `Idempotency-Replayed: true`) a nic neprovede podruhé - bezpečný retry po timeoutu. Stejný klíč s jiným tělem vrací 422 `IDEMPOTENCY_CONFLICT`."},"required":true,"name":"Idempotency-Key","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255},"currency":{"type":"string","minLength":3,"maxLength":3},"description":{"type":"string","maxLength":1000}},"required":["name","currency"]}}}},"responses":{"201":{"description":"Založeno.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","description":"standard = drží transakce, composite = souhrn jiných portfolií"},"currency":{"type":"string"},"portfolioIds":{"type":"array","items":{"type":"string"},"description":"Jen composite: ID přímých členů."}},"required":["id","name","type","currency"]}}}},"400":{"description":"Neplatný vstup / neznámá měna (`INVALID_REQUEST`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"409":{"description":"Limit počtu portfolií (`QUOTA_EXCEEDED`) / idempotency klíč v běhu (`IDEMPOTENCY_IN_PROGRESS`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"422":{"description":"Idempotency-Key použitý na jiný požadavek (`IDEMPOTENCY_CONFLICT`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/portfolios/{id}":{"get":{"weight":"portfolios.get","tags":["Portfolia"],"summary":"Detail portfolia","description":"\n\nCena: 1 kredit z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","example":"665f00000000000000000001"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Portfolio.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","description":"standard = drží transakce, composite = souhrn jiných portfolií"},"currency":{"type":"string"},"portfolioIds":{"type":"array","items":{"type":"string"},"description":"Jen composite: ID přímých členů."}},"required":["id","name","type","currency"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"404":{"description":"Portfolio neexistuje nebo nepatří k účtu (`NOT_FOUND`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}},"patch":{"weight":"portfolios.update","tags":["Portfolia"],"summary":"Úprava portfolia","description":"\n\nCena: 5 kreditů z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","example":"665f00000000000000000001"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":8,"maxLength":128,"description":"Klíč idempotence (zvolte si, např. UUID). Opakování požadavku se STEJNÝM klíčem vrátí uloženou odpověď (hlavička `Idempotency-Replayed: true`) a nic neprovede podruhé - bezpečný retry po timeoutu. Stejný klíč s jiným tělem vrací 422 `IDEMPOTENCY_CONFLICT`."},"required":true,"name":"Idempotency-Key","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":255},"currency":{"type":"string","minLength":3,"maxLength":3},"description":{"type":"string","maxLength":1000}},"additionalProperties":false}}}},"responses":{"200":{"description":"Upraveno.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","description":"standard = drží transakce, composite = souhrn jiných portfolií"},"currency":{"type":"string"},"portfolioIds":{"type":"array","items":{"type":"string"},"description":"Jen composite: ID přímých členů."}},"required":["id","name","type","currency"]}}}},"400":{"description":"Neplatný vstup, neznámé pole (`INVALID_REQUEST`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"404":{"description":"Portfolio neexistuje (`NOT_FOUND`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}},"delete":{"weight":"portfolios.delete","tags":["Portfolia"],"summary":"Smazání portfolia (kaskádové)","description":"Smaže portfolio VČETNĚ všech transakcí a párování. U neprázdného portfolia vyžaduje `?confirm=<přesný název>` - bez něj vrací 409 `CONFIRMATION_REQUIRED` s počtem transakcí.\n\nCena: 5 kreditů z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","example":"665f00000000000000000001"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Přesný název portfolia (potvrzení)."},"required":false,"description":"Přesný název portfolia (potvrzení).","name":"confirm","in":"query"},{"schema":{"type":"string","minLength":8,"maxLength":128,"description":"Klíč idempotence (zvolte si, např. UUID). Opakování požadavku se STEJNÝM klíčem vrátí uloženou odpověď (hlavička `Idempotency-Replayed: true`) a nic neprovede podruhé - bezpečný retry po timeoutu. Stejný klíč s jiným tělem vrací 422 `IDEMPOTENCY_CONFLICT`."},"required":true,"name":"Idempotency-Key","in":"header"}],"responses":{"200":{"description":"Smazáno.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]},"deletedTransactions":{"type":"number"}},"required":["id","deleted"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"404":{"description":"Portfolio neexistuje (`NOT_FOUND`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"409":{"description":"Chybí/nesedí potvrzení (`CONFIRMATION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/portfolios/{id}/positions":{"get":{"weight":"positions.get","tags":["Portfolia"],"summary":"Otevřené pozice portfolia","description":"`pricesPending: true` = ceny se ještě dotahují; zopakujte dotaz.\n\nCena: 5 kreditů z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","example":"665f00000000000000000001"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Pozice + součty v měně portfolia.","content":{"application/json":{"schema":{"type":"object","properties":{"currency":{"type":"string"},"positions":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"quantity":{"type":"number"},"currency":{"type":"string"},"avgPrice":{"type":"number"},"costNative":{"type":"number"},"marketPrice":{"type":"number"},"marketValue":{"type":"number"},"unrealizedGain":{"type":"number"},"realizedGain":{"type":"number"}},"required":["symbol","quantity","currency","avgPrice","costNative"]}},"totals":{"type":"object","properties":{"costValue":{"type":"number"},"marketValue":{"type":"number"},"unrealizedGain":{"type":"number"},"realizedGain":{"type":"number"}},"required":["costValue","marketValue","unrealizedGain","realizedGain"]},"pricesPending":{"type":"boolean","description":"true = ceny se ještě dotahují; zopakujte dotaz, než na číslech postavíte rozhodnutí."}},"required":["currency","positions","totals"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"404":{"description":"Portfolio neexistuje (`NOT_FOUND`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/transactions":{"get":{"weight":"transactions.list","tags":["Transakce"],"summary":"Výpis transakcí (cursor-based)","description":"Bez `portfolioId` jde napříč všemi portfolii. Stránkuje se přes `nextCursor` → `?cursor=`; offset neexistuje.\n\nCena: 1 kredit z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"portfolioId","in":"query"},{"schema":{"type":"string"},"required":false,"name":"symbol","in":"query"},{"schema":{"type":"string","description":"Čárkou oddělený seznam (Buy,Sell,Dividend…)."},"required":false,"description":"Čárkou oddělený seznam (Buy,Sell,Dividend…).","name":"operation","in":"query"},{"schema":{"type":"string","description":"ISO datum od (včetně)."},"required":false,"description":"ISO datum od (včetně).","name":"from","in":"query"},{"schema":{"type":"string","description":"ISO datum do (včetně)."},"required":false,"description":"ISO datum do (včetně).","name":"to","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"string","description":"Velikost stránky, default 50, max 200."},"required":false,"description":"Velikost stránky, default 50, max 200.","name":"limit","in":"query"}],"responses":{"200":{"description":"Stránka transakcí.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"portfolioId":{"type":"string"},"date":{"type":"string","description":"ISO 8601."},"operation":{"type":"string"},"symbol":{"type":"string"},"quantity":{"type":"number"},"amountPerShare":{"type":"number"},"currency":{"type":"string"},"fee":{"type":"number"},"tax":{"type":"number"},"note":{"type":"string"},"withholdingTax":{"type":"number"},"sourceCountryCode":{"type":"string"},"isin":{"type":"string"},"assetClass":{"type":"string"},"option":{"type":"object","properties":{"optionType":{"type":"string","enum":["call","put"]},"strike":{"type":"number"},"expiry":{"type":"string"},"underlyingSymbol":{"type":"string"},"contractMultiplier":{"type":"number"}}}},"required":["id","portfolioId","date","operation","symbol","quantity","amountPerShare","currency","fee","tax"]}},"nextCursor":{"type":["string","null"],"description":"Pošlete zpět jako ?cursor= pro další stránku; null = konec výpisu."}},"required":["items","nextCursor"]}}}},"400":{"description":"Neplatný filtr nebo cursor (`INVALID_REQUEST`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}},"post":{"weight":"transactions.create","tags":["Transakce"],"summary":"Založení transakce","description":"Prodej nad držené množství vrací 400 (deriváty smí short). Párování dotčeného instrumentu se přepočítá automaticky.\n\nCena: 5 kreditů z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":128,"description":"Klíč idempotence (zvolte si, např. UUID). Opakování požadavku se STEJNÝM klíčem vrátí uloženou odpověď (hlavička `Idempotency-Replayed: true`) a nic neprovede podruhé - bezpečný retry po timeoutu. Stejný klíč s jiným tělem vrací 422 `IDEMPOTENCY_CONFLICT`."},"required":true,"name":"Idempotency-Key","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"portfolioId":{"type":"string","minLength":1},"transaction":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"symbol":{"type":"string","minLength":1,"maxLength":255},"operation":{"type":"string","enum":["Buy","Sell","Dividend","Fee","Interest","Expiration"]},"quantity":{"type":"number","exclusiveMinimum":0},"amountPerShare":{"type":"number","minimum":0},"currency":{"type":"string","minLength":3,"maxLength":3},"fee":{"type":"number","minimum":0,"default":0},"tax":{"type":"number","minimum":0,"default":0},"note":{"type":"string","maxLength":1000},"withholdingTax":{"type":"number","minimum":0},"sourceCountryCode":{"type":"string","minLength":2,"maxLength":2},"isin":{"type":"string","maxLength":12},"assetClass":{"type":"string","enum":["security","crypto","derivative"]},"option":{"type":"object","properties":{"optionType":{"type":"string","enum":["call","put"]},"strike":{"type":"number","exclusiveMinimum":0},"expiry":{"type":"string","format":"date-time"},"underlyingSymbol":{"type":"string","minLength":1,"maxLength":255},"contractMultiplier":{"type":"number","exclusiveMinimum":0}}}},"required":["date","operation","quantity","amountPerShare","currency"]}},"required":["portfolioId","transaction"]}}}},"responses":{"201":{"description":"Založeno.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"portfolioId":{"type":"string"},"date":{"type":"string","description":"ISO 8601."},"operation":{"type":"string"},"symbol":{"type":"string"},"quantity":{"type":"number"},"amountPerShare":{"type":"number"},"currency":{"type":"string"},"fee":{"type":"number"},"tax":{"type":"number"},"note":{"type":"string"},"withholdingTax":{"type":"number"},"sourceCountryCode":{"type":"string"},"isin":{"type":"string"},"assetClass":{"type":"string"},"option":{"type":"object","properties":{"optionType":{"type":"string","enum":["call","put"]},"strike":{"type":"number"},"expiry":{"type":"string"},"underlyingSymbol":{"type":"string"},"contractMultiplier":{"type":"number"}}}},"required":["id","portfolioId","date","operation","symbol","quantity","amountPerShare","currency","fee","tax"]}}}},"400":{"description":"Neplatný vstup (`INVALID_REQUEST`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"404":{"description":"Portfolio neexistuje (`NOT_FOUND`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"409":{"description":"Limit transakcí portfolia (`QUOTA_EXCEEDED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/transactions/{id}":{"get":{"weight":"transactions.get","tags":["Transakce"],"summary":"Detail transakce","description":"\n\nCena: 1 kredit z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","example":"665f00000000000000000001"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Transakce.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"portfolioId":{"type":"string"},"date":{"type":"string","description":"ISO 8601."},"operation":{"type":"string"},"symbol":{"type":"string"},"quantity":{"type":"number"},"amountPerShare":{"type":"number"},"currency":{"type":"string"},"fee":{"type":"number"},"tax":{"type":"number"},"note":{"type":"string"},"withholdingTax":{"type":"number"},"sourceCountryCode":{"type":"string"},"isin":{"type":"string"},"assetClass":{"type":"string"},"option":{"type":"object","properties":{"optionType":{"type":"string","enum":["call","put"]},"strike":{"type":"number"},"expiry":{"type":"string"},"underlyingSymbol":{"type":"string"},"contractMultiplier":{"type":"number"}}}},"required":["id","portfolioId","date","operation","symbol","quantity","amountPerShare","currency","fee","tax"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"404":{"description":"Transakce neexistuje (`NOT_FOUND`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}},"patch":{"weight":"transactions.update","tags":["Transakce"],"summary":"Úprava transakce","description":"Posílejte jen měněná pole. Neznámé pole vrací 400 (žádné tiché zahození). Transakce vygenerovaná korporátní akcí je needitovatelná (409).\n\nCena: 5 kreditů z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","example":"665f00000000000000000001"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":8,"maxLength":128,"description":"Klíč idempotence (zvolte si, např. UUID). Opakování požadavku se STEJNÝM klíčem vrátí uloženou odpověď (hlavička `Idempotency-Replayed: true`) a nic neprovede podruhé - bezpečný retry po timeoutu. Stejný klíč s jiným tělem vrací 422 `IDEMPOTENCY_CONFLICT`."},"required":true,"name":"Idempotency-Key","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"symbol":{"type":"string","minLength":1,"maxLength":255},"operation":{"type":"string","enum":["Buy","Sell","Dividend","Fee","Interest","Expiration"]},"quantity":{"type":"number","exclusiveMinimum":0},"amountPerShare":{"type":"number","minimum":0},"currency":{"type":"string","minLength":3,"maxLength":3},"fee":{"type":"number","minimum":0,"default":0},"tax":{"type":"number","minimum":0,"default":0},"note":{"type":"string","maxLength":1000},"withholdingTax":{"type":"number","minimum":0},"sourceCountryCode":{"type":"string","minLength":2,"maxLength":2},"isin":{"type":"string","maxLength":12},"assetClass":{"type":"string","enum":["security","crypto","derivative"]},"option":{"type":"object","properties":{"optionType":{"type":"string","enum":["call","put"]},"strike":{"type":"number","exclusiveMinimum":0},"expiry":{"type":"string","format":"date-time"},"underlyingSymbol":{"type":"string","minLength":1,"maxLength":255},"contractMultiplier":{"type":"number","exclusiveMinimum":0}}}},"additionalProperties":false}}}},"responses":{"200":{"description":"Upraveno.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"portfolioId":{"type":"string"},"date":{"type":"string","description":"ISO 8601."},"operation":{"type":"string"},"symbol":{"type":"string"},"quantity":{"type":"number"},"amountPerShare":{"type":"number"},"currency":{"type":"string"},"fee":{"type":"number"},"tax":{"type":"number"},"note":{"type":"string"},"withholdingTax":{"type":"number"},"sourceCountryCode":{"type":"string"},"isin":{"type":"string"},"assetClass":{"type":"string"},"option":{"type":"object","properties":{"optionType":{"type":"string","enum":["call","put"]},"strike":{"type":"number"},"expiry":{"type":"string"},"underlyingSymbol":{"type":"string"},"contractMultiplier":{"type":"number"}}}},"required":["id","portfolioId","date","operation","symbol","quantity","amountPerShare","currency","fee","tax"]}}}},"400":{"description":"Neplatný vstup, neznámé pole (`INVALID_REQUEST`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"404":{"description":"Transakce neexistuje (`NOT_FOUND`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"409":{"description":"Transakce z korporátní akce (`INVALID_REQUEST`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}},"delete":{"weight":"transactions.delete","tags":["Transakce"],"summary":"Smazání transakce","description":"Vyžaduje oprávnění `delete` na klíči. Párování dotčeného instrumentu se přepočítá.\n\nCena: 5 kreditů z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","example":"665f00000000000000000001"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":8,"maxLength":128,"description":"Klíč idempotence (zvolte si, např. UUID). Opakování požadavku se STEJNÝM klíčem vrátí uloženou odpověď (hlavička `Idempotency-Replayed: true`) a nic neprovede podruhé - bezpečný retry po timeoutu. Stejný klíč s jiným tělem vrací 422 `IDEMPOTENCY_CONFLICT`."},"required":true,"name":"Idempotency-Key","in":"header"}],"responses":{"200":{"description":"Smazáno.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean","enum":[true]},"deletedTransactions":{"type":"number"}},"required":["id","deleted"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"404":{"description":"Transakce neexistuje (`NOT_FOUND`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/transactions/bulk":{"post":{"weight":"transactions.bulk","tags":["Transakce"],"summary":"Hromadné založení transakcí","description":"Max 500 položek. Dávka NENÍ všechno-nebo-nic: odpověď nese `created[]` a `failed[]` per index. Cena: 5 kreditů + 1 za položku.\n\nCena: 5 kreditů z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string","minLength":8,"maxLength":128,"description":"Klíč idempotence (zvolte si, např. UUID). Opakování požadavku se STEJNÝM klíčem vrátí uloženou odpověď (hlavička `Idempotency-Replayed: true`) a nic neprovede podruhé - bezpečný retry po timeoutu. Stejný klíč s jiným tělem vrací 422 `IDEMPOTENCY_CONFLICT`."},"required":true,"name":"Idempotency-Key","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"portfolioId":{"type":"string","minLength":1},"transactions":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"symbol":{"type":"string","minLength":1,"maxLength":255},"operation":{"type":"string","enum":["Buy","Sell","Dividend","Fee","Interest","Expiration"]},"quantity":{"type":"number","exclusiveMinimum":0},"amountPerShare":{"type":"number","minimum":0},"currency":{"type":"string","minLength":3,"maxLength":3},"fee":{"type":"number","minimum":0,"default":0},"tax":{"type":"number","minimum":0,"default":0},"note":{"type":"string","maxLength":1000},"withholdingTax":{"type":"number","minimum":0},"sourceCountryCode":{"type":"string","minLength":2,"maxLength":2},"isin":{"type":"string","maxLength":12},"assetClass":{"type":"string","enum":["security","crypto","derivative"]},"option":{"type":"object","properties":{"optionType":{"type":"string","enum":["call","put"]},"strike":{"type":"number","exclusiveMinimum":0},"expiry":{"type":"string","format":"date-time"},"underlyingSymbol":{"type":"string","minLength":1,"maxLength":255},"contractMultiplier":{"type":"number","exclusiveMinimum":0}}}},"required":["date","operation","quantity","amountPerShare","currency"]},"minItems":1}},"required":["portfolioId","transactions"]}}}},"responses":{"200":{"description":"Výsledek per položka.","content":{"application/json":{"schema":{"type":"object","properties":{"created":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number"},"id":{"type":"string"}},"required":["index","id"]}},"failed":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number"},"error":{"type":"string"}},"required":["index","error"]}}},"required":["created","failed"]}}}},"400":{"description":"Neplatný vstup / příliš velká dávka (`INVALID_REQUEST`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"404":{"description":"Portfolio neexistuje (`NOT_FOUND`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"409":{"description":"Dávka by překročila limit transakcí portfolia (`QUOTA_EXCEEDED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/tax-report/{year}":{"get":{"weight":"taxReport.get","tags":["Daně"],"summary":"Podklad pro daňové přiznání za rok","description":"Před použitím čísel zkontrolujte `status` - `blocked` znamená neúplný výpočet (důvod ve `warnings`). Default je kompaktní souhrn s řádky přiznání; `?format=full` přidá rozpad po prodejích a dividendách.\n\nCena: 25 kreditů z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"$ref":"#/components/parameters/year"},{"schema":{"type":"string","enum":["summary","full"],"description":"Default summary."},"required":false,"description":"Default summary.","name":"format","in":"query"},{"schema":{"type":"string","description":"Omezení na jedno portfolio (composite se rozbalí)."},"required":false,"description":"Omezení na jedno portfolio (composite se rozbalí).","name":"portfolioId","in":"query"}],"responses":{"200":{"description":"Daňový podklad.","content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"number"},"scope":{"type":"string","enum":["all","portfolio"]},"portfolioIds":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["ok","blocked"],"description":"blocked = čísla NELZE použít (viz warnings) - zkontrolujte před přepsáním do přiznání."},"warnings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"severity":{"type":"string"},"message":{"type":"string"},"symbol":{"type":"string"},"currency":{"type":"string"},"year":{"type":"number"},"portfolioId":{"type":"string"}},"required":["code","severity","message"]}},"formLines":{"type":"object","properties":{"r38":{"type":"number","description":"ř. 38 - dílčí základ §8 (hrubé zahraniční dividendy)."},"r40":{"type":"number","description":"ř. 40 - dílčí základ §10 (zdanitelný zisk z prodeje)."},"r74a":{"type":"number","description":"ř. 74a - daň ze samostatného základu (§16a) po zápočtu."}},"required":["r38","r40","r74a"]},"section10":{"type":"object","properties":{"taxableProceedsCzk":{"type":"number"},"taxableExpensesCzk":{"type":"number"},"taxableGainCzk":{"type":"number"},"exemptTimeTestProceedsCzk":{"type":"number"},"exemptValueTestProceedsCzk":{"type":"number"},"valueTestApplied":{"type":"boolean"},"securities":{"type":"object","properties":{"taxableProceedsCzk":{"type":"number"},"taxableExpensesCzk":{"type":"number"},"taxableGainCzk":{"type":"number"}},"required":["taxableProceedsCzk","taxableExpensesCzk","taxableGainCzk"]},"crypto":{"type":"object","properties":{"taxableProceedsCzk":{"type":"number"},"taxableExpensesCzk":{"type":"number"},"taxableGainCzk":{"type":"number"}},"required":["taxableProceedsCzk","taxableExpensesCzk","taxableGainCzk"]},"derivatives":{"type":"object","properties":{"taxableProceedsCzk":{"type":"number"},"taxableExpensesCzk":{"type":"number"},"taxableGainCzk":{"type":"number"}},"required":["taxableProceedsCzk","taxableExpensesCzk","taxableGainCzk"]}},"required":["taxableProceedsCzk","taxableExpensesCzk","taxableGainCzk","exemptTimeTestProceedsCzk","exemptValueTestProceedsCzk","valueTestApplied","securities","crypto","derivatives"]},"section8":{"type":"object","properties":{"totalGrossCzk":{"type":"number"},"totalWithheldCzk":{"type":"number"},"totalCreditableCzk":{"type":"number"},"totalTaxToPayCzk":{"type":"number"},"byCountry":{"type":"array","items":{"type":"object","properties":{"countryCode":{"type":"string"},"count":{"type":"number"},"grossCzk":{"type":"number"},"withheldCzk":{"type":"number"},"creditableCzk":{"type":"number"},"taxToPayCzk":{"type":"number"}},"required":["countryCode","count","grossCzk","withheldCzk","creditableCzk","taxToPayCzk"]}},"domesticGrossCzk":{"type":"number"},"domesticWithheldCzk":{"type":"number"}},"required":["totalGrossCzk","totalWithheldCzk","totalCreditableCzk","totalTaxToPayCzk","byCountry","domesticGrossCzk","domesticWithheldCzk"]},"totals":{"type":"object","properties":{"section10BaseCzk":{"type":"number"},"section8BaseCzk":{"type":"number"},"estimatedTaxGeneralCzk":{"type":"number"},"estimatedTaxSzdCzk":{"type":"number"}},"required":["section10BaseCzk","section8BaseCzk","estimatedTaxGeneralCzk","estimatedTaxSzdCzk"]},"sales":{"type":"array","items":{"type":"object","properties":{"transactionId":{"type":"string"},"portfolioId":{"type":"string"},"symbol":{"type":"string"},"currency":{"type":"string"},"assetClass":{"type":"string"},"sellDate":{"type":"string"},"quantity":{"type":"number"},"matchedQuantity":{"type":"number"},"proceedsGrossCzk":{"type":"number"},"acquisitionCzk":{"type":"number"},"gainCzk":{"type":"number"},"taxableGainCzk":{"type":"number"}},"required":["transactionId","symbol","currency","assetClass","sellDate","quantity","matchedQuantity","proceedsGrossCzk","acquisitionCzk","gainCzk","taxableGainCzk"]},"description":"Jen ?format=full."},"dividends":{"type":"array","items":{"type":"object","properties":{"transactionId":{"type":"string"},"portfolioId":{"type":"string"},"symbol":{"type":"string"},"currency":{"type":"string"},"date":{"type":"string"},"countryCode":{"type":"string"},"grossCzk":{"type":"number"},"withheldCzk":{"type":"number"},"creditableCzk":{"type":"number"}},"required":["transactionId","symbol","currency","date","grossCzk","withheldCzk","creditableCzk"]},"description":"Jen ?format=full."}},"required":["year","scope","portfolioIds","status","warnings","formLines","section10","section8","totals"]}}}},"400":{"description":"Neplatný rok (`INVALID_REQUEST`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"404":{"description":"Portfolio neexistuje (`NOT_FOUND`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/tax-optimization/{year}":{"get":{"weight":"taxOptimization.get","tags":["Daně"],"summary":"Daňová optimalizace (dopředný pohled)","description":"Co se daňově stane, když otevřené pozice prodám teď: ztrátové loty, splněný časový test, čerpání limitu 100 000 Kč. `?format=full` přidá rozpad na jednotlivé loty.\n\nCena: 25 kreditů z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"$ref":"#/components/parameters/year"},{"schema":{"type":"string","enum":["summary","full"]},"required":false,"name":"format","in":"query"},{"schema":{"type":"string"},"required":false,"name":"portfolioId","in":"query"}],"responses":{"200":{"description":"Optimalizační podklad.","content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"number"},"referenceDate":{"type":"string"},"scope":{"type":"string","enum":["all","portfolio"]},"portfolioIds":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["ok","blocked"]},"warnings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"severity":{"type":"string"},"message":{"type":"string"},"symbol":{"type":"string"},"currency":{"type":"string"},"year":{"type":"number"},"portfolioId":{"type":"string"}},"required":["code","severity","message"]}},"nearDays":{"type":"number"},"exemptGainCzk":{"type":"number"},"harvestableLossCzk":{"type":"number"},"alreadyRealizedTaxableGainCzk":{"type":"number"},"offsetableLossCzk":{"type":"number"},"valueTestUsedCzk":{"type":"number"},"cryptoValueTestUsedCzk":{"type":"number"},"valueTestThreshold":{"type":"number"},"pricesPending":{"type":"boolean"},"lots":{"type":"array","items":{"type":"object","properties":{"buyTransactionId":{"type":"string"},"symbol":{"type":"string"},"portfolioId":{"type":"string"},"currency":{"type":"string"},"assetClass":{"type":"string"},"quantity":{"type":"number"},"buyDate":{"type":"string"},"acquisitionCzk":{"type":"number"},"currentValueCzk":{"type":["number","null"]},"unrealizedGainCzk":{"type":["number","null"]},"heldDays":{"type":"number"},"daysUntilTimeTest":{"type":"number"},"timeTestPassed":{"type":"boolean"},"category":{"type":"string"}},"required":["buyTransactionId","symbol","currency","assetClass","quantity","buyDate","acquisitionCzk","currentValueCzk","unrealizedGainCzk","heldDays","daysUntilTimeTest","timeTestPassed","category"]},"description":"Jen ?format=full."}},"required":["year","referenceDate","scope","portfolioIds","status","warnings","nearDays","exemptGainCzk","harvestableLossCzk","alreadyRealizedTaxableGainCzk","offsetableLossCzk","valueTestUsedCzk","cryptoValueTestUsedCzk","valueTestThreshold"]}}}},"400":{"description":"Neplatný rok (`INVALID_REQUEST`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/currencies":{"get":{"weight":"currencies.list","tags":["Číselníky"],"summary":"Podporované měny","description":"\n\nCena: 1 kredit z denního rozpočtu.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Měny.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"}},"required":["code","name","symbol"]}},"nextCursor":{"type":["string","null"],"description":"Pošlete zpět jako ?cursor= pro další stránku; null = konec výpisu."}},"required":["items","nextCursor"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}},"/api/v1/exchange-rates":{"get":{"weight":"exchangeRates.list","tags":["Číselníky"],"summary":"Daňové kurzy (jednotné GFŘ + denní ČNB)","description":"\n\nCena: 1 kredit z denního rozpočtu.","security":[{"apiKey":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"year","in":"query"},{"schema":{"type":"string"},"required":false,"name":"currency","in":"query"},{"schema":{"type":"string","enum":["yearly","daily"]},"required":false,"name":"mode","in":"query"}],"responses":{"200":{"description":"Kurzy.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"currency":{"type":"string"},"year":{"type":"number","description":"Jen u yearly kurzu."},"mode":{"type":"string","description":"yearly = jednotný kurz GFŘ, daily = denní kurz ČNB."},"rate":{"type":"number"},"date":{"type":"string","description":"Jen u daily kurzu."}},"required":["currency","mode","rate"]}},"nextCursor":{"type":["string","null"],"description":"Pošlete zpět jako ?cursor= pro další stránku; null = konec výpisu."}},"required":["items","nextCursor"]}}}},"401":{"description":"Chybějící/neplatný API klíč (`API_KEY_REQUIRED`, `API_KEY_INVALID`, `API_KEY_EXPIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"402":{"description":"Účet bez aktivního předplatného (`SUBSCRIPTION_REQUIRED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"403":{"description":"Chybějící oprávnění klíče (`INSUFFICIENT_SCOPE`), pozastavený klíč (`API_KEY_SUSPENDED`) nebo účet jen pro čtení (`READ_ONLY`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"429":{"description":"Překročený limit (`RATE_LIMITED` = burst za minutu, `QUOTA_EXCEEDED` = denní kredity, `TOO_MANY_CONCURRENT_REQUESTS` = souběh). Viz hlavičky `X-RateLimit-*` a `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}},"503":{"description":"API vypnuté (`API_DISABLED`) nebo přetížené (`OVERLOADED`).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Stabilní strojový kód chyby - na něj se rozhodujte, ne na text."},"message":{"type":"string","description":"Česká hláška pro člověka; může se měnit."},"details":{"type":"object","additionalProperties":{}}},"required":["code","message"]}}}}}}}},"webhooks":{}}