{"openapi":"3.1.0","info":{"title":"Sheffield Solar API","version":"0.1.0"},"paths":{"/pvlive/api/v4/gsp/{gsp_id}":{"get":{"tags":["pvlive"],"summary":"PV_Live GSP data","description":"Get PV_Live data for a specific GSP.","operationId":"pvlive_gsp_pvlive_api_v4_gsp__gsp_id__get","parameters":[{"name":"gsp_id","in":"path","required":true,"schema":{"type":"integer","title":"Gsp Id"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"YYYY-mm-ddTHH:MM"},{"type":"null"}],"title":"Start"},"description":"Optional start time. Format: YYYY-mm-ddTHH:MM"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"YYYY-mm-ddTHH:MM"},{"type":"null"}],"title":"End"},"description":"Optional end time. Format: YYYY-mm-ddTHH:MM"},{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}},{"name":"extra_field","in":"query","required":false,"schema":{"type":"array","items":{"enum":["bias_error","capacity_mwp","installedcapacity_mwp","lcl_mw","site_count","stats_error","ucl_mw","uncertainty_mw","updated_gmt"],"type":"string"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp","default":[],"title":"Extra Field"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp"},{"name":"extra_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Fields","description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},"description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},{"name":"updated_gmt_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Gmt From"}},{"name":"updated_gmt_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Gmt To"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"const":"30","type":"string"},{"type":"null"}],"description":"Deprecated: The 5 minute interval is no longer available. The 30 minute interval is the default.","deprecated":true,"title":"Period"},"description":"Deprecated: The 5 minute interval is no longer available. The 30 minute interval is the default.","deprecated":true}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvlive/api/v4/pes/0":{"get":{"tags":["pvlive"],"summary":"Pvlive Pes0","description":"PES live generation data — (National Aggregate).","operationId":"pvlive_pes0_pvlive_api_v4_pes_0_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"YYYY-mm-ddTHH:MM"},{"type":"null"}],"title":"Start"},"description":"Optional start time. Format: YYYY-mm-ddTHH:MM"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"YYYY-mm-ddTHH:MM"},{"type":"null"}],"title":"End"},"description":"Optional end time. Format: YYYY-mm-ddTHH:MM"},{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}},{"name":"extra_field","in":"query","required":false,"schema":{"type":"array","items":{"enum":["bias_error","capacity_mwp","installedcapacity_mwp","lcl_mw","site_count","stats_error","ucl_mw","uncertainty_mw","updated_gmt"],"type":"string"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp","default":[],"title":"Extra Field"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp"},{"name":"extra_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Fields","description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},"description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},{"name":"updated_gmt_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Gmt From"}},{"name":"updated_gmt_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Gmt To"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"const":"30","type":"string"},{"type":"null"}],"description":"Deprecated: The 5 minute interval is no longer available. The 30 minute interval is the default.","deprecated":true,"title":"Period"},"description":"Deprecated: The 5 minute interval is no longer available. The 30 minute interval is the default.","deprecated":true}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvlive/api/v4/pes/{pes_id}":{"get":{"tags":["pvlive"],"summary":"PV_Live PES data","description":"Get PV_Live data for a specific PES region.","operationId":"pvlive_pes_pvlive_api_v4_pes__pes_id__get","parameters":[{"name":"pes_id","in":"path","required":true,"schema":{"type":"integer","maximum":23,"minimum":10,"title":"Pes Id"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"YYYY-mm-ddTHH:MM"},{"type":"null"}],"title":"Start"},"description":"Optional start time. Format: YYYY-mm-ddTHH:MM"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"YYYY-mm-ddTHH:MM"},{"type":"null"}],"title":"End"},"description":"Optional end time. Format: YYYY-mm-ddTHH:MM"},{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}},{"name":"extra_field","in":"query","required":false,"schema":{"type":"array","items":{"enum":["bias_error","capacity_mwp","installedcapacity_mwp","lcl_mw","site_count","stats_error","ucl_mw","uncertainty_mw","updated_gmt"],"type":"string"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp","default":[],"title":"Extra Field"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp"},{"name":"extra_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Fields","description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},"description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},{"name":"updated_gmt_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Gmt From"}},{"name":"updated_gmt_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Gmt To"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"const":"30","type":"string"},{"type":"null"}],"description":"Deprecated: The 5 minute interval is no longer available. The 30 minute interval is the default.","deprecated":true,"title":"Period"},"description":"Deprecated: The 5 minute interval is no longer available. The 30 minute interval is the default.","deprecated":true}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvlive/api/v4/gsp_list":{"get":{"tags":["pvlive"],"summary":"PV_Live GSP List","description":"List all GSP regions.","operationId":"pvlive_gsp_list_pvlive_api_v4_gsp_list_get","parameters":[{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvlive/api/v4/pes_list":{"get":{"tags":["pvlive"],"summary":"PV_Live PES List","description":"List all PES regions.","operationId":"pvlive_pes_list_pvlive_api_v4_pes_list_get","parameters":[{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvlive/api/v4/passiv_reading_count/{start_at}":{"get":{"tags":["pvlive"],"summary":"Passiv Reading Count","description":"Return 2-minute-bucketed Passiv reading counts for the 1-hour window.","operationId":"passiv_reading_count_pvlive_api_v4_passiv_reading_count__start_at__get","parameters":[{"name":"start_at","in":"path","required":true,"schema":{"type":"string","format":"date-time","title":"Start At"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvlive/api/v4/peakgeneration":{"get":{"tags":["pvlive"],"summary":"Peakgeneration","description":"Return the single highest national generation reading in the last 4 years.","operationId":"peakgeneration_pvlive_api_v4_peakgeneration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pvlive_eu/api/v5/nuts_list":{"get":{"tags":["pvlive_eu"],"summary":"PV_Live_EU NUTS List","description":"List all NUTS region codes and names.","operationId":"pvlive_eu_nuts_list_pvlive_eu_api_v5_nuts_list_get","parameters":[{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvlive_eu/api/v5/nuts/{nuts_code}":{"get":{"tags":["pvlive_eu"],"summary":"PV_Live_EU NUTS","description":"Return PVLive EU generation data for the given NUTS region code.","operationId":"pvlive_eu_nuts_pvlive_eu_api_v5_nuts__nuts_code__get","parameters":[{"name":"nuts_code","in":"path","required":true,"schema":{"type":"string","title":"Nuts Code"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"YYYY-mm-ddTHH:MM"},{"type":"null"}],"title":"Start"},"description":"Optional start time. Format: YYYY-mm-ddTHH:MM"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"YYYY-mm-ddTHH:MM"},{"type":"null"}],"title":"End"},"description":"Optional end time. Format: YYYY-mm-ddTHH:MM"},{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}},{"name":"extra_field","in":"query","required":false,"schema":{"type":"array","items":{"enum":["bias_error","capacity_mwp","installedcapacity_mwp","lcl_mw","site_count","stats_error","ucl_mw","uncertainty_mw","updated_gmt"],"type":"string"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp","default":[],"title":"Extra Field"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp"},{"name":"extra_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Fields","description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},"description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},{"name":"updated_gmt_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Gmt From"}},{"name":"updated_gmt_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Gmt To"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"const":"30","type":"string"},{"type":"null"}],"description":"Deprecated: The 5 minute interval is no longer available. The 30 minute interval is the default.","deprecated":true,"title":"Period"},"description":"Deprecated: The 5 minute interval is no longer available. The 30 minute interval is the default.","deprecated":true}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvforecast/api/v4/hicast":{"get":{"tags":["pvforecast"],"summary":"Hicast","description":"Return hicast (historical forecast) data for GSP 0 (national aggregate).","operationId":"hicast_pvforecast_api_v4_hicast_get","parameters":[{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}},{"name":"extra_field","in":"query","required":false,"schema":{"type":"array","items":{"enum":["capacity_mwp","installedcapacity_mwp"],"type":"string"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp","default":[],"title":"Extra Field"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp"},{"name":"extra_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Fields","description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},"description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"forecast_base_gmt","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Forecast Base Gmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvforecast/api/v4/gsp/{gsp_id}":{"get":{"tags":["pvforecast"],"summary":"PV_Forecast GSP data","description":"Get PV_Forecast data for a specific GSP.","operationId":"pvforecast_gsp_pvforecast_api_v4_gsp__gsp_id__get","parameters":[{"name":"gsp_id","in":"path","required":true,"schema":{"type":"integer","title":"Gsp Id"}},{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}},{"name":"extra_field","in":"query","required":false,"schema":{"type":"array","items":{"enum":["capacity_mwp","installedcapacity_mwp"],"type":"string"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp","default":[],"title":"Extra Field"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp"},{"name":"extra_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Fields","description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},"description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"forecast_base_gmt","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Forecast Base Gmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvforecast/api/v4/pes/0":{"get":{"tags":["pvforecast"],"summary":"Pvforecast Pes0","description":"PES forecast data.","operationId":"pvforecast_pes0_pvforecast_api_v4_pes_0_get","parameters":[{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}},{"name":"extra_field","in":"query","required":false,"schema":{"type":"array","items":{"enum":["capacity_mwp","installedcapacity_mwp"],"type":"string"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp","default":[],"title":"Extra Field"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp"},{"name":"extra_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Fields","description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},"description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"forecast_base_gmt","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Forecast Base Gmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvforecast/api/v4/pes/{pes_id}":{"get":{"tags":["pvforecast"],"summary":"PV_Forecast PES data","description":"Get PV_Forecast data for a specific PES region.","operationId":"pvforecast_pes_pvforecast_api_v4_pes__pes_id__get","parameters":[{"name":"pes_id","in":"path","required":true,"schema":{"type":"integer","maximum":23,"minimum":10,"title":"Pes Id"}},{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}},{"name":"extra_field","in":"query","required":false,"schema":{"type":"array","items":{"enum":["capacity_mwp","installedcapacity_mwp"],"type":"string"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp","default":[],"title":"Extra Field"},"description":"A repeated query parameter. Example: ?extra_field=capacity_mwp&extra_field=installedcapacity_mwp"},{"name":"extra_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Fields","description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},"description":"Deprecated: Use extra_field instead. A comma-separated list of extra fields to include in the response.","deprecated":true},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"forecast_base_gmt","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Forecast Base Gmt"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvforecast/api/v4/forecast_bases_list":{"get":{"tags":["pvforecast"],"summary":"Forecast Bases List0","description":"Return a list of distinct forecast base datetimes for the given GSP.","operationId":"forecast_bases_list0_pvforecast_api_v4_forecast_bases_list_get","parameters":[{"name":"gsp_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":0,"title":"Gsp Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pvforecast/api/v4/forecast_bases_list/{gsp_id}":{"get":{"tags":["pvforecast"],"summary":"Forecast Bases List","description":"Return a list of distinct forecast base datetimes for the given GSP.","operationId":"forecast_bases_list_pvforecast_api_v4_forecast_bases_list__gsp_id__get","parameters":[{"name":"gsp_id","in":"path","required":true,"schema":{"type":"integer","title":"Gsp Id"}},{"name":"gsp_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":0,"title":"Gsp Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"data_format","in":"query","required":false,"schema":{"enum":["csv","json"],"type":"string","default":"json","title":"Data Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health/live":{"get":{"tags":["health"],"summary":"Liveness Probe","description":"Liveness check.\nPurely validates that the event loop isn't blocked.","operationId":"liveness_probe_health_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Liveness Probe Health Live Get"}}}}}}},"/health/ready":{"get":{"tags":["health"],"summary":"Readiness Probe","description":"Readiness check.\nValidates downstream dependencies concurrently.","operationId":"readiness_probe_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Readiness Probe Health Ready Get"}}}}}}},"/admin/admin_page/{sort_col}/{direction}":{"get":{"tags":["admin"],"summary":"Admin Page","description":"Render the admin user list page, sorted by the specified column.\nAdmin — requires superuser.\n\nRaises HTTP 400 if sort_col is not in the allowed whitelist (prevents SQL injection).\nRequires superuser privileges.","operationId":"admin_page_admin_admin_page__sort_col___direction__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"sort_col","in":"path","required":true,"schema":{"type":"string","title":"Sort Col"}},{"name":"direction","in":"path","required":true,"schema":{"type":"string","title":"Direction"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/admin_page/":{"get":{"tags":["admin"],"summary":"Admin Page","description":"Render the admin user list page, sorted by the specified column.\nAdmin — requires superuser.\n\nRaises HTTP 400 if sort_col is not in the allowed whitelist (prevents SQL injection).\nRequires superuser privileges.","operationId":"admin_page_admin_admin_page__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"sort_col","in":"query","required":false,"schema":{"type":"string","default":"id","title":"Sort Col"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","default":"asc","title":"Direction"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/admin_form/{user_id}":{"get":{"tags":["admin"],"summary":"Admin User Form","description":"Show the admin user edit form (GET).","operationId":"admin_user_form_admin_admin_form__user_id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/admin_page/region/{user_id}":{"post":{"tags":["admin"],"summary":"Submit Region","description":"Replace all region assignments for a user (POST).","operationId":"submit_region_admin_admin_page_region__user_id__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/admin_page/token/{user_id}":{"post":{"tags":["admin"],"summary":"Submit Token","description":"Update token fields for a user (POST).","operationId":"submit_token_admin_admin_page_token__user_id__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/admin_page/token_gen/{user_id}":{"post":{"tags":["admin"],"summary":"Submit Token Gen","description":"Regenerate or freshly create the API key for a user (POST).","operationId":"submit_token_gen_admin_admin_page_token_gen__user_id__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/admin_page/user/{user_id}":{"post":{"tags":["admin"],"summary":"Submit User","description":"Update profile fields for a user (POST).","operationId":"submit_user_admin_admin_page_user__user_id__post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Reset:Forgot Password","operationId":"reset_forgot_password_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reset_forgot_password_auth_forgot_password_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset:Reset Password","operationId":"reset_reset_password_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reset_reset_password_auth_reset_password_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"RESET_PASSWORD_BAD_TOKEN":{"summary":"Bad or expired token.","value":{"detail":"RESET_PASSWORD_BAD_TOKEN"}},"RESET_PASSWORD_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"RESET_PASSWORD_INVALID_PASSWORD","reason":"Password should be at least 3 characters"}}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/request-verify-token":{"post":{"tags":["auth"],"summary":"Verify:Request-Token","operationId":"verify_request_token_auth_request_verify_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_request_token_auth_request_verify_token_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify":{"post":{"tags":["auth"],"summary":"Verify:Verify","operationId":"verify_verify_auth_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_verify_auth_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"VERIFY_USER_BAD_TOKEN":{"summary":"Bad token, not existing user or not the e-mail currently set for the user.","value":{"detail":"VERIFY_USER_BAD_TOKEN"}},"VERIFY_USER_ALREADY_VERIFIED":{"summary":"The user is already verified.","value":{"detail":"VERIFY_USER_ALREADY_VERIFIED"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/cookie/login":{"post":{"tags":["auth"],"summary":"Auth:Cookie.Login","operationId":"auth_cookie_login_auth_cookie_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_auth_cookie_login_auth_cookie_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"LOGIN_BAD_CREDENTIALS":{"summary":"Bad credentials or the user is inactive.","value":{"detail":"LOGIN_BAD_CREDENTIALS"}},"LOGIN_USER_NOT_VERIFIED":{"summary":"The user is not verified.","value":{"detail":"LOGIN_USER_NOT_VERIFIED"}}}}}},"204":{"description":"No Content"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/cookie/logout":{"post":{"tags":["auth"],"summary":"Auth:Cookie.Logout","operationId":"auth_cookie_logout_auth_cookie_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing token or inactive user."},"204":{"description":"No Content"}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}]}},"/auth/jwt/login":{"post":{"tags":["api-auth"],"summary":"Auth:Jwt.Login","operationId":"auth_jwt_login_auth_jwt_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_auth_jwt_login_auth_jwt_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BearerResponse"},"example":{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOTIyMWZmYzktNjQwZi00MzcyLTg2ZDMtY2U2NDJjYmE1NjAzIiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTcxNTA0MTkzfQ.M10bjOe45I5Ncu_uXvOmVV8QxnL-nZfcH96U90JaocI","token_type":"bearer"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"LOGIN_BAD_CREDENTIALS":{"summary":"Bad credentials or the user is inactive.","value":{"detail":"LOGIN_BAD_CREDENTIALS"}},"LOGIN_USER_NOT_VERIFIED":{"summary":"The user is not verified.","value":{"detail":"LOGIN_USER_NOT_VERIFIED"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/jwt/logout":{"post":{"tags":["api-auth"],"summary":"Auth:Jwt.Logout","operationId":"auth_jwt_logout_auth_jwt_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing token or inactive user."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}]}},"/auth/jwt/register":{"post":{"tags":["api-auth"],"summary":"Register:Register","operationId":"register_register_auth_jwt_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"REGISTER_USER_ALREADY_EXISTS":{"summary":"A user with this email already exists.","value":{"detail":"REGISTER_USER_ALREADY_EXISTS"}},"REGISTER_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"REGISTER_INVALID_PASSWORD","reason":"Password should beat least 3 characters"}}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/me":{"get":{"tags":["users"],"summary":"Users:Current User","operationId":"users_current_user_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}]},"patch":{"tags":["users"],"summary":"Users:Patch Current User","operationId":"users_patch_current_user_users_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"},"examples":{"UPDATE_USER_EMAIL_ALREADY_EXISTS":{"summary":"A user with this email already exists.","value":{"detail":"UPDATE_USER_EMAIL_ALREADY_EXISTS"}},"UPDATE_USER_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"UPDATE_USER_INVALID_PASSWORD","reason":"Password should beat least 3 characters"}}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}]}},"/users/{id}":{"get":{"tags":["users"],"summary":"Users:User","operationId":"users_user_users__id__get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."},"403":{"description":"Not a superuser."},"404":{"description":"The user does not exist."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["users"],"summary":"Users:Patch User","operationId":"users_patch_user_users__id__patch","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing token or inactive user."},"403":{"description":"Not a superuser."},"404":{"description":"The user does not exist."},"400":{"content":{"application/json":{"examples":{"UPDATE_USER_EMAIL_ALREADY_EXISTS":{"summary":"A user with this email already exists.","value":{"detail":"UPDATE_USER_EMAIL_ALREADY_EXISTS"}},"UPDATE_USER_INVALID_PASSWORD":{"summary":"Password validation failed.","value":{"detail":{"code":"UPDATE_USER_INVALID_PASSWORD","reason":"Password should beat least 3 characters"}}}},"schema":{"$ref":"#/components/schemas/ErrorModel"}}},"description":"Bad Request"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["users"],"summary":"Users:Delete User","operationId":"users_delete_user_users__id__delete","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing token or inactive user."},"403":{"description":"Not a superuser."},"404":{"description":"The user does not exist."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/login":{"get":{"summary":"Get Login Form","description":"Render the login page.","operationId":"get_login_form_user_login_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"csrf_error","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Csrf 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":{"summary":"Handle Login","description":"Handle login form submissions securely via middleware-backed CSRF with Captcha Step-up.","operationId":"handle_login_user_login_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_handle_login_user_login_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/register":{"post":{"summary":"Handle Registration","description":"Process user registrations safely with background validation parsing and Step-Up challenges.","operationId":"handle_registration_user_register_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_handle_registration_user_register_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Register Form","description":"Render the PVForecast user registration form.","operationId":"get_register_form_user_register_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"csrf_error","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Csrf Error"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/logout":{"get":{"summary":"Handle Logout","description":"Clear the auth cookie and redirect to the landing page.","operationId":"handle_logout_user_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}]}},"/user/user":{"get":{"summary":"Pvforecast User","description":"Render the authenticated user's dashboard, showing their active API tokens.","operationId":"pvforecast_user_user_user_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}]}},"/user/forgot-password":{"get":{"summary":"Forgot Password Page","description":"Render the forgot password page.","operationId":"forgot_password_page_user_forgot_password_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"csrf_error","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Csrf 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":{"summary":"Handle Forgot Password","description":"Processes the forgot password form submission natively on the server.\nProtected automatically by FastAPICSRFJinjaMiddleware.","operationId":"handle_forgot_password_user_forgot_password_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_handle_forgot_password_user_forgot_password_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/reset-password":{"get":{"summary":"Reset Password Page","description":"This route is emailed to a user. It includes a token as a query parameter.","operationId":"reset_password_page_user_reset_password_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Handle Reset Password Submission","description":"Processes the new password submission on the server.\nProtected automatically by FastAPICSRFJinjaMiddleware.","operationId":"handle_reset_password_submission_user_reset_password_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_handle_reset_password_submission_user_reset_password_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/user/verify":{"get":{"summary":"Verify Page","description":"Render the initial email verification page landing button.","operationId":"verify_page_user_verify_get","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}},{"name":"csrf_error","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Csrf 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":{"summary":"Handle Verify","description":"Processes the verification form submission on the server.\nProtected automatically by FastAPICSRFJinjaMiddleware.","operationId":"handle_verify_user_verify_post","security":[{"OAuth2PasswordBearer":[]},{"APIKeyCookie":[]}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_handle_verify_user_verify_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/metrics":{"get":{"tags":["metrics"],"summary":"Metrics","operationId":"metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBasic":[]}]}}},"components":{"schemas":{"BearerResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type"}},"type":"object","required":["access_token","token_type"],"title":"BearerResponse"},"Body_auth_cookie_login_auth_cookie_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_auth_cookie_login_auth_cookie_login_post"},"Body_auth_jwt_login_auth_jwt_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_auth_jwt_login_auth_jwt_login_post"},"Body_handle_forgot_password_user_forgot_password_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_handle_forgot_password_user_forgot_password_post"},"Body_handle_login_user_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"},"g-recaptcha-response":{"type":"string","title":"G-Recaptcha-Response","default":""},"captcha-version":{"type":"string","title":"Captcha-Version","default":"v3"}},"type":"object","required":["username","password"],"title":"Body_handle_login_user_login_post"},"Body_handle_registration_user_register_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"phone":{"type":"string","title":"Phone"},"company":{"type":"string","title":"Company"},"tandc":{"type":"boolean","title":"Tandc"},"g-recaptcha-response":{"type":"string","title":"G-Recaptcha-Response","default":""},"captcha-version":{"type":"string","title":"Captcha-Version","default":"v3"}},"type":"object","required":["email","password"],"title":"Body_handle_registration_user_register_post"},"Body_handle_reset_password_submission_user_reset_password_post":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"Body_handle_reset_password_submission_user_reset_password_post"},"Body_handle_verify_user_verify_post":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Body_handle_verify_user_verify_post"},"Body_reset_forgot_password_auth_forgot_password_post":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"Body_reset_forgot_password_auth_forgot_password_post"},"Body_reset_reset_password_auth_reset_password_post":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"Body_reset_reset_password_auth_reset_password_post"},"Body_verify_request_token_auth_request_verify_token_post":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"Body_verify_request_token_auth_request_verify_token_post"},"Body_verify_verify_auth_verify_post":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Body_verify_verify_auth_verify_post"},"ErrorModel":{"properties":{"detail":{"anyOf":[{"type":"string"},{"additionalProperties":{"type":"string"},"type":"object"}],"title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorModel"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","default":true},"is_superuser":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superuser","default":false},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified","default":false},"first_name":{"type":"string","maxLength":100,"minLength":1,"title":"First Name"},"last_name":{"type":"string","maxLength":100,"minLength":1,"title":"Last Name"},"phone":{"anyOf":[{"type":"string","pattern":"^\\+?[\\d\\s\\-()\\[\\]]{7,20}$"},{"type":"null"}],"title":"Phone"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"tandc":{"type":"boolean","title":"Tandc","default":false}},"type":"object","required":["email","password","first_name","last_name"],"title":"UserCreate","description":"Schema for new user registration."},"UserRead":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_superuser":{"type":"boolean","title":"Is Superuser","default":false},"is_verified":{"type":"boolean","title":"Is Verified","default":false},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"tandc":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tandc"}},"type":"object","required":["id","email"],"title":"UserRead","description":"Schema returned for user reads.  Extends the base with SSF extras."},"UserUpdate":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"is_superuser":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superuser"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified"},"first_name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Last Name"},"phone":{"anyOf":[{"type":"string","pattern":"^\\+?[\\d\\s\\-()\\[\\]]{7,20}$"},{"type":"null"}],"title":"Phone"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"tandc":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tandc"}},"type":"object","title":"UserUpdate","description":"Schema for user self-updates (PATCH /users/me)."},"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"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/auth/jwt/login"}}},"APIKeyCookie":{"type":"apiKey","in":"cookie","name":"ssapi_session"},"HTTPBasic":{"type":"http","scheme":"basic"}}},"tags":[{"name":"pvlive","description":"PV_Live API endpoints."},{"name":"pvlive_eu","description":"PV_Live EU API endpoints."},{"name":"pvforecast","description":"PV_Forecast API endpoints."}]}