{"openapi":"3.1.0","info":{"title":"API webu — Obec Vlastibořice","version":"1.0.0","description":"Zápis příspěvků, úřední desky a zpravodaje na web obce (Web od Voltu 2.0). Lidský popis: https://vlastiborice.cz/api","license":{"name":"EUPL-1.2","identifier":"EUPL-1.2"}},"servers":[{"url":"https://vlastiborice.cz/api/v1"}],"security":[{"token":[]}],"components":{"securitySchemes":{"token":{"type":"http","scheme":"bearer","description":"Token ze Správa → API a integrace"}},"schemas":{"Chyba":{"type":"object","required":["chyba"],"properties":{"chyba":{"type":"string"},"pole":{"type":"string"}}},"Prispevek":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"typ":{"type":"string"},"titulek":{"type":"string"},"slug":{"type":"string"},"stav":{"type":"string","enum":["koncept","zverejneno"]},"rozpracovana_zmena":{"type":"boolean"},"url":{"type":"string"},"sprava_url":{"type":"string"},"zdroj":{"type":"string"},"externi_id":{"type":["string","null"]},"kategorie":{"type":["string","null"]},"datum":{"type":["string","null"]},"akce_konec":{"type":["string","null"]},"hlaseni_id":{"type":["string","null"]},"aktualizovano":{"type":"boolean"}}},"ZpravodajMetadata":{"type":"object","required":["rocnik","cislo","vydano","perex","evidence"],"description":"viz docs/ZPRAVODAJ-API.md","properties":{"rocnik":{"type":"integer"},"cislo":{"type":"integer"},"titulek":{"type":"string"},"vydano":{"type":"string","format":"date"},"obdobi":{"type":"string"},"perex":{"type":"string"},"obsah":{"type":"array","items":{"type":"object","properties":{"strana":{"type":"integer"},"nadpis":{"type":"string"}}}},"evidence":{"type":"object","required":["k","obyvatel"],"properties":{"k":{"type":"string","format":"date"},"obyvatel":{"type":"integer"}}},"hospodareni":{"type":"object"},"akce":{"type":"array","items":{"type":"object"}},"tiraz":{"type":"object","additionalProperties":{"type":"string"}},"zverejnit":{"type":"boolean","default":true},"rozeslat":{"type":"boolean","default":false}}}}},"paths":{"/kategorie":{"get":{"summary":"Kategorie webu, úřední desky a infokanálu","responses":{"200":{"description":"Seznamy kategorií","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Neplatná data (pole `pole` říká které)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"401":{"description":"Chybí nebo neplatný token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"403":{"description":"Token nemá potřebné oprávnění","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"413":{"description":"Soubor nebo požadavek je příliš velký","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"429":{"description":"Překročen limit požadavků","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}}}}},"/prispevky":{"get":{"summary":"Hledání příspěvků (např. podle zdroje a externího id)","parameters":[{"name":"zdroj","in":"query","schema":{"type":"string"}},{"name":"externi_id","in":"query","schema":{"type":"string"}},{"name":"typ","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Seznam","content":{"application/json":{"schema":{"type":"object","properties":{"polozky":{"type":"array","items":{"$ref":"#/components/schemas/Prispevek"}}}}}}},"400":{"description":"Neplatná data (pole `pole` říká které)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"401":{"description":"Chybí nebo neplatný token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"403":{"description":"Token nemá potřebné oprávnění","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"413":{"description":"Soubor nebo požadavek je příliš velký","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"429":{"description":"Překročen limit požadavků","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}}}},"post":{"summary":"Založení příspěvku (nebo úprava při stejném zdroji + externi_id)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"typ":{"type":"string","enum":["aktualita","akce","stranka"],"default":"aktualita"},"titulek":{"type":"string","maxLength":250},"perex":{"type":"string","maxLength":600},"html":{"type":"string","description":"HTML textu (sanitizuje se); nebo `markdown`"},"markdown":{"type":"string"},"kategorie":{"type":"string","description":"slug nebo id kategorie webu (GET /api/v1/kategorie)"},"datum":{"type":"string","description":"aktualita: YYYY-MM-DD, YYYY-MM-DDTHH:MM (Praha) nebo ISO 8601"},"akce_od":{"type":"string","description":"akce: začátek (YYYY-MM-DD = celý den)"},"akce_do":{"type":"string"},"akce_cely_den":{"type":"boolean"},"misto":{"type":"string","maxLength":200},"v_aktualitach":{"type":"boolean","description":"akce se ukáže i v Aktualitách jako pozvánka"},"v_menu":{"type":"boolean","description":"stránka v menu (výchozí ne)"},"slug":{"type":"string"},"obrazek_id":{"type":"string","format":"uuid"},"obrazek_alt":{"type":"string","description":"popis úvodního obrázku — povinný před zveřejněním"},"prilohy_id":{"type":"array","items":{"type":"string","format":"uuid"}},"zverejnit":{"type":"boolean","description":"true = zveřejnit, false/vynecháno = koncept"},"zdroj":{"type":"string","default":"api","description":"jméno vašeho systému (pro idempotenci)"},"externi_id":{"type":"string","description":"id záznamu u vás; stejný zdroj + externi_id = úprava"}}}},"multipart/form-data":{"schema":{"allOf":[{"type":"object","properties":{"typ":{"type":"string","enum":["aktualita","akce","stranka"],"default":"aktualita"},"titulek":{"type":"string","maxLength":250},"perex":{"type":"string","maxLength":600},"html":{"type":"string","description":"HTML textu (sanitizuje se); nebo `markdown`"},"markdown":{"type":"string"},"kategorie":{"type":"string","description":"slug nebo id kategorie webu (GET /api/v1/kategorie)"},"datum":{"type":"string","description":"aktualita: YYYY-MM-DD, YYYY-MM-DDTHH:MM (Praha) nebo ISO 8601"},"akce_od":{"type":"string","description":"akce: začátek (YYYY-MM-DD = celý den)"},"akce_do":{"type":"string"},"akce_cely_den":{"type":"boolean"},"misto":{"type":"string","maxLength":200},"v_aktualitach":{"type":"boolean","description":"akce se ukáže i v Aktualitách jako pozvánka"},"v_menu":{"type":"boolean","description":"stránka v menu (výchozí ne)"},"slug":{"type":"string"},"obrazek_id":{"type":"string","format":"uuid"},"obrazek_alt":{"type":"string","description":"popis úvodního obrázku — povinný před zveřejněním"},"prilohy_id":{"type":"array","items":{"type":"string","format":"uuid"}},"zverejnit":{"type":"boolean","description":"true = zveřejnit, false/vynecháno = koncept"},"zdroj":{"type":"string","default":"api","description":"jméno vašeho systému (pro idempotenci)"},"externi_id":{"type":"string","description":"id záznamu u vás; stejný zdroj + externi_id = úprava"}}},{"type":"object","properties":{"obrazek":{"type":"string","format":"binary"},"prilohy":{"type":"array","items":{"type":"string","format":"binary"}}}}]}}}},"responses":{"200":{"description":"Upraveno (idempotence)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Prispevek"}}}},"201":{"description":"Založeno","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Prispevek"}}}},"400":{"description":"Neplatná data (pole `pole` říká které)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"401":{"description":"Chybí nebo neplatný token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"403":{"description":"Token nemá potřebné oprávnění","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"409":{"description":"Konflikt typu","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"413":{"description":"Soubor nebo požadavek je příliš velký","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"429":{"description":"Překročen limit požadavků","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}}}}},"/prispevky/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"get":{"summary":"Detail příspěvku","responses":{"200":{"description":"Příspěvek","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Prispevek"}}}},"400":{"description":"Neplatná data (pole `pole` říká které)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"401":{"description":"Chybí nebo neplatný token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"403":{"description":"Token nemá potřebné oprávnění","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"404":{"description":"Nenalezeno","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"413":{"description":"Soubor nebo požadavek je příliš velký","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"429":{"description":"Překročen limit požadavků","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}}}},"patch":{"summary":"Úprava příspěvku založeného přes API (jen poslaná pole)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"typ":{"type":"string","enum":["aktualita","akce","stranka"],"default":"aktualita"},"titulek":{"type":"string","maxLength":250},"perex":{"type":"string","maxLength":600},"html":{"type":"string","description":"HTML textu (sanitizuje se); nebo `markdown`"},"markdown":{"type":"string"},"kategorie":{"type":"string","description":"slug nebo id kategorie webu (GET /api/v1/kategorie)"},"datum":{"type":"string","description":"aktualita: YYYY-MM-DD, YYYY-MM-DDTHH:MM (Praha) nebo ISO 8601"},"akce_od":{"type":"string","description":"akce: začátek (YYYY-MM-DD = celý den)"},"akce_do":{"type":"string"},"akce_cely_den":{"type":"boolean"},"misto":{"type":"string","maxLength":200},"v_aktualitach":{"type":"boolean","description":"akce se ukáže i v Aktualitách jako pozvánka"},"v_menu":{"type":"boolean","description":"stránka v menu (výchozí ne)"},"slug":{"type":"string"},"obrazek_id":{"type":"string","format":"uuid"},"obrazek_alt":{"type":"string","description":"popis úvodního obrázku — povinný před zveřejněním"},"prilohy_id":{"type":"array","items":{"type":"string","format":"uuid"}},"zverejnit":{"type":"boolean","description":"true = zveřejnit, false/vynecháno = koncept"},"zdroj":{"type":"string","default":"api","description":"jméno vašeho systému (pro idempotenci)"},"externi_id":{"type":"string","description":"id záznamu u vás; stejný zdroj + externi_id = úprava"}}}},"multipart/form-data":{"schema":{"allOf":[{"type":"object","properties":{"typ":{"type":"string","enum":["aktualita","akce","stranka"],"default":"aktualita"},"titulek":{"type":"string","maxLength":250},"perex":{"type":"string","maxLength":600},"html":{"type":"string","description":"HTML textu (sanitizuje se); nebo `markdown`"},"markdown":{"type":"string"},"kategorie":{"type":"string","description":"slug nebo id kategorie webu (GET /api/v1/kategorie)"},"datum":{"type":"string","description":"aktualita: YYYY-MM-DD, YYYY-MM-DDTHH:MM (Praha) nebo ISO 8601"},"akce_od":{"type":"string","description":"akce: začátek (YYYY-MM-DD = celý den)"},"akce_do":{"type":"string"},"akce_cely_den":{"type":"boolean"},"misto":{"type":"string","maxLength":200},"v_aktualitach":{"type":"boolean","description":"akce se ukáže i v Aktualitách jako pozvánka"},"v_menu":{"type":"boolean","description":"stránka v menu (výchozí ne)"},"slug":{"type":"string"},"obrazek_id":{"type":"string","format":"uuid"},"obrazek_alt":{"type":"string","description":"popis úvodního obrázku — povinný před zveřejněním"},"prilohy_id":{"type":"array","items":{"type":"string","format":"uuid"}},"zverejnit":{"type":"boolean","description":"true = zveřejnit, false/vynecháno = koncept"},"zdroj":{"type":"string","default":"api","description":"jméno vašeho systému (pro idempotenci)"},"externi_id":{"type":"string","description":"id záznamu u vás; stejný zdroj + externi_id = úprava"}}},{"type":"object","properties":{"obrazek":{"type":"string","format":"binary"},"prilohy":{"type":"array","items":{"type":"string","format":"binary"}}}}]}}}},"responses":{"200":{"description":"Upraveno","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Prispevek"}}}},"400":{"description":"Neplatná data (pole `pole` říká které)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"401":{"description":"Chybí nebo neplatný token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"403":{"description":"Token nemá potřebné oprávnění","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"404":{"description":"Nenalezeno","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"413":{"description":"Soubor nebo požadavek je příliš velký","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"429":{"description":"Překročen limit požadavků","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}}}}},"/prispevky/{id}/rozeslat":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"post":{"summary":"Rozeslání zveřejněného příspěvku infokanálem (rozsah infokanal:rozeslat)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"sms":{"type":"boolean","default":false},"kategorie":{"type":"string"}}}}}},"responses":{"202":{"description":"Hlášení založeno","content":{"application/json":{"schema":{"type":"object","properties":{"hlaseni_id":{"type":"string"},"prijemcu":{"type":"integer"}}}}}},"400":{"description":"Neplatná data (pole `pole` říká které)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"401":{"description":"Chybí nebo neplatný token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"403":{"description":"Token nemá potřebné oprávnění","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"409":{"description":"Příspěvek není zveřejněný","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"413":{"description":"Soubor nebo požadavek je příliš velký","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"429":{"description":"Překročen limit požadavků","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}}}}},"/soubory":{"post":{"summary":"Nahrání dokumentu nebo obrázku (text a OCR pro vyhledávání se zpracují na pozadí)","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","required":["soubor"],"properties":{"soubor":{"type":"string","format":"binary"},"alt":{"type":"string"}}}}}},"responses":{"201":{"description":"Uloženo","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"}}}}}},"400":{"description":"Neplatná data (pole `pole` říká které)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"401":{"description":"Chybí nebo neplatný token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"403":{"description":"Token nemá potřebné oprávnění","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"413":{"description":"Soubor nebo požadavek je příliš velký","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"429":{"description":"Překročen limit požadavků","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}}}}},"/deska":{"post":{"summary":"Vyvěšení dokumentu na úřední desku (zákonné lhůty se kontrolují)","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","required":["nazev","kategorie"],"properties":{"nazev":{"type":"string"},"kategorie":{"type":"string"},"vyveseno_od":{"type":"string","format":"date"},"vyveseno_do":{"type":"string","format":"date"},"do_odvolani":{"type":"boolean"},"popis":{"type":"string"},"cislo_jednaci":{"type":"string"},"puvodce":{"type":"string"},"typ_rozpoctu":{"type":"string"},"rok":{"type":"integer"},"potvrdit_nahrazeni":{"type":"boolean"},"prilohy":{"type":"array","items":{"type":"string","format":"binary"}}}}}}},"responses":{"201":{"description":"Vyvěšeno","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Neplatná data (pole `pole` říká které)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"401":{"description":"Chybí nebo neplatný token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"403":{"description":"Token nemá potřebné oprávnění","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"409":{"description":"Sejmul by starší rozpočtové dokumenty — potvrďte","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"413":{"description":"Soubor nebo požadavek je příliš velký","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"429":{"description":"Překročen limit požadavků","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}}}}},"/zpravodaj":{"post":{"summary":"Nové číslo obecního zpravodaje (stejný ročník + číslo = úprava)","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","required":["metadata","pdf"],"properties":{"metadata":{"$ref":"#/components/schemas/ZpravodajMetadata"},"pdf":{"type":"string","format":"binary"},"pdf_tisk":{"type":"string","format":"binary"},"obalka":{"type":"string","format":"binary"}}},"encoding":{"metadata":{"contentType":"application/json"}}}}},"responses":{"200":{"description":"Upraveno","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Založeno","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Neplatná data (pole `pole` říká které)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"401":{"description":"Chybí nebo neplatný token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"403":{"description":"Token nemá potřebné oprávnění","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"413":{"description":"Soubor nebo požadavek je příliš velký","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}},"429":{"description":"Překročen limit požadavků","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chyba"}}}}}}}}}