{
    "openapi": "3.1.0",
    "info": {
        "title": "Kystpraksis API",
        "version": "1.0.0",
        "summary": "Kystdirektoratets afgoerelser om strandbeskyttelse, klitfredning og soeterritoriet, anonymiseret og kategoriseret.",
        "description": "Gratis, offentligt JSON-API uden noegle. Kun GET.\n\nData: alle afgoerelser offentliggjort paa mst.dk siden 2024 samt aeldre afgoerelser fra det tidligere kyst.dk (2019-2023). En del af sagerne er gennemgaaet og kategoriseret med en sprogmodel efter et fast skema (type, udfald, zone, projekt, afgoerende hensyn, praksisflag) og har et anonymiseret resume og en anonymiseret fuldtekst. Resten har kun titel og metadata.\n\nAnonymisering: navne, adresser, matrikelnumre, e-mails og telefonnumre er fjernet eller erstattet med markoerer som [navn] og [adresse]. Kortkoordinater er forskudt 50-150 m fra ejendommen; adressen kan ikke udledes.\n\nKategoriseringen er en hjaelp til at finde relevante sager, ikke en juridisk vurdering. Laes altid selve afgoerelsen, og henvis til sagens url og journalnummer.",
        "contact": {
            "url": "https://kystpraksis.dk/om"
        },
        "license": {
            "name": "Offentlige aktstykker i anonymiseret form; fri brug med kildeangivelse (kystpraksis.dk)."
        }
    },
    "servers": [
        {
            "url": "https://kystpraksis.dk"
        }
    ],
    "paths": {
        "/api/soeg": {
            "get": {
                "operationId": "soegAfgoerelser",
                "summary": "Soeg og filtrer afgoerelser",
                "description": "Fritekst (q) rammer resumeer, noegleord og anonymiseret fuldtekst i gennemgaaede sager samt alle titler. Alle filtre kan kombineres. Resultater sorteres efter relevans, derefter gennemgaaede sager foerst og nyeste dato.",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "maxLength": 200
                        },
                        "description": "Soegeord paa dansk, fx \"uudnyttet tagetage\" eller \"badebro\". Flere ord = alle ord skal forekomme."
                    },
                    {
                        "name": "emne",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "strandbeskyttelse",
                                "klitfredning",
                                "soeterritoriet",
                                "bypass",
                                "kystbeskyttelse_staten"
                            ],
                            "description": "Emneomraade. strandbeskyttelse = Strandbeskyttelse, klitfredning = Klitfredning, soeterritoriet = Søterritoriet, bypass = Bypass og nyttiggørelse, kystbeskyttelse_staten = Kystbeskyttelse (staten)."
                        },
                        "description": "Begraens til et emne."
                    },
                    {
                        "name": "typ",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "dispensation",
                                "afslag",
                                "tilladelse",
                                "lovliggoerelse",
                                "paabud",
                                "hoering",
                                "afvisning",
                                "andet"
                            ],
                            "description": "Afgoerelsestype, dvs. hvad direktoratet gjorde. dispensation = Dispensation, afslag = Afslag, tilladelse = Tilladelse, lovliggoerelse = Lovliggørelse, paabud = Påbud, hoering = Høring, afvisning = Afvisning, andet = Andet."
                        },
                        "description": "Begraens til en afgoerelsestype."
                    },
                    {
                        "name": "udfald",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "imoedekommet",
                                "delvist",
                                "afslag",
                                "ikke_relevant"
                            ],
                            "description": "Udfald for ansoegeren (kun gennemgaaede sager). imoedekommet = Imødekommet, delvist = Delvist imødekommet, afslag = Afslag, ikke_relevant = Ikke relevant."
                        },
                        "description": "Begraens til et udfald."
                    },
                    {
                        "name": "kommune",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Kommunenavn uden \"Kommune\", fx \"Odsherred\" eller \"Tønder\"."
                    },
                    {
                        "name": "aar",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 2019
                        },
                        "description": "Afgoerelsesaar."
                    },
                    {
                        "name": "zone",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "byzone",
                                "landzone",
                                "sommerhusomraade",
                                "ukendt"
                            ],
                            "description": "Planzone (kun gennemgaaede sager). byzone = Byzone, landzone = Landzone, sommerhusomraade = Sommerhusområde, ukendt = Ukendt."
                        },
                        "description": "Begraens til en zone."
                    },
                    {
                        "name": "flag",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Et eller flere praksisflag adskilt med komma, fx \"f_harmoni,f_vinduer_mod_kyst\". Kun sager, hvor flaget er sandt. Mulige vaerdier: f_vinduer_mod_kyst, f_tagetage_udnyttes, f_uudnyttet_tagetage, f_hoejde_foroeges, f_fodaftryk_foroeges, f_saerligt_tilfaelde, f_mindre_end_lidt, f_harmoni, f_energi, f_tilgaengelighed, f_kommune_positiv, f_naboindsigelser, f_vilkaar, f_genoptaget."
                    },
                    {
                        "name": "gennemgaaet",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "enum": [
                                0,
                                1
                            ]
                        },
                        "description": "1 = kun sager, der er gennemgaaet og kategoriseret (har resume og label)."
                    },
                    {
                        "name": "naer",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "pattern": "^-?\\d{1,2}\\.\\d{1,6},-?\\d{1,3}\\.\\d{1,6}$"
                        },
                        "description": "Sager inden for ca. 4 km af et punkt \"lat,lon\" (WGS84), sorteret efter afstand. Brug fx kort.lat/kort.lon fra en anden sag."
                    },
                    {
                        "name": "p",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        },
                        "description": "Sidenummer."
                    },
                    {
                        "name": "antal",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50,
                            "default": 20
                        },
                        "description": "Resultater pr. side."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Soegeresultat",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Soegeresultat"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/sag/{id}": {
            "get": {
                "operationId": "hentSag",
                "summary": "Hent een afgoerelse",
                "description": "Metadata, anonymiseret resume, kategorisering (label) og anonymiseret fuldtekst for en sag. Ikke-gennemgaaede sager har kun metadata.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Sagens id, som det staar i soegeresultatet og i url'en /sag/{id}."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sagen",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Sag"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Sagen findes ikke"
                    }
                }
            }
        },
        "/api/punkter": {
            "get": {
                "operationId": "hentPunkter",
                "summary": "Alle geokodede sager til kort",
                "description": "Kompakt liste til kortvisning: hvert element er [id, lat, lon, udfaldskode (0 andet, 1 dispensation/tilladelse, 2 afslag), titel, aar]. Punkterne er forskudt 50-150 m fra ejendommen.",
                "responses": {
                    "200": {
                        "description": "Liste af punkter",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "type": "array",
                                        "minItems": 6,
                                        "maxItems": 6
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "Soegeresultat": {
                "type": "object",
                "properties": {
                    "antal": {
                        "type": "integer",
                        "description": "Samlet antal sager, der matcher"
                    },
                    "side": {
                        "type": "integer"
                    },
                    "sider": {
                        "type": "integer"
                    },
                    "pr_side": {
                        "type": "integer"
                    },
                    "filtre": {
                        "type": "object",
                        "description": "De filtre, der blev anvendt"
                    },
                    "bemaerk": {
                        "type": "string"
                    },
                    "resultater": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/SagKort"
                        }
                    }
                }
            },
            "SagKort": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "url": {
                        "type": "string",
                        "description": "Sagens side paa kystpraksis.dk, til henvisning"
                    },
                    "api_url": {
                        "type": "string"
                    },
                    "titel": {
                        "type": "string",
                        "description": "Afgoerelsens titel med adresser og matrikler maskeret"
                    },
                    "emne": {
                        "type": "string",
                        "enum": [
                            "strandbeskyttelse",
                            "klitfredning",
                            "soeterritoriet",
                            "bypass",
                            "kystbeskyttelse_staten"
                        ],
                        "description": "Emne. strandbeskyttelse = Strandbeskyttelse, klitfredning = Klitfredning, soeterritoriet = Søterritoriet, bypass = Bypass og nyttiggørelse, kystbeskyttelse_staten = Kystbeskyttelse (staten)."
                    },
                    "emne_navn": {
                        "type": "string"
                    },
                    "aar": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "dato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "kommune": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "afgoerelsestype": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "afgoerelsestype_navn": {
                        "type": "string"
                    },
                    "udfald": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "udfald_navn": {
                        "type": "string"
                    },
                    "gennemgaaet": {
                        "type": "boolean",
                        "description": "Om sagen er laest, kategoriseret og anonymiseret"
                    },
                    "resume": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Anonymiseret resume: hvad der blev soegt, hvad direktoratet afgjorde og hvorfor"
                    },
                    "zone": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ejendomstype": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ansoeger": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "afstand_til_kyst_m": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "konfidens": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "hoej/middel/lav: sikkerheden i kategoriseringen"
                    },
                    "kilde": {
                        "type": "string"
                    },
                    "afstand_km": {
                        "type": "number",
                        "description": "Kun ved naer-soegning"
                    }
                }
            },
            "Sag": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "url": {
                        "type": "string"
                    },
                    "titel": {
                        "type": "string"
                    },
                    "emne": {
                        "type": "string"
                    },
                    "emne_navn": {
                        "type": "string"
                    },
                    "aar": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "dato": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "journalnummer": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Miljoestyrelsens journalnummer; bruges ved aktindsigt"
                    },
                    "kommune": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "kilde": {
                        "type": "object",
                        "description": "Hvor afgoerelsen blev offentliggjort (mst.dk eller det tidligere kyst.dk) med link"
                    },
                    "antal_dokumenter": {
                        "type": "integer"
                    },
                    "gennemgaaet": {
                        "type": "boolean"
                    },
                    "resume": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "label": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Kategoriseringen efter det faste skema",
                        "properties": {
                            "afgoerelsestype": {
                                "type": "string",
                                "enum": [
                                    "dispensation",
                                    "afslag",
                                    "tilladelse",
                                    "lovliggoerelse",
                                    "paabud",
                                    "hoering",
                                    "afvisning",
                                    "andet"
                                ],
                                "description": "Hvad direktoratet gjorde. dispensation = Dispensation, afslag = Afslag, tilladelse = Tilladelse, lovliggoerelse = Lovliggørelse, paabud = Påbud, hoering = Høring, afvisning = Afvisning, andet = Andet."
                            },
                            "udfald": {
                                "type": "string",
                                "enum": [
                                    "imoedekommet",
                                    "delvist",
                                    "afslag",
                                    "ikke_relevant"
                                ],
                                "description": "Udfald. imoedekommet = Imødekommet, delvist = Delvist imødekommet, afslag = Afslag, ikke_relevant = Ikke relevant."
                            },
                            "lovgrundlag": {
                                "type": "array",
                                "items": {
                                    "type": "string",
                                    "enum": [
                                        "strandbeskyttelse_nbl15",
                                        "klitfredning_nbl8",
                                        "soeterritoriet_kbl16a",
                                        "kystbeskyttelse_kbl3",
                                        "nbl65b",
                                        "nbl15a_undtagelse",
                                        "nbl69a_linjeflytning",
                                        "andet"
                                    ],
                                    "description": "Lovgrundlag. strandbeskyttelse_nbl15 = Naturbeskyttelseslovens § 15, klitfredning_nbl8 = Naturbeskyttelseslovens § 8, soeterritoriet_kbl16a = Kystbeskyttelseslovens § 16 a, kystbeskyttelse_kbl3 = Kystbeskyttelseslovens § 3, nbl65b = Naturbeskyttelseslovens § 65 b, nbl15a_undtagelse = Undtagelse efter § 15 a, nbl69a_linjeflytning = Naturbeskyttelseslovens § 69 a, andet = Andet."
                                }
                            },
                            "zone": {
                                "type": "string",
                                "enum": [
                                    "byzone",
                                    "landzone",
                                    "sommerhusomraade",
                                    "ukendt"
                                ],
                                "description": "Zone. byzone = Byzone, landzone = Landzone, sommerhusomraade = Sommerhusområde, ukendt = Ukendt."
                            },
                            "beliggenhed_zone": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "oprindelig_100m",
                                    "udvidet_300m",
                                    null
                                ],
                                "description": "Inden for de oprindelige 100 m eller den udvidede strandbeskyttelseszone (100-300 m)"
                            },
                            "afstand_til_kyst_m": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "ejendomstype": {
                                "type": "string",
                                "enum": [
                                    "helaarsbolig",
                                    "sommerhus",
                                    "landbrugsejendom",
                                    "erhverv",
                                    "offentlig",
                                    "forening",
                                    "ubebygget",
                                    "havn",
                                    "andet",
                                    "ukendt"
                                ],
                                "description": "Ejendomstype. helaarsbolig = Helårsbolig, sommerhus = Sommerhus, landbrugsejendom = Landbrugsejendom, erhverv = Erhverv, offentlig = Offentlig, forening = Forening, ubebygget = Ubebygget, havn = Havn, andet = Andet, ukendt = Ukendt."
                            },
                            "ansoeger": {
                                "type": "string",
                                "enum": [
                                    "privat",
                                    "virksomhed",
                                    "kommune",
                                    "forening",
                                    "stat",
                                    "fond",
                                    "forsyningsselskab",
                                    "ukendt"
                                ],
                                "description": "Ansoegertype. privat = Privat, virksomhed = Virksomhed, kommune = Kommune, forening = Forening, stat = Stat, fond = Fond, forsyningsselskab = Forsyningsselskab, ukendt = Ukendt."
                            },
                            "opfoerelsesaar": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "tal": {
                                "type": "object",
                                "description": "Tal fra teksten: areal_foer_m2, areal_efter_m2, hoejde_foer_m, hoejde_efter_m, glasareal_mod_kyst_foer_m2, glasareal_mod_kyst_efter_m2, vindue_stoerste_maal_m"
                            },
                            "projekt": {
                                "type": "array",
                                "items": {
                                    "type": "string",
                                    "enum": [
                                        "genopfoerelse",
                                        "tilbygning",
                                        "nybyggeri",
                                        "ombygning",
                                        "udnyttelse_tagetage",
                                        "kviste",
                                        "ovenlys",
                                        "vinduesaendring",
                                        "terrasse",
                                        "udhus_garage_carport",
                                        "hegn",
                                        "terraenregulering",
                                        "beplantning",
                                        "bro_badebro",
                                        "kystbeskyttelse",
                                        "midlertidigt_arrangement",
                                        "shelter_friluft",
                                        "sauna",
                                        "telt",
                                        "anvendelsesaendring",
                                        "ledning_kabel",
                                        "uddybning_bypass",
                                        "havneanlaeg",
                                        "arealoverfoersel_udstykning",
                                        "skovrejsning",
                                        "skilte",
                                        "teknisk_anlaeg",
                                        "naturpleje_vandhul",
                                        "linjeflytning",
                                        "andet"
                                    ],
                                    "description": "Projekttype. genopfoerelse = Genopførelse, tilbygning = Tilbygning, nybyggeri = Nybyggeri, ombygning = Ombygning, udnyttelse_tagetage = Udnyttelse af tagetage, kviste = Kviste, ovenlys = Ovenlys, vinduesaendring = Vinduesændring, terrasse = Terrasse, udhus_garage_carport = Udhus, garage eller carport, hegn = Hegn, terraenregulering = Terrænregulering, beplantning = Beplantning, bro_badebro = Bro eller badebro, kystbeskyttelse = Kystbeskyttelse, midlertidigt_arrangement = Midlertidigt arrangement, shelter_friluft = Shelter og friluftsliv, sauna = Sauna, telt = Telt, anvendelsesaendring = Anvendelsesændring, ledning_kabel = Ledning eller kabel, uddybning_bypass = Uddybning eller bypass, havneanlaeg = Havneanlæg, arealoverfoersel_udstykning = Arealoverførsel eller udstykning, skovrejsning = Skovrejsning, skilte = Skilte, teknisk_anlaeg = Teknisk anlæg, naturpleje_vandhul = Naturpleje eller vandhul, linjeflytning = Flytning af linjen, andet = Andet."
                                }
                            },
                            "flag": {
                                "type": "object",
                                "description": "Praksisflag som true/false/null (null = ikke omtalt): vinduer_mod_kyst_aendres, tagetage_udnyttes, uudnyttet_tagetage_bevares_eller_etableres, bygningshoejde_foroeges, fodaftryk_foroeges, saerligt_tilfaelde_anerkendt, mindre_end_lidt_praksis, harmoni_begrundelse, energi_begrundelse, tilgaengelighed_begrundelse, kommune_positiv, naboindsigelser, vilkaar_stillet, genoptaget_sag"
                            },
                            "synlighed": {
                                "type": "string",
                                "enum": [
                                    "skjult",
                                    "delvist_synlig",
                                    "synlig",
                                    "ukendt"
                                ],
                                "description": "Direktoratets vurdering af synlighed. skjult = Skjult i landskabet, delvist_synlig = Delvist synlig, synlig = Synlig, ukendt = Ikke vurderet."
                            },
                            "afgoerende_hensyn": {
                                "type": "array",
                                "items": {
                                    "type": "string",
                                    "enum": [
                                        "afstand_til_kyst",
                                        "afskaermning_af_bebyggelse_eller_beplantning",
                                        "erstatter_eksisterende",
                                        "uaendret_eller_lavere_hoejde",
                                        "begraenset_omfang",
                                        "erhvervsmaessig_noedvendighed",
                                        "landbrugsdrift",
                                        "offentlig_adgang_friluftsliv",
                                        "klimasikring_stormflod",
                                        "energi_isolering",
                                        "tilgaengelighed",
                                        "harmoni_helhed",
                                        "kommunens_anbefaling",
                                        "praksis_praecedens",
                                        "aabent_kystlandskab_paavirkes",
                                        "praecedensvirkning",
                                        "ikke_saerligt_tilfaelde",
                                        "natura2000_bilagIV",
                                        "lovligt_eksisterende_forhold",
                                        "ikke_fejl_ved_linjefastlaeggelse",
                                        "andet"
                                    ],
                                    "description": "Hensyn, direktoratet lagde vaegt paa. afstand_til_kyst = Afstand til kysten, afskaermning_af_bebyggelse_eller_beplantning = Afskærmet af bebyggelse eller beplantning, erstatter_eksisterende = Erstatter eksisterende, uaendret_eller_lavere_hoejde = Uændret eller lavere højde, begraenset_omfang = Begrænset omfang, erhvervsmaessig_noedvendighed = Erhvervsmæssig nødvendighed, landbrugsdrift = Landbrugsdrift, offentlig_adgang_friluftsliv = Offentlig adgang og friluftsliv, klimasikring_stormflod = Klimasikring og stormflod, energi_isolering = Energi og isolering, tilgaengelighed = Tilgængelighed, harmoni_helhed = Harmoni og helhed, kommunens_anbefaling = Kommunens anbefaling, praksis_praecedens = Fast praksis, aabent_kystlandskab_paavirkes = Det åbne kystlandskab påvirkes, praecedensvirkning = Præcedensvirkning, ikke_saerligt_tilfaelde = Ikke et særligt tilfælde, natura2000_bilagIV = Natura 2000 og bilag IV, lovligt_eksisterende_forhold = Lovligt eksisterende forhold, ikke_fejl_ved_linjefastlaeggelse = Ingen fejl ved linjens fastlæggelse, andet = Andet."
                                }
                            },
                            "vilkaar": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "resume_anonymt": {
                                "type": "string"
                            },
                            "noegleord": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "konfidens": {
                                "type": "string",
                                "enum": [
                                    "hoej",
                                    "middel",
                                    "lav"
                                ]
                            },
                            "journalnummer": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "dato": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "kommune": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "tekst_anonym": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Hele afgoerelsesteksten, anonymiseret. Linjer, der begynder med │, er raekker fra Ja/Nej-skemaer; ☒/☐ er afkrydsningsfelter."
                    },
                    "kort": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "lat": {
                                "type": "number"
                            },
                            "lon": {
                                "type": "number"
                            },
                            "praecision": {
                                "type": "string",
                                "enum": [
                                    "ejendom_forskudt",
                                    "postnummer",
                                    "kommune"
                                ]
                            },
                            "forklaring": {
                                "type": "string"
                            }
                        },
                        "description": "Forskudt visningspunkt, aldrig adressen"
                    },
                    "bemaerk": {
                        "type": "string"
                    }
                }
            }
        }
    }
}