{"openapi":"3.1.0","info":{"title":"Danadresse API — DAWA drop-in replacement","summary":"Drop-in REST replacement for dawa.aws.dk · Free tier 2000/month","description":"**Drop-in replacement for the Danish Address Web API (DAWA).** DAWA closes on 17 August 2026 — Danadresse takes over with the exact same endpoints, query parameters, JSON shapes and UUIDs.\n\n### Migration in 30 seconds\n1. Replace your base URL `https://dawa.aws.dk` → `https://api.danadresse.dk`.\n2. Add an `X-Api-Key: dawa_live_…` header to every request (get one free at <https://danadresse.dk/dashboard/signup>).\n3. Ship. Your DAR/DAGI IDs still resolve.\n\nEvery request needs a key; free tier is 2 000 calls/month. Paid tiers: Hobby/Basic/Pro/Enterprise — see <https://danadresse.dk/#pricing>.\n\n### Auth\nPublic DAWA endpoints (`/adresser`, `/autocomplete`, …) accept the key as either `X-Api-Key` header or `?api_key=` query — either is fine. Dashboard endpoints under `/api/v1/auth`, `/api/v1/keys`, `/api/v1/billing` require a JWT Bearer token from `POST /api/v1/auth/login`.\n\nBuilt by [LynBro ApS](https://lynbro.dk).","contact":{"name":"Danadresse Support","url":"https://danadresse.dk/dashboard","email":"support@danadresse.dk"},"license":{"name":"Data: CC BY 4.0 (Klimadatastyrelsen) · API: proprietary","url":"https://danadresse.dk/terms"},"version":"1.0.0"},"servers":[{"url":"https://api.danadresse.dk","description":"Production"},{"url":"https://danadresse.dk","description":"Same host (CORS-friendly)"}],"paths":{"/autocomplete":{"get":{"tags":["dawa:autocomplete"],"summary":"Typo-tolerant address autocomplete (DAWA-compatible)","description":"Returns up to 20 ranked address suggestions for an incremental query. Matches DAWA's response shape exactly so existing clients only need the base-URL swap.\n\n**Phases:**\n- street only → `type=vejnavn` suggestions (Bumyren typo → Bymuren)\n- street + husnr → `type=adresse` units in that building\n  (multi-apartment: all units; single villa: 1 row)\n- street + husnr + etage/dør → 1 exact `type=adresse` hit\n\nPunctuation tolerated: `Bymuren 68, 3. th` and `Bymuren 68 3 th` yield identical results.","operationId":"autocomplete_autocomplete_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Search query — street, street+husnr, or full address","examples":["Rådhuspladsen 1","Bymuren 68, 3. th","Vesterbrogade 4 1620","kobenhavn","raadhuspladsen"],"default":"","title":"Q"},"description":"Search query — street, street+husnr, or full address"},{"name":"struktur","in":"query","required":false,"schema":{"enum":["mini","full"],"type":"string","default":"mini","title":"Struktur"}},{"name":"srid","in":"query","required":false,"schema":{"type":"integer","default":4326,"title":"Srid"}},{"name":"fuzzy","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Typo tolerance. Falls back to ASCII↔Danish folding (oe↔ø, aa↔å, ae↔æ). Accepts the widget's empty-string form.","title":"Fuzzy"},"description":"Typo tolerance. Falls back to ASCII↔Danish folding (oe↔ø, aa↔å, ae↔æ). Accepts the widget's empty-string form."},{"name":"adgangsadresserOnly","in":"query","required":false,"schema":{"type":"boolean","description":"Skip the `type=adresse` (etage/dør) tier","default":false,"title":"Adgangsadresseronly"},"description":"Skip the `type=adresse` (etage/dør) tier"},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max number of suggestions (DAWA default 20)","default":20,"title":"Per Side"},"description":"Max number of suggestions (DAWA default 20)"},{"name":"params","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"JSON-encoded filter, e.g. {\"kommunekode\":\"0101\"}","examples":["{\"kommunekode\":\"0101\"}"],"title":"Params"},"description":"JSON-encoded filter, e.g. {\"kommunekode\":\"0101\"}"},{"name":"callback","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"JSONP callback function name","title":"Callback"},"description":"JSONP callback function name"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Target tier: 'adresse' (default, drills to units), 'adgangsadresse' (terminal), or 'vejnavn'.","title":"Type"},"description":"Target tier: 'adresse' (default, drills to units), 'adgangsadresse' (terminal), or 'vejnavn'."},{"name":"caretpos","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Widget cursor pos (accepted; drill is driven by query text).","title":"Caretpos"},"description":"Widget cursor pos (accepted; drill is driven by query text)."},{"name":"adgangsadresseid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Widget hint (accepted).","title":"Adgangsadresseid"},"description":"Widget hint (accepted)."},{"name":"startfra","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Widget hint (accepted).","title":"Startfra"},"description":"Widget hint (accepted)."},{"name":"supplerendebynavn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Widget flag (accepted).","title":"Supplerendebynavn"},"description":"Widget flag (accepted)."},{"name":"stormodtagerpostnumre","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Widget flag.","title":"Stormodtagerpostnumre"},"description":"Widget flag."},{"name":"multilinje","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Widget flag (accepted).","title":"Multilinje"},"description":"Widget flag (accepted)."}],"responses":{"200":{"description":"Ranked suggestions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Autocomplete Autocomplete Get"},"examples":{"street_with_typo":{"summary":"Typo correction","value":[{"type":"vejnavn","tekst":"Bymuren","forslagstekst":"Bymuren ","caretpos":8,"data":{"navn":"Bymuren","href":"/vejnavne/Bymuren"}}]},"full_apartment":{"summary":"Specific apartment in a multi-unit building","value":[{"type":"adresse","tekst":"Bymuren 68, 3. th, 2650 Hvidovre","forslagstekst":"Bymuren 68, 3. th, 2650 Hvidovre","caretpos":33,"data":{"id":"0a3f50a5-4bab-32b8-e044-0003ba298018","status":1,"vejnavn":"Bymuren","husnr":"68","etage":"3","dør":"th","postnr":"2650","postnrnavn":"Hvidovre","kommunekode":"0167","kommunenavn":"Hvidovre","x":12.449,"y":55.6307}}]}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/postnumre":{"get":{"tags":["dawa:postnumre"],"summary":"List Postnumre","operationId":"list_postnumre_postnumre_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"nr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nr"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Postnumre Postnumre Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/postnumre/autocomplete":{"get":{"tags":["dawa:postnumre"],"summary":"Autocomplete Postnumre","operationId":"autocomplete_postnumre_postnumre_autocomplete_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":20,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Autocomplete Postnumre Postnumre Autocomplete Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/postnumre/{nr}":{"get":{"tags":["dawa:postnumre"],"summary":"Get Postnummer","operationId":"get_postnummer_postnumre__nr__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"nr","in":"path","required":true,"schema":{"type":"string","title":"Nr"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Postnummer Postnumre  Nr  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kommuner":{"get":{"tags":["dawa:kommuner"],"summary":"List Kommuner","operationId":"list_kommuner_kommuner_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"kode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kode"}},{"name":"regionskode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Regionskode"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Kommuner Kommuner Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kommuner/autocomplete":{"get":{"tags":["dawa:kommuner"],"summary":"Autocomplete Kommuner","operationId":"autocomplete_kommuner_kommuner_autocomplete_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":20,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Autocomplete Kommuner Kommuner Autocomplete Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kommuner/{kode}":{"get":{"tags":["dawa:kommuner"],"summary":"Get Kommune","operationId":"get_kommune_kommuner__kode__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kode","in":"path","required":true,"schema":{"type":"string","title":"Kode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Kommune Kommuner  Kode  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vejnavne":{"get":{"tags":["dawa:vejnavne"],"summary":"List Vejnavne","operationId":"list_vejnavne_vejnavne_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Vejnavne Vejnavne Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vejnavne/autocomplete":{"get":{"tags":["dawa:vejnavne"],"summary":"Autocomplete Vejnavne","operationId":"autocomplete_vejnavne_vejnavne_autocomplete_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":20,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Autocomplete Vejnavne Vejnavne Autocomplete Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vejnavne/{id}":{"get":{"tags":["dawa:vejnavne"],"summary":"Get Vejnavn","operationId":"get_vejnavn_vejnavne__id__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Vejnavn Vejnavne  Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/navngivneveje":{"get":{"tags":["dawa:navngivneveje"],"summary":"List Navngivneveje","operationId":"list_navngivneveje_navngivneveje_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Navngivneveje Navngivneveje Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/navngivneveje/{id}":{"get":{"tags":["dawa:navngivneveje"],"summary":"Get Navngivenvej","operationId":"get_navngivenvej_navngivneveje__id__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Navngivenvej Navngivneveje  Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vejstykker":{"get":{"tags":["dawa:vejstykker"],"summary":"List Vejstykker","operationId":"list_vejstykker_vejstykker_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"kommunekode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kommunekode"}},{"name":"kode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"vejkode","title":"Kode"},"description":"vejkode"},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Vejstykker Vejstykker Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vejstykker/autocomplete":{"get":{"tags":["dawa:vejstykker"],"summary":"Autocomplete Vejstykker","operationId":"autocomplete_vejstykker_vejstykker_autocomplete_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"kommunekode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kommunekode"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":20,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Autocomplete Vejstykker Vejstykker Autocomplete Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vejstykker/{kommunekode}/{kode}":{"get":{"tags":["dawa:vejstykker"],"summary":"Get Vejstykke","operationId":"get_vejstykke_vejstykker__kommunekode___kode__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kommunekode","in":"path","required":true,"schema":{"type":"string","title":"Kommunekode"}},{"name":"kode","in":"path","required":true,"schema":{"type":"string","title":"Kode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Vejstykke Vejstykker  Kommunekode   Kode  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/retskredse":{"get":{"tags":["dawa:dagi"],"summary":"List Retskredse","operationId":"list_retskredse_retskredse_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"_model","in":"query","required":false,"schema":{"title":" Model"}},{"name":"_path","in":"query","required":false,"schema":{"default":"retskredse","title":" Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Retskredse Retskredse Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/retskredse/{kode}":{"get":{"tags":["dawa:dagi"],"summary":"Get Retskredse","operationId":"get_retskredse_retskredse__kode__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kode","in":"path","required":true,"schema":{"type":"string","title":"Kode"}},{"name":"_model","in":"query","required":false,"schema":{"title":" Model"}},{"name":"_path","in":"query","required":false,"schema":{"default":"retskredse","title":" Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Retskredse Retskredse  Kode  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/politikredse":{"get":{"tags":["dawa:dagi"],"summary":"List Politikredse","operationId":"list_politikredse_politikredse_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"_model","in":"query","required":false,"schema":{"title":" Model"}},{"name":"_path","in":"query","required":false,"schema":{"default":"politikredse","title":" Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Politikredse Politikredse Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/politikredse/{kode}":{"get":{"tags":["dawa:dagi"],"summary":"Get Politikredse","operationId":"get_politikredse_politikredse__kode__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kode","in":"path","required":true,"schema":{"type":"string","title":"Kode"}},{"name":"_model","in":"query","required":false,"schema":{"title":" Model"}},{"name":"_path","in":"query","required":false,"schema":{"default":"politikredse","title":" Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Politikredse Politikredse  Kode  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/opstillingskredse":{"get":{"tags":["dawa:dagi"],"summary":"List Opstillingskredse","operationId":"list_opstillingskredse_opstillingskredse_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"_model","in":"query","required":false,"schema":{"title":" Model"}},{"name":"_path","in":"query","required":false,"schema":{"default":"opstillingskredse","title":" Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Opstillingskredse Opstillingskredse Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/opstillingskredse/{kode}":{"get":{"tags":["dawa:dagi"],"summary":"Get Opstillingskredse","operationId":"get_opstillingskredse_opstillingskredse__kode__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kode","in":"path","required":true,"schema":{"type":"string","title":"Kode"}},{"name":"_model","in":"query","required":false,"schema":{"title":" Model"}},{"name":"_path","in":"query","required":false,"schema":{"default":"opstillingskredse","title":" Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Opstillingskredse Opstillingskredse  Kode  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/landsdele":{"get":{"tags":["dawa:dagi"],"summary":"List Landsdele","operationId":"list_landsdele_landsdele_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"_m","in":"query","required":false,"schema":{"title":" M"}},{"name":"_p","in":"query","required":false,"schema":{"default":"landsdele","title":" P"}},{"name":"_k","in":"query","required":false,"schema":{"default":"nuts3","title":" K"}},{"name":"_ok","in":"query","required":false,"schema":{"default":"nuts3","title":" Ok"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/landsdele/{key}":{"get":{"tags":["dawa:dagi"],"summary":"Get Landsdele","operationId":"get_landsdele_landsdele__key__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"_m","in":"query","required":false,"schema":{"title":" M"}},{"name":"_p","in":"query","required":false,"schema":{"default":"landsdele","title":" P"}},{"name":"_k","in":"query","required":false,"schema":{"default":"nuts3","title":" K"}},{"name":"_ok","in":"query","required":false,"schema":{"default":"nuts3","title":" Ok"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/storkredse":{"get":{"tags":["dawa:dagi"],"summary":"List Storkredse","operationId":"list_storkredse_storkredse_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"_m","in":"query","required":false,"schema":{"title":" M"}},{"name":"_p","in":"query","required":false,"schema":{"default":"storkredse","title":" P"}},{"name":"_k","in":"query","required":false,"schema":{"default":"nummer","title":" K"}},{"name":"_ok","in":"query","required":false,"schema":{"default":"nummer","title":" Ok"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/storkredse/{key}":{"get":{"tags":["dawa:dagi"],"summary":"Get Storkredse","operationId":"get_storkredse_storkredse__key__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"_m","in":"query","required":false,"schema":{"title":" M"}},{"name":"_p","in":"query","required":false,"schema":{"default":"storkredse","title":" P"}},{"name":"_k","in":"query","required":false,"schema":{"default":"nummer","title":" K"}},{"name":"_ok","in":"query","required":false,"schema":{"default":"nummer","title":" Ok"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valglandsdele":{"get":{"tags":["dawa:dagi"],"summary":"List Valglandsdele","operationId":"list_valglandsdele_valglandsdele_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"_m","in":"query","required":false,"schema":{"title":" M"}},{"name":"_p","in":"query","required":false,"schema":{"default":"valglandsdele","title":" P"}},{"name":"_k","in":"query","required":false,"schema":{"default":"bogstav","title":" K"}},{"name":"_ok","in":"query","required":false,"schema":{"default":"bogstav","title":" Ok"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valglandsdele/{key}":{"get":{"tags":["dawa:dagi"],"summary":"Get Valglandsdele","operationId":"get_valglandsdele_valglandsdele__key__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"_m","in":"query","required":false,"schema":{"title":" M"}},{"name":"_p","in":"query","required":false,"schema":{"default":"valglandsdele","title":" P"}},{"name":"_k","in":"query","required":false,"schema":{"default":"bogstav","title":" K"}},{"name":"_ok","in":"query","required":false,"schema":{"default":"bogstav","title":" Ok"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/afstemningsomraader":{"get":{"tags":["dawa:dagi"],"summary":"List Afstemningsomraader","operationId":"list_afstemningsomraader_afstemningsomraader_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"kommunekode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kommunekode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Afstemningsomraader Afstemningsomraader Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/afstemningsomraader/{kommunekode}/{nummer}":{"get":{"tags":["dawa:dagi"],"summary":"Get Afstemningsomraade","operationId":"get_afstemningsomraade_afstemningsomraader__kommunekode___nummer__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kommunekode","in":"path","required":true,"schema":{"type":"string","title":"Kommunekode"}},{"name":"nummer","in":"path","required":true,"schema":{"type":"string","title":"Nummer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Afstemningsomraade Afstemningsomraader  Kommunekode   Nummer  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/supplerendebynavne2":{"get":{"tags":["dawa:dagi"],"summary":"List Supplerendebynavne2","operationId":"list_supplerendebynavne2_supplerendebynavne2_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Supplerendebynavne2 Supplerendebynavne2 Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/supplerendebynavne":{"get":{"tags":["dawa:dagi"],"summary":"List Supplerendebynavne","description":"Deprecated v1 path — same data, native (was proxied).","operationId":"list_supplerendebynavne_supplerendebynavne_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Supplerendebynavne Supplerendebynavne Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/regioner":{"get":{"tags":["dawa:dagi"],"summary":"List Regioner","operationId":"list_regioner_regioner_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Regioner Regioner Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/regioner/{kode}":{"get":{"tags":["dawa:dagi"],"summary":"Get Region","operationId":"get_region_regioner__kode__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kode","in":"path","required":true,"schema":{"type":"string","title":"Kode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Region Regioner  Kode  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sogne":{"get":{"tags":["dawa:dagi"],"summary":"List Sogne","operationId":"list_sogne_sogne_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Sogne Sogne Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sogne/{kode}":{"get":{"tags":["dawa:dagi"],"summary":"Get Sogn","operationId":"get_sogn_sogne__kode__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kode","in":"path","required":true,"schema":{"type":"string","title":"Kode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Sogn Sogne  Kode  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ejerlav/autocomplete":{"get":{"tags":["dawa:matrikel"],"summary":"Autocomplete Ejerlav","operationId":"autocomplete_ejerlav_ejerlav_autocomplete_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":20,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Autocomplete Ejerlav Ejerlav Autocomplete Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ejerlav":{"get":{"tags":["dawa:matrikel"],"summary":"List Ejerlav","operationId":"list_ejerlav_ejerlav_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"navn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navn"}},{"name":"kode","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kode"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Ejerlav Ejerlav Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ejerlav/{kode}":{"get":{"tags":["dawa:matrikel"],"summary":"Get Ejerlav","operationId":"get_ejerlav_ejerlav__kode__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kode","in":"path","required":true,"schema":{"type":"integer","title":"Kode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ejerlav Ejerlav  Kode  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jordstykker":{"get":{"tags":["dawa:matrikel"],"summary":"List Jordstykker","operationId":"list_jordstykker_jordstykker_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"ejerlavkode","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ejerlavkode"}},{"name":"matrikelnr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matrikelnr"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Jordstykker Jordstykker Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jordstykker/{ejerlavkode}/{matrikelnr}":{"get":{"tags":["dawa:matrikel"],"summary":"Get Jordstykke","operationId":"get_jordstykke_jordstykker__ejerlavkode___matrikelnr__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"ejerlavkode","in":"path","required":true,"schema":{"type":"integer","title":"Ejerlavkode"}},{"name":"matrikelnr","in":"path","required":true,"schema":{"type":"string","title":"Matrikelnr"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Jordstykke Jordstykker  Ejerlavkode   Matrikelnr  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/steder":{"get":{"tags":["dawa:stednavne"],"summary":"List Steder","operationId":"list_steder_steder_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"hovedtype","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hovedtype"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Steder Steder Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/steder/{id}":{"get":{"tags":["dawa:stednavne"],"summary":"Get Sted","operationId":"get_sted_steder__id__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Sted Steder  Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stednavne":{"get":{"tags":["dawa:stednavne"],"summary":"List Stednavne","operationId":"list_stednavne_stednavne_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Stednavne Stednavne Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/menighedsraadsafstemningsomraader":{"get":{"tags":["dawa:stednavne"],"summary":"List Menighedsraad","operationId":"list_menighedsraad_menighedsraadsafstemningsomraader_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kommunekode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kommunekode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Menighedsraad Menighedsraadsafstemningsomraader Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/menighedsraadsafstemningsomraader/{kommunekode}/{nummer}":{"get":{"tags":["dawa:stednavne"],"summary":"Get Menighedsraad","operationId":"get_menighedsraad_menighedsraadsafstemningsomraader__kommunekode___nummer__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"kommunekode","in":"path","required":true,"schema":{"type":"string","title":"Kommunekode"}},{"name":"nummer","in":"path","required":true,"schema":{"type":"string","title":"Nummer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Menighedsraad Menighedsraadsafstemningsomraader  Kommunekode   Nummer  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/matrikelnumre":{"get":{"tags":["dawa:stednavne"],"summary":"List Matrikelnumre","description":"Derived from the native jordstykke table (distinct ejerlavkode+matrikelnr).","operationId":"list_matrikelnumre_matrikelnumre_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"ejerlavkode","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ejerlavkode"}},{"name":"matrikelnr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matrikelnr"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Matrikelnumre Matrikelnumre Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/adgangsadresser":{"get":{"tags":["dawa:adgangsadresser"],"summary":"List Adgangsadresser","operationId":"list_adgangsadresser_adgangsadresser_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"vejnavn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vejnavn"}},{"name":"husnr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Husnr"}},{"name":"postnr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Flerværdi: 1550|1551","title":"Postnr"},"description":"Flerværdi: 1550|1551"},{"name":"kommunekode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Flerværdi: 0101|0147","title":"Kommunekode"},"description":"Flerværdi: 0101|0147"},{"name":"vejkode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vejkode"}},{"name":"sognekode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sognekode"}},{"name":"regionskode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Regionskode"}},{"name":"retskredskode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retskredskode"}},{"name":"politikredskode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Politikredskode"}},{"name":"opstillingskredskode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opstillingskredskode"}},{"name":"nøjagtighed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nøjagtighed"}},{"name":"medtagnedlagte","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Medtagnedlagte"}},{"name":"kvh","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"12-tegns KVH-nøgle (DAWA)","title":"Kvh"},"description":"12-tegns KVH-nøgle (DAWA)"},{"name":"cirkel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Adresser inden for en cirkel: 'lng,lat,radius_m' (DAWA-kompatibel)","title":"Cirkel"},"description":"Adresser inden for en cirkel: 'lng,lat,radius_m' (DAWA-kompatibel)"},{"name":"polygon","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Adresser inden for et polygon: GeoJSON [[[lon,lat],…]]","title":"Polygon"},"description":"Adresser inden for et polygon: GeoJSON [[[lon,lat],…]]"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status"}},{"name":"format","in":"query","required":false,"schema":{"enum":["json","geojson","ndjson"],"type":"string","default":"json","title":"Format"}},{"name":"struktur","in":"query","required":false,"schema":{"enum":["mini","nestet","flad"],"type":"string","default":"nestet","title":"Struktur"}},{"name":"srid","in":"query","required":false,"schema":{"type":"integer","default":4326,"title":"Srid"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/adgangsadresser/reverse":{"get":{"tags":["dawa:adgangsadresser"],"summary":"Reverse Geocode","description":"Знаходить найближчу adgangsadresse до точки (x, y).","operationId":"reverse_geocode_adgangsadresser_reverse_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"x","in":"query","required":true,"schema":{"type":"number","description":"Longitude (4326) або East (25832)","title":"X"},"description":"Longitude (4326) або East (25832)"},{"name":"y","in":"query","required":true,"schema":{"type":"number","description":"Latitude (4326) або North (25832)","title":"Y"},"description":"Latitude (4326) або North (25832)"},{"name":"srid","in":"query","required":false,"schema":{"type":"integer","default":4326,"title":"Srid"}},{"name":"struktur","in":"query","required":false,"schema":{"enum":["mini","full"],"type":"string","default":"full","title":"Struktur"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reverse Geocode Adgangsadresser Reverse Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/adgangsadresser/autocomplete":{"get":{"tags":["dawa:adgangsadresser"],"summary":"Autocomplete Adgangsadresser","description":"DAWA per-resource autocomplete → [{tekst, adgangsadresse:{…}}].","operationId":"autocomplete_adgangsadresser_adgangsadresser_autocomplete_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":20,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Autocomplete Adgangsadresser Adgangsadresser Autocomplete Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/adgangsadresser/{id}":{"get":{"tags":["dawa:adgangsadresser"],"summary":"Get Adgangsadresse","operationId":"get_adgangsadresse_adgangsadresser__id__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}},{"name":"srid","in":"query","required":false,"schema":{"type":"integer","default":4326,"title":"Srid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Adgangsadresse Adgangsadresser  Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/adresser":{"get":{"tags":["dawa:adresser"],"summary":"Søg adresser (DAWA-kompatibel)","description":"Søger danske adresser. 1:1 DAWA-kompatibel.\n\nReturnerer JSON (struktur=nestet) som standard. `?format=csv|geojson|ndjson`,\n`?struktur=flad|mini` understøttes.","operationId":"list_adresser_adresser_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fritekstsøgning på vejnavn","title":"Q"},"description":"Fritekstsøgning på vejnavn"},{"name":"vejnavn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vejnavn"}},{"name":"husnr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Husnr"}},{"name":"etage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Etage"}},{"name":"dør","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dør"}},{"name":"postnr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postnr"}},{"name":"kommunekode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kommunekode"}},{"name":"kvhx","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"19-tegns KVHX-nøgle (DAWA)","title":"Kvhx"},"description":"19-tegns KVHX-nøgle (DAWA)"},{"name":"cirkel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Adresser inden for en cirkel: 'lng,lat,radius_m' (DAWA-kompatibel)","title":"Cirkel"},"description":"Adresser inden for en cirkel: 'lng,lat,radius_m' (DAWA-kompatibel)"},{"name":"polygon","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Adresser inden for et polygon: GeoJSON [[[lon,lat],…]]","title":"Polygon"},"description":"Adresser inden for et polygon: GeoJSON [[[lon,lat],…]]"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"1=aktiv (default), 2=nedlagt","title":"Status"},"description":"1=aktiv (default), 2=nedlagt"},{"name":"srid","in":"query","required":false,"schema":{"type":"integer","description":"4326=WGS84, 25832=ETRS89/UTM32","default":4326,"title":"Srid"},"description":"4326=WGS84, 25832=ETRS89/UTM32"},{"name":"format","in":"query","required":false,"schema":{"enum":["json","csv","geojson","ndjson"],"type":"string","description":"Response format","default":"json","title":"Format"},"description":"Response format"},{"name":"struktur","in":"query","required":false,"schema":{"enum":["mini","nestet","flad"],"type":"string","default":"nestet","title":"Struktur"}},{"name":"side","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Side"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/adresser/reverse":{"get":{"tags":["dawa:adresser"],"summary":"Reverse geocode → adresse","description":"Find nærmeste fulde adresse til en koordinat. DAWA-kompatibel.","operationId":"adresser_reverse_adresser_reverse_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"x","in":"query","required":true,"schema":{"type":"number","description":"Longitude (4326) / East (25832)","title":"X"},"description":"Longitude (4326) / East (25832)"},{"name":"y","in":"query","required":true,"schema":{"type":"number","description":"Latitude (4326) / North (25832)","title":"Y"},"description":"Latitude (4326) / North (25832)"},{"name":"srid","in":"query","required":false,"schema":{"type":"integer","default":4326,"title":"Srid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Adresser Reverse Adresser Reverse Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/adresser/autocomplete":{"get":{"tags":["dawa:adresser"],"summary":"Autocomplete Adresser","description":"DAWA per-resource autocomplete → [{tekst, adresse:{…}}].","operationId":"autocomplete_adresser_adresser_autocomplete_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"per_side","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":20,"title":"Per Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Autocomplete Adresser Adresser Autocomplete Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/adresser/{id}":{"get":{"tags":["dawa:adresser"],"summary":"Hent én adresse","operationId":"get_adresse_adresser__id__get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}},{"name":"srid","in":"query","required":false,"schema":{"type":"integer","default":4326,"title":"Srid"}},{"name":"format","in":"query","required":false,"schema":{"enum":["json","csv"],"type":"string","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/datavask/adgangsadresser":{"post":{"tags":["dawa:datavask"],"summary":"Datavask Adgangsadresser","description":"Очищення/валідація adgangsadresse. Повертає top матч + кутегорію.","operationId":"datavask_adgangsadresser_datavask_adgangsadresser_post","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"struktur","in":"query","required":false,"schema":{"enum":["mini","full"],"type":"string","default":"mini","title":"Struktur"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaskInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Datavask Adgangsadresser Datavask Adgangsadresser Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["dawa:datavask"],"summary":"Datavask af adgangsadresse (DAWA-kompatibel GET)","description":"GET-version af datavask. Tager parametre direkte i query og kalder POST-handleren.\n\nHvis `betegnelse` er udfyldt parser vi den til vejnavn/husnr/postnr (best-effort).","operationId":"datavask_adgangsadresser_get_datavask_adgangsadresser_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"vejnavn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vejnavn"}},{"name":"husnr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Husnr"}},{"name":"postnr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postnr"}},{"name":"supplerendebynavn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supplerendebynavn"}},{"name":"betegnelse","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hel adresse-streng, parses","title":"Betegnelse"},"description":"Hel adresse-streng, parses"},{"name":"struktur","in":"query","required":false,"schema":{"enum":["mini","full"],"type":"string","default":"mini","title":"Struktur"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Datavask Adgangsadresser Get Datavask Adgangsadresser Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/datavask/adresser":{"post":{"tags":["dawa:datavask"],"summary":"Datavask Adresser","description":"Datavask на повну адресу (з etage/dør).","operationId":"datavask_adresser_datavask_adresser_post","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"struktur","in":"query","required":false,"schema":{"enum":["mini","full"],"type":"string","default":"mini","title":"Struktur"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaskInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Datavask Adresser Datavask Adresser Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["dawa:datavask"],"summary":"Datavask af adresse (DAWA-kompatibel GET)","description":"GET-version af datavask for fulde adresser.","operationId":"datavask_adresser_get_datavask_adresser_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"vejnavn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vejnavn"}},{"name":"husnr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Husnr"}},{"name":"etage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Etage"}},{"name":"dør","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dør"}},{"name":"postnr","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postnr"}},{"name":"supplerendebynavn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supplerendebynavn"}},{"name":"betegnelse","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Betegnelse"}},{"name":"struktur","in":"query","required":false,"schema":{"enum":["mini","full"],"type":"string","default":"mini","title":"Struktur"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Datavask Adresser Get Datavask Adresser Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/replikering/senesteSekvensnummer":{"get":{"tags":["dawa:replikering"],"summary":"Latest replication sequence number","description":"Highest sekvensnummer we've ingested across all entities.\n\nNative + instant — this is the endpoint replication clients poll\nconstantly to decide whether to fetch new events.","operationId":"seneste_sekvensnummer_replikering_senesteSekvensnummer_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Seneste Sekvensnummer Replikering Senestesekvensnummer Get"}}}}}}},"/replikering/datamodel":{"get":{"tags":["dawa:replikering"],"summary":"Machine-readable data model of replicable entities","description":"DAWA-style datamodel: each entity → {key, attributes:[{name,type,nullable}]}.","operationId":"datamodel_replikering_datamodel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Datamodel Replikering Datamodel Get"}}}}}}},"/replikering/senestetransaktion":{"get":{"tags":["dawa:replikering"],"summary":"Latest transaction (modern replication)","operationId":"senestetransaktion_replikering_senestetransaktion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Senestetransaktion Replikering Senestetransaktion Get"}}}}}}},"/replikering/transaktioner":{"get":{"tags":["dawa:replikering"],"summary":"Transaction metadata (modern replication)","operationId":"transaktioner_replikering_transaktioner_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Transaktioner Replikering Transaktioner Get"}}}}}}},"/replikering/udtraek":{"get":{"tags":["dawa:replikering"],"summary":"Full extract of an entity (NDJSON stream)","description":"Native, streamed full extract of an entity as NDJSON. DAWA's modern\nflat form: /replikering/udtraek?entitet=postnummer.","operationId":"udtraek_native_replikering_udtraek_get","parameters":[{"name":"entitet","in":"query","required":true,"schema":{"type":"string","title":"Entitet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/replikering/{entitet}/haendelser":{"get":{"tags":["dawa:replikering"],"summary":"Change events for an entity since a seqno","description":"Event stream for an entity. Requires an API key (Enterprise feature).\n\nServed from our native event log when `replikering_serve_native` is on\n(the post-cutover mode); otherwise proxied 1:1 to DAWA. Same JSON shape\neither way, so clients never change.","operationId":"haendelser_replikering__entitet__haendelser_get","parameters":[{"name":"entitet","in":"path","required":true,"schema":{"type":"string","title":"Entitet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/replikering/{entitet}":{"get":{"tags":["dawa:replikering"],"summary":"Full snapshot (udtraek) of an entity","description":"Full data snapshot for an entity. Requires an API key.\n\nProxied to DAWA upstream; identical contract.","operationId":"udtraek_replikering__entitet__get","parameters":[{"name":"entitet","in":"path","required":true,"schema":{"type":"string","title":"Entitet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"tags":["health"],"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/readyz":{"get":{"tags":["health"],"summary":"Readyz","operationId":"readyz_readyz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/version":{"get":{"tags":["health"],"summary":"Version","description":"Public build/config probe. Only non-sensitive values (tier limits + prices\nare already public on the pricing page); never secrets.","operationId":"version_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/healthz":{"get":{"tags":["health"],"summary":"Healthz","operationId":"healthz_api_v1_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/readyz":{"get":{"tags":["health"],"summary":"Readyz","operationId":"readyz_api_v1_readyz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/version":{"get":{"tags":["health"],"summary":"Version","description":"Public build/config probe. Only non-sensitive values (tier limits + prices\nare already public on the pricing page); never secrets.","operationId":"version_api_v1_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/signup":{"post":{"tags":["auth"],"summary":"Signup","operationId":"signup_api_v1_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Me Api V1 Auth Me Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"JWT stateless — клієнт сам видаляє token. Для blacklist можна додати Redis.","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Logout Api V1 Auth Logout Post"}}}}}}},"/api/v1/auth/magic":{"post":{"tags":["auth"],"summary":"Request Magic","description":"Запит magic-link на email. Якщо юзера нема — створюємо.","operationId":"request_magic_api_v1_auth_magic_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Request Magic Api V1 Auth Magic Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/otp/signup":{"post":{"tags":["auth"],"summary":"Otp Signup","description":"Stage 1 of signup: stash credentials, email a 6-digit code.\n\nNo user row is created until the code is verified — this prevents the table\nfrom filling with abandoned half-signups and lets people retry with the\nsame email.","operationId":"otp_signup_api_v1_auth_otp_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpSignupBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Otp Signup Api V1 Auth Otp Signup Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/otp/verify":{"post":{"tags":["auth"],"summary":"Otp Verify","description":"Stage 2 of signup: consume code, create user, return JWT.","operationId":"otp_verify_api_v1_auth_otp_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpVerifyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/otp/forgot":{"post":{"tags":["auth"],"summary":"Otp Forgot","description":"Request a password-reset code. Always returns 200 — we don't leak\nwhether an email exists in our system (prevents user enumeration).","operationId":"otp_forgot_api_v1_auth_otp_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpForgotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Otp Forgot Api V1 Auth Otp Forgot Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/otp/reset":{"post":{"tags":["auth"],"summary":"Otp Reset","description":"Verify reset code, set new password, return JWT (auto-login).","operationId":"otp_reset_api_v1_auth_otp_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpResetBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/otp/resend":{"post":{"tags":["auth"],"summary":"Otp Resend","description":"Re-issue a code. Rate-limit: max 1 resend per 60 sec per email+purpose.","operationId":"otp_resend_api_v1_auth_otp_resend_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpResendBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Otp Resend Api V1 Auth Otp Resend Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/magic/{token}":{"get":{"tags":["auth"],"summary":"Confirm Magic","operationId":"confirm_magic_api_v1_auth_magic__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/keys":{"get":{"tags":["keys"],"summary":"List Keys","operationId":"list_keys_api_v1_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Keys Api V1 Keys Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["keys"],"summary":"Create Key","description":"Створити ключ. Plaintext key повертається ТІЛЬКИ ЗАРАЗ і ніколи знов.","operationId":"create_key_api_v1_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Key Api V1 Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/keys/{key_id}":{"delete":{"tags":["keys"],"summary":"Revoke Key","operationId":"revoke_key_api_v1_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Key Api V1 Keys  Key Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/checkout":{"post":{"tags":["billing"],"summary":"Create Checkout","description":"Створити Stripe Checkout Session. Якщо у юзера ще немає customer_id — створюємо.","operationId":"create_checkout_api_v1_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Checkout Api V1 Billing Checkout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/billing/portal":{"post":{"tags":["billing"],"summary":"Create Portal","description":"Stripe Customer Portal — користувач керує підпискою, методами оплати, інвойсами.","operationId":"create_portal_api_v1_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Portal Api V1 Billing Portal Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/billing/preview-proration":{"post":{"tags":["billing"],"summary":"Preview Proration","description":"What the customer would be charged now for switching to {plan, interval}.","operationId":"preview_proration_api_v1_billing_preview_proration_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePlanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Preview Proration Api V1 Billing Preview Proration Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/billing/change-plan":{"post":{"tags":["billing"],"summary":"Change Plan","description":"Switch an existing subscription's plan. Upgrade → prorate + invoice now;\ndowngrade → no proration/refund (matches the cancel policy).","operationId":"change_plan_api_v1_billing_change_plan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePlanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Change Plan Api V1 Billing Change Plan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/billing/status":{"get":{"tags":["billing"],"summary":"Billing Status","operationId":"billing_status_api_v1_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Billing Status Api V1 Billing Status Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/billing/webhook/stripe":{"post":{"tags":["billing"],"summary":"Stripe Webhook","description":"Stripe webhook. Підтримує ОБИДВА формати payload:\n\n1. **Snapshot** (`Payload style: Snapshot`, API v2026-03-25.dahlia):\n   Повний event object з усіма даними. `event.type` = \"customer.subscription.created\" etc.\n\n2. **Thin payload** (`Payload style: Thin`, Unversioned):\n   Тільки `event.type` + `event.related_object.id`. Треба fetch повного об'єкта через API.\n\nОбидва — одна функція. Розрізняємо по `payload_style` у тілі.","operationId":"stripe_webhook_api_v1_billing_webhook_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stripe Webhook Api V1 Billing Webhook Stripe Post"}}}}}}},"/api/v1/enrich/adresser/{id}/dagi":{"get":{"tags":["enrich"],"summary":"Dagi Tags","description":"Все 8 адміністративних рівнів за one call.\n\nEquivalent to Smarty's FIPS/congressional district feature but free.","operationId":"dagi_tags_api_v1_enrich_adresser__id__dagi_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","description":"Adgangsadresse UUID","title":"Id"},"description":"Adgangsadresse UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dagi Tags Api V1 Enrich Adresser  Id  Dagi Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/adresser/{id}/bbr":{"get":{"tags":["enrich"],"summary":"Bbr Data","description":"BBR building data — construction year, area, floors, usage, materials.\n\nServes real data from the `bygning` table once the BBR ETL has run\n(etl.bbr_etl). Until then returns the shape with _status=needs_bbr_etl.","operationId":"bbr_data_api_v1_enrich_adresser__id__bbr_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bbr Data Api V1 Enrich Adresser  Id  Bbr Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/adresser/{id}/enhed":{"get":{"tags":["enrich"],"summary":"Enhed Data","description":"🏠 BBR unit/dwelling detail — rooms, kitchen/bath/toilet, area, heating,\nhousing & rental type per dwelling (BBR_Enhed). The most-requested BBR layer\nfor home-valuation, rental and due-diligence.\n\nAccepts an **adgangsadresse** id (→ all units at that entrance) OR a unit\n**adresse** id (→ that single dwelling). Floor/door labels come from DAR.\nServes the `enhed` table; returns _status=needs_bbr_enhed_etl until\netl.bbr_enhed_etl has run.","operationId":"enhed_data_api_v1_enrich_adresser__id__enhed_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Enhed Data Api V1 Enrich Adresser  Id  Enhed Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/adresser/{id}/ejendom":{"get":{"tags":["enrich"],"summary":"Ejendom Data","description":"🏠 Ejendomsdata-hub — EVERYTHING about the property at this address in one\ncall: BFE (EBR), cadastre/SamletFastEjendom (Matriklen), official valuation\n(Ejendomsvurdering), and the BBR buildings. Joins four Datafordeler registers\nlive (cached 24h). Accepts an adgangsadresse OR adresse id.","operationId":"ejendom_data_api_v1_enrich_adresser__id__ejendom_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ejendom Data Api V1 Enrich Adresser  Id  Ejendom Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/adresser/{id}/virksomheder":{"get":{"tags":["enrich"],"summary":"Companies At Address","description":"Companies at this address → soge.dk (the CVR/vehicle product), which has\nthe full company + accounts + history + vehicle data.\n\nWe do NOT serve a native CVR-at-address list here: CVR on Datafordeler keys\non DAR-1.0 UUIDs while our address ids are the legacy DAWA UUIDs, and CVR's\nGraphQL filter can't take kommune/vej/postnr — so we funnel to soge, which\nalready does this. (The verified CVR client lives in app/integrations/cvr.py\nfor when a DAR-1.0 id crosswalk is added.)","operationId":"companies_at_address_api_v1_enrich_adresser__id__virksomheder_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Companies At Address Api V1 Enrich Adresser  Id  Virksomheder Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/adresser/{id}/climate":{"get":{"tags":["enrich"],"summary":"Climate Risk","description":"Coastal-flood / storm-surge risk — real data, no stub.\n\nCombines two open sources, both live:\n  • DHM terrain elevation (Datafordeler DHM WCS, our single API key) — how\n    high the ground sits, in m DVR90 ≈ m above present mean sea level.\n  • DMI Klimaatlas (open ArcGIS FeatureServer, no key) — projected sea-level\n    rise + N-year storm-surge height for the nearest coastal stretch.\nThe honest indicator is the *margin*: terrain elevation minus the projected\n100-year storm-surge height. Negative margin ⇒ exposed. Inland addresses far\nfrom any coast return level=\"minimal\". A unique DK value-add no global\naddress API offers.","operationId":"climate_risk_api_v1_enrich_adresser__id__climate_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Climate Risk Api V1 Enrich Adresser  Id  Climate Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/adresser/{id}/property":{"get":{"tags":["enrich"],"summary":"Property Valuation","description":"Tax-assessed property valuation (Vurderingsstyrelsen / Ejendomsvurdering).\n\nReal data — joins EBR→BFE→VUR live via Datafordeler (cached 24h), the same\nsource /ejendom uses. Returns the latest valuation across the address's\nproperties.","operationId":"property_valuation_api_v1_enrich_adresser__id__property_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Property Valuation Api V1 Enrich Adresser  Id  Property Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/adresser/{id}/installations":{"get":{"tags":["enrich"],"summary":"Technical Installations","description":"BBR technical installations at the address: solar (solceller/solvarme), oil\nfurnaces, oil tanks, wind turbines, etc. — live from Datafordeler BBR_TekniskAnlaeg\n(cached 24h). NB the building's primary HEATING (incl. heat pumps / district\nheating) is a BBR_Bygning code — see /api/v1/enrich/adresser/{id}/bbr.","operationId":"technical_installations_api_v1_enrich_adresser__id__installations_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Technical Installations Api V1 Enrich Adresser  Id  Installations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/adresser/{id}/all":{"get":{"tags":["enrich"],"summary":"All Enrichment","description":"Composite call — DAGI + BBR + units + Companies + Climate + Valuation +\nEjendom (zoning/energy-label/cadastre) + Installations in one. The complete\n\"everything we hold about this address\" bundle (ideal for a property/agency view).\n\nThe enrichments are independent, so they run concurrently. An AsyncSession\nis NOT safe for concurrent use, so each gathered task gets its own session\n(the injected `db` is only used to bound the request lifecycle).","operationId":"all_enrichment_api_v1_enrich_adresser__id__all_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response All Enrichment Api V1 Enrich Adresser  Id  All Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/distance":{"get":{"tags":["enrich"],"summary":"Distance Between Addresses","description":"Straight-line distance + bearing between two DAWA addresses.\n\nUseful for delivery zone checks, last-mile costing, postnummer-radius queries\nwithout spinning up a routing engine.","operationId":"distance_between_addresses_api_v1_enrich_distance_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string","description":"Source adgangsadresse UUID","default":"","title":"From"},"description":"Source adgangsadresse UUID"},{"name":"to","in":"query","required":false,"schema":{"type":"string","description":"Destination adgangsadresse UUID","default":"","title":"To"},"description":"Destination adgangsadresse UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Distance Between Addresses Api V1 Enrich Distance Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/quality/score":{"post":{"tags":["enrich"],"summary":"Quality Score","description":"Score the completeness + plausibility of an address record.\n\nUseful for data-cleansing pipelines that need a numeric confidence\nbefore triggering a more expensive datavask call. 0 = unusable, 100 = perfect.","operationId":"quality_score_api_v1_enrich_quality_score_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Quality Score Api V1 Enrich Quality Score Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}]}},"/api/v1/enrich/validate/iban":{"post":{"tags":["enrich"],"summary":"Validate Iban","description":"IBAN mod-97 validation + DK bank code lookup.","operationId":"validate_iban_api_v1_enrich_validate_iban_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IBANInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Validate Iban Api V1 Enrich Validate Iban Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/validate/cvr":{"post":{"tags":["enrich"],"summary":"Validate Cvr","description":"Danish CVR 8-digit validation.","operationId":"validate_cvr_api_v1_enrich_validate_cvr_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CVRInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Validate Cvr Api V1 Enrich Validate Cvr Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/validate/phone":{"post":{"tags":["enrich"],"summary":"Validate Phone","description":"Danish phone normalization (+45) + line type hint.","operationId":"validate_phone_api_v1_enrich_validate_phone_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Validate Phone Api V1 Enrich Validate Phone Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enrich/validate/ean":{"post":{"tags":["enrich"],"summary":"Validate Ean","description":"EAN/GLN 13-digit mod-10 (Luhn-variant) check.","operationId":"validate_ean_api_v1_enrich_validate_ean_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EANInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Validate Ean Api V1 Enrich Validate Ean Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/datavask/parse":{"get":{"tags":["enrich:datavask"],"summary":"Parse a free-text address + resolve to canonical (no AI)","description":"Rule-based parse → structured components, then fuzzy-match to a real\naddress. `kanonisk` is the best canonical hit (or null); `resultater` mirrors\nthe DAWA datavask shape (kategori A/B/C + score) for the top matches.","operationId":"datavask_parse_api_v1_datavask_parse_get","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"betegnelse","in":"query","required":true,"schema":{"type":"string","description":"Hel adresse-streng, fx 'Rådhuspladsen 1, 3.tv, 1550 København V'","title":"Betegnelse"},"description":"Hel adresse-streng, fx 'Rådhuspladsen 1, 3.tv, 1550 København V'"},{"name":"struktur","in":"query","required":false,"schema":{"enum":["mini","full"],"type":"string","default":"mini","title":"Struktur"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Datavask Parse Api V1 Datavask Parse Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bulk/cleanse":{"post":{"tags":["bulk"],"summary":"Bulk Cleanse","description":"Submit CSV for bulk address cleansing.","operationId":"bulk_cleanse_api_v1_bulk_cleanse_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_bulk_cleanse_api_v1_bulk_cleanse_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bulk Cleanse Api V1 Bulk Cleanse Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bulk/jobs/{job_id}":{"get":{"tags":["bulk"],"summary":"Job Status","operationId":"job_status_api_v1_bulk_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Job Status Api V1 Bulk Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bulk/jobs":{"get":{"tags":["bulk"],"summary":"List Jobs","description":"List the caller's most recent bulk jobs (best-effort scan of Redis).","operationId":"list_jobs_api_v1_bulk_jobs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Jobs Api V1 Bulk Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bulk/jobs/{job_id}/download":{"get":{"tags":["bulk"],"summary":"Job Download","operationId":"job_download_api_v1_bulk_jobs__job_id__download_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stats":{"get":{"tags":["stats"],"summary":"Live address-data counts","description":"Public JSON: counts of addresses, postnumre, kommuner, sogne, vejstykker.\n\nCached 15 min at the edge — these change at most a few times an hour.","operationId":"stats_api_api_v1_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Api Api V1 Stats Get"}}}}}}},"/api/v1/stats/national":{"get":{"tags":["stats"],"summary":"National Stats","description":"Pre-aggregated national address/property statistics (for soge.dk /stats).\n\nServed from a nightly-refreshed snapshot (Redis) → fast, no per-request scan.\nAnonymous works under the free tier; an enterprise X-Api-Key avoids the limit.\nDistinct from `/stats` (that is per-account API-usage). A top-level `totals`\nis always present. Blocks we can't bulk-aggregate (flood_risk, energy_labels,\nproperty_value) are `null` — see docs/TASK_national_stats_api.md.\n\nNote: `?kommunekode=` (per-municipality scope) is Phase 3 and not yet served;\nthe param is currently ignored and the national snapshot is returned.","operationId":"national_stats_api_v1_stats_national_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response National Stats Api V1 Stats National Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}]}},"/api/v1/stats/address-count":{"get":{"tags":["stats"],"summary":"Address Count","description":"Live, filter-driven count of Danish addresses (soge.dk stats-explorer).\n\n`{\"count\": <int|null>, \"reason\": <enum|null>}`. Filters (all optional, AND):\n`type` (adgang|adresse), `kommunekode`, `regionskode`, `postnr`, `vejkode`,\n`vejnavn`, `status`. Answered from Meili `total_hits` / MySQL COUNT in ~0.1 s;\na query that can't return a real count cheaply returns `count=null` (with a\n`reason`) rather than blocking. See docs/TASK_address_count_api.md.\n\nRequires an X-Api-Key (owner decision 2026-06-23 — no anonymous tier here).\nsoge calls it with a dedicated Enterprise key (soft cap → effectively\nunlimited), so per-keystroke traffic is never rate-limited; the key's monthly\nquota is the only governor.","operationId":"address_count_api_v1_stats_address_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Address Count Api V1 Stats Address Count Get"}}}}}}},"/api/v1/webhooks":{"get":{"tags":["webhooks"],"summary":"List Webhooks","operationId":"list_webhooks_api_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Webhooks Api V1 Webhooks Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["webhooks"],"summary":"Create Webhook","operationId":"create_webhook_api_v1_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Webhook Api V1 Webhooks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/webhooks/{webhook_id}":{"delete":{"tags":["webhooks"],"summary":"Delete Webhook","operationId":"delete_webhook_api_v1_webhooks__webhook_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Webhook Api V1 Webhooks  Webhook Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscribe":{"post":{"summary":"Subscribe","operationId":"subscribe_api_v1_subscribe_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_subscribe_api_v1_subscribe_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tak-for-tilmelding":{"get":{"summary":"Takket","operationId":"takket_tak_for_tilmelding_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/":{"get":{"tags":["dashboard"],"summary":"Home","operationId":"home_dashboard__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/settings":{"get":{"tags":["dashboard"],"summary":"Settings Page","operationId":"settings_page_dashboard_settings_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["dashboard"],"summary":"Settings Save","description":"Self-service account settings: profile fields + password change (the user is\nalready authenticated via the session, so a password change needs the current one).","operationId":"settings_save_dashboard_settings_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_settings_save_dashboard_settings_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/login":{"get":{"tags":["dashboard"],"summary":"Login Page","operationId":"login_page_dashboard_login_get","parameters":[{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dashboard"],"summary":"Login Post","operationId":"login_post_dashboard_login_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_post_dashboard_login_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/login/verify":{"post":{"tags":["dashboard"],"summary":"Login Verify","description":"Second factor: consume the login OTP → set the session cookie.","operationId":"login_verify_dashboard_login_verify_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_verify_dashboard_login_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/login/resend":{"post":{"tags":["dashboard"],"summary":"Login Resend","operationId":"login_resend_dashboard_login_resend_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_resend_dashboard_login_resend_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/signup":{"get":{"tags":["dashboard"],"summary":"Signup Page","operationId":"signup_page_dashboard_signup_get","parameters":[{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"plan","in":"query","required":false,"schema":{"type":"string","default":"","title":"Plan"}},{"name":"interval","in":"query","required":false,"schema":{"type":"string","default":"","title":"Interval"}},{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dashboard"],"summary":"Signup Post","description":"Stage 1: validate + email a 6-digit code. No user row created yet.","operationId":"signup_post_dashboard_signup_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_signup_post_dashboard_signup_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/buy":{"get":{"tags":["dashboard"],"summary":"Buy","description":"One-click path to payment. Logged in → straight to Stripe Checkout;\nanonymous → signup (email + code) carrying the intent, then back here.\nDefault interval is YEARLY (the pages offer the yearly per-month price by\ndefault; every CTA still passes interval explicitly).","operationId":"buy_dashboard_buy_get","parameters":[{"name":"plan","in":"query","required":false,"schema":{"type":"string","default":"pro","title":"Plan"}},{"name":"interval","in":"query","required":false,"schema":{"type":"string","default":"year","title":"Interval"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/welcome":{"get":{"tags":["dashboard"],"summary":"Welcome","description":"Post-payment return page. The buyer comes back from Stripe here.\n\nThree jobs, so the payment can never feel \"lost\":\n  1. Recover WHO paid from the Checkout Session (client_reference_id → email)\n     and **re-establish the login cookie** — never dump them at /login.\n  2. Grant the plan + bind customer/subscription IMMEDIATELY (belt-and-braces\n     with the webhook, which may lag a few seconds).\n  3. Make sure they leave with a working live key, and (if the account has no\n     password yet — the deferred-password buy flow) prompt them to set one.","operationId":"welcome_dashboard_welcome_get","parameters":[{"name":"session_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/set-password":{"post":{"tags":["dashboard"],"summary":"Set Password","description":"Set an initial password for the deferred-password buy flow. Allowed only when\nthe account currently has NO password (otherwise use settings, which requires the\ncurrent one). Session-authenticated.","operationId":"set_password_dashboard_set_password_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_set_password_dashboard_set_password_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/signup/verify":{"post":{"tags":["dashboard"],"summary":"Signup Verify","description":"Stage 2: consume code → create user → cookie session → keys (or straight\nto Stripe Checkout when the signup carried a buy intent from the pricing page).\n\nIn buy mode the form step collects no password, so the verify step offers to\ncreate one here (optional — the buyer can also skip and set it after payment).","operationId":"signup_verify_dashboard_signup_verify_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_signup_verify_dashboard_signup_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/signup/resend":{"post":{"tags":["dashboard"],"summary":"Signup Resend","operationId":"signup_resend_dashboard_signup_resend_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_signup_resend_dashboard_signup_resend_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/forgot":{"get":{"tags":["dashboard"],"summary":"Forgot Page","operationId":"forgot_page_dashboard_forgot_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["dashboard"],"summary":"Forgot Post","description":"Always go to reset step — don't leak whether email exists.","operationId":"forgot_post_dashboard_forgot_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_forgot_post_dashboard_forgot_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/forgot/reset":{"post":{"tags":["dashboard"],"summary":"Forgot Reset","operationId":"forgot_reset_dashboard_forgot_reset_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_forgot_reset_dashboard_forgot_reset_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/forgot/resend":{"post":{"tags":["dashboard"],"summary":"Forgot Resend","operationId":"forgot_resend_dashboard_forgot_resend_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_forgot_resend_dashboard_forgot_resend_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/logout":{"get":{"tags":["dashboard"],"summary":"Logout","operationId":"logout_dashboard_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/keys":{"get":{"tags":["dashboard"],"summary":"Keys Page","operationId":"keys_page_dashboard_keys_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["dashboard"],"summary":"Keys Create","operationId":"keys_create_dashboard_keys_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_keys_create_dashboard_keys_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/keys/{key_id}/revoke":{"post":{"tags":["dashboard"],"summary":"Keys Revoke","operationId":"keys_revoke_dashboard_keys__key_id__revoke_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/keys/{key_id}/reset-device":{"post":{"tags":["dashboard"],"summary":"Keys Reset Device","description":"Unlock / rebind a key: clear the binding + all enforcement state so the next\nrequest binds fresh. This is the cabinet path to approve a new device or lift a\nblock. Also clears the Redis warning-dedup + account-IP set so a fresh start\nisn't immediately re-flagged.","operationId":"keys_reset_device_dashboard_keys__key_id__reset_device_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/usage":{"get":{"tags":["dashboard"],"summary":"Usage Page","operationId":"usage_page_dashboard_usage_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/billing":{"get":{"tags":["dashboard"],"summary":"Billing Page","operationId":"billing_page_dashboard_billing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard/bulk":{"get":{"tags":["dashboard"],"summary":"Bulk Page","operationId":"bulk_page_dashboard_bulk_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/uk":{"get":{"tags":["landing"],"summary":"Index","operationId":"index_uk_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/en":{"get":{"tags":["landing"],"summary":"Index","operationId":"index_en_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/":{"get":{"tags":["landing"],"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Body_bulk_cleanse_api_v1_bulk_cleanse_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"vejnavn_col":{"type":"string","title":"Vejnavn Col","default":"vejnavn"},"husnr_col":{"type":"string","title":"Husnr Col","default":"husnr"},"postnr_col":{"type":"string","title":"Postnr Col","default":"postnr"}},"type":"object","required":["file"],"title":"Body_bulk_cleanse_api_v1_bulk_cleanse_post"},"Body_forgot_post_dashboard_forgot_post":{"properties":{"email":{"type":"string","title":"Email"},"cf-turnstile-response":{"type":"string","title":"Cf-Turnstile-Response","default":""}},"type":"object","required":["email"],"title":"Body_forgot_post_dashboard_forgot_post"},"Body_forgot_resend_dashboard_forgot_resend_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_forgot_resend_dashboard_forgot_resend_post"},"Body_forgot_reset_dashboard_forgot_reset_post":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["email","code","new_password"],"title":"Body_forgot_reset_dashboard_forgot_reset_post"},"Body_keys_create_dashboard_keys_post":{"properties":{"name":{"type":"string","title":"Name"},"mode":{"type":"string","title":"Mode"}},"type":"object","required":["name","mode"],"title":"Body_keys_create_dashboard_keys_post"},"Body_login_post_dashboard_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"next":{"type":"string","title":"Next","default":""},"cf-turnstile-response":{"type":"string","title":"Cf-Turnstile-Response","default":""}},"type":"object","required":["email","password"],"title":"Body_login_post_dashboard_login_post"},"Body_login_resend_dashboard_login_resend_post":{"properties":{"email":{"type":"string","title":"Email"},"next":{"type":"string","title":"Next","default":""}},"type":"object","required":["email"],"title":"Body_login_resend_dashboard_login_resend_post"},"Body_login_verify_dashboard_login_verify_post":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"},"next":{"type":"string","title":"Next","default":""}},"type":"object","required":["email","code"],"title":"Body_login_verify_dashboard_login_verify_post"},"Body_set_password_dashboard_set_password_post":{"properties":{"new":{"type":"string","title":"New"},"confirm":{"type":"string","title":"Confirm","default":""}},"type":"object","required":["new"],"title":"Body_set_password_dashboard_set_password_post"},"Body_settings_save_dashboard_settings_post":{"properties":{"action":{"type":"string","title":"Action","default":"profile"},"name":{"type":"string","title":"Name","default":""},"company":{"type":"string","title":"Company","default":""},"cvr":{"type":"string","title":"Cvr","default":""},"current":{"type":"string","title":"Current","default":""},"new":{"type":"string","title":"New","default":""},"confirm":{"type":"string","title":"Confirm","default":""}},"type":"object","title":"Body_settings_save_dashboard_settings_post"},"Body_signup_post_dashboard_signup_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password","default":""},"name":{"type":"string","title":"Name","default":""},"plan":{"type":"string","title":"Plan","default":""},"interval":{"type":"string","title":"Interval","default":""},"next":{"type":"string","title":"Next","default":""},"company_website":{"type":"string","title":"Company Website","default":""},"cf-turnstile-response":{"type":"string","title":"Cf-Turnstile-Response","default":""}},"type":"object","required":["email"],"title":"Body_signup_post_dashboard_signup_post"},"Body_signup_resend_dashboard_signup_resend_post":{"properties":{"email":{"type":"string","title":"Email"},"plan":{"type":"string","title":"Plan","default":""},"interval":{"type":"string","title":"Interval","default":""},"next":{"type":"string","title":"Next","default":""}},"type":"object","required":["email"],"title":"Body_signup_resend_dashboard_signup_resend_post"},"Body_signup_verify_dashboard_signup_verify_post":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"},"plan":{"type":"string","title":"Plan","default":""},"interval":{"type":"string","title":"Interval","default":""},"next":{"type":"string","title":"Next","default":""},"password":{"type":"string","title":"Password","default":""}},"type":"object","required":["email","code"],"title":"Body_signup_verify_dashboard_signup_verify_post"},"Body_subscribe_api_v1_subscribe_post":{"properties":{"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name","default":""},"source":{"type":"string","title":"Source","default":"website"},"lang":{"type":"string","title":"Lang","default":"da"},"cf-turnstile-response":{"type":"string","title":"Cf-Turnstile-Response","default":""}},"type":"object","required":["email"],"title":"Body_subscribe_api_v1_subscribe_post"},"CVRInput":{"properties":{"cvr":{"type":"string","title":"Cvr"}},"type":"object","required":["cvr"],"title":"CVRInput"},"ChangePlanRequest":{"properties":{"plan":{"type":"string","title":"Plan"},"interval":{"type":"string","title":"Interval","default":"month"}},"type":"object","required":["plan"],"title":"ChangePlanRequest"},"CheckoutRequest":{"properties":{"plan":{"type":"string","title":"Plan","default":"pro"},"interval":{"type":"string","title":"Interval","default":"month"},"success_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Url"},"cancel_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Url"}},"type":"object","title":"CheckoutRequest"},"CreateKeyBody":{"properties":{"name":{"type":"string","title":"Name"},"mode":{"type":"string","title":"Mode","default":"live"},"scopes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scopes"}},"type":"object","required":["name"],"title":"CreateKeyBody"},"EANInput":{"properties":{"ean":{"type":"string","title":"Ean"}},"type":"object","required":["ean"],"title":"EANInput"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IBANInput":{"properties":{"iban":{"type":"string","title":"Iban"}},"type":"object","required":["iban"],"title":"IBANInput"},"LoginBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginBody"},"MagicRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"MagicRequest"},"OtpForgotBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"OtpForgotBody"},"OtpResendBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"purpose":{"type":"string","enum":["signup","reset"],"title":"Purpose"}},"type":"object","required":["email","purpose"],"title":"OtpResendBody"},"OtpResetBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","pattern":"^\\d{6}$","title":"Code"},"new_password":{"type":"string","maxLength":200,"minLength":8,"title":"New Password"}},"type":"object","required":["email","code","new_password"],"title":"OtpResetBody"},"OtpSignupBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"lang":{"type":"string","title":"Lang","default":"da"}},"type":"object","required":["email","password"],"title":"OtpSignupBody"},"OtpVerifyBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","pattern":"^\\d{6}$","title":"Code"}},"type":"object","required":["email","code"],"title":"OtpVerifyBody"},"PhoneInput":{"properties":{"phone":{"type":"string","title":"Phone"},"country":{"type":"string","title":"Country","default":"DK"}},"type":"object","required":["phone"],"title":"PhoneInput"},"QualityInput":{"properties":{"vejnavn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vejnavn"},"husnr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Husnr"},"etage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Etage"},"door":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Door"},"postnr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postnr"},"postnr_navn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postnr Navn"},"kommunekode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kommunekode"}},"type":"object","title":"QualityInput"},"SignupBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"cvr":{"anyOf":[{"type":"string","pattern":"^\\d{8}$"},{"type":"null"}],"title":"Cvr"},"lang":{"type":"string","title":"Lang","default":"da"}},"type":"object","required":["email","password"],"title":"SignupBody"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"Bearer"},"user":{"additionalProperties":true,"type":"object","title":"User"}},"type":"object","required":["access_token","user"],"title":"TokenResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VaskInput":{"properties":{"vejnavn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vejnavn"},"husnr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Husnr"},"etage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Etage"},"dør":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dør"},"postnr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postnr"},"supplerendebynavn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supplerendebynavn"}},"type":"object","title":"VaskInput"},"WebhookCreate":{"properties":{"url":{"type":"string","title":"Url"},"entities":{"items":{"type":"string"},"type":"array","title":"Entities"}},"type":"object","required":["url","entities"],"title":"WebhookCreate"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","description":"API key issued from /dashboard/keys — required on every request. Free tier: 2000 calls/month with a free key.","in":"header","name":"X-Api-Key"},"APIKeyQuery":{"type":"apiKey","description":"API key as query parameter (DAWA-compat fallback).","in":"query","name":"api_key"},"HTTPBearer":{"type":"http","description":"JWT issued from /api/v1/auth/login (dashboard sessions).","scheme":"bearer"}}},"tags":[{"name":"dawa:adresser","description":"DAWA-compat: full addresses with etage/dør"},{"name":"dawa:adgangsadresser","description":"DAWA-compat: entry addresses (building-level)"},{"name":"dawa:autocomplete","description":"DAWA-compat: typo-tolerant search-as-you-type"},{"name":"dawa:postnumre","description":"DAWA-compat: postal codes"},{"name":"dawa:kommuner","description":"DAWA-compat: municipalities"},{"name":"dawa:vejnavne","description":"DAWA-compat: street names"},{"name":"dawa:datavask","description":"DAWA-compat: address cleansing (kategori A/B/C)"},{"name":"enrich","description":"Beyond DAWA: DAGI, BBR, climate, distance, quality"},{"name":"bulk","description":"Bulk CSV cleansing (async jobs)"},{"name":"auth","description":"Dashboard auth: signup, login, OTP, password reset"},{"name":"keys","description":"Dashboard: manage API keys"},{"name":"billing","description":"Dashboard: subscription + invoicing"}]}