{"openapi":"3.1.0","info":{"title":"natomrade.airpipe.ai","description":"API för svenska elområden, nätområden, nätägare och energiskatt.","version":"0.1.0"},"paths":{"/auth/login":{"get":{"tags":["auth"],"summary":"Login Page","operationId":"login_page_auth_login_get","parameters":[{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}},{"name":"info","in":"query","required":false,"schema":{"type":"string","default":"","title":"Info"}}],"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":["auth"],"summary":"Login Submit","operationId":"login_submit_auth_login_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_submit_auth_login_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/signup":{"get":{"tags":["auth"],"summary":"Signup Page","operationId":"signup_page_auth_signup_get","parameters":[{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","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":["auth"],"summary":"Signup Submit","operationId":"signup_submit_auth_signup_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_signup_submit_auth_signup_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/magic":{"post":{"tags":["auth"],"summary":"Magic Request","operationId":"magic_request_auth_magic_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_magic_request_auth_magic_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/magic/verify/{token}":{"get":{"tags":["auth"],"summary":"Magic Verify","operationId":"magic_verify_auth_magic_verify__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/lookup/postal":{"get":{"summary":"Api Lookup Postal","operationId":"api_lookup_postal_api_v1_lookup_postal_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","description":"5-siffrigt postnummer, t.ex. 11151","title":"Code"},"description":"5-siffrigt postnummer, t.ex. 11151"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/lookup/grid-area":{"get":{"summary":"Api Lookup Grid Area","operationId":"api_lookup_grid_area_api_v1_lookup_grid_area_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","description":"Nätområdeskod: MGA-kod (t.ex. ALS), EIC eller SvK-id","title":"Code"},"description":"Nätområdeskod: MGA-kod (t.ex. ALS), EIC eller SvK-id"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/ort":{"get":{"summary":"Api Search Ort","operationId":"api_search_ort_api_v1_search_ort_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/lookup/ort":{"get":{"summary":"Api Lookup Ort","operationId":"api_lookup_ort_api_v1_lookup_ort_get","parameters":[{"name":"ort","in":"query","required":true,"schema":{"type":"string","title":"Ort"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/lookup/address":{"get":{"summary":"Api Lookup Address","operationId":"api_lookup_address_api_v1_lookup_address_get","parameters":[{"name":"adress","in":"query","required":true,"schema":{"type":"string","description":"Gatuadress, t.ex. Drottninggatan 1","title":"Adress"},"description":"Gatuadress, t.ex. Drottninggatan 1"},{"name":"ort","in":"query","required":false,"schema":{"type":"string","description":"Ort","default":"","title":"Ort"},"description":"Ort"},{"name":"postnr","in":"query","required":false,"schema":{"type":"string","description":"5-siffrigt postnr","default":"","title":"Postnr"},"description":"5-siffrigt postnr"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/lookup/coordinate":{"get":{"summary":"Api Lookup Coordinate","operationId":"api_lookup_coordinate_api_v1_lookup_coordinate_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","title":"Lat"}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","title":"Lon"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/regions/elomraden":{"get":{"summary":"List Elomraden","operationId":"list_elomraden_api_v1_regions_elomraden_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/prices/spot":{"get":{"summary":"Api Prices Spot","description":"Aktuellt/framtida spotpris. Öppen endpoint för UI (ingen API-nyckel).","operationId":"api_prices_spot_api_v1_prices_spot_get","parameters":[{"name":"area","in":"query","required":false,"schema":{"type":"string","description":"SE1|SE2|SE3|SE4 eller tomt för alla","default":"","title":"Area"},"description":"SE1|SE2|SE3|SE4 eller tomt för alla"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/prices/current":{"get":{"summary":"Api Prices Current","description":"Nuvarande spotpris per elområde + dagens snitt (day-ahead) per elområde.\n\n`now`        = priset för den aktuella kvarten/timmen (svensk tid).\n`today_avg`  = medelpris över hela dygnet per zon (matchar \"dagens elspotpris\").\n`today`      = dygnets svenska datum (Europe/Stockholm).","operationId":"api_prices_current_api_v1_prices_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/production/current":{"get":{"summary":"Api Production Current","description":"Senaste TILLGÄNGLIGA 15-min produktion per typ (MW).\n\neSett publicerar avräkningsdata med ~1 dygns fördröjning — de allra senaste\nslotsen kommer som nollor tills de settlats. Vi returnerar därför senaste slot\nmed verklig data (total > 0), inte den absolut nyaste (som ofta är 0).","operationId":"api_production_current_api_v1_production_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/regions/grid-owners":{"get":{"summary":"List Owners","description":"Lista alla nätägare (Netowner) — synkad från ediel_company_registry.","operationId":"list_owners_api_v1_regions_grid_owners_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/policy/global":{"get":{"summary":"Get Global Policy","operationId":"get_global_policy_admin_policy_global_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Set Global Policy","operationId":"set_global_policy_admin_policy_global_post","parameters":[{"name":"anon_per_ip_per_day","in":"query","required":true,"schema":{"type":"integer","title":"Anon Per Ip Per Day"}},{"name":"anon_global_per_day","in":"query","required":true,"schema":{"type":"integer","title":"Anon Global Per Day"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"summary":"List Users","operationId":"list_users_admin_users_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create User","operationId":"create_user_admin_users_post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Name"}},{"name":"tier","in":"query","required":false,"schema":{"type":"string","default":"free","title":"Tier"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/policy":{"post":{"summary":"Set User Policy","operationId":"set_user_policy_admin_users__user_id__policy_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"per_minute","in":"query","required":true,"schema":{"type":"integer","title":"Per Minute"}},{"name":"per_hour","in":"query","required":true,"schema":{"type":"integer","title":"Per Hour"}},{"name":"per_day","in":"query","required":true,"schema":{"type":"integer","title":"Per Day"}},{"name":"burst","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Burst"}},{"name":"auto_throttle_enabled","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Auto Throttle Enabled"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/keys":{"post":{"summary":"Create Key","operationId":"create_key_admin_users__user_id__keys_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"label","in":"query","required":false,"schema":{"type":"string","default":"","title":"Label"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/keys/{key_id}":{"delete":{"summary":"Revoke Key","operationId":"revoke_key_admin_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/usage":{"get":{"summary":"Admin Usage","operationId":"admin_usage_admin_usage_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/bans":{"get":{"summary":"Admin Bans","operationId":"admin_bans_admin_bans_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/bans/{ban_id}":{"delete":{"summary":"Lift Ban","operationId":"lift_ban_admin_bans__ban_id__delete","parameters":[{"name":"ban_id","in":"path","required":true,"schema":{"type":"integer","title":"Ban Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_login_submit_auth_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"Body_login_submit_auth_login_post"},"Body_magic_request_auth_magic_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_magic_request_auth_magic_post"},"Body_signup_submit_auth_signup_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password","default":""},"name":{"type":"string","title":"Name","default":""}},"type":"object","required":["email"],"title":"Body_signup_submit_auth_signup_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"}}}}