{"openapi":"3.1.0","info":{"title":"dawa_analog","description":"DAWA drop-in replacement — Danish Address Web API analog. By LynBro ApS · lynbro.dk","version":"0.1.0"},"paths":{"/autocomplete":{"get":{"tags":["dawa:autocomplete"],"summary":"Autocomplete","description":"DAWA-сумісний autocomplete endpoint.\n\nNB: DAWA повертає JSON array (не obj). Те саме робимо.\nJSONP callback обгортка робиться у middleware (TODO).","operationId":"autocomplete_autocomplete_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Search query (DAWA: required)","default":"","title":"Q"},"description":"Search query (DAWA: required)"},{"name":"struktur","in":"query","required":false,"schema":{"enum":["mini","full"],"type":"string","default":"mini","title":"Struktur"}},{"name":"srid","in":"query","required":false,"schema":{"enum":[4326,25832],"type":"integer","default":4326,"title":"Srid"}},{"name":"fuzzy","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Fuzzy"}},{"name":"adgangsadresserOnly","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Adgangsadresseronly"}},{"name":"params","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"JSON-encoded filter object, e.g. {\"kommunekode\":\"101\"}","title":"Params"},"description":"JSON-encoded filter object, e.g. {\"kommunekode\":\"101\"}"},{"name":"callback","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"JSONP callback function name","title":"Callback"},"description":"JSONP callback function name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Autocomplete Autocomplete Get"}}}},"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","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/{nr}":{"get":{"tags":["dawa:postnumre"],"summary":"Get Postnummer","operationId":"get_postnummer_postnumre__nr__get","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","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/{kode}":{"get":{"tags":["dawa:kommuner"],"summary":"Get Kommune","operationId":"get_kommune_kommuner__kode__get","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","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/{id}":{"get":{"tags":["dawa:vejnavne"],"summary":"Get Vejnavn","operationId":"get_vejnavn_vejnavne__id__get","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"}}}}}}},"/adgangsadresser":{"get":{"tags":["dawa:adgangsadresser"],"summary":"List Adgangsadresser","operationId":"list_adgangsadresser_adgangsadresser_get","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"}],"title":"Postnr"}},{"name":"kommunekode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kommunekode"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status"}},{"name":"srid","in":"query","required":false,"schema":{"enum":[4326,25832],"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":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Adgangsadresser Adgangsadresser 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","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}},{"name":"srid","in":"query","required":false,"schema":{"enum":[4326,25832],"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"}}}}}}},"/adgangsadresser/reverse":{"get":{"tags":["dawa:adgangsadresser"],"summary":"Reverse Geocode","description":"Знаходить найближчу adgangsadresse до точки (x, y).","operationId":"reverse_geocode_adgangsadresser_reverse_get","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":{"enum":[4326,25832],"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"}}}}}}},"/adresser":{"get":{"tags":["dawa:adresser"],"summary":"List Adresser","operationId":"list_adresser_adresser_get","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":"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":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status"}},{"name":"srid","in":"query","required":false,"schema":{"enum":[4326,25832],"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":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Adresser Adresser Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/adresser/{id}":{"get":{"tags":["dawa:adresser"],"summary":"Get Adresse","operationId":"get_adresse_adresser__id__get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}},{"name":"srid","in":"query","required":false,"schema":{"enum":[4326,25832],"type":"integer","default":4326,"title":"Srid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Adresse Adresser  Id  Get"}}}},"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","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"}}}}}}},"/datavask/adresser":{"post":{"tags":["dawa:datavask"],"summary":"Datavask Adresser","description":"Datavask на повну адресу (з etage/dør).","operationId":"datavask_adresser_datavask_adresser_post","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"}}}}}}},"/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/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"}}}}}}},"/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/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"}}}}}},"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"}}}}}}},"/api/v1/keys/{key_id}":{"delete":{"tags":["keys"],"summary":"Revoke Key","operationId":"revoke_key_api_v1_keys__key_id__delete","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"}}}}}}},"/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"}}}}}}},"/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"}}}}}}},"/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"}}}}}}},"/dashboard/":{"get":{"tags":["dashboard"],"summary":"Home","operationId":"home_dashboard__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/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"}}],"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/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"}}],"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","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":{"application/json":{"schema":{}}}},"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/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"}}}}}}},"/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_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"}},"type":"object","required":["email","password"],"title":"Body_login_post_dashboard_login_post"},"Body_signup_post_dashboard_signup_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"name":{"type":"string","title":"Name","default":""}},"type":"object","required":["email","password"],"title":"Body_signup_post_dashboard_signup_post"},"CheckoutRequest":{"properties":{"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"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"},"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"}}}}