{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","description":"\n# Jua Query Engine API\n\nAccess to Jua's weather forecast and energy market data.\n\n## Features\n\n- Query forecast data for specific locations, regions, or market zones\n- Access multiple forecast models with various resolutions and update frequencies\n- Query ENTSOE energy market data including prices, load, and generation\n- Retrieve data in JSON or Apache Arrow format for efficient processing\n- Stream large datasets with optional streaming response\n- Advanced aggregation and grouping capabilities\n- Estimate credit consumption before executing queries\n\n## Authentication\nInclude your API key in the `X-API-Key` header:\n```\nX-API-Key: your_api_key_id:your_api_key_secret\n```\n\n## Documentation\n\nFor detailed guides, tutorials, and examples, visit our documentation at [docs.jua.ai](https://docs.jua.ai).\n\n## Rate Limiting\n\nAPI requests are subject to rate limiting based on your subscription plan.\n        ","version":"0.1.0"},"servers":[{"url":"https://query.jua.ai","description":"Production"}],"paths":{"/v1/forecast/meta":{"get":{"tags":["forecast"],"summary":"Get forecast models metadata","description":"Retrieve metadata for available forecast models including:\n- Available weather variables for each model\n- Spatial grid resolution information\n- Model identifiers\n\nUse this endpoint to discover which models and variables are available before making data queries.\n\n**Authentication**: Requires API key.\n\nFor detailed model specifications and variable descriptions, visit [docs.jua.ai](https://docs.jua.ai).","operationId":"get_meta_v1_forecast_meta_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"models","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/Model"}},{"type":"null"}],"description":"Filter by specific model(s). If not provided, returns all models","title":"Models"},"description":"Filter by specific model(s). If not provided, returns all models"}],"responses":{"200":{"description":"Successfully retrieved model metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaQueryResult"},"example":{"models":[{"model":"ept2","variables":["air_temperature_at_height_level_2m","wind_speed_at_height_level_100m"],"grid":{"num_latitudes":2160,"num_longitudes":4320}}]}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast/available-forecasts":{"get":{"tags":["forecast"],"summary":"List available forecasts","description":"List all available forecast initialization times for specified models with optional time filtering.\n\nReturns forecast init times and maximum available lead times, useful for:\n- Discovering historical forecast availability\n- Finding specific forecast runs\n- Monitoring forecast data updates\n\n**Authentication**: Requires API key.\n\nResults are paginated. Use `limit` and `offset` parameters to navigate through large result sets.\n\nFor forecast schedules and update frequencies, see [docs.jua.ai](https://docs.jua.ai).","operationId":"get_available_forecasts_v1_forecast_available_forecasts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"models","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/Model"}},{"type":"null"}],"description":"Filter by specific model(s). If not provided, returns all accessible models with Clickhouse data source","title":"Models"},"description":"Filter by specific model(s). If not provided, returns all accessible models with Clickhouse data source"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only return forecasts initialized on or after this datetime (optional)","examples":["2025-01-01T00:00:00Z","2025-01-01 00:00:00"],"title":"Since"},"description":"Only return forecasts initialized on or after this datetime (optional)"},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only return forecasts initialized before this datetime (optional)","examples":["2025-10-01T00:00:00Z","2025-10-01 00:00:00"],"title":"Before"},"description":"Only return forecasts initialized before this datetime (optional)"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Maximum number of results to return","default":20,"title":"Limit"},"description":"Maximum number of results to return"},{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Number of results to skip for pagination","default":0,"title":"Offset"},"description":"Number of results to skip for pagination"},{"name":"order","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort by init_time: 'desc' (newest first, default) or 'asc' (oldest first). Use 'asc' with limit=1 to find the earliest run.","default":"desc","title":"Order"},"description":"Sort by init_time: 'desc' (newest first, default) or 'asc' (oldest first). Use 'asc' with limit=1 to find the earliest run."}],"responses":{"200":{"description":"Successfully retrieved available forecasts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableForecastsQueryResult"},"example":{"forecasts_per_model":{"ept2":[{"init_time":"2025-01-15T00:00:00Z","max_prediction_timedelta":10080}]},"pagination":{"limit":20,"offset":0}}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast/count":{"get":{"tags":["forecast"],"summary":"Count available forecasts","description":"Get the total count of available forecasts per model with optional time filtering.\n\nUseful for:\n- Checking data availability before querying\n- Monitoring forecast archive growth\n- Validating expected data coverage\n\n**Authentication**: Requires API key.\n\nFor more information on forecast availability, see [docs.jua.ai](https://docs.jua.ai).","operationId":"get_count_v1_forecast_count_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"models","in":"query","required":true,"schema":{"type":"array","items":{"$ref":"#/components/schemas/Model"},"minItems":1,"description":"Filter by specific model(s)","title":"Models"},"description":"Filter by specific model(s)"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only count forecasts initialized on or after this datetime (optional)","examples":["2025-01-01T00:00:00Z","2025-01-01 00:00:00"],"title":"Since"},"description":"Only count forecasts initialized on or after this datetime (optional)"},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only count forecasts initialized before this datetime (optional)","examples":["2025-10-01T00:00:00Z","2025-10-01 00:00:00"],"title":"Before"},"description":"Only count forecasts initialized before this datetime (optional)"}],"responses":{"200":{"description":"Successfully counted forecasts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotalNumberOfForecastsQueryResult"},"example":{"forecasts_per_model":{"ept2":1250,"aifs":980}}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast/latest-init-time":{"get":{"tags":["forecast"],"summary":"Get latest forecast initialization time","description":"Retrieve the most recent forecast initialization time available for each model.\n\nReturns:\n- Latest init_time for each model\n- Maximum available lead time for that forecast\n\n`init_time: \"latest\"` on `POST /v1/forecast/data` means \"latest run that\nexists\", not \"latest run that has finished ingesting\". Use this endpoint\nas a pre-flight when you need a complete horizon before fetching data.\n\nExample — wait until ept2_hrrr has ingested 48 hours (2880 minutes):\n\n```\nGET /v1/forecast/latest-init-time?models=ept2_hrrr&min_prediction_timedelta=2880\n```\n\nThe response's `forecasts_per_model.ept2_hrrr.init_time` is then safe to\nsend as an explicit `init_time` on `POST /v1/forecast/data`. If no run yet\nmeets `min_prediction_timedelta`, the endpoint does not return that model.\n\nUseful for:\n- Getting real-time forecast data with `init_time='latest'`\n- Monitoring forecast update status\n- Validating forecast freshness before a horizon-sensitive fetch\n\n**Authentication**: Requires API key.\n\nFor forecast update schedules, see [docs.jua.ai](https://docs.jua.ai).","operationId":"get_latest_init_time_v1_forecast_latest_init_time_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"models","in":"query","required":true,"schema":{"type":"array","items":{"$ref":"#/components/schemas/Model"},"minItems":1,"description":"Filter by specific model(s)","title":"Models"},"description":"Filter by specific model(s)"},{"name":"min_prediction_timedelta","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Minimum required lead time in minutes. Use this to skip a partially ingested latest run: e.g. 2880 for a 48h horizon.","default":0,"title":"Min Prediction Timedelta"},"description":"Minimum required lead time in minutes. Use this to skip a partially ingested latest run: e.g. 2880 for a 48h horizon."}],"responses":{"200":{"description":"Successfully retrieved latest forecast info","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestForecastInfoQueryResult"},"example":{"forecasts_per_model":{"ept2":{"init_time":"2025-01-15T12:00:00Z","prediction_timedelta":10080}}}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast/data":{"post":{"tags":["forecast"],"summary":"Query forecast data","description":"Main endpoint for querying weather forecast data with full flexibility.\n\n## Features\n- Query by location (point, area, market zone) and time\n- Select specific models and weather variables\n- Support for aggregation and grouping\n- Multiple response formats (JSON, Apache Arrow)\n- Optional streaming for large datasets\n\n## Response Formats\n- **JSON** (`format=json`): Returns columnar JSON `{column: [values], ...}` suitable for small to medium datasets\n- **Arrow** (`format=arrow`): Returns Apache Arrow IPC stream for efficient large dataset handling\n\n## Streaming\nSet `stream=true` for streaming responses with Arrow format. Recommended for queries returning >100k rows.\n\n## Latest init_time and partial runs\n`init_time: \"latest\"` (and integer offset `0`) is the most recent run that\n**exists**, not the most recent run that has finished ingesting. While a run\nis still disseminating, this endpoint clamps the returned horizon to the\nlead times already in ClickHouse and still returns HTTP 200.\n\nWhen a requested run is still short of the requested\n`prediction_timedelta.end` (or still disseminating), the response includes\n`X-Jua-Partial-Model-Runs` with `is_partial: true`. That header is emitted\nfor every caller, not only dashboard `X-Request-Source: data-source`\nrequests.\n\nTo fail instead of receiving a truncated 200, pass `strict=true`. That\nreturns HTTP 409 with `detail.error_type = \"latest_run_incomplete\"` and the\navailable horizon in the JSON body.\n\nTo wait for a complete run without using strict mode, pre-flight\n`GET /v1/forecast/latest-init-time` with `min_prediction_timedelta` equal\nto the horizon you need, then send that `init_time` explicitly — or set\n`latest_min_prediction_timedelta` on this request so `\"latest\"` skips\nruns below that horizon. Example (48h of ept2_hrrr, horizon in minutes):\n\n```\nGET /v1/forecast/latest-init-time?models=ept2_hrrr&min_prediction_timedelta=2880\n```\n\n## Cost Management\nQueries are billed based on data volume, models, and variables. Use:\n- `request_credit_limit`: Set maximum credits to prevent unexpectedly large charges\n- `/cost` endpoint: Estimate costs before executing\n\nFor more details on how the costs are computed, visit [docs.jua.ai/pricing](https://docs.jua.ai/pricing).\n\n**Authentication**: Requires API key.\n\nFor detailed query examples and best practices, visit [docs.jua.ai](https://docs.jua.ai).","operationId":"post_data_v1_forecast_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow formatjson only supports up to 50k rows, arrow supports up to 5M rows without streaming","default":"json","title":"Format"},"description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow formatjson only supports up to 50k rows, arrow supports up to 5M rows without streaming"},{"name":"stream","in":"query","required":false,"schema":{"type":"boolean","description":"Enable streaming response (only with format=arrow). Recommended for queries returning >100k rows.","default":false,"title":"Stream"},"description":"Enable streaming response (only with format=arrow). Recommended for queries returning >100k rows."},{"name":"request_credit_limit","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Maximum credits allowed for this request. Query will fail if estimated cost exceeds this limit","default":50,"title":"Request Credit Limit"},"description":"Maximum credits allowed for this request. Query will fail if estimated cost exceeds this limit"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless."},{"name":"strict","in":"query","required":false,"schema":{"type":"boolean","description":"When true, return HTTP 409 instead of a truncated 200 if the latest (or otherwise requested) run has not ingested the requested prediction_timedelta.end. On the default 200 path, X-Jua-Partial-Model-Runs is set when the horizon was clamped.","default":false,"title":"Strict"},"description":"When true, return HTTP 409 instead of a truncated 200 if the latest (or otherwise requested) run has not ingested the requested prediction_timedelta.end. On the default 200 path, X-Jua-Partial-Model-Runs is set when the horizon was clamped."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastQuery"},"examples":{"point_query":{"summary":"Simple point query","description":"Query temperature and wind at a single location (Berlin). Point coordinates are [latitude, longitude].","value":{"models":["ept2"],"geo":{"type":"point","value":[52.52,13.405],"method":"nearest"},"variables":["air_temperature_at_height_level_2m","wind_speed_at_height_level_100m"],"init_time":"latest","prediction_timedelta":{"start":0,"end":360}}},"market_aggregate":{"summary":"Market zone aggregation","description":"Average wind speed over Germany market zone","value":{"models":["ept2"],"geo":{"type":"market_zone","value":"DE"},"variables":["wind_speed_at_height_level_100m"],"init_time":"2025-01-15T00:00:00","prediction_timedelta":{"start":0,"end":2880},"group_by":["model","init_time","time"],"aggregation":["avg"],"include_time":true}}}}}},"responses":{"200":{"description":"Successfully retrieved forecast data","content":{"application/json":{"schema":{},"example":{"model":["ept2","ept2"],"init_time":["2025-10-15T00:00:00Z","2025-10-15T00:00:00Z"],"latitude":[52.52,52.52],"longitude":[13.4,13.4],"prediction_timedelta":[60,120],"air_temperature_at_height_level_2m":[285.5,286.2]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}},"headers":{"X-Jua-Partial-Model-Runs":{"description":"JSON list of requested runs whose ingested horizon is below the request or the run's expected lead times.","schema":{"type":"string"}}}},"400":{"description":"Invalid query parameters or response size exceeded"},"401":{"description":"Authentication required"},"402":{"description":"Insufficient credits"},"403":{"description":"Insufficient permissions or model not in subscription"},"409":{"description":"strict=true and the latest (or otherwise requested) run has not ingested the requested prediction_timedelta.end","content":{"application/json":{"example":{"detail":{"reason":"latest_run_incomplete","error_type":"latest_run_incomplete","available_max_prediction_timedelta":900,"requested_max_prediction_timedelta":2880,"init_time":"2026-05-07T13:00:00+00:00","model":"ept2_hrrr"}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast/index":{"post":{"tags":["forecast"],"summary":"Query forecast data index","description":"Endpoint to obtain the index for weather forecasts.\n\n**Authentication**: Requires API key.\n\nFor detailed query examples and best practices, visit [docs.jua.ai](https://docs.jua.ai).","operationId":"post_forecast_index_v1_forecast_index_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_credit_limit","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Maximum credits allowed for this request. Query will fail if estimated cost exceeds this limit","default":50,"title":"Request Credit Limit"},"description":"Maximum credits allowed for this request. Query will fail if estimated cost exceeds this limit"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastIndexQuery"},"examples":{"european_hindcast":{"summary":"Simple point query","description":"Query temperature and wind at a single location","value":{"model":"ept2","latitude":[32,71],"longitude":[-15,50],"variables":["air_temperature_at_height_level_2m","wind_speed_at_height_level_100m"],"init_time":{"start":"2025-01-01T00:00:00Z","end":"2025-01-31T23:59:59Z"},"prediction_timedelta":{"start":0,"end":120},"timedelta_unit":"h"}}}}}},"responses":{"200":{"description":"Successfully retrieved forecast data","content":{"application/json":{"schema":{},"example":{"init_time":["2025-10-15T00:00:00Z","2025-10-15T06:00:00Z"],"latitude":[52.0,52.25,52.5],"longitude":[13,13.25],"prediction_timedelta":[0,60,120,180],"variables":["air_temperature_at_height_level_2m"]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters or response size exceeded"},"401":{"description":"Authentication required"},"402":{"description":"Insufficient credits"},"403":{"description":"Insufficient permissions or model not in subscription"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast/":{"get":{"tags":["forecast"],"summary":"Query forecast data (simple)","description":"Simplified GET endpoint for querying forecast data at a single point location.\n\nThis endpoint provides a simpler interface compared to POST `/data` for basic point queries.\nUse this for quick lookups at specific coordinates.\n\n**Limitations**:\n- Point queries only (no areas or market zones)\n- JSON response format only (no Arrow or streaming)\n- No grouping or aggregation support\n\nFor advanced queries with aggregation, multiple locations, or Arrow format, use POST `/data`.\n\n**Authentication**: Requires API key.\n\nSee [docs.jua.ai](https://docs.jua.ai/) for examples.","operationId":"get_data_simple_v1_forecast__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"models","in":"query","required":true,"schema":{"type":"array","items":{"$ref":"#/components/schemas/Model"},"description":"List of forecast models to query","title":"Models"},"description":"List of forecast models to query"},{"name":"init_time","in":"query","required":true,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"const":"latest","type":"string"}],"description":"Forecast initialization time (ISO 8601 format) or 'latest' for most recent forecast","title":"Init Time"},"description":"Forecast initialization time (ISO 8601 format) or 'latest' for most recent forecast"},{"name":"latitude","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"description":"Latitude of query point in degrees (-90 to 90)","title":"Latitude"},"description":"Latitude of query point in degrees (-90 to 90)"},{"name":"longitude","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"description":"Longitude of query point in degrees (-180 to 180)","title":"Longitude"},"description":"Longitude of query point in degrees (-180 to 180)"},{"name":"method","in":"query","required":false,"schema":{"enum":["nearest","bilinear"],"type":"string","description":"Interpolate or return the nearest value","default":"nearest","title":"Method"},"description":"Interpolate or return the nearest value"},{"name":"variables","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/CustomerVariable"}},{"type":"null"}],"description":"Weather variables to query. If not specified, returns all available variables","title":"Variables"},"description":"Weather variables to query. If not specified, returns all available variables"},{"name":"time_zone","in":"query","required":false,"schema":{"type":"string","description":"IANA time zone name for time formatting","default":"GMT","title":"Time Zone"},"description":"IANA time zone name for time formatting"},{"name":"include_time","in":"query","required":false,"schema":{"type":"boolean","description":"Include forecast valid time column","default":true,"title":"Include Time"},"description":"Include forecast valid time column"},{"name":"min_prediction_timedelta","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Minimum lead time, expressed in `timedelta_unit` (default hours)","default":0,"title":"Min Prediction Timedelta"},"description":"Minimum lead time, expressed in `timedelta_unit` (default hours)"},{"name":"max_prediction_timedelta","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum lead time, expressed in `timedelta_unit` (default hours)","title":"Max Prediction Timedelta"},"description":"Maximum lead time, expressed in `timedelta_unit` (default hours)"},{"name":"timedelta_unit","in":"query","required":false,"schema":{"enum":["h","m","d","hour","hourly","hours","minute","minutes","day","days"],"type":"string","description":"Unit for min/max_prediction_timedelta. 'h' hours (default), 'm' minutes, 'd' days. Defaults to hours for backward compatibility.","default":"h","title":"Timedelta Unit"},"description":"Unit for min/max_prediction_timedelta. 'h' hours (default), 'm' minutes, 'd' days. Defaults to hours for backward compatibility."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip for pagination","default":0,"title":"Offset"},"description":"Number of results to skip for pagination"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Maximum number of results to return","default":10000,"title":"Limit"},"description":"Maximum number of results to return"},{"name":"request_credit_limit","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Maximum credits allowed for this request","default":5,"title":"Request Credit Limit"},"description":"Maximum credits allowed for this request"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless."},{"name":"include_ensemble_members","in":"query","required":false,"schema":{"type":"boolean","description":"When true, return per-ensemble-member rows instead of ensemble-mean rows. Not supported for ept2_e.","default":false,"title":"Include Ensemble Members"},"description":"When true, return per-ensemble-member rows instead of ensemble-mean rows. Not supported for ept2_e."}],"responses":{"200":{"description":"Successfully retrieved forecast data","content":{"application/json":{"schema":{},"example":{"model":["ept2","ept2"],"init_time":["2025-01-15T00:00:00Z","2025-01-15T00:00:00Z"],"latitude":[52.52,52.52],"longitude":[13.4,13.4],"prediction_timedelta":[60,120],"air_temperature_at_height_level_2m":[285.5,286.2]}}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"402":{"description":"Insufficient credits"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast/market-aggregate":{"get":{"tags":["forecast"],"summary":"Query market-aggregated forecast data","description":"Simplified GET endpoint for querying weighted-average forecasts over market zones or countries.\n\nAutomatically applies weighted aggregation based on capacity (wind/solar) or population distribution.\nUseful for energy market analysis and regional forecasting.\n\n**Common Use Cases**:\n- Wind power generation forecasts for market zones (weighted by wind capacity)\n- Solar power generation forecasts (weighted by solar capacity)\n- Population-weighted temperature averages for countries\n\n**Weighting Options**:\n- `wind_capacity`: Weight by installed wind power capacity\n- `solar_capacity`: Weight by installed solar power capacity  \n- `population`: Weight by population density\n\n**Limitations**:\n- JSON response format only (no Arrow or streaming)\n- Must specify either `market_zones` OR `country_keys` (not both)\n\nFor advanced aggregation queries, use POST `/data` with `group_by` and `weighting` parameters.\n\n**Authentication**: Requires API key.\n\nSee [docs.jua.ai](https://docs.jua.ai/) for examples.","operationId":"get_market_aggregate_simple_v1_forecast_market_aggregate_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"models","in":"query","required":true,"schema":{"type":"array","items":{"$ref":"#/components/schemas/Model"},"description":"List of forecast models to query","title":"Models"},"description":"List of forecast models to query"},{"name":"init_time","in":"query","required":true,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"const":"latest","type":"string"}],"description":"Forecast initialization time (ISO 8601 format) or 'latest' for most recent forecast","title":"Init Time"},"description":"Forecast initialization time (ISO 8601 format) or 'latest' for most recent forecast"},{"name":"weighting","in":"query","required":true,"schema":{"enum":["wind_capacity","solar_capacity","population"],"type":"string","description":"Weighting scheme for aggregation","title":"Weighting"},"description":"Weighting scheme for aggregation"},{"name":"market_zones","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Energy market zone codes (e.g., ['DE', 'FR']). Mutually exclusive with country_keys","title":"Market Zones"},"description":"Energy market zone codes (e.g., ['DE', 'FR']). Mutually exclusive with country_keys"},{"name":"country_keys","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"ISO country codes (e.g., ['DE', 'US']). Mutually exclusive with market_zones","title":"Country Keys"},"description":"ISO country codes (e.g., ['DE', 'US']). Mutually exclusive with market_zones"},{"name":"variables","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/CustomerVariable"}},{"type":"null"}],"description":"Weather variables to query. If not specified, returns all available variables","title":"Variables"},"description":"Weather variables to query. If not specified, returns all available variables"},{"name":"time_zone","in":"query","required":false,"schema":{"type":"string","description":"IANA time zone name for time formatting","default":"GMT","title":"Time Zone"},"description":"IANA time zone name for time formatting"},{"name":"include_time","in":"query","required":false,"schema":{"type":"boolean","description":"Include forecast valid time column","default":true,"title":"Include Time"},"description":"Include forecast valid time column"},{"name":"min_prediction_timedelta","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Minimum lead time, expressed in `timedelta_unit` (default hours)","default":0,"title":"Min Prediction Timedelta"},"description":"Minimum lead time, expressed in `timedelta_unit` (default hours)"},{"name":"max_prediction_timedelta","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum lead time, expressed in `timedelta_unit` (default hours)","title":"Max Prediction Timedelta"},"description":"Maximum lead time, expressed in `timedelta_unit` (default hours)"},{"name":"timedelta_unit","in":"query","required":false,"schema":{"enum":["h","m","d","hour","hourly","hours","minute","minutes","day","days"],"type":"string","description":"Unit for min/max_prediction_timedelta. 'h' hours (default), 'm' minutes, 'd' days. Defaults to hours for backward compatibility.","default":"h","title":"Timedelta Unit"},"description":"Unit for min/max_prediction_timedelta. 'h' hours (default), 'm' minutes, 'd' days. Defaults to hours for backward compatibility."},{"name":"temporal_resolution","in":"query","required":false,"schema":{"anyOf":[{"enum":[15,30,60,120,180,240,300,360],"type":"integer"},{"type":"null"}],"description":"Requested temporal resolution in minutes. Values finer than the model's native step trigger interpolation; coarser values downsample. Allowed: 15, 30, 60, 120, 180, 240, 300, 360.","title":"Temporal Resolution"},"description":"Requested temporal resolution in minutes. Values finer than the model's native step trigger interpolation; coarser values downsample. Allowed: 15, 30, 60, 120, 180, 240, 300, 360."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip for pagination","default":0,"title":"Offset"},"description":"Number of results to skip for pagination"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"Maximum number of results to return","default":10000,"title":"Limit"},"description":"Maximum number of results to return"},{"name":"unit","in":"query","required":false,"schema":{"enum":["weather","mw"],"type":"string","description":"Output unit. 'weather': capacity-weighted raw weather. 'mw': apply power curves and return predicted MW.","default":"weather","title":"Unit"},"description":"Output unit. 'weather': capacity-weighted raw weather. 'mw': apply power curves and return predicted MW."},{"name":"debias","in":"query","required":false,"schema":{"type":"boolean","description":"When unit='mw' and market_zones is set, apply leakage-safe walk-forward MW debiasing. Wind uses an eight-week fitting window and solar uses four weeks; both retain a seven-day exclusion gap. Not supported with country_keys. Raw MW remains the default.","default":false,"title":"Debias"},"description":"When unit='mw' and market_zones is set, apply leakage-safe walk-forward MW debiasing. Wind uses an eight-week fitting window and solar uses four weeks; both retain a seven-day exclusion gap. Not supported with country_keys. Raw MW remains the default."},{"name":"request_credit_limit","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Maximum credits allowed for this request","default":50,"title":"Request Credit Limit"},"description":"Maximum credits allowed for this request"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless."}],"responses":{"200":{"description":"Successfully retrieved aggregated forecast data","content":{"application/json":{"schema":{},"example":{"model":["ept2"],"init_time":["2025-01-15T00:00:00Z"],"time":["2025-01-15T06:00:00Z"],"prediction_timedelta":[360],"wind_speed_at_height_level_100m":[8.5]}}}},"400":{"description":"Invalid parameters (must specify market_zones OR country_keys)"},"401":{"description":"Authentication required"},"402":{"description":"Insufficient credits"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast/market-aggregate/mw-zones":{"get":{"tags":["forecast"],"summary":"List market zones capable of MW output","description":"Return market zones that have both facility data and fitted power curves.\n\nThis is a metadata endpoint. Authentication is optional: credentials are\nhonoured for caller attribution when present, and the endpoint remains\ncallable anonymously for backwards compatibility with released SDK versions.\n\nA zone is MW-capable for wind if it has operating wind facilities\n*and* corresponding entries in the wind power-curve tables.\nSame logic applies for solar.\n\nResults are cached in-memory for 5 minutes.","operationId":"get_mw_zones_v1_forecast_market_aggregate_mw_zones_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MWZonesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]},{}]}},"/v1/status/subjects":{"get":{"tags":["status"],"summary":"List published forecast-status subjects","operationId":"get_subjects_v1_status_subjects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubjectsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/status/summary":{"get":{"tags":["status"],"summary":"Per-subject status summary for the caller's audience","operationId":"get_summary_v1_status_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subjects","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Subjects"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/runs":{"get":{"tags":["status"],"summary":"Customer-facing run statuses, newest first","operationId":"get_runs_v1_status_runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subjects","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Subjects"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Before"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/attributions":{"get":{"tags":["status"],"summary":"Customer-visible delay attributions overlapping the window","operationId":"get_attributions_v1_status_attributions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subjects","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Subjects"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttributionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/stats":{"get":{"tags":["status"],"summary":"Per-subject run statistics for the caller's audience","operationId":"get_stats_v1_status_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subjects","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Subjects"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/station-benchmarks/metrics":{"post":{"tags":["benchmarks"],"summary":"Query station benchmark metrics","description":"Query benchmark metrics (RMSE, MAE, bias, CRPS, quantiles) for forecast models evaluated against weather station observations.\n\nCRPS (Continuous Ranked Probability Score) is derived from the per-ensemble-member forecast errors; for deterministic models it equals MAE.\n\nFor calibratable Jua ensemble models, CRPS reflects the delivered-product spread calibration by default. Set `calibrate=false` to evaluate the raw ensemble spread instead.\n\n**Metric selection**: By default all metrics are computed and returned. Pass `metrics` (any of `rmse`, `mae`, `bias`, `crps`) to compute and return only those. Requesting only mean-based metrics (`rmse`/`mae`/`bias`) is significantly faster for ensemble models, since CRPS is the only metric that needs the per-ensemble-member distribution.\n\nUseful for:\n- Comparing forecast model performance\n- Evaluating model accuracy by region\n- Analyzing forecast errors over time\n\n**Multi-Model Support**:\n- Query multiple models in a single request to compare performance\n- Results include model name in each row for easy comparison\n\n**Geographic Filtering**:\n- `market_zone`: Filter by energy market zone (e.g., \"DE\", \"FR\")\n- `country_key`: Filter by country code (e.g., \"DE\", \"US\")\n\n**Note**: Either `station_ids` or `geo` must be provided (mutually exclusive).\n\n**Authentication**: Requires API key.\n\nFor more information on benchmark metrics, see [docs.jua.ai](https://docs.jua.ai).","operationId":"post_station_metrics_v1_station_benchmarks_metrics_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow IPC stream","default":"json","title":"Format"},"description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow IPC stream"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StationBenchmarkQuery"},"examples":{"market_zone_query":{"summary":"Query by market zone","description":"Get benchmark metrics for Germany market zone","value":{"models":["ept2"],"geo":{"type":"market_zone","value":"DE"},"start_time":"2024-10-01T00:00:00Z","end_time":"2024-10-07T00:00:00Z","variables":["air_temperature_at_height_level_2m"]}},"multi_model_query":{"summary":"Compare multiple models","description":"Get benchmark metrics for multiple models to compare performance","value":{"models":["ept2","aifs"],"geo":{"type":"country_key","value":"US"},"start_time":"2024-10-01T00:00:00Z","end_time":"2024-10-07T00:00:00Z","variables":["air_temperature_at_height_level_2m","wind_speed_at_height_level_10m"]}},"single_metric_query":{"summary":"Request a single metric (faster)","description":"Compute and return only RMSE. Requesting only mean-based metrics (rmse/mae/bias) skips the per-ensemble-member computation CRPS requires, so it is much faster for ensemble models.","value":{"models":["ecmwf_ens"],"geo":{"type":"country_key","value":"DE"},"start_time":"2024-10-01T00:00:00Z","end_time":"2024-10-07T00:00:00Z","variables":["air_temperature_at_height_level_2m"],"metrics":["rmse"]}}}}}},"responses":{"200":{"description":"Successfully retrieved benchmark metrics","content":{"application/json":{"schema":{},"example":{"model":["ept2","ept2","ept2","ept2"],"prediction_timedelta":[60,60,60,60],"variable":["air_temperature_at_height_level_2m","air_temperature_at_height_level_2m","air_temperature_at_height_level_2m","air_temperature_at_height_level_2m"],"metric":["rmse","mae","bias","crps"],"avg":[1.23,0.98,-0.12,0.91]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/station-benchmarks/available-dates":{"get":{"tags":["benchmarks"],"summary":"Get available benchmark dates","description":"Retrieve available dates for station benchmark data with optional filtering.\n\nUseful for:\n- Discovering available benchmark data\n- Finding recent benchmark dates\n- Planning benchmark queries\n\n**Authentication**: Requires API key.\n\nFor more information, see [docs.jua.ai](https://docs.jua.ai).","operationId":"get_available_dates_v1_station_benchmarks_available_dates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional model name to filter by","title":"Model"},"description":"Optional model name to filter by"},{"name":"days_lookback","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Number of days to look back from today","default":365,"title":"Days Lookback"},"description":"Number of days to look back from today"}],"responses":{"200":{"description":"Successfully retrieved available dates","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableDatesResponse"},"example":{"dates":["2024-10-15","2024-10-14","2024-10-13"]}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"500":{"description":"Internal server error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/station-benchmarks/solar-coverage":{"get":{"tags":["benchmarks"],"summary":"Get solar-benchmark geographic coverage","description":"List the country and market-zone codes that have at least one audited solar\nradiation station.\n\nThe surface-solar-radiation benchmark is scored only over stations that passed\nthe offline radiation quality audit (a much smaller set than the synoptic\nnetwork). This endpoint returns the regions where a solar country / market-zone\nbenchmark can actually be computed, so the dashboard can restrict the\nsolar-benchmark region pickers to non-empty selections.\n\n**Authentication**: Requires API key.","operationId":"get_solar_station_coverage_v1_station_benchmarks_solar_coverage_get","responses":{"200":{"description":"Successfully retrieved solar coverage","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolarStationCoverageResponse"},"example":{"country_keys":["DE","FR","ES"],"market_zones":["DE","FR","ES"]}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/entsoe/data":{"post":{"tags":["entsoe"],"summary":"Query ENTSOE timeseries data","description":"Query ENTSOE energy market timeseries data including:\n- Day-ahead and imbalance prices\n- Load and generation actuals and forecasts\n- Cross-border flows and scheduled exchanges\n- Wind and solar forecasts\n\n**Supported Variables:**\n- `day_ahead_prices`: Day-ahead electricity market prices\n- `imbalance_prices`: Imbalance settlement prices\n- `load_actual`: Actual total load\n- `load_forecast_da`: Day-ahead load forecast\n- `generation_actual`: Actual power generation by source type\n- `generation_forecast_da`: Day-ahead generation forecast\n- `crossborder_flows`: Physical cross-border power flows\n- `wind_solar_forecast_da`: Day-ahead wind/solar forecast\n- And more...\n\n**Response Formats:**\n- `json`: Columnar JSON format `{column: [values], ...}`\n- `arrow`: Apache Arrow IPC stream for efficient processing\n\n**Authentication**: Requires API key.\n\nFor more information, see [docs.jua.ai](https://docs.jua.ai).","operationId":"post_entsoe_data_v1_entsoe_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format","default":"json","title":"Format"},"description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntsoeTimeseriesQuery"},"examples":{"day_ahead_prices":{"summary":"Query day-ahead prices","description":"Get day-ahead electricity prices for Germany-Luxembourg","value":{"variables":["day_ahead_prices"],"zone_keys":["DE_LU"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-15T00:00:00Z"}},"generation_by_source":{"summary":"Query generation by source","description":"Get actual generation data for solar and wind","value":{"variables":["generation_actual"],"zone_keys":["DE_LU"],"psr_types":["Solar","Wind Onshore","Wind Offshore"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-07T00:00:00Z"}},"crossborder_flows":{"summary":"Query cross-border flows","description":"Get physical power flows from Germany to France","value":{"variables":["crossborder_flows"],"zone_from":["DE_LU"],"zone_to":["FR"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-07T00:00:00Z"}}}}}},"responses":{"200":{"description":"Successfully retrieved ENTSOE data","content":{"application/json":{"schema":{},"example":{"time":["2025-12-01T00:00:00Z","2025-12-01T01:00:00Z"],"variable_name":["day_ahead_prices","day_ahead_prices"],"zone_key":["DE_LU","DE_LU"],"zone_key_from":["",""],"zone_key_to":["",""],"psr_type":["",""],"other_type":["",""],"value":[85.5,82.3],"unit":["EUR/MWh","EUR/MWh"],"currency":["EUR","EUR"]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/entsoe/pivoted":{"post":{"tags":["entsoe"],"summary":"Query ENTSOE data in pivoted wide-column format","description":"Returns ENTSO-E generation+load data pivoted into one column per PSR type, with optional derived columns (wind_total, renewables_total, residual_load) and linear interpolation — all computed inside ClickHouse.","operationId":"post_entsoe_pivoted_v1_entsoe_pivoted_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' or 'arrow'","default":"json","title":"Format"},"description":"Response format: 'json' or 'arrow'"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntsoePivotedQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/entsoe/outages":{"post":{"tags":["entsoe"],"summary":"Query ENTSOE outages data","description":"Query all ENTSOE infrastructure unavailability document types.\n\n**Features:**\n- **Source Types:** Load, production units, transmission, offshore grid, or generation units\n- **Time Filtering:** Real-time snapshots (active_at) or schedule ranges (start_from/to)\n- **Announcement Filtering:** announced_as_of returns only outages the TSO had\n  published by that instant (created_doc_time <= announced_as_of) — reconstruct\n  what the market knew when an auction cleared\n- **Filtering:** Filter by zone, plant type, business type (planned/forced)\n- **Aggregation:** aggregate_capacity=true returns summed unavailable capacity\n  by zone/plant_type/businesstype (latest-revision dedup + step-curve collapse;\n  peak by default, or point-in-time via aggregate_at). Generation outages only\n\n**Authentication**: Requires API key.","operationId":"post_entsoe_outages_v1_entsoe_outages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format","default":"json","title":"Format"},"description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntsoeOutagesQuery"},"examples":{"active_generation_outages":{"summary":"Active Generation Outages","description":"Get currently active generation outages in Germany","value":{"source_type":"generation_unit","biddingzone_domain":["DE_LU"],"active_at":"2025-12-01T12:00:00Z"}},"transmission_schedule":{"summary":"Transmission Schedule","description":"Planned maintenance for France-Germany lines","value":{"source_type":"transmission","in_domain":["FR"],"out_domain":["DE_LU"],"start_from":"2025-12-01T00:00:00Z","business_types":["Planned maintenance"]}},"known_at_auction_time":{"summary":"Outages known when an auction cleared","description":"German generation outages overlapping a delivery day that the TSO had already published by the intraday gate — reconstructs the information set that priced the intraday auction.","value":{"source_type":"generation_unit","biddingzone_domain":["DE_LU"],"start_from":"2025-12-01T00:00:00Z","start_to":"2025-12-02T00:00:00Z","announced_as_of":"2025-11-30T15:00:00Z","aggregate_capacity":true}}}}}},"responses":{"200":{"description":"Successfully retrieved outages data","content":{"application/json":{"schema":{},"example":{}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/entsoe/variables":{"get":{"tags":["entsoe"],"summary":"List available ENTSOE variables","description":"Get a list of available ENTSOE variable types with metadata including:\n- Variable name\n- Description\n- Unit of measurement\n- Whether variable uses zone_key, zone_from/zone_to, or psr_type filters\n\n**Authentication**: Requires API key.","operationId":"get_entsoe_variables_v1_entsoe_variables_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"zone_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional zone to filter variables by","title":"Zone Key"},"description":"Optional zone to filter variables by"}],"responses":{"200":{"description":"Successfully retrieved variable list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jua_query_v2__entsoe__types__AvailableVariablesResult"},"example":{"variables":[{"name":"day_ahead_prices","description":"Day-ahead electricity market prices","unit":"EUR/MWh","uses_zone_key":true,"uses_zone_from_to":false,"uses_psr_type":false}]}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/entsoe/zones":{"get":{"tags":["entsoe"],"summary":"List available ENTSOE zones","description":"Get a list of available zone codes (bidding zones, countries).\n\nOptionally filter by variable to see which zones have data for a specific variable.\n\n**Authentication**: Requires API key.","operationId":"get_entsoe_zones_v1_entsoe_zones_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"variable","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/EntsoeVariable"},{"type":"null"}],"description":"Optional variable to filter zones by","title":"Variable"},"description":"Optional variable to filter zones by"}],"responses":{"200":{"description":"Successfully retrieved zone list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableZonesResult"},"example":{"zones":["AT","BE","CH","DE","DK_1","DK_2","FR","NL"]}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/entsoe/psr-types":{"get":{"tags":["entsoe"],"summary":"List available PSR types","description":"Get a list of available PSR (Production Source Type) codes for generation data.\n\nPSR types include:\n- Solar, Wind Onshore, Wind Offshore\n- Nuclear, Hydro (various types)\n- Fossil fuels (Gas, Coal, Oil, etc.)\n- Biomass, Geothermal, etc.\n\n**Authentication**: Requires API key.","operationId":"get_entsoe_psr_types_v1_entsoe_psr_types_get","responses":{"200":{"description":"Successfully retrieved PSR type list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailablePsrTypesResult"},"example":{"psr_types":["Biomass","Fossil Gas","Nuclear","Solar","Wind Offshore","Wind Onshore"]}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/netztransparenz/data":{"post":{"tags":["netztransparenz"],"summary":"Query Netztransparenz timeseries data","description":"Query German TSO transparency data (netztransparenz.de) including:\n- NRV balance (grid control cooperation)\n- Balancing energy prices (reBAP, ID-AEP, AEP estimator)\n- Reserve power activation (aFRR, mFRR, FCR)\n- Renewable energy marketing and forecasts\n- Emergency measures (additional measures, emergency assistance, interruptible loads)\n\n**TSOs (Transmission System Operators):**\n- 50Hertz (Eastern Germany)\n- Amprion (Western Germany)\n- TenneT TSO (Northern Germany)\n- TransnetBW (Southern Germany)\n- gesamt (Germany-wide aggregate)\n\n**Variables with Per-TSO Data:**\nReserve activation (aktivierte_srl_*, aktivierte_mrl_*, srl_optimierung_*, mrl_optimierung_*,\ndifference_*, prl_*, zusatzmassnahmen_*, nothilfe_*), interruptible loads (abschaltbare_lasten_*),\nand control area balance (rz_saldo_*) have data for all 4 individual TSOs plus the gesamt aggregate.\n\n**Response Formats:**\n- `json`: Columnar JSON format `{column: [values], ...}`\n- `arrow`: Apache Arrow IPC stream for efficient processing\n\n**Authentication**: Requires API key.","operationId":"post_netztransparenz_data_v1_netztransparenz_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format","default":"json","title":"Format"},"description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetztransparenzTimeseriesQuery"},"examples":{"nrv_balance":{"summary":"Query NRV balance","description":"Get operational NRV balance data","value":{"variables":["nrv_saldo_betrieblich"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-02T00:00:00Z"}},"balancing_prices":{"summary":"Query balancing prices","description":"Get reBAP balancing energy prices","value":{"variables":["rebap_qualitaetsgesichert"],"directions":["positive","negative"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-07T00:00:00Z"}},"reserve_activation_by_tso":{"summary":"Query reserve activation by TSO","description":"Get secondary reserve activation data with direction filter","value":{"variables":["aktivierte_srl_betrieblich"],"directions":["positive","negative"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-02T00:00:00Z"}},"renewable_forecasts":{"summary":"Query renewable generation forecasts","description":"Get day-ahead solar and wind forecasts","value":{"variables":["hochrechnung_solar","hochrechnung_wind"],"start_time":"2025-12-01T00:00:00Z","aggregation":"hourly"}}}}}},"responses":{"200":{"description":"Successfully retrieved Netztransparenz data","content":{"application/json":{"schema":{},"example":{"time":["2025-12-01T00:00:00Z","2025-12-01T00:15:00Z"],"ts_end":["2025-12-01T00:15:00Z","2025-12-01T00:30:00Z"],"variable_name":["nrv_saldo_betrieblich","nrv_saldo_betrieblich"],"subcategory":["",""],"value":[150.5,-82.3],"value_name":["",""],"unit":["MW","MW"],"tso":["",""],"direction":["",""]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/netztransparenz/variables":{"get":{"tags":["netztransparenz"],"summary":"List available Netztransparenz variables","description":"Get a list of available Netztransparenz variable types with metadata including:\n- Variable name\n- Description\n- Unit of measurement\n- Whether variable uses TSO or subcategory filters\n\n**Variable Categories:**\n- Renewable Marketing (vermarktung_*)\n- Day-Ahead Forecast (hochrechnung_*)\n- NRV Balance (nrv_saldo_*, rz_saldo_*)\n- Balancing Prices (rebap_qualitaetsgesichert, idaep, aep_schaetzer_*)\n- Reserve Activation (aktivierte_srl_*, aktivierte_mrl_*, prl_*)\n- Emergency Measures (zusatzmassnahmen_*, nothilfe_*, abschaltbare_lasten_*)\n\n**Authentication**: Requires API key.","operationId":"get_netztransparenz_variables_v1_netztransparenz_variables_get","responses":{"200":{"description":"Successfully retrieved variable list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jua_query_v2__netztransparenz__types__AvailableVariablesResult"},"example":{"variables":[{"name":"nrv_saldo_betrieblich","description":"NRV balance - operational (real-time)","unit":"MW","uses_tso":false,"uses_subcategory":false,"uses_direction":false}]}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/netztransparenz/tsos":{"get":{"tags":["netztransparenz"],"summary":"List available TSOs","description":"Get a list of available German Transmission System Operators (TSOs).\n\nThe four TSOs operating the German high-voltage grid, plus the aggregate:\n- **50Hertz** - Eastern Germany\n- **Amprion** - Western Germany\n- **TenneT TSO** - Northern Germany\n- **TransnetBW** - Southern Germany\n- **gesamt** - Germany-wide aggregate (sum of all TSOs)\n\nOptionally filter by variable to see which TSOs have data for a specific variable.\nMany reserve activation variables now have per-TSO data in addition to the aggregate.\n\n**Authentication**: Requires API key.","operationId":"get_netztransparenz_tsos_v1_netztransparenz_tsos_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"variable","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/NetztransparenzVariable"},{"type":"null"}],"description":"Optional variable to filter TSOs by","title":"Variable"},"description":"Optional variable to filter TSOs by"}],"responses":{"200":{"description":"Successfully retrieved TSO list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableTsosResult"},"example":{"tsos":["50Hertz","Amprion","TenneT TSO","TransnetBW","gesamt"]}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/netztransparenz/subcategories":{"get":{"tags":["netztransparenz"],"summary":"List available subcategories","description":"Get a list of available subcategories (technology types) for data that is\nbroken down by energy source.\n\nSubcategories include:\n- **solar** - Solar photovoltaic\n- **wind_onshore** - Onshore wind\n- **wind_offshore** - Offshore wind\n- **wind** - Combined wind (used in some endpoints)\n\n**Authentication**: Requires API key.","operationId":"get_netztransparenz_subcategories_v1_netztransparenz_subcategories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"variable","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/NetztransparenzVariable"},{"type":"null"}],"description":"Optional variable to filter subcategories by","title":"Variable"},"description":"Optional variable to filter subcategories by"}],"responses":{"200":{"description":"Successfully retrieved subcategory list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableSubcategoriesResult"},"example":{"subcategories":["solar","wind_onshore","wind_offshore"]}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/climatology/data":{"post":{"tags":["climatology"],"summary":"Query climatology data over a time range","description":"Query ERA5 WMO climatology data (smoothed 30-year daily averages from 1991-2020) over a specified time range.\n\nClimatology provides historical baseline values for each (day_of_year, hour, latitude, longitude)\ncombination, useful for:\n- Comparing forecasts against historical norms\n- Detecting anomalies in weather patterns\n- Energy market baseline calculations\n\n**Time Range Query:**\nSpecify `start_time` and `end_time` to get climatology data for each hour in the range.\nThe climatology values are matched by day of year and hour, then combined with the full\ndatetime from your time range. This allows you to get a \"typical\" weather pattern\nfor any date range based on historical averages.\n\n**Response Format:**\nUse `format=json` or `format=arrow` to select the response explicitly. When\n`format` is omitted, `Accept: application/vnd.apache.arrow.stream` selects Arrow\nand all other requests retain the JSON default.\n\n**Query Dimensions:**\n- `geo`: Location filter (point, bounding_box, polygon, market_zone, country_key)\n- `start_time`: Start of the time range (inclusive)\n- `end_time`: End of the time range (exclusive)\n- `variables`: Weather variables to retrieve\n\n**Time Aggregation:**\nUse `group_by` to control time aggregation:\n- `hourly`: Hourly resolution (default)\n- `daily`: Daily averages\n- `weekly`: Weekly averages\n\nFor daily/weekly aggregations, use `timezone` to specify the timezone for day/week boundaries\n(e.g., \"Europe/Berlin\"). Defaults to UTC if not specified.\n\n**Spatial Aggregation:**\nAdd `market_zone`, `country_key`, or `point` to `group_by` to preserve those\ndimensions as a spatial mean. Add `latitude` and `longitude` to keep the native\ngrid under daily/weekly aggregation (bounding boxes and polygons). Omit\n`group_by` entirely for an unaggregated hourly grid. Use `aggregation` to\nspecify the aggregation function (e.g., `[\"avg\"]`).\n\n**Response Formats:**\n- `json`: Columnar JSON format `{column: [values], ...}`\n- `arrow`: Apache Arrow IPC stream for efficient processing\n\n**Authentication**: Requires API key.\n\n**Billing**: Free - no credit charges.\n\nFor more information, see [docs.jua.ai](https://docs.jua.ai).","operationId":"post_climatology_data_v1_climatology_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format","default":"json","title":"Format"},"description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeRangeClimatologyQuery"},"examples":{"point_query_day":{"summary":"Query single point for one day","description":"Get climatology for Berlin for a full day","value":{"geo":{"type":"point","value":[[52.52,13.405]],"method":"nearest"},"start_time":"2024-01-15T00:00:00Z","end_time":"2024-01-16T00:00:00Z","variables":["air_temperature_at_height_level_2m","wind_speed_at_height_level_10m"]}},"point_query_week":{"summary":"Query single point for one week","description":"Get climatology for Berlin for a week in summer","value":{"geo":{"type":"point","value":[[52.52,13.405]],"method":"nearest"},"start_time":"2024-07-01T00:00:00Z","end_time":"2024-07-08T00:00:00Z","variables":["air_temperature_at_height_level_2m","surface_downwelling_shortwave_flux_sum_1h"]}},"market_zone_query":{"summary":"Market zone query","description":"Get climatology for Germany market zone","value":{"geo":{"type":"market_zone","value":"DE"},"start_time":"2024-06-01T00:00:00Z","end_time":"2024-06-02T00:00:00Z","variables":["air_temperature_at_height_level_2m"]}},"bounding_box_grid":{"summary":"Bounding-box grid (no spatial mean)","description":"Return one climatology cell per lat/lon in the box. Omit group_by for an hourly grid; pass latitude and longitude in group_by to keep the grid under daily/weekly aggregation.","value":{"geo":{"type":"bounding_box","value":[[[47.0,8.0],[48.0,9.0]]]},"start_time":"2024-01-15T00:00:00Z","end_time":"2024-01-16T00:00:00Z","variables":["air_temperature_at_height_level_2m"]}},"daily_aggregation":{"summary":"Daily aggregation query","description":"Get daily climatology averages for a market zone","value":{"geo":{"type":"market_zone","value":"DE"},"start_time":"2024-06-01T00:00:00Z","end_time":"2024-06-08T00:00:00Z","variables":["air_temperature_at_height_level_2m"],"group_by":["daily","market_zone"],"aggregation":["avg"],"timezone":"Europe/Berlin"}},"weekly_aggregation":{"summary":"Weekly aggregation query","description":"Get weekly climatology averages","value":{"geo":{"type":"point","value":[[52.52,13.405]]},"start_time":"2024-01-01T00:00:00Z","end_time":"2024-02-01T00:00:00Z","variables":["air_temperature_at_height_level_2m","wind_speed_at_height_level_10m"],"group_by":["weekly"],"aggregation":["avg"]}}}}}},"responses":{"200":{"description":"Successfully retrieved climatology data","content":{"application/json":{"schema":{},"example":{"time":["2024-01-15T00:00:00Z","2024-01-15T01:00:00Z","2024-01-15T02:00:00Z"],"latitude":[52.5,52.5,52.5],"longitude":[13.5,13.5,13.5],"air_temperature_at_height_level_2m":[271.5,271.2,270.8]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/climatology/variables":{"get":{"tags":["climatology"],"summary":"List available climatology variables","description":"Get a list of weather variables available in the ERA5 climatology dataset.\n\nThese variables represent 30-year averages (1991-2020) computed from ERA5 reanalysis data.\n\n**Authentication**: Requires API key.","operationId":"get_climatology_variables_v1_climatology_variables_get","responses":{"200":{"description":"Successfully retrieved variable list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/query_engine__climatology__router__AvailableVariablesResult"},"example":{"variables":[{"name":"air_temperature_at_height_level_2m","description":"Air temperature at 2m height"},{"name":"wind_speed_at_height_level_10m","description":"Wind speed at 10m height"}]}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/climatology/meta":{"get":{"tags":["climatology"],"summary":"Get climatology dataset metadata","description":"Get metadata about the ERA5 WMO climatology dataset including:\n- Grid resolution and dimensions\n- Available days of year and hours\n- List of variables\n\n**Authentication**: Requires API key.","operationId":"get_climatology_meta_v1_climatology_meta_get","responses":{"200":{"description":"Successfully retrieved metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClimatologyMetaResult"},"example":{"description":"ERA5 WMO 30-year climatology (1991-2020)","period":"1991-2020","grid_resolution":"0.25° x 0.25°","num_latitudes":720,"num_longitudes":1440,"days_of_year":[1,2,3,4,5],"hours":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],"variables":["air_temperature_at_height_level_2m","..."]}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/station-data/data":{"post":{"tags":["station-data"],"summary":"Query station observation data","description":"Query weather station observation data including:\n- Temperature, dew point, wind speed/direction\n- Atmospheric pressure (surface and MSL)\n- Precipitation accumulations (1h, 3h, 6h, 12h, 24h)\n- Solar radiation and cloud cover\n\n**Filtering Options:**\n- `station_ids`: List of specific station IDs\n- `bounding_box`: Geographic bounds (min/max lat/lon)\n- `variables`: Subset of observation variables\n\n**Temporal Aggregation:**\n- `none`: Raw observations (default)\n- `hourly`: Hourly averages\n- `daily`: Daily averages\n\n**Response Formats:**\n- `json`: Columnar JSON format `{column: [values], ...}`\n- `arrow`: Apache Arrow IPC stream for efficient processing\n\n**Authentication**: Requires API key.\n\nFor more information, see [docs.jua.ai](https://docs.jua.ai).","operationId":"post_station_data_v1_station_data_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format","default":"json","title":"Format"},"description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StationDataQuery"},"examples":{"basic_query":{"summary":"Query temperature for stations","description":"Get temperature data for specific stations using ICAO codes","value":{"station_ids":["EDDT"],"variables":["air_temperature_at_height_level_2m"],"start_time":"2025-08-01T00:00:00Z","end_time":"2025-08-07T00:00:00Z"}},"bounding_box_query":{"summary":"Query by geographic region","description":"Get all variables for stations in Europe","value":{"bounding_box":{"min_lat":35.0,"max_lat":70.0,"min_lon":-10.0,"max_lon":40.0},"start_time":"2024-01-01T00:00:00Z","end_time":"2024-01-02T00:00:00Z","aggregation":"hourly"}},"daily_aggregation":{"summary":"Daily aggregated data","description":"Get daily average temperature","value":{"station_ids":["EDDT","EDDH"],"variables":["air_temperature_at_height_level_2m","precipitation_amount_sum_24h"],"start_time":"2024-01-01T00:00:00Z","end_time":"2024-01-31T00:00:00Z","aggregation":"daily"}}}}}},"responses":{"200":{"description":"Successfully retrieved station data","content":{"application/json":{"schema":{},"example":{"time":["2024-01-01T00:00:00Z","2024-01-01T01:00:00Z"],"station":["EDDT","EDDT"],"name":["BERLIN-TEGEL","BERLIN-TEGEL"],"latitude":[52.56,52.56],"longitude":[13.28,13.28],"air_temperature_at_height_level_2m":[275.5,274.8]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/station-data/solar-data":{"post":{"tags":["station-data"],"summary":"Query solar station observation data","description":"Query solar radiation station observations\n(`surface_downwelling_shortwave_flux_sum_1h`, hourly-accumulated GHI in J/m²).\n\nSolar stations are a distinct, quality-audited network from the synoptic\nstations and are served from a separate table. Pass namespaced station ids\n(`solar:<station_id>`) via `station_ids` alongside a time range.\n\n**Authentication**: Requires API key.","operationId":"post_solar_station_data_v1_station_data_solar_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format","default":"json","title":"Format"},"description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow format"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StationDataQuery"}}}},"responses":{"200":{"description":"Successfully retrieved solar station data","content":{"application/json":{"schema":{}},"application/vnd.apache.arrow.stream":{}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/station-data/stations":{"get":{"tags":["station-data"],"summary":"List available stations","description":"Get a list of available weather stations with their metadata.\n\nOptionally filter by geographic bounding box.\n\n**Authentication**: Requires API key.","operationId":"get_stations_v1_station_data_stations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"min_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"description":"Minimum latitude for bounding box filter","title":"Min Lat"},"description":"Minimum latitude for bounding box filter"},{"name":"max_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"description":"Maximum latitude for bounding box filter","title":"Max Lat"},"description":"Maximum latitude for bounding box filter"},{"name":"min_lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"description":"Minimum longitude for bounding box filter","title":"Min Lon"},"description":"Minimum longitude for bounding box filter"},{"name":"max_lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"description":"Maximum longitude for bounding box filter","title":"Max Lon"},"description":"Maximum longitude for bounding box filter"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Maximum number of stations to return","title":"Limit"},"description":"Maximum number of stations to return"}],"responses":{"200":{"description":"Successfully retrieved station list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableStationsResult"},"example":{"stations":[{"station":"EDDT","name":"BERLIN-TEGEL","latitude":52.56,"longitude":13.28,"elevation":3.0}],"total_count":1}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/station-data/solar-stations":{"get":{"tags":["station-data"],"summary":"List available solar-radiation stations","description":"Get a list of audited (clean) solar-radiation benchmark stations with their\nmetadata. Solar stations are a distinct, quality-audited network from the\nsynoptic stations and are served from a separate table (`solar_station_meta`,\nfiltered to `is_clean = 1`). Ids are namespaced `solar:<station_id>` to match\nthe solar observation and benchmark read paths.\n\nOptionally filter by geographic bounding box.\n\n**Authentication**: Requires API key.","operationId":"get_solar_stations_v1_station_data_solar_stations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"min_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"description":"Minimum latitude for bounding box filter","title":"Min Lat"},"description":"Minimum latitude for bounding box filter"},{"name":"max_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"description":"Maximum latitude for bounding box filter","title":"Max Lat"},"description":"Maximum latitude for bounding box filter"},{"name":"min_lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"description":"Minimum longitude for bounding box filter","title":"Min Lon"},"description":"Minimum longitude for bounding box filter"},{"name":"max_lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"description":"Maximum longitude for bounding box filter","title":"Max Lon"},"description":"Maximum longitude for bounding box filter"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":1},{"type":"null"}],"description":"Maximum number of stations to return","title":"Limit"},"description":"Maximum number of stations to return"}],"responses":{"200":{"description":"Successfully retrieved solar station list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableStationsResult"},"example":{"stations":[{"station":"solar:dwd:00867","name":"Berus","latitude":49.26,"longitude":6.69,"elevation":362.0}],"total_count":1}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/station-data/variables":{"get":{"tags":["station-data"],"summary":"List available variables","description":"Get a list of available observation variables with metadata including:\n- Variable name\n- Description\n- Unit of measurement\n\n**Authentication**: Requires API key.","operationId":"get_variables_v1_station_data_variables_get","responses":{"200":{"description":"Successfully retrieved variable list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jua_query_v2__station_data__types__AvailableVariablesResult"},"example":{"variables":[{"name":"air_temperature_at_height_level_2m","description":"Air temperature at 2 meters above ground","unit":"K"},{"name":"wind_speed_at_height_level_10m","description":"Wind speed at 10 meters above ground","unit":"m/s"}]}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/reanalysis/data":{"post":{"tags":["reanalysis"],"summary":"Query reanalysis data","description":"Query reanalysis data from models like ARCO ERA5.\n\nReanalysis data provides historical weather analysis at a specific time (unlike forecasts\nwhich have init_time + prediction_timedelta dimensions). This is useful for:\n- Historical weather analysis\n- Training and validating machine learning models\n- Comparing forecasts against actuals\n\n**Query Dimensions:**\n- `models`: Reanalysis model(s) to query (e.g., [\"arco_era5\"])\n- `geo`: Location filter (point, bounding_box, polygon, market_zone, country_key)\n- `time`: Analysis time(s) — a datetime, a list of datetimes, or a time range.\n  Reanalysis has no init-time axis, so `\"latest\"` and integer offsets are rejected.\n- `variables`: Weather variables to retrieve\n\n**Response Formats:**\n- `json`: Columnar JSON format `{column: [values], ...}`\n- `arrow`: Apache Arrow IPC stream for efficient processing\n\n**Authentication**: Requires API key.\n\nFor more information, see [docs.jua.ai](https://docs.jua.ai).","operationId":"post_reanalysis_data_v1_reanalysis_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow","default":"json","title":"Format"},"description":"Response format: 'json' for columnar JSON or 'arrow' for Apache Arrow"},{"name":"stream","in":"query","required":false,"schema":{"type":"boolean","description":"If true, stream the response as an Apache Arrow IPC stream. Overrides 'format' to 'arrow'.","default":false,"title":"Stream"},"description":"If true, stream the response as an Apache Arrow IPC stream. Overrides 'format' to 'arrow'."},{"name":"request_credit_limit","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Maximum credits allowed for this request. Query will fail if estimated cost exceeds this limit","default":50,"title":"Request Credit Limit"},"description":"Maximum credits allowed for this request. Query will fail if estimated cost exceeds this limit"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReanalysisQuery"},"examples":{"point_query_day":{"summary":"Query single point for one day","description":"Get reanalysis data for Berlin for a full day","value":{"models":["arco_era5"],"geo":{"type":"point","value":[[52.52,13.405]],"method":"nearest"},"time":{"start":"2024-01-15T00:00:00Z","end":"2024-01-16T00:00:00Z"},"variables":["air_temperature_at_height_level_2m","wind_speed_at_height_level_10m"]}},"market_zone_query":{"summary":"Market zone query","description":"Get reanalysis data for Germany market zone","value":{"models":["arco_era5"],"geo":{"type":"market_zone","value":"DE"},"time":{"start":"2024-06-01T00:00:00Z","end":"2024-06-02T00:00:00Z"},"variables":["air_temperature_at_height_level_2m"]}},"aggregation_query":{"summary":"Aggregation query","description":"Get daily averages for a market zone","value":{"models":["arco_era5"],"geo":{"type":"market_zone","value":"DE"},"time":{"start":"2024-06-01T00:00:00Z","end":"2024-06-08T00:00:00Z"},"variables":["air_temperature_at_height_level_2m"],"group_by":["time__date","market_zone"],"aggregation":["avg"]}}}}}},"responses":{"200":{"description":"Successfully retrieved reanalysis data","content":{"application/json":{"schema":{},"example":{"time":["2024-01-15T00:00:00Z","2024-01-15T01:00:00Z","2024-01-15T02:00:00Z"],"latitude":[52.5,52.5,52.5],"longitude":[13.5,13.5,13.5],"air_temperature_at_height_level_2m":[271.5,271.2,270.8]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"402":{"description":"Insufficient credits"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reanalysis/meta":{"get":{"tags":["reanalysis"],"summary":"Get reanalysis dataset metadata","description":"Get metadata about available reanalysis models including:\n- Model names and display names\n- Grid resolution and temporal resolution\n- Available variables\n\n**Authentication**: Requires API key.","operationId":"get_reanalysis_meta_v1_reanalysis_meta_get","responses":{"200":{"description":"Successfully retrieved metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReanalysisMetaResult"},"example":{"models":[{"name":"arco_era5","display_name":"ARCO ERA5","grid_resolution":"0.25° x 0.25°","temporal_resolution_minutes":60,"variables":["air_temperature_at_height_level_2m","..."]}]}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/power-forecast/data":{"post":{"tags":["power-forecast"],"summary":"Query power forecast data","description":"Query power forecast prediction data for renewable energy generation (Solar, Wind, etc.)\nand electricity demand (Load).\n\n**Dimensions:**\n- `zone_key`: Country/region code (e.g. \"DE\")\n- `psr_type`: Generation source type (e.g. \"Solar\", \"Wind Onshore\") or \"Load\" for\n  electricity demand. Load is currently available for Germany (\"DE\") only.\n\n**Query Modes (mutually exclusive):**\n\n1. **Horizon mode** (init_time-centric):\n   - `init_time`: Specific init time(s) or relative tokens (`latest`, `latest-N`)\n   - `max_prediction_timedelta`: Limit forecast horizon (minutes)\n\n2. **Time range mode** (time-centric):\n   - `start_time` / `end_time`: Filter by computed forecast time\n\n**Model version and regime:**\n- Omit ``version`` (or ``version: \"stable\"``) to follow the packaged stable pointer —\n  this **moves** when Jua promotes a new checkpoint.\n- ``regime`` selects which product those aliases resolve against.\n  ``curtailed`` (default) is actual production. ``uncurtailed`` is potential.\n  A concrete run id ignores ``regime``.\n- To **freeze** today's stable (safe across promotes): call\n  ``GET /versions``, take the row with ``is_stable: true`` (curtailed) or\n  ``is_stable_uncurtailed: true``, then pass that run id as ``version``.\n- ``version: \"latest\"`` follows the packaged latest pointer for ``regime``.\n- ``version_pins`` overrides specific (zone, psr) cells in one request.\n\n**Response Formats:**\n- `json`: Columnar JSON format `{column: [values], ...}`\n- `arrow`: Apache Arrow IPC stream for efficient processing\n\n**Authentication**: Requires API key.","operationId":"post_power_forecast_data_v1_power_forecast_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' or 'arrow'","default":"json","title":"Format"},"description":"Response format: 'json' or 'arrow'"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}. Units are always sent via X-Variable-Units header regardless."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PowerForecastQuery"},"examples":{"latest_solar_de":{"summary":"Latest solar forecast for Germany","description":"Get the latest solar power forecast for Germany","value":{"zone_keys":["DE"],"psr_types":["Solar"],"init_time":"latest"}},"latest_load_de":{"summary":"Latest load (demand) forecast for Germany","description":"Get the latest electricity load forecast for Germany","value":{"zone_keys":["DE"],"psr_types":["Load"],"init_time":"latest"}},"pin_current_stable":{"summary":"Freeze today's stable (safe across promotes)","description":"1) GET /v1/power-forecast/versions?zone_key=DE&psr_type=Solar and copy model_version where is_stable=true (e.g. rv7orbtm). 2) Pass that run id as version. Unlike version=stable, this does not move when Jua promotes a new live checkpoint.","value":{"zone_keys":["DE"],"psr_types":["Solar"],"version":"rv7orbtm","init_time":"latest"}},"pin_some_cells_keep_rest_stable":{"summary":"Pin some cells; follow stable elsewhere","description":"Portfolio stays on live stable except DE Solar, which is frozen to a run id from GET /versions (is_stable=true). Only the pinned cell is promote-safe.","value":{"zone_keys":["DE","FR"],"psr_types":["Solar","Wind Onshore"],"version":"stable","version_pins":[{"zone_key":"DE","psr_type":"Solar","version":"rv7orbtm"}],"init_time":"latest"}},"specific_init_time":{"summary":"Specific init time with horizon","description":"Query a specific forecast run with 48h horizon","value":{"zone_keys":["DE"],"psr_types":["Wind Onshore"],"init_time":["2025-12-01T00:00:00Z"],"max_prediction_timedelta":2880}},"time_range":{"summary":"Time range query","description":"Get forecasts covering a specific time period","value":{"zone_keys":["DE"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-03T00:00:00Z"}}}}}},"responses":{"200":{"description":"Successfully retrieved power forecast data","content":{"application/json":{"schema":{},"example":{"zone_key":["DE","DE"],"psr_type":["Solar","Solar"],"init_time":["2025-12-01T00:00:00Z","2025-12-01T00:00:00Z"],"prediction_timedelta":[60,120],"time":["2025-12-01T01:00:00Z","2025-12-01T02:00:00Z"],"value":[1250.5,1320.3]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/power-forecast/zones":{"get":{"tags":["power-forecast"],"summary":"List available power forecast zones","description":"Get a list of available zone codes that have power forecast data.\n\nThis is a metadata endpoint. Authentication is optional: credentials are\nhonoured for caller attribution when present, and the endpoint remains\ncallable anonymously for backwards compatibility with released SDK versions.","operationId":"get_power_forecast_zones_v1_power_forecast_zones_get","responses":{"200":{"description":"Successfully retrieved zone list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableZonesResult"},"example":{"zones":["DE"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]},{}]}},"/v1/power-forecast/psr-types":{"get":{"tags":["power-forecast"],"summary":"List available PSR types","description":"Get a list of available PSR (Production Source) types for power forecasts.\n\nThis is a metadata endpoint. Authentication is optional: credentials are\nhonoured for caller attribution when present, and the endpoint remains\ncallable anonymously for backwards compatibility with released SDK versions.","operationId":"get_power_forecast_psr_types_v1_power_forecast_psr_types_get","security":[{"HTTPBearer":[]},{}],"parameters":[{"name":"zone_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Optional zone key(s) to filter PSR types by","title":"Zone Key"},"description":"Optional zone key(s) to filter PSR types by"},{"name":"strict","in":"query","required":false,"schema":{"type":"boolean","description":"When true, return only PSR types produced in *every* given zone (intersection). Default returns the union across zones.","default":false,"title":"Strict"},"description":"When true, return only PSR types produced in *every* given zone (intersection). Default returns the union across zones."}],"responses":{"200":{"description":"Successfully retrieved PSR type list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailablePsrTypesResult"},"example":{"psr_types":["Load","Solar","Wind Onshore"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/power-forecast/versions":{"get":{"tags":["power-forecast"],"summary":"List available model versions","description":"Catalog of pin-able run ids per zone/PSR.\n\n``description`` is packaged metadata for a known run id. Historical versions\nwithout retained metadata return ``null``.\n\n**Freeze today's stable (recommended for promote-safety):**\n1. Call this endpoint (optionally filter with ``zone_key`` / ``psr_type``).\n2. For each cell you care about, take ``model_version`` where ``is_stable``\n   is true.\n3. Pass that run id as ``version`` on ``POST /power-forecast/data`` (whole\n   request) or in ``version_pins`` (per cell).\n\n``version: \"stable\"`` follows live promotes. A concrete run id does **not**.\n\n``is_latest`` marks the curtailed preview alias (``version=latest``).\n``is_stable_uncurtailed`` / ``is_latest_uncurtailed`` mark the uncurtailed\nsibling maps.\n\nRequires power-forecast model entitlement (same as ``POST /data``): the\ncatalog exposes internal checkpoint / WandB run ids used for pinning.","operationId":"get_power_forecast_versions_v1_power_forecast_versions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"zone_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Optional zone key(s) to filter versions by","title":"Zone Key"},"description":"Optional zone key(s) to filter versions by"},{"name":"psr_type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Optional PSR type(s) to filter versions by","title":"Psr Type"},"description":"Optional PSR type(s) to filter versions by"}],"responses":{"200":{"description":"Successfully retrieved version catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableVersionsResult"},"example":{"versions":[{"model_version":"rv7orbtm","description":"Adds EPT 2.1 Helios to the Germany solar forecast (2026-07-09)","zone_key":"DE","psr_type":"Solar","is_stable":true,"is_latest":true,"earliest_init_time":"2025-05-31T23:45:00Z","latest_init_time":"2026-07-11T08:30:00Z"}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/power-forecast/fallback-status":{"get":{"tags":["power-forecast"],"summary":"Check if latest forecast uses fallback initial conditions","description":"Check whether the most recent power forecast was generated using fallback\ninitial conditions (i.e. ENTSO-E source data was unavailable).\n\nReturns `{\"is_fallback\": true}` when the latest forecast used synthetic\nhistory, and `{\"is_fallback\": false}` otherwise.\n\nThis is a metadata endpoint. Authentication is optional: credentials are\nhonoured for caller attribution when present, and the endpoint remains\ncallable anonymously for backwards compatibility with released SDK versions.","operationId":"get_fallback_status_v1_power_forecast_fallback_status_get","security":[{"HTTPBearer":[]},{}],"parameters":[{"name":"zone_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional zone key to check (e.g. 'DE'). If omitted, checks across all zones.","title":"Zone Key"},"description":"Optional zone key to check (e.g. 'DE'). If omitted, checks across all zones."}],"responses":{"200":{"description":"Fallback status","content":{"application/json":{"schema":{},"example":{"is_fallback":false}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/power-forecast/fallback-init-times":{"get":{"tags":["power-forecast"],"summary":"List init times that used fallback initial conditions","description":"Return init times whose forecasts were generated with fallback (estimated)\ninitial conditions.  The frontend uses this to flag specific model runs\nin the chart legend as potentially degraded.\n\nThis is a metadata endpoint. Authentication is optional: credentials are\nhonoured for caller attribution when present, and the endpoint remains\ncallable anonymously for backwards compatibility with released SDK versions.","operationId":"get_fallback_init_times_v1_power_forecast_fallback_init_times_get","security":[{"HTTPBearer":[]},{}],"parameters":[{"name":"zone_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional zone key to filter by (e.g. 'DE'). If omitted, returns fallback init times across all zones.","title":"Zone Key"},"description":"Optional zone key to filter by (e.g. 'DE'). If omitted, returns fallback init times across all zones."}],"responses":{"200":{"description":"List of fallback init times","content":{"application/json":{"schema":{},"example":{"fallback_init_times":["2026-03-24T14:00:00Z","2026-03-25T06:00:00Z"]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/power-forecast/init-times":{"get":{"tags":["power-forecast"],"summary":"List available init times","description":"Get available forecast init times with their max prediction horizon.\n\nUsed by the dashboard to populate the init_time dropdown when creating a\npower forecast data source.  Results are ordered newest-first.\n\nWhen `include_availability=true` is passed along with zone_key and psr_type\nfilters, the response includes an `availability_by_init_time` field that\nmaps each init_time to the list of (zone_key, psr_type) combinations that\nare available for it. This allows determining which specific combinations\nare missing for excluded init times without additional API calls.\n\n`total_count`, `archive_earliest_init_time`, and\n`archive_latest_init_time` come from a separately cached archive-stats\nquery (900 s logical TTL + 180 s stale-while-revalidate). They can lag\nthe listing by up to 1080 s, and all three are null together when a\ncold archive-stats miss hits the request deadline or fails. The\nlisting is still returned in that case. A cached all-null stats\nblock also means the scope has no complete run; clients cannot\ndistinguish those two cases on the wire.\n\nThis is a metadata endpoint. Authentication is optional: credentials are\nhonoured for caller attribution when present, and the endpoint remains\ncallable anonymously for backwards compatibility with released SDK versions.","operationId":"get_power_forecast_init_times_v1_power_forecast_init_times_get","security":[{"HTTPBearer":[]},{}],"parameters":[{"name":"zone_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Zone key(s) to filter init times by","title":"Zone Key"},"description":"Zone key(s) to filter init times by"},{"name":"psr_type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"PSR type(s) to filter by. When multiple are given, only init_times available for ALL of them are returned.","title":"Psr Type"},"description":"PSR type(s) to filter by. When multiple are given, only init_times available for ALL of them are returned."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of init times to return. Ignored only when BOTH start_time and end_time are provided (the closed window then bounds the listing instead of the row count). With a single bound the limit still applies, since the other side is open.","default":192,"title":"Limit"},"description":"Maximum number of init times to return. Ignored only when BOTH start_time and end_time are provided (the closed window then bounds the listing instead of the row count). With a single bound the limit still applies, since the other side is open."},{"name":"order","in":"query","required":false,"schema":{"enum":["desc","asc"],"type":"string","description":"Sort direction for init_time: 'desc' (newest first, default) or 'asc' (oldest first)","default":"desc","title":"Order"},"description":"Sort direction for init_time: 'desc' (newest first, default) or 'asc' (oldest first)"},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Inclusive lower bound on init_time (ISO-8601, UTC). When set together with end_time, all init_times in the closed window are returned regardless of the limit/1000 row cap; on its own the limit still applies.","title":"Start Time"},"description":"Inclusive lower bound on init_time (ISO-8601, UTC). When set together with end_time, all init_times in the closed window are returned regardless of the limit/1000 row cap; on its own the limit still applies."},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Exclusive upper bound on init_time (ISO-8601, UTC): init_time < end_time. On its own the limit still applies (the lower side is unbounded).","title":"End Time"},"description":"Exclusive upper bound on init_time (ISO-8601, UTC): init_time < end_time. On its own the limit still applies (the lower side is unbounded)."},{"name":"include_availability","in":"query","required":false,"schema":{"type":"boolean","description":"When true and zone_key/psr_type are provided, include per-init-time availability breakdown showing which zone/PSR combinations are available for each init_time.","default":false,"title":"Include Availability"},"description":"When true and zone_key/psr_type are provided, include per-init-time availability breakdown showing which zone/PSR combinations are available for each init_time."},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Model version: 'stable' (default), 'latest', or a run id from GET /versions. Same semantics as POST /data.","title":"Version"},"description":"Model version: 'stable' (default), 'latest', or a run id from GET /versions. Same semantics as POST /data."},{"name":"regime","in":"query","required":false,"schema":{"enum":["curtailed","uncurtailed"],"type":"string","description":"Product map version aliases resolve against. 'curtailed' (default) is actual production. 'uncurtailed' is potential. Same semantics as POST /data.","default":"curtailed","title":"Regime"},"description":"Product map version aliases resolve against. 'curtailed' (default) is actual production. 'uncurtailed' is potential. Same semantics as POST /data."}],"responses":{"200":{"description":"Successfully retrieved init times","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableInitTimesResult"},"example":{"init_times":[{"init_time":"2025-12-01T18:00:00Z","max_prediction_timedelta":3720},{"init_time":"2025-12-01T12:00:00Z","max_prediction_timedelta":3720}]}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/uk-power/data":{"post":{"tags":["uk-power"],"summary":"Query UK power generation data","description":"Query UK (GB) power generation timeseries data including:\n- Wind and solar generation actuals (transmission + embedded)\n- Transmission system demand (load)\n- Day-ahead wind and solar forecasts (NESO)\n\nAll variables cover **Great Britain** (England, Scotland, Wales). Northern\nIreland is not included — it runs on the separate all-island I-SEM market.\nAll values are in MW, on the half-hourly settlement-period grid (UTC).\n\n**Actuals:**\n- `wind`: Total wind generation, transmission + embedded (Elexon FUELHH + NESO Gen Mix)\n- `wind_transmission`: Transmission-connected wind generation (Elexon FUELHH)\n- `wind_embedded`: Distribution-embedded wind generation (NESO Gen Mix)\n- `solar`: Total solar generation (Sheffield Solar PV_Live)\n- `load`: Transmission system demand / TSD (NESO Demand)\n\n**Day-ahead forecasts (NESO):**\n- `wind_forecast`: Day-ahead total wind forecast, transmission + embedded (NESO Day Ahead Wind + NESO Embedded Forecast)\n- `wind_transmission_forecast`: Day-ahead transmission wind forecast (NESO Day Ahead Wind)\n- `wind_embedded_forecast`: Day-ahead embedded wind forecast (NESO Embedded Forecast)\n- `solar_forecast`: Day-ahead embedded solar forecast (NESO Embedded Forecast)\n\n`wind` / `wind_forecast` may be requested together with their transmission\nand embedded components. The total is a **strict sum**: a timestamp appears\non the total only when both components have values, so the total series can\nbe shorter than a component in the same response.\n\nWhen `variables` is omitted, the default is totals (`wind`, `solar`, `load`,\n`wind_forecast`, `solar_forecast`), not the split.\n\n**Response Formats:**\n- `json`: Columnar JSON format `{column: [values], ...}`\n- `arrow`: Apache Arrow IPC stream for efficient processing\n\n**Authentication**: Requires API key.\n\nFor more information, see [docs.jua.ai](https://docs.jua.ai).","operationId":"post_uk_power_data_v1_uk_power_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' or 'arrow'","default":"json","title":"Format"},"description":"Response format: 'json' or 'arrow'"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UkPowerTimeseriesQuery"},"examples":{"actuals":{"summary":"Query wind and solar actuals","description":"Get total wind and solar generation","value":{"variables":["wind","solar"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-07T00:00:00Z"}},"generation_breakdown":{"summary":"Query transmission/embedded breakdown + load","description":"Get the transmission vs embedded wind split alongside transmission system demand","value":{"variables":["wind_transmission","wind_embedded","load"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-07T00:00:00Z"}},"total_and_breakdown":{"summary":"Query total wind together with the split","description":"wind is derived as the strict sum of transmission + embedded; components can be requested in the same query","value":{"variables":["wind","wind_transmission","wind_embedded"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-07T00:00:00Z"}},"forecasts":{"summary":"Query day-ahead forecasts","description":"Get NESO day-ahead wind and solar forecasts","value":{"variables":["wind_forecast","solar_forecast"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-07T00:00:00Z"}},"forecast_breakdown":{"summary":"Query transmission/embedded forecast breakdown","description":"Get the transmission vs embedded day-ahead wind forecast split","value":{"variables":["wind_transmission_forecast","wind_embedded_forecast"],"start_time":"2025-12-01T00:00:00Z","end_time":"2025-12-07T00:00:00Z"}}}}}},"responses":{"200":{"description":"Successfully retrieved UK power data","content":{"application/json":{"schema":{},"example":{"time":["2025-12-01T00:00:00Z","2025-12-01T00:30:00Z"],"variable_name":["wind","wind"],"value":[12500.0,12700.0],"unit":["MW","MW"]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/uk-power/variables":{"get":{"tags":["uk-power"],"summary":"List available UK power variables","description":"Get a list of available UK power generation variables with metadata.\n\n**Authentication**: Requires API key.","operationId":"get_uk_power_variables_v1_uk_power_variables_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jua_query_v2__uk_power__types__AvailableVariablesResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/uk-power/sources":{"get":{"tags":["uk-power"],"summary":"List available UK power data sources","description":"Get a list of available data sources for UK power generation.\n\n**Authentication**: Requires API key.","operationId":"get_uk_power_sources_v1_uk_power_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jua_query_v2__uk_power__types__AvailableSourcesResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/epex-spot/data":{"post":{"tags":["epex-spot"],"summary":"Query EPEX SPOT market data","description":"Query EPEX SPOT electricity market data including:\n- Intraday continuous prices (VWAP, last, low, high) and volumes\n- Intraday continuous price indices: IDFULL (full session), ID1 (last 1h\n  before delivery), ID3 (last 3h before delivery) — all at 60-minute resolution\n- Day-ahead auction clearing prices and volumes (quarter-hourly)\n- Intraday auction (IDA1/IDA2/IDA3) prices and volumes\n- Day-ahead official index prices\n\n**Response Formats:**\n- `json`: Columnar JSON format `{column: [values], ...}`\n- `arrow`: Apache Arrow IPC stream for efficient processing\n\n**Authentication**: Requires API key.","operationId":"post_epex_spot_data_v1_epex_spot_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' or 'arrow'","default":"json","title":"Format"},"description":"Response format: 'json' or 'arrow'"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpexSpotTimeseriesQuery"},"examples":{"da_prices":{"summary":"Query day-ahead prices","description":"Get DA clearing prices for Germany","value":{"variables":["da_price"],"start_time":"2026-04-01T00:00:00Z","end_time":"2026-04-14T00:00:00Z","market_area":"DE"}},"intraday_continuous":{"summary":"Query intraday continuous VWAP","description":"Get VWAP and volumes from continuous trading","value":{"variables":["continuous_weighted_avg_price","continuous_volume_buy","continuous_volume_sell"],"start_time":"2026-04-10T00:00:00Z","end_time":"2026-04-14T00:00:00Z","market_area":"DE"}},"all_auction_prices":{"summary":"Compare DA vs IDA prices","description":"Get DA, IDA1, IDA2, IDA3 clearing prices","value":{"variables":["da_price","ida1_price","ida2_price","ida3_price"],"start_time":"2026-04-12T00:00:00Z","end_time":"2026-04-13T00:00:00Z","market_area":"DE"}},"da_hourly_prices":{"summary":"Query historical hourly DA prices","description":"Get day-ahead hourly clearing prices for the pre-2025-10-01 era (before the 15-minute switchover).","value":{"variables":["da_hourly_price","da_hourly_volume"],"start_time":"2024-06-01T00:00:00Z","end_time":"2024-06-08T00:00:00Z","market_area":"DE"}},"intraday_indices":{"summary":"Compare IDFULL vs ID1 vs ID3 indices","description":"Get the 60-minute intraday continuous indices: IDFULL (full session VWAP), ID1 (last 1h before delivery), ID3 (last 3h before delivery).","value":{"variables":["continuous_idfull_price","continuous_id1_price","continuous_id3_price"],"start_time":"2026-04-12T00:00:00Z","end_time":"2026-04-13T00:00:00Z","market_area":"DE"}}}}}},"responses":{"200":{"description":"Successfully retrieved EPEX SPOT data","content":{"application/json":{"schema":{},"example":{"time":["2026-04-12T22:00:00Z","2026-04-12T23:00:00Z"],"variable_name":["da_price","da_price"],"value":[95.1,98.05],"unit":["EUR/MWh","EUR/MWh"],"market_area":["DE","DE"],"auction":["DA","DA"]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/epex-spot/trades":{"post":{"tags":["epex-spot"],"summary":"Query EPEX SPOT intraday continuous individual trades","description":"Query row-level intraday continuous trades from EPEX SPOT.\n\nEach row is a single executed trade (price, volume, side, delivery area,\ntrade phase, execution time). This dataset is high-volume (~1.2M trades/day\nfor Germany), so requests are capped per response format and will return\nHTTP 400 if too large — narrow the delivery-date / execution-time range, add\nfilters, or paginate.\n\n**Filters:** market_area, delivery_areas, sides, products, trade_phases,\nexecution-time window (start_time/end_time), delivery-date window\n(delivery_date_start/delivery_date_end).\n\n**Response Formats:** `json` (columnar) or `arrow` (IPC stream).\n\n**Authentication**: Requires API key.","operationId":"post_epex_spot_trades_v1_epex_spot_trades_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' or 'arrow'","default":"json","title":"Format"},"description":"Response format: 'json' or 'arrow'"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpexSpotTradesQuery"},"examples":{"de_one_delivery_day":{"summary":"All DE trades for one delivery day","description":"Continuous trades for a single delivery date","value":{"market_area":"DE","delivery_date_start":"2026-04-08","delivery_date_end":"2026-04-08","trade_phases":["CONT"],"order_by":["execution_time__desc"],"pagination":{"limit":1000,"offset":0}}}}}}},"responses":{"200":{"description":"Successfully retrieved EPEX SPOT trades","content":{"application/json":{"schema":{},"example":{"execution_time":["2026-04-08T09:15:00.123Z"],"delivery_start":["2026-04-08T12:00:00Z"],"side":["BUY"],"price":[85.5],"volume":[2.5],"delivery_area":["DE1"]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters or response too large"},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/epex-spot/auction-curves":{"post":{"tags":["epex-spot"],"summary":"Query EPEX SPOT aggregated supply/demand curves","description":"Query EPEX SPOT Day-Ahead aggregated supply/demand curves (full order-book\nstep curves). Each delivery period contains many price/volume points per side\n(Sell = supply, Purchase = demand), so this returns a row-shaped result rather\nthan a scalar timeseries.\n\nResponses can be large; use `pagination` (with `order_by`) or a narrow time\nwindow to bound the result.\n\n**Authentication**: Requires API key.","operationId":"post_epex_spot_auction_curves_v1_epex_spot_auction_curves_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpexSpotCurveQuery"},"examples":{"da_curves":{"summary":"One delivery day of PT60M curves","value":{"auction":"DA","resolution":"PT60M","market_area":"DE","start_time":"2024-06-14T00:00:00Z","end_time":"2024-06-15T00:00:00Z","order_by":["delivery_start","side","point_index"],"pagination":{"limit":5000,"offset":0}}}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuctionCurvesResult"}}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/epex-spot/block-bids":{"post":{"tags":["epex-spot"],"summary":"Query EPEX SPOT block bids","description":"Query EPEX SPOT Day-Ahead block bids (normalized long: one row per block per\ndelivery period, non-zero volumes only).\n\nUse `pagination` (with `order_by`) or a narrow time window to bound the result.\n\n**Authentication**: Requires API key.","operationId":"post_epex_spot_block_bids_v1_epex_spot_block_bids_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpexSpotBlockBidQuery"},"examples":{"da_block_bids":{"summary":"One delivery day of block bids","value":{"auction":"DA","market_area":"DE","start_time":"2024-06-14T00:00:00Z","end_time":"2024-06-15T00:00:00Z","order_by":["delivery_start","block_id"],"pagination":{"limit":5000,"offset":0}}}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuctionBlockBidsResult"}}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/epex-spot/variables":{"get":{"tags":["epex-spot"],"summary":"List available EPEX SPOT variables","description":"Get a list of available EPEX SPOT variables with metadata including:\n- Variable name\n- Description\n- Unit of measurement\n- Source table\n\n**Authentication**: Requires API key.","operationId":"get_epex_spot_variables_v1_epex_spot_variables_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jua_query_v2__epex_spot__types__AvailableVariablesResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/epex-spot/continuous-vwap-surface":{"post":{"tags":["epex-spot"],"summary":"Query the gate-closure-anchored continuous-trade VWAP surface","description":"Return the volume-weighted average price of EPEX SPOT continuous (XBID) trades\nper (delivery_start, trading_bucket), where a bucket is a 15-minute window measured\nbackward from each delivery slot's gate closure (delivery_start minus 5 minutes).\nBucket 0 is the last 15 minutes before gate closure. Used by the trade-recommendations\nPnL engine to price the continuous intraday venue by execution time.\n\nResponses can be large (one row per delivery slot and trading bucket); use a\nnarrow time window to bound the result.\n\n**Authentication**: Requires API key.","operationId":"post_epex_spot_continuous_vwap_surface_v1_epex_spot_continuous_vwap_surface_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContinuousVwapSurfaceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContinuousVwapSurfaceResult"}}}},"400":{"description":"Result set too large; narrow the time window"},"422":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"}},"security":[{"HTTPBearer":[]}]}},"/v1/climate-indices/data":{"post":{"tags":["climate-indices"],"summary":"Query climate indices data","description":"Query climate oscillation indices timeseries data.\n\n**Available indices** (46 series):\n- Atmospheric oscillations: NAO, AO, AAO, PNA, PDO, QBO, AMO, SOI, WPO, EPO, GBI\n- Teleconnections: EA, SCAND, EAWR, TNH, POL, EPNP\n- ENSO: ENSO_NINO12, ENSO_NINO3, ENSO_NINO4, ENSO_NINO34 (and their _ANOM variants), MEI, ONI\n- Atlantic SST: TNA, TSA, AMM\n- Indian Ocean: IOD\n- MJO (Wheeler-Hendon RMM, daily): MJO_RMM1, MJO_RMM2, MJO_PHASE, MJO_AMPLITUDE\n- MJO (CPC velocity-potential, pentad): MJO_20E..MJO_10W (10 longitude series)\n- Solar: SUNSPOT\n\n**Sources**: noaa_psl, noaa_cpc, noaa_ncei, bom, sidc, wisc_aos\n\n**Temporal resolution**: monthly for most indices; daily for BOM RMM MJO; pentad (5-day) for CPC VP-MJO.\n\n**Response Formats:**\n- `json`: Columnar JSON format `{column: [values], ...}`\n- `arrow`: Apache Arrow IPC stream for efficient processing\n\n**Authentication**: Requires API key.","operationId":"post_climate_indices_data_v1_climate_indices_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["json","arrow"],"type":"string","description":"Response format: 'json' or 'arrow'","default":"json","title":"Format"},"description":"Response format: 'json' or 'arrow'"},{"name":"include_units","in":"query","required":false,"schema":{"type":"boolean","description":"When true, JSON responses are wrapped in {data, units}.","default":false,"title":"Include Units"},"description":"When true, JSON responses are wrapped in {data, units}."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClimateIndicesTimeseriesQuery"},"examples":{"enso_nao":{"summary":"Query ENSO and NAO indices","description":"Get ENSO Nino 3.4 and NAO for a time range","value":{"indices":["ENSO_NINO34","NAO"],"start_time":"2020-01-01T00:00:00Z","end_time":"2025-01-01T00:00:00Z"}},"all_recent":{"summary":"Query all indices (recent)","description":"Get all available indices from 2024 onwards","value":{"start_time":"2024-01-01T00:00:00Z"}}}}}},"responses":{"200":{"description":"Successfully retrieved climate indices data","content":{"application/json":{"schema":{},"example":{"time":["2020-01-01T00:00:00Z","2020-02-01T00:00:00Z"],"index_name":["NAO","NAO"],"value":[0.56,-0.3],"unit":["index","index"]}},"application/vnd.apache.arrow.stream":{"description":"Apache Arrow IPC stream format"}}},"400":{"description":"Invalid query parameters"},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/climate-indices/indices":{"get":{"tags":["climate-indices"],"summary":"List available climate indices","description":"Get a list of available climate oscillation indices with metadata.\n\n**Authentication**: Requires API key.","operationId":"get_climate_indices_list_v1_climate_indices_indices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableIndicesResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/climate-indices/sources":{"get":{"tags":["climate-indices"],"summary":"List available climate indices data sources","description":"Get a list of available data sources for climate indices.\n\n**Authentication**: Requires API key.","operationId":"get_climate_indices_sources_v1_climate_indices_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jua_query_v2__climate_indices__types__AvailableSourcesResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"ActiveNotice":{"properties":{"message":{"type":"string","title":"Message"},"severity":{"type":"string","enum":["info","minor","major"],"title":"Severity"},"since":{"type":"string","format":"date-time","title":"Since"}},"type":"object","required":["message","severity","since"],"title":"ActiveNotice"},"Aggregation":{"properties":{"aggregation":{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"],"title":"Aggregation","description":"Aggregation function name.","examples":["avg","min","max","quantile","argmin","argmax"]},"parameters":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Parameters","description":"Parameters for parameterized aggregations.Example: 'quantile': [0.5] for median, [0.95] for 95th percentile, etc.","examples":[[0.5],[0.95]]},"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/CustomerVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"Specific variables to aggregate. If None, applies to all variables in the query"}},"type":"object","required":["aggregation"],"title":"Aggregation","description":"Aggregation function to apply when grouping forecast data.\n\nSupported aggregations:\n- Basic: avg, std, min, max, sum, count, median\n- Parameterized: quantile_(p), argmin_(col), argmax_(col)\n\nFor argmin/argmax, the parameter is the column to return, and the variable\nis the column to find the min/max of. Example:\n    argmin_(time)__temperature -> returns time when temperature is minimum\n\nCan be applied to specific variables or all variables in the query."},"AttributionsResponse":{"properties":{"attributions":{"items":{"$ref":"#/components/schemas/CustomerAttributionRecord"},"type":"array","title":"Attributions"}},"type":"object","title":"AttributionsResponse"},"AuctionBlockBidsResult":{"properties":{"data":{"items":{"$ref":"#/components/schemas/BlockBid"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"AuctionBlockBidsResult","description":"Result for a block-bids query."},"AuctionCurvesResult":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CurvePoint"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"AuctionCurvesResult","description":"Result for an aggregated-curves query."},"AvailableDatesResponse":{"properties":{"dates":{"items":{"type":"string"},"type":"array","title":"Dates"}},"type":"object","required":["dates"],"title":"AvailableDatesResponse","description":"Response containing available benchmark dates."},"AvailableForecastsQueryResult":{"properties":{"forecasts_per_model":{"additionalProperties":{"items":{"$ref":"#/components/schemas/ForecastInfo"},"type":"array"},"propertyNames":{"$ref":"#/components/schemas/Model"},"type":"object","title":"Forecasts Per Model","description":"Mapping of model identifiers to lists of available forecasts"},"total_per_model":{"anyOf":[{"additionalProperties":{"type":"integer"},"propertyNames":{"$ref":"#/components/schemas/Model"},"type":"object"},{"type":"null"}],"title":"Total Per Model","description":"Total matching forecasts per model BEFORE pagination. Lets callers detect truncated listings without a separate count request."},"archive_min_per_model":{"anyOf":[{"additionalProperties":{"type":"string"},"propertyNames":{"$ref":"#/components/schemas/Model"},"type":"object"},{"type":"null"}],"title":"Archive Min Per Model","description":"Earliest init_time per model in the full visible archive, ignoring since/before/limit filters. Lets callers distinguish a filtered query window from the true archive start."},"archive_max_per_model":{"anyOf":[{"additionalProperties":{"type":"string"},"propertyNames":{"$ref":"#/components/schemas/Model"},"type":"object"},{"type":"null"}],"title":"Archive Max Per Model","description":"Latest init_time per model in the full visible archive, ignoring since/before/limit filters."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination information if results were paginated"}},"type":"object","required":["forecasts_per_model"],"title":"AvailableForecastsQueryResult","description":"Result containing available forecast times per model."},"AvailableIndicesResult":{"properties":{"indices":{"items":{"$ref":"#/components/schemas/ClimateIndexInfo"},"type":"array","title":"Indices"}},"type":"object","required":["indices"],"title":"AvailableIndicesResult","description":"Result for available climate indices query."},"AvailableInitTimesResult":{"properties":{"init_times":{"items":{"$ref":"#/components/schemas/InitTimeInfo"},"type":"array","title":"Init Times"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count"},"archive_earliest_init_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archive Earliest Init Time"},"archive_latest_init_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archive Latest Init Time"},"availability_by_init_time":{"anyOf":[{"additionalProperties":{"items":{"prefixItems":[{"type":"string"},{"type":"string"}],"type":"array","maxItems":2,"minItems":2},"type":"array"},"type":"object"},{"type":"null"}],"title":"Availability By Init Time"}},"type":"object","required":["init_times"],"title":"AvailableInitTimesResult","description":"Result for available init times query."},"AvailablePsrTypesResult":{"properties":{"psr_types":{"items":{"type":"string"},"type":"array","title":"Psr Types"}},"type":"object","required":["psr_types"],"title":"AvailablePsrTypesResult","description":"Result for available PSR types query."},"AvailableStationsResult":{"properties":{"stations":{"items":{"$ref":"#/components/schemas/StationInfo"},"type":"array","title":"Stations"},"total_count":{"type":"integer","title":"Total Count","description":"Total number of stations"}},"type":"object","required":["stations","total_count"],"title":"AvailableStationsResult","description":"Result containing list of available stations."},"AvailableSubcategoriesResult":{"properties":{"subcategories":{"items":{"type":"string"},"type":"array","title":"Subcategories"}},"type":"object","required":["subcategories"],"title":"AvailableSubcategoriesResult","description":"Result for available subcategories query."},"AvailableTsosResult":{"properties":{"tsos":{"items":{"type":"string"},"type":"array","title":"Tsos"}},"type":"object","required":["tsos"],"title":"AvailableTsosResult","description":"Result for available TSOs query."},"AvailableVersionsResult":{"properties":{"versions":{"items":{"$ref":"#/components/schemas/VersionInfo"},"type":"array","title":"Versions"}},"type":"object","required":["versions"],"title":"AvailableVersionsResult","description":"Catalog of pin-able model versions, optionally filtered by zone/PSR."},"AvailableZonesResult":{"properties":{"zones":{"items":{"type":"string"},"type":"array","title":"Zones"}},"type":"object","required":["zones"],"title":"AvailableZonesResult","description":"Result for available zones query."},"BlockBid":{"properties":{"delivery_date":{"type":"string","format":"date","title":"Delivery Date"},"delivery_start":{"type":"string","format":"date-time","title":"Delivery Start"},"delivery_end":{"type":"string","format":"date-time","title":"Delivery End"},"market_area":{"type":"string","title":"Market Area"},"auction":{"type":"string","title":"Auction"},"resolution":{"type":"string","title":"Resolution"},"block_id":{"type":"string","title":"Block Id"},"block_type":{"type":"string","title":"Block Type"},"block_code_prm":{"type":"string","title":"Block Code Prm"},"execution":{"type":"string","title":"Execution"},"limit_price":{"type":"number","title":"Limit Price"},"volume":{"type":"number","title":"Volume"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["delivery_date","delivery_start","delivery_end","market_area","auction","resolution","block_id","block_type","block_code_prm","execution","limit_price","volume","currency"],"title":"BlockBid","description":"A single (block, delivery period) bid row."},"BoundingBox":{"properties":{"min_lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Min Lat","description":"Minimum latitude"},"max_lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Max Lat","description":"Maximum latitude"},"min_lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Min Lon","description":"Minimum longitude"},"max_lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Max Lon","description":"Maximum longitude"}},"type":"object","required":["min_lat","max_lat","min_lon","max_lon"],"title":"BoundingBox","description":"Geographic bounding box for filtering stations.\n\nNote: This is kept for backward compatibility. Prefer using GeoFilter\nwith type='bounding_box' for new code."},"ClimateIndex":{"type":"string","enum":["NAO","AO","AAO","PNA","PDO","QBO","AMO","SOI","WPO","EPO","GBI","EA","SCAND","EAWR","TNH","POL","EPNP","ENSO_NINO12","ENSO_NINO12_ANOM","ENSO_NINO3","ENSO_NINO3_ANOM","ENSO_NINO4","ENSO_NINO4_ANOM","ENSO_NINO34","ENSO_NINO34_ANOM","MEI","ONI","TNA","TSA","AMM","IOD","MJO_20E","MJO_70E","MJO_80E","MJO_100E","MJO_120E","MJO_140E","MJO_160E","MJO_120W","MJO_40W","MJO_10W","MJO_RMM1","MJO_RMM2","MJO_PHASE","MJO_AMPLITUDE","SUNSPOT"],"title":"ClimateIndex","description":"Climate oscillation index identifiers."},"ClimateIndexInfo":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"unit":{"type":"string","title":"Unit"}},"type":"object","required":["name","description","unit"],"title":"ClimateIndexInfo","description":"Metadata for a climate index."},"ClimateIndicesTimeseriesQuery":{"properties":{"indices":{"anyOf":[{"items":{"$ref":"#/components/schemas/ClimateIndex"},"type":"array"},{"type":"null"}],"title":"Indices","description":"Climate indices to query. If not set, returns all.","examples":[["NAO","ENSO_NINO34"]]},"sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sources","description":"Data sources to filter by (e.g. 'noaa_psl', 'noaa_cpc', 'sidc')."},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)","examples":["2020-01-01T00:00:00Z"]},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time for the query (exclusive). If None, no upper bound.","examples":["2025-01-01T00:00:00Z"]},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for time formatting (e.g. 'Europe/Berlin').","examples":["UTC","Europe/Berlin"]},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by (e.g. 'time__desc').","examples":[["time"],["time__desc"]]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters"}},"type":"object","required":["start_time"],"title":"ClimateIndicesTimeseriesQuery","description":"Query parameters for climate indices timeseries data."},"ClimatologyMetaResult":{"properties":{"description":{"type":"string","title":"Description"},"period":{"type":"string","title":"Period"},"grid_resolution":{"type":"string","title":"Grid Resolution"},"num_latitudes":{"type":"integer","title":"Num Latitudes"},"num_longitudes":{"type":"integer","title":"Num Longitudes"},"days_of_year":{"items":{"type":"integer"},"type":"array","title":"Days Of Year"},"hours":{"items":{"type":"integer"},"type":"array","title":"Hours"},"variables":{"items":{"type":"string"},"type":"array","title":"Variables"},"variable_units":{"additionalProperties":{"type":"string"},"type":"object","title":"Variable Units","default":{}}},"type":"object","required":["description","period","grid_resolution","num_latitudes","num_longitudes","days_of_year","hours","variables"],"title":"ClimatologyMetaResult","description":"Metadata about the climatology dataset."},"ClimatologyVariableInfo":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"unit":{"type":"string","title":"Unit","default":""}},"type":"object","required":["name","description"],"title":"ClimatologyVariableInfo","description":"Information about a climatology variable."},"ContinuousVwapSurfaceRequest":{"properties":{"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"market_area":{"type":"string","title":"Market Area","default":"DE"}},"type":"object","required":["start_time","end_time"],"title":"ContinuousVwapSurfaceRequest","description":"Request body for the gate-closure-anchored continuous VWAP surface."},"ContinuousVwapSurfaceResult":{"properties":{"delivery_start":{"items":{"type":"string","format":"date-time"},"type":"array","title":"Delivery Start"},"bucket":{"items":{"type":"integer"},"type":"array","title":"Bucket"},"vwap":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Vwap"},"volume":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Volume"}},"type":"object","required":["delivery_start","bucket","vwap","volume"],"title":"ContinuousVwapSurfaceResult","description":"Columnar VWAP surface response: parallel lists, one entry per cell.\n\nDocumented in the OpenAPI schema so SDK / dashboard types are generated."},"Coordinates":{"type":"string","enum":["model","init_time","time","prediction_timedelta","latitude","longitude","point","market_zone","country_key"],"title":"Coordinates"},"CurvePoint":{"properties":{"delivery_start":{"type":"string","format":"date-time","title":"Delivery Start"},"delivery_end":{"type":"string","format":"date-time","title":"Delivery End"},"market_area":{"type":"string","title":"Market Area"},"auction":{"type":"string","title":"Auction"},"resolution":{"type":"string","title":"Resolution"},"side":{"type":"string","title":"Side"},"point_index":{"type":"integer","title":"Point Index"},"price":{"type":"number","title":"Price"},"volume":{"type":"number","title":"Volume"}},"type":"object","required":["delivery_start","delivery_end","market_area","auction","resolution","side","point_index","price","volume"],"title":"CurvePoint","description":"A single point of an aggregated supply/demand curve."},"CustomerAttribution":{"properties":{"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"}},"type":"object","required":["title","message"],"title":"CustomerAttribution","description":"Customer-facing attribution on a run: title + message, visible reasons only."},"CustomerAttributionRecord":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"kind":{"type":"string","enum":["external","upstream","maintenance","internal"],"title":"Kind"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"subject_keys":{"items":{"type":"string"},"type":"array","title":"Subject Keys"}},"type":"object","required":["id","title","message","kind","starts_at","ends_at","subject_keys"],"title":"CustomerAttributionRecord","description":"Customer list row for ``GET /v1/status/attributions``."},"CustomerRunStatus":{"properties":{"subject_key":{"type":"string","title":"Subject Key"},"init_time":{"type":"string","format":"date-time","title":"Init Time"},"status":{"type":"string","enum":["scheduled","running","delayed","complete"],"title":"Status"},"on_time":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On Time"},"late_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Late Minutes"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"communicated_complete":{"type":"string","format":"date-time","title":"Communicated Complete"},"attribution":{"anyOf":[{"$ref":"#/components/schemas/CustomerAttribution"},{"type":"null"}]}},"type":"object","required":["subject_key","init_time","status","on_time","late_minutes","started_at","completed_at","communicated_complete"],"title":"CustomerRunStatus","description":"What one customer track sees for a run. Returned verbatim by query-engine.\n\nTimestamps are on the track's clock (standard weather = internal +30). No\ninternal targets or thresholds are present."},"CustomerVariable":{"type":"string","enum":["air_temperature_at_height_level_2m","surface_temperature","dew_point_temperature_at_height_level_2m","relative_humidity_at_height_level_2m","air_pressure_at_mean_sea_level","surface_air_pressure","wind_speed_at_height_level_10m","wind_direction_at_height_level_10m","wind_speed_at_height_level_100m","wind_direction_at_height_level_100m","wind_speed_at_height_level_20m","wind_speed_at_height_level_40m","wind_speed_at_height_level_60m","wind_speed_at_height_level_80m","wind_speed_at_height_level_120m","wind_speed_at_height_level_140m","wind_speed_at_height_level_160m","wind_speed_at_height_level_180m","wind_speed_at_height_level_200m","wind_direction_at_height_level_200m","air_density_at_height_level_2m","geopotential_at_pressure_level_50000Pa","eastward_wind_at_height_level_10m","northward_wind_at_height_level_10m","eastward_wind_at_height_level_100m","northward_wind_at_height_level_100m","wind_speed_of_gust_at_height_level_10m_max","surface_direct_downwelling_shortwave_flux_sum_1h","surface_downwelling_longwave_flux_sum_1h","surface_downwelling_shortwave_flux_sum_1h","surface_downwelling_shortwave_flux_sum_30min","surface_direct_downwelling_shortwave_flux_sum_30min","toa_bidirectional_reflectance_560_710nm","toa_bidirectional_reflectance_1500_1780nm","toa_brightness_temperature_3480_4360nm","toa_brightness_temperature_9800_11800nm","surface_downwelling_longwave_flux_sum_6h","surface_downwelling_shortwave_flux_sum_6h","surface_net_downward_longwave_flux_sum_1h","surface_net_downward_shortwave_flux_sum_1h","surface_net_downward_longwave_flux_sum_6h","surface_net_downward_shortwave_flux_sum_6h","surface_direct_along_beam_shortwave_flux_sum_6h","cloud_area_fraction_at_entire_atmosphere","cloud_area_fraction_at_entire_atmosphere_high_type","cloud_area_fraction_at_entire_atmosphere_medium_type","cloud_area_fraction_at_entire_atmosphere_low_type","precipitation_amount_sum_1h","precipitation_amount_sum_3h","precipitation_amount_sum_6h","precipitation_amount_sum_12h","precipitation_amount_sum_24h","atmosphere_convective_available_potential_energy","predominant_precipitation_type_at_surface","sea_surface_temperature","snowfall_sum_1h","surface_runoff_sum_1h","sub_surface_runoff_sum_1h","surface_sensible_heat_flux_sum_1h","surface_latent_heat_flux_sum_1h","maximum_temperature_at_height_level_2m_24h","minimum_temperature_at_height_level_2m_24h","snow_depth","temperature_in_ground_at_layer_below_ground_0.00m","volume_fraction_of_condensed_water_in_soil_at_layer_below_ground_0.00m","volume_fraction_of_condensed_water_in_soil_at_layer_below_ground_0.07m","volume_fraction_of_condensed_water_in_soil_at_layer_below_ground_0.28m","volume_fraction_of_condensed_water_in_soil_at_layer_below_ground_1.00m","surface_elevation","terrain_slope","terrain_aspect"],"title":"CustomerVariable","description":"Weather variable name with units:\n  • air_temperature_at_height_level_2m: K\n  • surface_temperature: K\n  • dew_point_temperature_at_height_level_2m: K\n  • relative_humidity_at_height_level_2m: %\n  • air_pressure_at_mean_sea_level: Pa\n  • surface_air_pressure: Pa\n  • wind_speed_at_height_level_10m: m/s\n  • wind_direction_at_height_level_10m: degrees\n  • wind_speed_at_height_level_100m: m/s\n  • wind_direction_at_height_level_100m: degrees\n  • wind_speed_at_height_level_20m: m/s\n  • wind_speed_at_height_level_40m: m/s\n  • wind_speed_at_height_level_60m: m/s\n  • wind_speed_at_height_level_80m: m/s\n  • wind_speed_at_height_level_120m: m/s\n  • wind_speed_at_height_level_140m: m/s\n  • wind_speed_at_height_level_160m: m/s\n  • wind_speed_at_height_level_180m: m/s\n  • wind_speed_at_height_level_200m: m/s\n  • wind_direction_at_height_level_200m: degrees\n  • air_density_at_height_level_2m: kg/m³\n  • geopotential_at_pressure_level_50000Pa: m²/s²\n  • eastward_wind_at_height_level_10m: m/s\n  • northward_wind_at_height_level_10m: m/s\n  • eastward_wind_at_height_level_100m: m/s\n  • northward_wind_at_height_level_100m: m/s\n  • wind_speed_of_gust_at_height_level_10m_max: m/s\n  • surface_direct_downwelling_shortwave_flux_sum_1h: J/m²\n  • surface_downwelling_longwave_flux_sum_1h: J/m²\n  • surface_downwelling_shortwave_flux_sum_1h: J/m²\n  • surface_downwelling_shortwave_flux_sum_30min: J/m²\n  • surface_direct_downwelling_shortwave_flux_sum_30min: J/m²\n  • toa_bidirectional_reflectance_560_710nm: \n  • toa_bidirectional_reflectance_1500_1780nm: \n  • toa_brightness_temperature_3480_4360nm: \n  • toa_brightness_temperature_9800_11800nm: \n  • surface_downwelling_longwave_flux_sum_6h: J/m²\n  • surface_downwelling_shortwave_flux_sum_6h: J/m²\n  • surface_net_downward_longwave_flux_sum_1h: J/m²\n  • surface_net_downward_shortwave_flux_sum_1h: J/m²\n  • surface_net_downward_longwave_flux_sum_6h: J/m²\n  • surface_net_downward_shortwave_flux_sum_6h: J/m²\n  • surface_direct_along_beam_shortwave_flux_sum_6h: J/m²\n  • cloud_area_fraction_at_entire_atmosphere: fraction (0-1)\n  • cloud_area_fraction_at_entire_atmosphere_high_type: fraction (0-1)\n  • cloud_area_fraction_at_entire_atmosphere_medium_type: fraction (0-1)\n  • cloud_area_fraction_at_entire_atmosphere_low_type: fraction (0-1)\n  • precipitation_amount_sum_1h: mm\n  • precipitation_amount_sum_3h: mm\n  • precipitation_amount_sum_6h: mm\n  • precipitation_amount_sum_12h: mm\n  • precipitation_amount_sum_24h: mm\n  • atmosphere_convective_available_potential_energy: J/kg\n  • predominant_precipitation_type_at_surface: categorical\n  • sea_surface_temperature: K\n  • snowfall_sum_1h: mm\n  • surface_runoff_sum_1h: mm\n  • sub_surface_runoff_sum_1h: mm\n  • surface_sensible_heat_flux_sum_1h: W/m²\n  • surface_latent_heat_flux_sum_1h: W/m²\n  • maximum_temperature_at_height_level_2m_24h: K\n  • minimum_temperature_at_height_level_2m_24h: K\n  • snow_depth: m\n  • temperature_in_ground_at_layer_below_ground_0.00m: K\n  • volume_fraction_of_condensed_water_in_soil_at_layer_below_ground_0.00m: m³/m³\n  • volume_fraction_of_condensed_water_in_soil_at_layer_below_ground_0.07m: m³/m³\n  • volume_fraction_of_condensed_water_in_soil_at_layer_below_ground_0.28m: m³/m³\n  • volume_fraction_of_condensed_water_in_soil_at_layer_below_ground_1.00m: m³/m³\n  • surface_elevation: m\n  • terrain_slope: deg\n  • terrain_aspect: deg"},"DailyStats":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"count":{"type":"integer","title":"Count"},"on_time_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"On Time Pct"},"p50":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P50"},"p90":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P90"},"late_count":{"type":"integer","title":"Late Count"},"delayed_count":{"type":"integer","title":"Delayed Count"},"attributed_count":{"type":"integer","title":"Attributed Count","default":0}},"type":"object","required":["date","count","on_time_pct","p50","p90","late_count","delayed_count"],"title":"DailyStats"},"DataSource":{"type":"string","enum":["clickhouse","open_meteo"],"title":"DataSource"},"DelayQuantiles":{"properties":{"p50":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P50"},"p90":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P90"},"p99":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P99"}},"type":"object","required":["p50","p90","p99"],"title":"DelayQuantiles","description":"Completion-delay quantiles in minutes over completed runs (``None`` when empty)."},"EntsoeBusinessType":{"type":"string","enum":["Planned maintenance","Unplanned outage"],"title":"EntsoeBusinessType","description":"Business type for outages (reason).\n\nNote: Values match the human-readable strings stored in ClickHouse,\nnot the raw ENTSOE codes (A53, A54)."},"EntsoeOtherType":{"type":"string","enum":["Long","Short"],"title":"EntsoeOtherType","description":"ENTSOE Other Type (for imbalance data)."},"EntsoeOutageSourceType":{"type":"string","enum":["load","production_unit","generation_unit","offshore_grid","transmission"],"title":"EntsoeOutageSourceType","description":"Outage source type discriminator."},"EntsoeOutagesQuery":{"properties":{"source_type":{"anyOf":[{"$ref":"#/components/schemas/EntsoeOutageSourceType"},{"type":"null"}],"description":"Filter by ENTSO-E unavailability source type"},"mrids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mrids","description":"Logical outage document ids (ENTSO-E mRID). Identity scoping; applied before revision collapse / history projection."},"biddingzone_domain":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoeZone"},"type":"array"},{"type":"null"}],"title":"Biddingzone Domain","description":"List of bidding zones (for generation outages)"},"in_domain":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoeZone"},"type":"array"},{"type":"null"}],"title":"In Domain","description":"List of from-zones (for transmission outages)"},"out_domain":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoeZone"},"type":"array"},{"type":"null"}],"title":"Out Domain","description":"List of to-zones (for transmission outages)"},"any_domain":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoeZone"},"type":"array"},{"type":"null"}],"title":"Any Domain","description":"Area involvement filter: matches when biddingzone_domain, in_domain, or out_domain is in the list (OR). Used by v2 ``areas`` for generation and/or transmission without silently dropping either asset type. Post-collapse / candidate-discover."},"active_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Active At","description":"Get outages active at this specific time (start <= time < end)"},"start_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start From","description":"Filter by start time >= this value"},"start_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start To","description":"Filter by start time < this value"},"plant_types":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoePsrType"},"type":"array"},{"type":"null"}],"title":"Plant Types","description":"Filter by plant type (generation only)"},"business_types":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoeBusinessType"},"type":"array"},{"type":"null"}],"title":"Business Types","description":"Filter by business type (reason)"},"exclude_cancelled":{"type":"boolean","title":"Exclude Cancelled","description":"After latest-revision projection, exclude logical outages whose latest revision is terminal (docstatus in ['A09', 'Cancelled', 'A13', 'Withdrawn']). Must not be applied before revision collapse.","default":true},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by. Supports direction suffix: 'start_time__desc' for descending, 'start_time__asc' for ascending. Object format: {'field': 'start_time', 'direction': 'desc'}"},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters"},"announced_as_of":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Announced As Of","description":"Announcement-time filter. If set, only outage records the TSO had published by this instant are returned (created_doc_time <= announced_as_of). Unlike as_of this is a normal analytical filter, not backtest replay: use it to reconstruct which outages the market knew about when an auction cleared."},"aggregate_capacity":{"type":"boolean","title":"Aggregate Capacity","description":"When true, return summed unavailable capacity grouped by zone, plant_type and businesstype instead of raw per-unit rows. Generation outages only (transmission has no nominal_power).","default":false},"aggregate_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Aggregate At","description":"Only meaningful with aggregate_capacity=true. When set, the aggregate sums the unavailable capacity of each outage as it stood at this instant rather than the outage's peak."}},"type":"object","title":"EntsoeOutagesQuery","description":"Query parameters for ENTSOE outages data.\n\nHistorical replay selects the latest stored ENTSO-E revision published by\nthe requested ``as_of`` timestamp. Load replay is latest-only because\nENTSO-E does not expose its historical load revisions.\n\nSupports filtering by:\n- source_type: ENTSO-E unavailability document type\n- zones: biddingzone_domain (single-zone) or in_domain/out_domain (transmission)\n- time: active_at, or start_from/start_to\n- attributes: plant_type, business_type, status\n\nResponses are projected to the latest revision per\n``(source_type, mrid)``. See\n``jua_query_v2.entsoe.outage_revision_semantics``. Transport ``as_of``\n(simulate routes) is a Jua observability cutoff on ``ingested_at``."},"EntsoePivotedQuery":{"properties":{"zone_keys":{"items":{"$ref":"#/components/schemas/EntsoeZone"},"type":"array","title":"Zone Keys","description":"Zone codes to query"},"psr_types":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoePsrType"},"type":"array"},{"type":"null"}],"title":"Psr Types","description":"PSR types to pivot into columns"},"generation_variable":{"anyOf":[{"$ref":"#/components/schemas/EntsoeVariable"},{"type":"null"}],"description":"ENTSO-E variable for generation data"},"load_variable":{"anyOf":[{"$ref":"#/components/schemas/EntsoeVariable"},{"type":"null"}],"description":"ENTSO-E variable for load data"},"psr_column_map":{"additionalProperties":{"type":"string"},"type":"object","title":"Psr Column Map","description":"Maps PSR type name to output column name"},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time (inclusive)"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time (exclusive)"},"temporal_resolution_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Temporal Resolution Minutes","description":"Target resolution; None to skip interpolation","default":15},"model_label":{"type":"string","title":"Model Label","description":"Value for the 'model' column in output rows","default":"ENTSO-E Actual"},"needed_derived_vars":{"anyOf":[{"items":{"type":"string"},"type":"array","uniqueItems":true},{"type":"null"}],"title":"Needed Derived Vars","description":"Set of derived column names to attempt to compute (wind_total_mw / renewables_total_mw / residual_load_mw). compute_derived_power_columns silently skips any whose input columns aren't in the frame, so callers don't have to mirror the feasibility logic. None means no derivation."},"load_col":{"type":"string","title":"Load Col","default":"load_mw"},"zone_key_remap":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Zone Key Remap","description":"Remap zone_key values in output"}},"type":"object","required":["zone_keys","start_time"],"title":"EntsoePivotedQuery","description":"Query that returns ENTSO-E data pivoted into wide-column format.\n\nPivots PSR-based generation data into per-source columns, optionally\njoins load, and interpolates to a regular time grid in ClickHouse.\nDerived columns (wind_total / renewables_total / residual_load) are\ncomputed post-query in `query_pivoted_data` via the shared\n`compute_derived_power_columns` helper — same code path as UK power\nand the api-server pivoted view, so null-propagation semantics match\neverywhere. Callers declare *intent* via ``needed_derived_vars``\n(the set of derived column names they want); feasibility (does this\nzone have onshore+offshore? does the frame have load?) is decided by\nthe derivation helper itself, not by the call site."},"EntsoePsrType":{"type":"string","enum":["Biomass","Energy storage","Fossil Brown coal/Lignite","Fossil Coal-derived gas","Fossil Gas","Fossil Hard coal","Fossil Oil","Fossil Oil shale","Fossil Peat","Geothermal","Hydro Pumped Storage","Hydro Pumped Storage Consumption","Hydro Pumped Storage Generation","Hydro Run-of-river and poundage","Hydro Water Reservoir","Marine","Nuclear","Other","Other renewable","Solar","Waste","Wind Offshore","Wind Onshore"],"title":"EntsoePsrType","description":"ENTSOE Production/Generation Source (PSR) types."},"EntsoeTimeseriesQuery":{"properties":{"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoeVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"List of ENTSOE variable types to query. If not set, returns all variables.","examples":[["day_ahead_prices","load_actual"]]},"zone_keys":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoeZone"},"type":"array"},{"type":"null"}],"title":"Zone Keys","description":"List of zone codes (e.g., ['DE_LU', 'FR', 'NO_1'])","examples":[["DE_LU","FR"]]},"zone_from":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoeZone"},"type":"array"},{"type":"null"}],"title":"Zone From","description":"Source zones for cross-border queries (e.g., FR)","examples":[["FR"]]},"zone_to":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoeZone"},"type":"array"},{"type":"null"}],"title":"Zone To","description":"Destination zones for cross-border queries (e.g., DE_LU)","examples":[["DE_LU"]]},"psr_types":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoePsrType"},"type":"array"},{"type":"null"}],"title":"Psr Types","description":"List of PSR types to filter generation data","examples":[["Solar","Wind Onshore"]]},"other_types":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoeOtherType"},"type":"array"},{"type":"null"}],"title":"Other Types","description":"Other types filter (e.g., 'Long', 'Short' for imbalance)","examples":[["Long","Short"]]},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)","examples":["2025-12-01T00:00:00Z"]},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time for the query (exclusive). If None, no upper bound is applied (useful for day-ahead forecasts)","examples":["2025-12-15T00:00:00Z"]},"aggregation":{"$ref":"#/components/schemas/jua_query_v2__entsoe__query__TemporalAggregation","description":"Temporal aggregation to apply","default":"none"},"include_metadata":{"type":"boolean","title":"Include Metadata","description":"Include metadata column in response","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone name for time formatting (e.g., 'Europe/Berlin', 'America/New_York'). Defaults to UTC","examples":["UTC","Europe/Berlin","America/New_York"]},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by. Supports direction suffix: 'time__desc' for descending, 'time__asc' for ascending (default). Can also use object format: {'field': 'time', 'direction': 'desc'}","examples":[["time","zone_key"],["time__desc"],[{"direction":"desc","field":"time"}]]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters"}},"type":"object","required":["start_time"],"title":"EntsoeTimeseriesQuery","description":"Query parameters for ENTSOE timeseries data.\n\nSupports filtering by:\n- variables: List of ENTSOE variable types (optional, returns all if not set)\n- zone_keys: List of zone codes for zone-based data\n- zone_from/zone_to: For cross-border flow queries\n- psr_types: For generation data by source type\n- start_time: Start of time range (required)\n- end_time: End of time range (optional - if None, no upper bound applied)\n\nNote: end_time can be None to include all future data, which is useful\nfor day-ahead forecasts that extend into tomorrow."},"EntsoeVariable":{"type":"string","enum":["countertrading","crossborder_flows","day_ahead_prices","generation_actual","generation_forecast_da","imbalance_prices","imbalance_volumes","intraday_offered_capacity","load_actual","load_forecast_da","net_position_da","net_position_total","ntc_dayahead","ntc_weekahead","ntc_monthahead","ntc_yearahead","redispatch_crossborder","redispatch_internal","scheduled_exchanges_da","scheduled_exchanges_total","total_available_hydro_capacity","wind_solar_forecast_da","wind_solar_forecast_intraday"],"title":"EntsoeVariable","description":"ENTSOE timeseries variable types."},"EntsoeVariableInfo":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"unit":{"type":"string","title":"Unit"},"uses_zone_key":{"type":"boolean","title":"Uses Zone Key","default":true},"uses_zone_from_to":{"type":"boolean","title":"Uses Zone From To","default":false},"uses_psr_type":{"type":"boolean","title":"Uses Psr Type","default":false},"zone_kind":{"$ref":"#/components/schemas/EntsoeZoneKind","default":"physical"}},"type":"object","required":["name","description","unit"],"title":"EntsoeVariableInfo","description":"Information about an ENTSOE variable."},"EntsoeZone":{"type":"string","enum":["AL","AT","BA","BE","BG","CH","CY","CZ","DE","DK","EE","ES","FI","FR","GB","GE","GR","HR","HU","IE","IT","LT","LU","LV","MD","ME","MK","MT","NL","NO","PL","PT","RO","RS","RU","SE","SI","SK","TR","UA","UK","XK","DE_LU","DE_AT_LU","DE_50HZ","DE_AMPRION","DE_TENNET","DE_TRANSNET","DK_1","DK_2","DK_CA","IT_CALA","IT_CNOR","IT_CSUD","IT_NORD","IT_SARD","IT_SICI","IT_SUD","IT_SACO_AC","IT_SACO_DC","NO_1","NO_2","NO_3","NO_4","NO_5","NO_2_NSL","SE_1","SE_2","SE_3","SE_4","IE_SEM","GB_NIR","LU_BZN","UA_IPS"],"title":"EntsoeZone","description":"ENTSOE bidding zones and control areas.\n\nBased on ENTSO-E Transparency Platform zone codes."},"EntsoeZoneKind":{"type":"string","enum":["physical","bidding","cross_border"],"title":"EntsoeZoneKind","description":"Which ENTSOE zone concept a variable is published under.\n\nENTSOE publishes some data at the country / control-area level\n(generation, load, capacity) and other data at the bidding-zone\nlevel (prices, net positions, imbalance).  For most countries the\ncountry code IS the bidding-zone code, but not always: Ireland\npublishes gen/load under ``IE`` (the country) and day-ahead prices\nunder ``IE_SEM`` (the all-island Single Electricity Market bidding\nzone).  Luxembourg is similar (``LU`` vs ``LU_BZN``).\n\nCross-border variables (flows, NTC, scheduled exchanges) use\n``zone_from`` / ``zone_to`` instead of ``zone_key`` and are flagged\nseparately so callers know not to try resolving them against a\nphysical/bidding zone pair."},"EpexSpotBlockBidQuery":{"properties":{"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time (inclusive, filters on delivery_start).","examples":["2026-04-01T00:00:00Z"]},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time (exclusive). If None, no upper bound.","examples":["2026-04-02T00:00:00Z"]},"market_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Area","description":"Market area filter (e.g. 'DE', 'GB'). Defaults to DE so GB GBP rows cannot mix with DE EUR. v2 public serving is DE and DE-LU; GB is internal-only. v1 serves DE and DE-LU only. Other-provider codes are ignored.","default":"DE"},"market_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Market Areas","description":"Market area IN-filter. Takes precedence over market_area."},"auction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auction","description":"Auction filter (e.g. 'DA')."},"auctions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Auctions","description":"Auction IN-filter. Takes precedence over auction."},"area_auctions":{"anyOf":[{"items":{"prefixItems":[{"type":"string"},{"type":"string"}],"type":"array","maxItems":2,"minItems":2},"type":"array"},{"type":"null"}],"title":"Area Auctions","description":"Per-area (market_area, auction) pairs. When set, binds (market_area, auction) IN and skips the independent auction predicate. Rejects an empty list — ClickHouse IN [] is invalid."},"resolution":{"anyOf":[{"type":"string","enum":["PT15M","PT30M","PT60M"]},{"type":"null"}],"title":"Resolution","description":"Resolution filter: PT15M, PT30M, or PT60M."},"resolutions":{"anyOf":[{"items":{"type":"string","enum":["PT15M","PT30M","PT60M"]},"type":"array"},{"type":"null"}],"title":"Resolutions","description":"Resolution IN-filter. Takes precedence over resolution."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for delivery_start/_end formatting.","examples":["UTC","Europe/Berlin"]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."},"keyset_after":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Keyset After","description":"Exclusive keyset lower bound; when set, OFFSET is ignored."},"execution":{"anyOf":[{"type":"string","enum":["Y","N"]},{"type":"null"}],"title":"Execution","description":"Execution flag filter: Y or N."},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by (e.g. 'delivery_start', 'block_id')."}},"type":"object","required":["start_time"],"title":"EpexSpotBlockBidQuery","description":"Query for EPEX SPOT block bids."},"EpexSpotCurveQuery":{"properties":{"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time (inclusive, filters on delivery_start).","examples":["2026-04-01T00:00:00Z"]},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time (exclusive). If None, no upper bound.","examples":["2026-04-02T00:00:00Z"]},"market_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Area","description":"Market area filter (e.g. 'DE', 'GB'). Defaults to DE so GB GBP rows cannot mix with DE EUR. v2 public serving is DE and DE-LU; GB is internal-only. v1 serves DE and DE-LU only. Other-provider codes are ignored.","default":"DE"},"market_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Market Areas","description":"Market area IN-filter. Takes precedence over market_area."},"auction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auction","description":"Auction filter (e.g. 'DA')."},"auctions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Auctions","description":"Auction IN-filter. Takes precedence over auction."},"area_auctions":{"anyOf":[{"items":{"prefixItems":[{"type":"string"},{"type":"string"}],"type":"array","maxItems":2,"minItems":2},"type":"array"},{"type":"null"}],"title":"Area Auctions","description":"Per-area (market_area, auction) pairs. When set, binds (market_area, auction) IN and skips the independent auction predicate. Rejects an empty list — ClickHouse IN [] is invalid."},"resolution":{"anyOf":[{"type":"string","enum":["PT15M","PT30M","PT60M"]},{"type":"null"}],"title":"Resolution","description":"Resolution filter: PT15M, PT30M, or PT60M."},"resolutions":{"anyOf":[{"items":{"type":"string","enum":["PT15M","PT30M","PT60M"]},"type":"array"},{"type":"null"}],"title":"Resolutions","description":"Resolution IN-filter. Takes precedence over resolution."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for delivery_start/_end formatting.","examples":["UTC","Europe/Berlin"]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."},"keyset_after":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Keyset After","description":"Exclusive keyset lower bound; when set, OFFSET is ignored."},"side":{"anyOf":[{"type":"string","enum":["Sell","Purchase"]},{"type":"null"}],"title":"Side","description":"Curve side filter: Sell (supply) or Purchase (demand)."},"sides":{"anyOf":[{"items":{"type":"string","enum":["Sell","Purchase"]},"type":"array"},{"type":"null"}],"title":"Sides","description":"Curve side IN-filter. Takes precedence over side."},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by (e.g. 'delivery_start', 'point_index__desc')."}},"type":"object","required":["start_time"],"title":"EpexSpotCurveQuery","description":"Query for EPEX SPOT aggregated supply/demand curves."},"EpexSpotTimeseriesQuery":{"properties":{"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/EpexSpotVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"Variables to query. If not set, returns all.","examples":[["da_price","continuous_weighted_avg_price"]]},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive, filters on delivery_start)","examples":["2026-04-01T00:00:00Z"]},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time for the query (exclusive). If None, no upper bound.","examples":["2026-04-14T00:00:00Z"]},"market_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Area","description":"Market area filter (e.g. 'DE', 'GB'). Defaults to DE so GB GBP rows cannot mix with DE EUR. v2 public serving is DE and DE-LU; GB is internal-only. v1 serves DE and DE-LU only. Other-provider codes are ignored.","default":"DE"},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for time formatting (e.g. 'Europe/Berlin').","examples":["UTC","Europe/Berlin"]},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by (e.g. 'delivery_start__desc')."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters"}},"type":"object","required":["start_time"],"title":"EpexSpotTimeseriesQuery","description":"Query parameters for EPEX SPOT market data.\n\nEach variable maps to a specific ClickHouse table and column.\nThe query builder generates the appropriate SQL UNION for variables\nspanning different tables."},"EpexSpotTradesQuery":{"properties":{"market_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Area","description":"Market area filter (e.g. 'DE', 'GB'). Defaults to DE so GB GBP rows cannot mix with DE EUR. v2 public serving is DE and DE-LU; GB is internal-only. v1 serves DE and DE-LU only. Other-provider codes are ignored.","default":"DE","examples":["DE"]},"market_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Market Areas","description":"Market area IN-filter. Takes precedence over market_area.","examples":[["DE","FR"]]},"delivery_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Delivery Areas","description":"Delivery area codes to filter by (e.g. ['DE1', 'DE4']).","examples":[["DE1","DE4"]]},"sides":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sides","description":"Trade sides to filter by ('BUY' and/or 'SELL').","examples":[["BUY"]]},"products":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Products","description":"Product codes to filter by (e.g. ['XBID_Hour_Power']).","examples":[["XBID_Hour_Power"]]},"trade_phases":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Trade Phases","description":"Trade phases to filter by (e.g. ['CONT']).","examples":[["CONT"]]},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start execution time (inclusive, filters on execution_time).","examples":["2026-04-08T00:00:00Z"]},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End execution time (exclusive, filters on execution_time).","examples":["2026-04-09T00:00:00Z"]},"delivery_date_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delivery Date Start","description":"Start delivery date (inclusive). EPEX CET/CEST trading day (Europe/Berlin, including GB), not a UTC calendar date.","examples":["2026-04-08"]},"delivery_date_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delivery Date End","description":"End delivery date (inclusive). EPEX CET/CEST trading day (Europe/Berlin, including GB), not a UTC calendar date.","examples":["2026-04-08"]},"delivery_start_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivery Start From","description":"Inclusive lower bound on delivery_start (UTC)."},"delivery_start_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivery Start To","description":"Exclusive upper bound on delivery_start (UTC)."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for datetime output (e.g. 'Europe/Berlin').","examples":["UTC","Europe/Berlin"]},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by (e.g. 'execution_time__desc')."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."},"keyset_after":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Keyset After","description":"Exclusive lower bound for keyset pagination matching the v2 total order (market_area, execution_time, delivery_date, trade_id, side, delivery_area). When set, OFFSET is ignored."}},"type":"object","title":"EpexSpotTradesQuery","description":"Query parameters for EPEX SPOT intraday continuous individual trades.\n\nFetches row-level trades from ``epex_spot_continuous_trades``. Filter by\nmarket area, delivery area, side, product, trade phase, a trade-execution\ntime window, and/or a delivery-date window. ``delivery_date`` is the table's\nprimary-index / partition key, so a ``delivery_date_*`` filter is the\ncheapest way to scope a query."},"EpexSpotVariable":{"type":"string","enum":["continuous_weighted_avg_price","continuous_last_price","continuous_low_price","continuous_high_price","continuous_volume_buy","continuous_volume_sell","continuous_index_price","continuous_idfull_price","continuous_id1_price","continuous_id3_price","da_price","ida1_price","ida2_price","ida3_price","da_volume","ida1_volume","ida2_volume","ida3_volume","da_index_price","da_hourly_price","da_hourly_volume"],"title":"EpexSpotVariable","description":"EPEX SPOT user-facing variable types."},"EpexSpotVariableInfo":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"unit":{"type":"string","title":"Unit"},"table":{"type":"string","title":"Table"}},"type":"object","required":["name","description","unit","table"],"title":"EpexSpotVariableInfo","description":"Information about an EPEX SPOT variable."},"ForecastIndexQuery":{"properties":{"model":{"$ref":"#/components/schemas/Model","description":"Model identifiers to query (e.g. 'ept2')","examples":["ept1_5","ept2"]},"init_time":{"anyOf":[{"type":"integer","minimum":0.0,"description":"Offset from latest forecast (0 = latest, 1 = second latest, etc.)"},{"type":"string","format":"date-time"},{"type":"string","pattern":"^latest(-\\d+)?$","description":"Use 'latest' or 'latest-N' for relative init times"},{"items":{"anyOf":[{"type":"integer","minimum":0.0,"description":"Offset from latest forecast (0 = latest, 1 = second latest, etc.)"},{"type":"string","format":"date-time"},{"type":"string","pattern":"^latest(-\\d+)?$","description":"Use 'latest' or 'latest-N' for relative init times"}]},"type":"array"},{"$ref":"#/components/schemas/TimeSlice"},{"$ref":"#/components/schemas/PreferredHours"}],"title":"Init Time","description":"Forecast initialization time(s). Accepts: 'latest' or 'latest-N' for relative init times, an integer offset (0 = latest, 1 = second latest), an ISO 8601 datetime string, a list of any of the above, or a TimeSlice object with start/end for a date range.","examples":["latest","latest-1",0,"2025-01-15T00:00:00","2025-05-02 12:00:00",["2025-01-15T00:00:00","2025-01-16T00:00:00"],[0,"latest-1","2025-01-16T00:00:00"],{"end":"2025-01-07T00:00:00","start":"2025-01-01T00:00:00"}]},"latitude":{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2,"title":"Latitude","description":"The range of latitudes to return.","examples":[[32,71],[25,50]]},"longitude":{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2,"title":"Longitude","description":"Geographic filter specifying the query location(s) or region(s)","examples":[[-15,50],[70,125]]},"variables":{"items":{"$ref":"#/components/schemas/CustomerVariable"},"type":"array","title":"Variables","description":"List of weather variables to query (e.g., 'air_temperature_at_height_level_2m', 'wind_speed_at_height_level_100m'). If empty, returns all variables available for the selected models","examples":[["air_temperature_at_height_level_2m","wind_speed_at_height_level_100m"]]},"prediction_timedelta":{"anyOf":[{"type":"integer"},{"$ref":"#/components/schemas/PredictionTimedeltaSlice"},{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Prediction Timedelta","description":"Forecast lead time(s) from init_time. The units are determined by the `timedelta_unit` parameter (default: `h`). Can be a single integer, list of integers, or a PredictionTimedeltaSlice range. If None, returns all available lead times. ","examples":[1,[1,2,3],{"end":48,"start":0}]},"latest_min_prediction_timedelta":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Latest Min Prediction Timedelta","description":"When using init_time='latest', only use forecasts with at least `latest_min_prediction_timedelta` of lead time available. The units are determined by the `timedelta_unit` parameter (default: `h`). "},"timedelta_unit":{"type":"string","enum":["h","m","d","hour","hourly","hours","minute","minutes","day","days"],"title":"Timedelta Unit","description":"Time scale to use for the query. Can be 'h' for hours, 'm' for minutes, 'd' for days","default":"h","examples":["h","m","d","hour","hourly","hours","minute","minutes","day","days"]}},"type":"object","required":["model","init_time","latitude","longitude"],"title":"ForecastIndexQuery","description":"Main query object for retrieving the index for forecast data."},"ForecastInfo":{"properties":{"init_time":{"type":"string","title":"Init Time","description":"Forecast initialization time"},"max_prediction_timedelta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Prediction Timedelta","description":"Maximum available lead time in minutes for this forecast"},"dissemination_time":{"type":"string","title":"Dissemination Time","description":"Forecast step dissemination time"}},"type":"object","required":["init_time","dissemination_time"],"title":"ForecastInfo","description":"Information about a single available forecast."},"ForecastQuery":{"properties":{"models":{"anyOf":[{"items":{"$ref":"#/components/schemas/Model"},"type":"array"},{"type":"null"}],"title":"Models","description":"List of forecast model identifiers to query (e.g., ['ept2', 'aifs']). Required if model_runs is not specified.","examples":[["ept2"],["ept2","ept1_5"]]},"geo":{"$ref":"#/components/schemas/GeoFilter","description":"Geographic filter specifying the query location(s) or region(s)","examples":[{"method":"nearest","type":"point","value":[52.52,13.405]},{"type":"market_zone","value":"DE"},{"type":"country_key","value":"DE"},{"type":"country_key","value":["DE","FR"]}]},"init_time":{"anyOf":[{"type":"integer","minimum":0.0,"description":"Offset from latest forecast (0 = latest, 1 = second latest, etc.)"},{"type":"string","format":"date-time"},{"type":"string","pattern":"^latest(-\\d+)?$","description":"Use 'latest' or 'latest-N' for relative init times"},{"items":{"anyOf":[{"type":"integer","minimum":0.0,"description":"Offset from latest forecast (0 = latest, 1 = second latest, etc.)"},{"type":"string","format":"date-time"},{"type":"string","pattern":"^latest(-\\d+)?$","description":"Use 'latest' or 'latest-N' for relative init times"}]},"type":"array"},{"$ref":"#/components/schemas/TimeSlice"},{"$ref":"#/components/schemas/PreferredHours"},{"type":"null"}],"title":"Init Time","description":"Forecast initialization time(s). Accepts: 'latest' or 'latest-N' for relative init times, an integer offset (0 = latest, 1 = second latest), an ISO 8601 datetime string, a list of any of the above, or a TimeSlice object with start/end for a date range. Required if model_runs is not specified.","examples":["latest","latest-1",0,1,"2025-01-15T00:00:00",["latest","latest-1","2025-01-15T00:00:00"],[0,1,2],{"end":"2025-01-07T00:00:00","start":"2025-01-01T00:00:00"}]},"model_runs":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"integer","minimum":0.0,"description":"Offset from latest forecast (0 = latest, 1 = second latest, etc.)"},{"type":"string","format":"date-time"},{"type":"string","pattern":"^latest(-\\d+)?$","description":"Use 'latest' or 'latest-N' for relative init times"},{"items":{"anyOf":[{"type":"integer","minimum":0.0,"description":"Offset from latest forecast (0 = latest, 1 = second latest, etc.)"},{"type":"string","format":"date-time"},{"type":"string","pattern":"^latest(-\\d+)?$","description":"Use 'latest' or 'latest-N' for relative init times"}]},"type":"array"},{"$ref":"#/components/schemas/TimeSlice"},{"$ref":"#/components/schemas/PreferredHours"}]},"propertyNames":{"$ref":"#/components/schemas/Model"},"type":"object"},{"type":"null"}],"title":"Model Runs","description":"Per-model init_time specification. Alternative to models+init_time. Keys are model identifiers, values are init_time specifications (same formats as init_time: 'latest', 'latest-N', integer offset, datetime, list, or TimeSlice). Cannot be used together with models/init_time.","examples":[{"aifs":"2025-01-15T00:00:00","ept2":"latest"},{"aifs":1,"ept2":0},{"ept2":["latest","latest-1"]}]},"time":{"anyOf":[{"type":"string","format":"date-time"},{"items":{"type":"string","format":"date-time"},"type":"array"},{"$ref":"#/components/schemas/TimeSlice"},{"type":"null"}],"title":"Time","description":"Filter by specific forecast valid times (as opposed to lead times). Accepts datetime, list of datetimes, or time range","examples":["2025-01-15T09:00:00","2025-05-02 14:00:00",["2025-01-15T00:00:00","2025-01-16T00:00:00"],{"end":"2025-01-07T00:00:00","start":"2025-01-01T00:00:00"}]},"variables":{"items":{"$ref":"#/components/schemas/CustomerVariable"},"type":"array","title":"Variables","description":"List of weather variables to query (e.g., 'air_temperature_at_height_level_2m', 'wind_speed_at_height_level_100m'). If empty, returns all variables available for the selected models","examples":[["air_temperature_at_height_level_2m","wind_speed_at_height_level_100m"]]},"prediction_timedelta":{"anyOf":[{"type":"integer"},{"$ref":"#/components/schemas/PredictionTimedeltaSlice"},{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Prediction Timedelta","description":"Forecast lead time(s) from init_time. The units are determined by the `timedelta_unit` parameter (default: `h`). Can be a single integer, list of integers, or a PredictionTimedeltaSlice range. If None, returns all available lead times. ","examples":[1,[1,2,3],{"end":48,"start":0}]},"latest_min_prediction_timedelta":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Latest Min Prediction Timedelta","description":"When using init_time='latest', only use forecasts with at least `latest_min_prediction_timedelta` of lead time available. The units are determined by the `timedelta_unit` parameter (default: `h`). "},"timedelta_unit":{"type":"string","enum":["h","m","d","hour","hourly","hours","minute","minutes","day","days"],"title":"Timedelta Unit","description":"Time scale to use for the query. Can be 'h' for hours, 'm' for minutes, 'd' for days","default":"h","examples":["h","m","d","hour","hourly","hours","minute","minutes","day","days"]},"temporal_resolution":{"anyOf":[{"type":"integer","enum":[15,30,60,120,180,240,300,360]},{"type":"null"}],"title":"Temporal Resolution","description":"Requested temporal resolution in minutes","examples":[15,30,60,120]},"group_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/GroupByKey"},"type":"array"},{"type":"null"}],"title":"Group By","description":"List of dimensions to group by for aggregation (e.g., ['model', 'init_time', 'time']). Requires 'aggregation' to be specified. See docs.jua.ai for grouping examples"},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_Union_Coordinates__CustomerVariable__"},"type":"array"},{"type":"null"}],"title":"Order By","description":"List of dimensions to sort results by. Supports direction suffix: 'time__desc' for descending, 'time__asc' for ascending (default). Can also use object format: {'field': 'time', 'direction': 'desc'}","examples":[["model","init_time","prediction_timedelta"],["point","time__desc"],[{"direction":"desc","field":"time"}]]},"aggregation":{"anyOf":[{"items":{"$ref":"#/components/schemas/Aggregation"},"type":"array"},{"type":"null"}],"title":"Aggregation","description":"List of aggregation functions to apply when grouping (e.g., ['avg', 'std']). Requires 'group_by' to be specified"},"weighting":{"anyOf":[{"$ref":"#/components/schemas/Weighting"},{"type":"null"}],"description":"Optional weighting scheme for geographic aggregation (e.g., by wind/solar capacity or population)","examples":[{"type":"wind_capacity"},{"type":"solar_capacity"},{"type":"population"}]},"include_time":{"type":"boolean","title":"Include Time","description":"Include the forecast valid time (init_time + prediction_timedelta) as a column in results","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone name for time formatting (e.g., 'Europe/Berlin', 'America/New_York'). Defaults to UTC","examples":["UTC","Europe/Berlin","America/New_York"]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters for limiting result size. Requires 'order_by' to be specified","examples":[{"limit":100,"offset":0}]},"include_ensemble_members":{"type":"boolean","title":"Include Ensemble Members","description":"When True, return per-ensemble-member rows for ensemble models instead of the implicit ensemble-mean. Disables the auto-grouping that hides individual members. If group_by is also explicit, 'ensemble_member' is automatically added so aggregation runs per member.","default":false},"debias":{"type":"boolean","title":"Debias","description":"If True, return Jua's bias-corrected forecast values. Supported variables are `air_temperature_at_height_level_2m` and `wind_speed_at_height_level_10m`; other variables and power/MW forecasts are not supported.","default":false},"mw_walkforward_debias":{"type":"boolean","title":"Mw Walkforward Debias","description":"When weighting.unit='mw', apply the shared leakage-safe walk-forward MW debias using the shared variable-specific init/lead window. Distinct from synoptic ``debias`` (t2m/ws10). Opt in explicitly; raw MW remains the API default.","default":false},"calibrate":{"type":"boolean","title":"Calibrate","description":"If True, inflate ensemble spread around the per-cell ensemble mean using an on-the-fly gamma = clip(mean_v(CRMSE_v / spread_v), 0.5, 2) from the previous four calendar weeks of European station benchmark errors, pooled by lead time across temperature, wind, and solar. Only Jua EPT ensemble models (`ept2_e`, `ept2_hrrr`, `ept2_1_europa`) are calibrated; other models pass through unchanged. Applies mean-centered spread inflation (`m + γ(x−m)`) before downstream aggregation or MW composition.","default":false}},"type":"object","required":["geo"],"title":"ForecastQuery","description":"Main query object for retrieving weather forecast data.\n\nSupports flexible querying by location, time, variables, and models with optional\naggregation, grouping, and weighting capabilities.\n\nTwo modes of specifying models and init_times:\n1. Classic mode: Use `models` + `init_time` (same init_time for all models)\n2. Model runs mode: Use `model_runs` (per-model init_time specification)\n\nThese modes are mutually exclusive."},"GeoConstraints":{"properties":{"allowed_zones":{"items":{"type":"string"},"type":"array","title":"Allowed Zones","description":"ISO country / market-zone codes where this model has data. In YAML, may be given as the string 'european' to expand to the shared EUROPEAN_ZONES list."},"bounding_box":{"anyOf":[{"$ref":"#/components/schemas/GridBounds"},{"type":"null"}],"description":"Explicit lat/lon bounding box. When omitted on a model with a non-EXACT grid, the grid's own bounds are used."}},"type":"object","required":["allowed_zones"],"title":"GeoConstraints","description":"Geographic coverage limits for a regional model.\n\nModels without a ``geo_constraints`` entry in their YAML are considered\nglobal and available everywhere."},"GeoFilter":{"properties":{"type":{"type":"string","enum":["point","bounding_box","polygon","market_zone","country_key","poi"],"title":"Type","description":"Geographic filter type. 'point': Single location or list of [latitude, longitude] coordinates. 'bounding_box': Rectangular area defined by [[lat_min, lon_min], [lat_max, lon_max]]. 'polygon': Custom area defined by list of [latitude, longitude] coordinates. 'market_zone': Predefined energy market zone codes (e.g., 'DE', 'FR'). 'country_key': ISO country codes (e.g., 'DE', 'US'). 'poi': Point of Interest reference(s) with coordinates and optional id/label.","examples":["point","bounding_box","polygon","market_zone","country_key","poi"]},"value":{"anyOf":[{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2},{"items":{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2},"type":"array"},{"prefixItems":[{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2},{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2}],"type":"array","maxItems":2,"minItems":2},{"items":{"prefixItems":[{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2},{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2}],"type":"array","maxItems":2,"minItems":2},"type":"array"},{"items":{"items":{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2},"type":"array"},"type":"array"},{"type":"string","enum":["AD","AE","AF","AG","AL","AM","AO","AR","AT","AU-LH","AU-NSW","AU-NT","AU-QLD","AU-SA","AU-TAS","AU-TAS-CBI","AU-TAS-FI","AU-TAS-KI","AU-VIC","AU-WA","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO","BR-CS","BR-N","BR-NE","BR-S","BS","BT","BW","BY","BZ","CA-AB","CA-BC","CA-MB","CA-NB","CA-NL","CA-NS","CA-NT","CA-NU","CA-ON","CA-PE","CA-QC","CA-SK","CA-YT","CD","CF","CG","CH","CI","CL-CHP","CL-SEA","CL-SEM","CL-SEN","CM","CN","CO","CR","CU","CV","CW","CY","CZ","DE","DJ","DK-BHM","DK-DK1","DK-DK2","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ES-CN-FV","ES-CN-GC","ES-CN-HI","ES-CN-IG","ES-CN-LP","ES-CN-LZ","ES-CN-TE","ES-IB-FO","ES-IB-IZ","ES-IB-MA","ES-IB-ME","ET","FI","FJ","FK","FM","FO-MI","FO-SI","FR","FR-COR","GA","GB","GB-NIR","GB-ORK","GB-ZET","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GT","GU","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN-AN","IN-EA","IN-NE","IN-NO","IN-SO","IN-WE","IQ","IR","IS","IT-CALA","IT-CNO","IT-CSO","IT-NO","IT-SAR","IT-SIC","IT-SO","JE","JM","JO","JP-CB","JP-CG","JP-HKD","JP-HR","JP-KN","JP-KY","JP-ON","JP-SK","JP-TH","JP-TK","KE","KG","KH","KM","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MD","ME","MG","MK","ML","MM","MN","MQ","MR","MT","MU","MV","MW","MX","MY-EM","MY-WM","MZ","NA","NC","NE","NG","NI","NL","NO-NO1","NO-NO2","NO-NO3","NO-NO4","NO-NO5","NP","NZ","NZ-NZC","NZ-NZST","OM","PA","PE","PF","PG","PH-LU","PH-MI","PH-VI","PK","PL","PM","PR","PS","PT","PT-AC","PT-MA","PW","PY","QA","RE","RO","RS","RU-1","RU-2","RU-AS","RU-EU","RU-FE","RU-KGD","RW","SA","SB","SC","SD","SE-SE1","SE-SE2","SE-SE3","SE-SE4","SG","SI","SJ","SK","SL","SN","SO","SR","SS","ST","SV","SY","SZ","TD","TG","TH","TJ","TL","TM","TN","TO","TR","TT","TW","TZ","UA","UA-CR","UG","US-AK","US-AK-SEAPA","US-CAL-BANC","US-CAL-CISO","US-CAL-IID","US-CAL-LDWP","US-CAL-TIDC","US-CAR-CPLE","US-CAR-CPLW","US-CAR-DUK","US-CAR-SC","US-CAR-SCEG","US-CENT-SPA","US-CENT-SWPP","US-FLA-FMPP","US-FLA-FPC","US-FLA-FPL","US-FLA-GVL","US-FLA-HST","US-FLA-JEA","US-FLA-SEC","US-FLA-TAL","US-FLA-TEC","US-HI","US-MIDA-PJM","US-MIDW-AECI","US-MIDW-LGEE","US-MIDW-MISO","US-NE-ISNE","US-NW-AVA","US-NW-BPAT","US-NW-CHPD","US-NW-DOPD","US-NW-GCPD","US-NW-IPCO","US-NW-NEVP","US-NW-NWMT","US-NW-PACE","US-NW-PACW","US-NW-PGE","US-NW-PSCO","US-NW-PSEI","US-NW-SCL","US-NW-TPWR","US-NW-WACM","US-NW-WAUW","US-NY-NYIS","US-SE-SOCO","US-SW-AZPS","US-SW-EPE","US-SW-PNM","US-SW-SRP","US-SW-TEPC","US-SW-WALC","US-TEN-TVA","US-TEX-ERCO","UY","UZ","VC","VE","VI","VN","VU","WS","XK","XX","YE","YT","ZA","ZM","ZW"]},{"items":{"type":"string","enum":["AD","AE","AF","AG","AL","AM","AO","AR","AT","AU-LH","AU-NSW","AU-NT","AU-QLD","AU-SA","AU-TAS","AU-TAS-CBI","AU-TAS-FI","AU-TAS-KI","AU-VIC","AU-WA","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO","BR-CS","BR-N","BR-NE","BR-S","BS","BT","BW","BY","BZ","CA-AB","CA-BC","CA-MB","CA-NB","CA-NL","CA-NS","CA-NT","CA-NU","CA-ON","CA-PE","CA-QC","CA-SK","CA-YT","CD","CF","CG","CH","CI","CL-CHP","CL-SEA","CL-SEM","CL-SEN","CM","CN","CO","CR","CU","CV","CW","CY","CZ","DE","DJ","DK-BHM","DK-DK1","DK-DK2","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ES-CN-FV","ES-CN-GC","ES-CN-HI","ES-CN-IG","ES-CN-LP","ES-CN-LZ","ES-CN-TE","ES-IB-FO","ES-IB-IZ","ES-IB-MA","ES-IB-ME","ET","FI","FJ","FK","FM","FO-MI","FO-SI","FR","FR-COR","GA","GB","GB-NIR","GB-ORK","GB-ZET","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GT","GU","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN-AN","IN-EA","IN-NE","IN-NO","IN-SO","IN-WE","IQ","IR","IS","IT-CALA","IT-CNO","IT-CSO","IT-NO","IT-SAR","IT-SIC","IT-SO","JE","JM","JO","JP-CB","JP-CG","JP-HKD","JP-HR","JP-KN","JP-KY","JP-ON","JP-SK","JP-TH","JP-TK","KE","KG","KH","KM","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MD","ME","MG","MK","ML","MM","MN","MQ","MR","MT","MU","MV","MW","MX","MY-EM","MY-WM","MZ","NA","NC","NE","NG","NI","NL","NO-NO1","NO-NO2","NO-NO3","NO-NO4","NO-NO5","NP","NZ","NZ-NZC","NZ-NZST","OM","PA","PE","PF","PG","PH-LU","PH-MI","PH-VI","PK","PL","PM","PR","PS","PT","PT-AC","PT-MA","PW","PY","QA","RE","RO","RS","RU-1","RU-2","RU-AS","RU-EU","RU-FE","RU-KGD","RW","SA","SB","SC","SD","SE-SE1","SE-SE2","SE-SE3","SE-SE4","SG","SI","SJ","SK","SL","SN","SO","SR","SS","ST","SV","SY","SZ","TD","TG","TH","TJ","TL","TM","TN","TO","TR","TT","TW","TZ","UA","UA-CR","UG","US-AK","US-AK-SEAPA","US-CAL-BANC","US-CAL-CISO","US-CAL-IID","US-CAL-LDWP","US-CAL-TIDC","US-CAR-CPLE","US-CAR-CPLW","US-CAR-DUK","US-CAR-SC","US-CAR-SCEG","US-CENT-SPA","US-CENT-SWPP","US-FLA-FMPP","US-FLA-FPC","US-FLA-FPL","US-FLA-GVL","US-FLA-HST","US-FLA-JEA","US-FLA-SEC","US-FLA-TAL","US-FLA-TEC","US-HI","US-MIDA-PJM","US-MIDW-AECI","US-MIDW-LGEE","US-MIDW-MISO","US-NE-ISNE","US-NW-AVA","US-NW-BPAT","US-NW-CHPD","US-NW-DOPD","US-NW-GCPD","US-NW-IPCO","US-NW-NEVP","US-NW-NWMT","US-NW-PACE","US-NW-PACW","US-NW-PGE","US-NW-PSCO","US-NW-PSEI","US-NW-SCL","US-NW-TPWR","US-NW-WACM","US-NW-WAUW","US-NY-NYIS","US-SE-SOCO","US-SW-AZPS","US-SW-EPE","US-SW-PNM","US-SW-SRP","US-SW-TEPC","US-SW-WALC","US-TEN-TVA","US-TEX-ERCO","UY","UZ","VC","VE","VI","VN","VU","WS","XK","XX","YE","YT","ZA","ZM","ZW"]},"type":"array"},{"type":"string","enum":["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","XX","YE","YT","ZA","ZM","ZW"]},{"items":{"type":"string","enum":["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","XX","YE","YT","ZA","ZM","ZW"]},"type":"array"},{"$ref":"#/components/schemas/POIReference"},{"items":{"$ref":"#/components/schemas/POIReference"},"type":"array"}],"title":"Value","description":"Geographic coordinates or identifiers. For 'point': [latitude, longitude] or list of coordinate pairs. For 'bounding_box': [[lat_min, lon_min], [lat_max, lon_max]]. For 'polygon': [[lat1, lon1], [lat2, lon2], ...]. For 'market_zone' or 'country_key': string code or list of codes. For 'poi': POIReference object or list of POIReference objects.","examples":[[52.52,13.405],[[52.52,13.405],[47.3784,8.5387]],"DE",["DE","FR"],[[52.52,13.405],[47.3784,8.5387],[51.0538,12.3724]],[[30,-15],[60,30]],{"coordinates":[52.52,13.405],"id":"station_123","label":"Berlin"}]},"method":{"anyOf":[{"type":"string","enum":["nearest","bilinear"]},{"type":"null"}],"title":"Method","description":"Interpolation method for point queries. 'nearest': Uses closest grid point (faster). 'bilinear': Interpolates between 4 surrounding grid points. Only applicable when type='point'. Defaults to 'nearest'"}},"type":"object","required":["type","value"],"title":"GeoFilter","description":"Geographic filter for specifying query locations.\n\nSupports various geographic query types including points, regions, and\npredefined areas like market zones."},"Grid":{"type":"string","enum":["720x1440","2160x4320","1440x2880","2220x4440","2221x4440","360x720","180x360","451x900","720x900_europe","721x1201_europe","657x1377","553x961_europe","746x1215","520x520_pm65","exact"],"title":"Grid"},"GridBounds":{"properties":{"min_lat":{"type":"number","title":"Min Lat"},"max_lat":{"type":"number","title":"Max Lat"},"min_lon":{"type":"number","title":"Min Lon"},"max_lon":{"type":"number","title":"Max Lon"}},"type":"object","required":["min_lat","max_lat","min_lon","max_lon"],"title":"GridBounds"},"GroupByKey":{"properties":{"field":{"type":"string","enum":["model","init_time","time","prediction_timedelta","ensemble_member","market_zone","country_key","point","latitude","longitude","day_of_year","hour"],"title":"Field"},"transformation":{"anyOf":[{"type":"string","const":"to_start_of"},{"type":"null"}],"title":"Transformation"},"parameters_list":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Parameters List"}},"type":"object","required":["field"],"title":"GroupByKey","description":"Structured representation of a group-by key.\n\n- field: one of supported base fields\n- transformation: optional transformation name (currently only 'to_start_of')\n- parameters_list: optional list of parameters for the transformation"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InitClockStats":{"properties":{"count":{"type":"integer","title":"Count"},"complete_count":{"type":"integer","title":"Complete Count"},"on_time_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"On Time Pct"},"missing_count":{"type":"integer","title":"Missing Count"},"completion_delay":{"$ref":"#/components/schemas/DelayQuantiles"},"start_delay":{"anyOf":[{"$ref":"#/components/schemas/StartDelayQuantiles"},{"type":"null"}]},"on_time_pct_excluding_attributed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"On Time Pct Excluding Attributed"},"attributed_count":{"type":"integer","title":"Attributed Count","default":0},"projected_late_count":{"type":"integer","title":"Projected Late Count","default":0},"projected_late_precision":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Late Precision"},"init_clock":{"type":"string","title":"Init Clock"}},"type":"object","required":["count","complete_count","on_time_pct","missing_count","completion_delay","start_delay","init_clock"],"title":"InitClockStats"},"InitTimeInfo":{"properties":{"init_time":{"type":"string","format":"date-time","title":"Init Time"},"max_prediction_timedelta":{"type":"integer","title":"Max Prediction Timedelta"}},"type":"object","required":["init_time","max_prediction_timedelta"],"title":"InitTimeInfo","description":"Information about an available init_time.\n\n``model_version`` / ``completed_at`` / ``forecast_ic`` are internal\ncatalogue fields (v2 runs / X-As-Of). They stay off the v1\n``/init-times`` wire via ``exclude=True``."},"LatestForecastInfo":{"properties":{"init_time":{"type":"string","title":"Init Time","description":"Latest forecast initialization time (ISO 8601 format)"},"prediction_timedelta":{"type":"integer","title":"Prediction Timedelta","description":"Maximum available lead time in minutes for this forecast"},"dissemination_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dissemination Time","description":"Forecast step dissemination time"}},"type":"object","required":["init_time","prediction_timedelta"],"title":"LatestForecastInfo","description":"Information about the latest available forecast for a model."},"LatestForecastInfoQueryResult":{"properties":{"forecasts_per_model":{"additionalProperties":{"$ref":"#/components/schemas/LatestForecastInfo"},"propertyNames":{"$ref":"#/components/schemas/Model"},"type":"object","title":"Forecasts Per Model","description":"Mapping of model identifiers to their latest forecast information"}},"type":"object","required":["forecasts_per_model"],"title":"LatestForecastInfoQueryResult","description":"Result containing the latest forecast information per model."},"MWZonesResponse":{"properties":{"wind":{"items":{"type":"string"},"type":"array","title":"Wind"},"wind_combined":{"items":{"type":"string"},"type":"array","title":"Wind Combined"},"wind_transmission_embedded":{"items":{"type":"string"},"type":"array","title":"Wind Transmission Embedded","default":[]},"wind_onshore_only":{"items":{"type":"string"},"type":"array","title":"Wind Onshore Only"},"solar":{"items":{"type":"string"},"type":"array","title":"Solar"},"load":{"items":{"type":"string"},"type":"array","title":"Load"}},"type":"object","required":["wind","wind_combined","wind_onshore_only","solar","load"],"title":"MWZonesResponse","description":"Market zones that have power-curve data and can produce MW output."},"MetaQueryResult":{"properties":{"models":{"items":{"$ref":"#/components/schemas/ModelInfo"},"type":"array","title":"Models","description":"List of model metadata"}},"type":"object","required":["models"],"title":"MetaQueryResult","description":"Result containing metadata for one or more forecast models."},"Model":{"type":"string","enum":["ept2","ept2_early","ept2_e","ept2_rr","ept2_hrrr","ept2_1_helios","ept2_1_europa","ept1_5","ept1_5_early","aifs","aifs_ens","aurora","icon_global","icon_eu","ecmwf_ifs_single","ecmwf_ens","ecmwf_ec46","ecmwf_seas5","ept2_reasoning","meteofrance_arome_france_hd","gfs_global_single","noaa_gfs_single","gfs_global_ensemble","icon_d2","gfs_graphcast025","knmi_harmonie_arome_europe","knmi_harmonie_arome_netherlands","ukmo_global_deterministic_10km","ukmo_uk_deterministic_2km"],"title":"Model"},"ModelInfo":{"properties":{"name":{"type":"string","title":"Name","description":"The name of the model"},"model_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Description","description":"Optional long-form model positioning text for agent guidance."},"grid":{"anyOf":[{"$ref":"#/components/schemas/Grid"},{"type":"null"}],"description":"Human readable grid description"},"is_ensemble_model":{"type":"boolean","title":"Is Ensemble Model","description":"Whether the model is an ensemble model","default":false},"variables":{"items":{"$ref":"#/components/schemas/CustomerVariable"},"type":"array","title":"Variables","description":"The variables of the model"},"daily_runs":{"additionalProperties":{"$ref":"#/components/schemas/RunDefinition"},"propertyNames":{"format":"time"},"type":"object","title":"Daily Runs","description":"The daily runs of the model"},"init_schedule":{"type":"string","title":"Init Schedule","description":"Cron expression (5-field: 'minute hour day-of-month month day-of-week') specifying which *dates* the model runs on. The minute/hour fields MUST be '*' — time-of-day lives exclusively in ``daily_runs`` (its dict keys are the clock times of each run). Default '* * * * *' means 'every day', which preserves the previous implicit semantics for all existing models. Example: '* * 1 * *' for a once-a-month model (SEAS5); '* * * * 0' for weekly-Sunday.","default":"* * * * *"},"derived_variables":{"additionalProperties":{"$ref":"#/components/schemas/RollingSumDerivation"},"propertyNames":{"$ref":"#/components/schemas/CustomerVariable"},"type":"object","title":"Derived Variables","description":"Synthetic variables computed in polars after the ClickHouse fetch -- see ``forecasts.data_provider.derived_variables``. Keys are customer-facing variable names that callers may request; values describe how each is computed from columns in ``variables``. Currently only ``rolling_sum`` is supported (e.g. EPT-2.1 Helios's 30-min flux summed pairwise to 1h)."},"variable_units":{"additionalProperties":{"type":"string"},"type":"object","title":"Variable Units","description":"SI unit for each variable (e.g. K, Pa, m/s)","readOnly":true},"grid_bounds":{"anyOf":[{"$ref":"#/components/schemas/GridBounds"},{"type":"null"}],"description":"The bounds of the grid","readOnly":true},"is_limited_model":{"type":"boolean","title":"Is Limited Model","description":"Limited models provide limited capabilities, such as being restricted to point forecasts and no access to historical data","readOnly":true},"min_step_minutes":{"type":"integer","title":"Min Step Minutes","description":"Minimum temporal step size across all runs in minutes","readOnly":true}},"type":"object","required":["name","variables","variable_units","grid_bounds","is_limited_model","min_step_minutes"],"title":"ModelInfo"},"NetztransparenzDirection":{"type":"string","enum":["positive","negative"],"title":"NetztransparenzDirection","description":"Direction indicators for signed values.\n\npositive/negative. Applies to the reserve and balancing variables that\ncarry a populated direction column (those flagged ``uses_direction=True``)\n— both the operational (``*_betrieblich``) and quality-assured\n(``*_qualitaetsgesichert``) variants of these series are signed. For the\nremaining variables — ABSM curtailment (split by subcategory relief\nregions instead), forecasts, marketing, balance and single-value price\nseries — the direction column is empty, so the filter passes all rows\n(silently ignored).\n\nNote: the quality-assured (``*_qualitaetsgesichert``) series publish on a\nmulti-week lag behind the operational series, so a query over a recent\ndate window may return no rows for them even though direction is fully\npopulated historically."},"NetztransparenzSubcategory":{"type":"string","enum":["H1","H2","T1","T2","T3","T4","T5","T6","AEP Modul 1","AEP Modul 2","AEP Modul 3","stunde1","stunde3","stunde4","stunde6"],"title":"NetztransparenzSubcategory","description":"Subcategories for specific variable types.\n\nNote: Only certain variables support subcategory filtering:\n- ABSM variables (absm_*): H1, H2, T1-T6 (relief regions)\n- aep_module_qualitaetsgesichert, finanzielle_wirkung_aep: AEP Modul 1/2/3"},"NetztransparenzTimeseriesQuery":{"properties":{"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/NetztransparenzVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"List of Netztransparenz variable types to query. If not set, returns all variables.","examples":[["nrv_saldo_betrieblich","aep_schaetzer_betrieblich"]]},"tsos":{"anyOf":[{"items":{"$ref":"#/components/schemas/NetztransparenzTso"},"type":"array"},{"type":"null"}],"title":"Tsos","description":"List of TSOs to filter by (e.g., ['50Hertz', 'Amprion'])","examples":[["50Hertz","Amprion"]]},"subcategories":{"anyOf":[{"items":{"$ref":"#/components/schemas/NetztransparenzSubcategory"},"type":"array"},{"type":"null"}],"title":"Subcategories","description":"List of subcategories (only for ABSM relief regions or AEP module variables)","examples":[["H1","H2","T1"]]},"directions":{"anyOf":[{"items":{"$ref":"#/components/schemas/NetztransparenzDirection"},"type":"array"},{"type":"null"}],"title":"Directions","description":"List of directions (e.g., ['positive', 'negative'])","examples":[["positive","negative"]]},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)","examples":["2025-12-01T00:00:00Z"]},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time for the query (exclusive). If None, no upper bound is applied (useful for day-ahead forecasts)","examples":["2025-12-15T00:00:00Z"]},"aggregation":{"$ref":"#/components/schemas/jua_query_v2__netztransparenz__query__TemporalAggregation","description":"Temporal aggregation to apply","default":"none"},"include_metadata":{"type":"boolean","title":"Include Metadata","description":"Include metadata column in response","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone name for time formatting (e.g., 'Europe/Berlin', 'America/New_York'). Defaults to UTC","examples":["UTC","Europe/Berlin"]},"order_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by","examples":[["time","tso"]]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters"}},"type":"object","required":["start_time"],"title":"NetztransparenzTimeseriesQuery","description":"Query parameters for Netztransparenz timeseries data.\n\nSupports filtering by:\n- variables: List of variable types (optional, returns all if not set)\n- tsos: List of TSOs to filter by (optional)\n- subcategories: List of technology subcategories (optional)\n- directions: List of directions - positive/negative (optional)\n- start_time: Start of time range (required)\n- end_time: End of time range (optional - if None, no upper bound applied)\n\nNote: end_time can be None to include all future data, which is useful\nfor day-ahead forecasts that extend into tomorrow."},"NetztransparenzTso":{"type":"string","enum":["50Hertz","Amprion","TenneT TSO","TransnetBW","gesamt"],"title":"NetztransparenzTso","description":"German Transmission System Operators (TSOs).\n\nThe four TSOs that operate the German high-voltage transmission grid,\nplus the Germany-wide aggregate."},"NetztransparenzVariable":{"type":"string","enum":["vermarktung_epex","vermarktung_exaa","vermarktung_solar","vermarktung_wind","vermarktung_sonstige","untertaegige_strommengen","differenz_einspeiseprognose","hochrechnung_solar","hochrechnung_wind","onlinehochrechnung_solar","onlinehochrechnung_wind_onshore","onlinehochrechnung_wind_offshore","absm_ausgewiesen","absm_zugeteilt","absm_erzeugungsverbot","nrv_saldo_betrieblich","nrv_saldo_qualitaetsgesichert","rz_saldo_betrieblich","rz_saldo_qualitaetsgesichert","nrv_saldo_minute_betrieblich","aep_schaetzer_betrieblich","idaep","rebap_qualitaetsgesichert","voaa_qualitaetsgesichert","finanzielle_wirkung_aep","aep_module_qualitaetsgesichert","aktivierte_srl_betrieblich","aktivierte_srl_qualitaetsgesichert","aktivierte_mrl_betrieblich","aktivierte_mrl_qualitaetsgesichert","srl_optimierung_betrieblich","srl_optimierung_qualitaetsgesichert","mrl_optimierung_betrieblich","mrl_optimierung_qualitaetsgesichert","difference_betrieblich","difference_qualitaetsgesichert","prl_betrieblich","prl_qualitaetsgesichert","zusatzmassnahmen_betrieblich","zusatzmassnahmen_qualitaetsgesichert","nothilfe_betrieblich","nothilfe_qualitaetsgesichert","abschaltbare_lasten_betrieblich","abschaltbare_lasten_qualitaetsgesichert","mfrr_satisfied_demand_betrieblich","inanspruchnahme_ausgleichsenergie","negative_preise_gesamt"],"title":"NetztransparenzVariable","description":"Netztransparenz timeseries variable types.\n\nVariables are organized by category matching the data dictionary."},"NetztransparenzVariableInfo":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"unit":{"type":"string","title":"Unit"},"uses_tso":{"type":"boolean","title":"Uses Tso","default":true},"uses_subcategory":{"type":"boolean","title":"Uses Subcategory","default":false},"uses_direction":{"type":"boolean","title":"Uses Direction","default":false}},"type":"object","required":["name","description","unit"],"title":"NetztransparenzVariableInfo","description":"Information about a Netztransparenz variable."},"NextExpected":{"properties":{"init_time":{"type":"string","format":"date-time","title":"Init Time"},"communicated_complete":{"type":"string","format":"date-time","title":"Communicated Complete"}},"type":"object","required":["init_time","communicated_complete"],"title":"NextExpected"},"OrderByItem_Union_Coordinates__CustomerVariable__":{"properties":{"field":{"anyOf":[{"$ref":"#/components/schemas/Coordinates"},{"$ref":"#/components/schemas/CustomerVariable"}],"title":"Field","description":"Field to sort by"},"direction":{"$ref":"#/components/schemas/SortDirection","description":"Sort direction: 'asc' (default) or 'desc'","default":"asc"},"aggregation":{"anyOf":[{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"]},{"type":"null"}],"title":"Aggregation","description":"Aggregation function when ordering by variable"}},"type":"object","required":["field"],"title":"OrderByItem[Union[Coordinates, CustomerVariable]]"},"OrderByItem_Union_ReanalysisCoordinates__CustomerVariable__":{"properties":{"field":{"anyOf":[{"$ref":"#/components/schemas/ReanalysisCoordinates"},{"$ref":"#/components/schemas/CustomerVariable"}],"title":"Field","description":"Field to sort by"},"direction":{"$ref":"#/components/schemas/SortDirection","description":"Sort direction: 'asc' (default) or 'desc'","default":"asc"},"aggregation":{"anyOf":[{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"]},{"type":"null"}],"title":"Aggregation","description":"Aggregation function when ordering by variable"}},"type":"object","required":["field"],"title":"OrderByItem[Union[ReanalysisCoordinates, CustomerVariable]]"},"OrderByItem_str_":{"properties":{"field":{"type":"string","title":"Field","description":"Field to sort by"},"direction":{"$ref":"#/components/schemas/SortDirection","description":"Sort direction: 'asc' (default) or 'desc'","default":"asc"},"aggregation":{"anyOf":[{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"]},{"type":"null"}],"title":"Aggregation","description":"Aggregation function when ordering by variable"}},"type":"object","required":["field"],"title":"OrderByItem[str]"},"POIReference":{"properties":{"coordinates":{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2,"title":"Coordinates","description":"Geographic coordinates as [latitude, longitude]"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Optional unique identifier (e.g., station ID)"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Optional human-readable name for display"}},"type":"object","required":["coordinates"],"title":"POIReference","description":"Reference to a Point of Interest with optional identity.\n\nThe coordinates are required for geo queries. The id and label are optional\nmetadata - id can be used by data sources that need identifiers (e.g., station IDs),\nand label provides a human-readable name for display purposes."},"Pagination":{"properties":{"limit":{"type":"integer","minimum":0.0,"title":"Limit","default":100},"offset":{"type":"integer","minimum":0.0,"title":"Offset","default":0}},"type":"object","title":"Pagination"},"PowerForecastQuery":{"properties":{"zone_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Zone Keys","description":"List of zone codes (e.g. ['DE', 'FR'])","examples":[["DE"]]},"psr_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Psr Types","description":"List of PSR types (e.g. ['Solar', 'Wind Onshore'])","examples":[["Solar","Wind Onshore"]]},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Default model version for all (zone, psr) cells: 'stable' (default), 'latest', or a run id from GET /versions. Overridden per cell by version_pins. Aliases resolve against ``regime``.","examples":["stable","latest","586rhosh"]},"regime":{"type":"string","enum":["curtailed","uncurtailed"],"title":"Regime","description":"Which packaged product ``version`` aliases resolve against. 'curtailed' (default) is actual production. 'uncurtailed' is potential. A concrete run id ignores this.","default":"curtailed","examples":["curtailed","uncurtailed"]},"version_pins":{"anyOf":[{"items":{"$ref":"#/components/schemas/VersionPin"},"type":"array"},{"type":"null"}],"title":"Version Pins","description":"Per-(zone_key, psr_type) version overrides. Unlisted cells use ``version``. Each pin may be 'stable', 'latest', or a run id. Example: keep the portfolio on stable but pin DE Solar to a specific checkpoint.","examples":[[{"psr_type":"Solar","version":"586rhosh","zone_key":"DE"}]]},"init_time":{"anyOf":[{"type":"integer","minimum":0.0,"description":"Offset from latest forecast (0 = latest, 1 = second latest, etc.)"},{"type":"string","format":"date-time"},{"items":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer","minimum":0.0,"description":"Offset from latest forecast (0 = latest, 1 = second latest, etc.)"}]},"type":"array"},{"type":"null"}],"title":"Init Time","description":"Init time selection for horizon mode. Accepts datetime(s), 'latest', or 'latest-N'.","examples":["latest","latest-2",["2025-12-01T00:00:00Z","latest-1"]]},"max_prediction_timedelta":{"anyOf":[{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0},{"type":"null"}],"title":"Max Prediction Timedelta","description":"Maximum prediction horizon in minutes (horizon mode)"},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start of time range (inclusive, time range mode)","examples":["2025-12-01T00:00:00Z"]},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End of time range (exclusive, time range mode)","examples":["2025-12-07T00:00:00Z"]},"aggregation_period":{"anyOf":[{"type":"string","enum":["native","hourly","daily","weekly"]},{"type":"null"}],"title":"Aggregation Period","description":"Temporal aggregation for returned rows. ``None`` and ``native`` return raw 15-minute rows; ``hourly``/``daily``/``weekly`` average ``value`` within buckets. ``init_time`` stays a group key so multi-run comparisons remain separated.","examples":["native","daily"]},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone name for time formatting (e.g. 'Europe/Berlin'). When ``aggregation_period`` is ``daily`` or ``weekly``, also sets the bucket boundary timezone (hourly aggregation ignores this).","examples":["UTC","Europe/Berlin"]},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by. Supports direction suffix: 'time__desc' for descending. Default: time ASC.","examples":[["time","zone_key"]]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters"},"debias":{"type":"boolean","title":"Debias","description":"Apply leakage-safe walk-forward additive MW debias. Wind uses an eight-week fitting window, solar uses four weeks, and both retain a seven-day exclusion gap. Opt in explicitly; raw predictions remain the API default.","default":false}},"type":"object","title":"PowerForecastQuery","description":"Query parameters for power forecast data.\n\nSupports two mutually exclusive query modes:\n\n**Horizon mode** (init_time-centric):\n    - Specify init_time as datetime(s) or relative tokens (latest/latest-N)\n    - Optionally limit by max_prediction_timedelta\n\n**Time range mode** (time-centric):\n    - Specify start_time / end_time\n    - Computed time = init_time + prediction_timedelta * 60s\n\nCommon filters:\n    - zone_keys: List of zone codes (e.g. [\"DE\", \"FR\"])\n    - psr_types: List of generation types (e.g. [\"Solar\", \"Wind Onshore\"])\n\nVersion selection:\n    - ``version`` is the default for every (zone, psr) cell\n    - ``regime`` selects which packaged product those aliases resolve\n      against (``curtailed`` = actual production, default; ``uncurtailed``\n      = potential). A concrete run id ignores ``regime``.\n    - ``version_pins`` overrides specific cells so one request can mix\n      e.g. DE Solar pinned + FR Wind on stable"},"PowerSubjectSchedule":{"properties":{"kind":{"type":"string","const":"power","title":"Kind","default":"power"},"cadence_minutes":{"type":"integer","title":"Cadence Minutes"},"communicated_complete_after_minutes":{"type":"integer","title":"Communicated Complete After Minutes"}},"type":"object","required":["cadence_minutes","communicated_complete_after_minutes"],"title":"PowerSubjectSchedule"},"PredictionTimedeltaSlice":{"properties":{"start":{"type":"integer","minimum":0.0,"title":"Start","description":"Start lead time in minutes from init_time (inclusive)","default":0},"end":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"End","description":"End lead time in minutes from init_time (inclusive). If None, uses model's maximum available lead time"}},"type":"object","title":"PredictionTimedeltaSlice","description":"Forecast lead time range in minutes from the initialization time."},"PreferredHours":{"properties":{"type":{"type":"string","title":"Type","default":"preferred_hours"},"selections":{"items":{"$ref":"#/components/schemas/PreferredHoursSelection"},"type":"array","title":"Selections","description":"List of {hour, optional minute, offset} selections. An empty list selects no forecast runs."}},"type":"object","required":["selections"],"title":"PreferredHours","description":"Select specific forecast runs by UTC hour and per-hour offset.\n\nEach selection picks the Nth most recent available run at a given UTC hour.\nExample: selections=[{hour:6, offset:0}, {hour:6, offset:2}, {hour:18, offset:0}]\nresolves to today's 6am, day-before-yesterday's 6am, and today's 6pm."},"PreferredHoursSelection":{"properties":{"hour":{"type":"integer","maximum":23.0,"minimum":0.0,"title":"Hour","description":"UTC hour (0-23)"},"minute":{"anyOf":[{"type":"integer","maximum":59.0,"minimum":0.0},{"type":"null"}],"title":"Minute","description":"Optional UTC minute (0-59). Omit for the legacy hour-only behavior."},"offset":{"type":"integer","minimum":0.0,"title":"Offset","description":"0 = most recent run at this hour, 1 = previous, etc.","default":0}},"type":"object","required":["hour"],"title":"PreferredHoursSelection","description":"A single preferred-hour run selection.\n\nPicks the Nth most recent run at a given UTC hour."},"ProviderReachability":{"properties":{"reachable":{"type":"boolean","title":"Reachable"},"since":{"type":"string","format":"date-time","title":"Since","description":"When ``reachable`` last flipped: the outage start while unreachable, the recovery time while reachable."}},"type":"object","required":["reachable","since"],"title":"ProviderReachability","description":"Debounced HTTP reachability of a ``provider:*`` subject.\n\nProjected from the ``forecast_status_provider_probe`` row: no probe\nverdicts, status codes, or failure counts leave the building."},"ProviderSubjectSchedule":{"properties":{"kind":{"type":"string","const":"provider","title":"Kind","default":"provider"},"cadence_minutes":{"type":"integer","title":"Cadence Minutes"},"communicated_complete_after_minutes":{"type":"integer","title":"Communicated Complete After Minutes"},"stream_display_name":{"type":"string","title":"Stream Display Name"}},"type":"object","required":["cadence_minutes","communicated_complete_after_minutes","stream_display_name"],"title":"ProviderSubjectSchedule"},"ReanalysisCoordinates":{"type":"string","enum":["model","time","latitude","longitude","point","market_zone","country_key"],"title":"ReanalysisCoordinates","description":"Coordinate dimensions available for reanalysis queries."},"ReanalysisMetaResult":{"properties":{"models":{"items":{"$ref":"#/components/schemas/ReanalysisModelInfo"},"type":"array","title":"Models"}},"type":"object","required":["models"],"title":"ReanalysisMetaResult","description":"Metadata about available reanalysis models."},"ReanalysisModel":{"type":"string","enum":["arco_era5"],"title":"ReanalysisModel","description":"Enumeration of available reanalysis models.\n\nUnlike forecast models which have init_time + prediction_timedelta dimensions,\nreanalysis models have a single time dimension representing the actual timestamp\nof the analysis."},"ReanalysisModelInfo":{"properties":{"name":{"type":"string","title":"Name"},"display_name":{"type":"string","title":"Display Name"},"grid_resolution":{"type":"string","title":"Grid Resolution"},"temporal_resolution_minutes":{"type":"integer","title":"Temporal Resolution Minutes"},"variables":{"items":{"type":"string"},"type":"array","title":"Variables"},"variable_units":{"additionalProperties":{"type":"string"},"type":"object","title":"Variable Units","default":{}}},"type":"object","required":["name","display_name","grid_resolution","temporal_resolution_minutes","variables"],"title":"ReanalysisModelInfo","description":"Information about a reanalysis model."},"ReanalysisQuery":{"properties":{"models":{"items":{"$ref":"#/components/schemas/ReanalysisModel"},"type":"array","title":"Models","description":"List of reanalysis model identifiers to query","examples":[["arco_era5"]]},"geo":{"$ref":"#/components/schemas/GeoFilter","description":"Geographic filter specifying the query location(s) or region(s)","examples":[{"method":"nearest","type":"point","value":[[52.52,13.405]]},{"type":"market_zone","value":"DE"},{"type":"country_key","value":"DE"},{"type":"country_key","value":["DE","FR"]}]},"time":{"anyOf":[{"type":"string","format":"date-time"},{"items":{"type":"string","format":"date-time"},"type":"array"},{"$ref":"#/components/schemas/TimeSlice"}],"title":"Time","description":"Analysis time(s) to query: a datetime, a list of datetimes, or a {start, end} range. Reanalysis has no init-time axis, so 'latest' and integer offsets are rejected.","examples":["2024-01-15T00:00:00Z",["2024-01-15T00:00:00Z","2024-01-16T00:00:00Z"],{"end":"2024-01-07T00:00:00Z","start":"2024-01-01T00:00:00Z"}]},"variables":{"items":{"$ref":"#/components/schemas/CustomerVariable"},"type":"array","title":"Variables","description":"List of weather variables to query. If empty, returns all variables available for the selected models","examples":[["air_temperature_at_height_level_2m","wind_speed_at_height_level_10m"]]},"group_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/GroupByKey"},"type":"array"},{"type":"null"}],"title":"Group By","description":"List of dimensions to group by for aggregation (e.g., ['model', 'time']). Requires 'aggregation' to be specified."},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_Union_ReanalysisCoordinates__CustomerVariable__"},"type":"array"},{"type":"null"}],"title":"Order By","description":"List of dimensions to sort results by. Supports direction suffix: 'time__desc' for descending, 'time__asc' for ascending (default). Can also use object format: {'field': 'time', 'direction': 'desc'}","examples":[["model","time"],["point","time__desc"],[{"direction":"desc","field":"time"}]]},"aggregation":{"anyOf":[{"items":{"$ref":"#/components/schemas/Aggregation"},"type":"array"},{"type":"null"}],"title":"Aggregation","description":"List of aggregation functions to apply when grouping (e.g., ['avg', 'std']). Requires 'group_by' to be specified"},"weighting":{"anyOf":[{"$ref":"#/components/schemas/Weighting"},{"type":"null"}],"description":"Optional weighting scheme for geographic aggregation (e.g., by wind/solar capacity or population)","examples":[{"type":"wind_capacity"},{"type":"solar_capacity"},{"type":"population"}]},"include_time":{"type":"boolean","title":"Include Time","description":"Include the time column in results (default: True)","default":true},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone name for time formatting (e.g., 'Europe/Berlin', 'America/New_York'). Defaults to UTC","examples":["UTC","Europe/Berlin","America/New_York"]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters for limiting result size. Requires 'order_by' to be specified","examples":[{"limit":100,"offset":0}]}},"type":"object","required":["models","geo","time"],"title":"ReanalysisQuery","description":"Query object for retrieving reanalysis data.\n\nReanalysis data uses a simple time dimension (unlike forecasts which\nhave init_time + prediction_timedelta). This provides historical\nanalysis data at specified timestamps.\n\nExample:\n    ```python\n    query = ReanalysisQuery(\n        models=[\"arco_era5\"],\n        geo={\"type\": \"point\", \"value\": [(52.52, 13.405)]},\n        time={\"start\": \"2024-01-01T00:00:00Z\", \"end\": \"2024-01-07T00:00:00Z\"},\n        variables=[\"air_temperature_at_height_level_2m\"],\n    )\n    ```"},"RollingSumDerivation":{"properties":{"type":{"type":"string","const":"rolling_sum","title":"Type","default":"rolling_sum"},"base":{"$ref":"#/components/schemas/CustomerVariable","description":"Column actually fetched from ClickHouse. Must appear in the enclosing model's ``variables`` list."},"window":{"type":"integer","minimum":2.0,"title":"Window","description":"Number of consecutive base values to sum."}},"type":"object","required":["base","window"],"title":"RollingSumDerivation","description":"Right-labelled rolling sum over ``window`` consecutive base values.\n\nAt ``prediction_timedelta=ht`` the derived value equals\n``sum(base[ht - (window-1)*step], ..., base[ht])``. With ``window=2``\nand a 30-min base step this yields a true 1h energy (J/m²) over\nthe half-open interval ``(init + ht - 1h, init + ht]``.\n\nThe derivation runs in polars after the ClickHouse fetch -- see\n``forecasts.data_provider.derived_variables.apply_derivations``."},"RunDefinition":{"properties":{"lead_time_set":{"items":{"type":"integer"},"type":"array","title":"Lead Time Set"},"dissemination_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Dissemination Time"},"dissemination_day_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dissemination Day Offset"},"min_step_minutes":{"type":"integer","title":"Min Step Minutes","description":"Minimum temporal step size between consecutive lead times in minutes.\n\nReturns 60 (hourly) as default if step cannot be determined.","readOnly":true}},"type":"object","required":["lead_time_set","min_step_minutes"],"title":"RunDefinition"},"RunDisseminationConfig":{"properties":{"expected_start":{"type":"string","format":"time","title":"Expected Start","description":"First step expected in ClickHouse (internal clock)."},"expected_start_day_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Start Day Offset"},"expected_complete":{"type":"string","format":"time","title":"Expected Complete","description":"Full lead_time_set expected in ClickHouse (internal clock)."},"expected_complete_day_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Complete Day Offset"},"internal_alert_after_minutes":{"type":"integer","minimum":0.0,"title":"Internal Alert After Minutes","description":"Open an internal (Slack) incident when start or completion is this many minutes later than expected_start / expected_complete."},"customer_notify_after_minutes":{"type":"integer","minimum":0.0,"title":"Customer Notify After Minutes","description":"Notify subscribers when completion is this many minutes later than the audience's communicated time (dissemination_time, +30 for standard)."}},"type":"object","required":["expected_start","expected_complete","internal_alert_after_minutes","customer_notify_after_minutes"],"title":"RunDisseminationConfig","description":"Internal timing targets for one run, used by ``jua-forecast-status``.\n\n``dissemination_time`` on the enclosing :class:`RunDefinition` stays the\n*communicated* completion (public SDK contract). This block adds the\ninternal targets the evaluator compares ClickHouse arrival times against.\nBoth clocks accept the same ``\"HH:MM\"`` / ``\"D+N HH:MM\"`` forms as\n``dissemination_time`` and resolve through :func:`resolve_run_clock`.\n\nNever serialized: ``RunDefinition.dissemination`` is ``exclude=True`` so\n``/v1/forecast/meta`` is unchanged."},"RunGroupStats":{"properties":{"count":{"type":"integer","title":"Count"},"complete_count":{"type":"integer","title":"Complete Count"},"on_time_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"On Time Pct"},"missing_count":{"type":"integer","title":"Missing Count"},"completion_delay":{"$ref":"#/components/schemas/DelayQuantiles"},"start_delay":{"anyOf":[{"$ref":"#/components/schemas/StartDelayQuantiles"},{"type":"null"}]},"on_time_pct_excluding_attributed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"On Time Pct Excluding Attributed"},"attributed_count":{"type":"integer","title":"Attributed Count","default":0},"projected_late_count":{"type":"integer","title":"Projected Late Count","default":0},"projected_late_precision":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Late Precision"}},"type":"object","required":["count","complete_count","on_time_pct","missing_count","completion_delay","start_delay"],"title":"RunGroupStats"},"RunsResponse":{"properties":{"runs":{"items":{"$ref":"#/components/schemas/CustomerRunStatus"},"type":"array","title":"Runs"}},"type":"object","title":"RunsResponse"},"SolarStationCoverageResponse":{"properties":{"country_keys":{"items":{"type":"string"},"type":"array","title":"Country Keys"},"market_zones":{"items":{"type":"string"},"type":"array","title":"Market Zones"}},"type":"object","required":["country_keys","market_zones"],"title":"SolarStationCoverageResponse","description":"Country / market-zone codes covered by the clean solar-station set."},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"StartDelayQuantiles":{"properties":{"p50":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P50"},"p90":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P90"}},"type":"object","required":["p50","p90"],"title":"StartDelayQuantiles","description":"Start-delay quantiles in minutes; internal audience and weather only."},"StationBenchmarkQuery":{"properties":{"station_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Station Ids","description":"List of specific station IDs to query. Mutually exclusive with geo filter."},"geo":{"anyOf":[{"$ref":"#/components/schemas/GeoFilter"},{"type":"null"}],"description":"Geographic filter for selecting stations by region. Mutually exclusive with station_ids."},"models":{"items":{"$ref":"#/components/schemas/Model"},"type":"array","title":"Models","description":"List of model names to query (e.g., ['ept2', 'aifs'])"},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for benchmark period"},"end_time":{"type":"string","format":"date-time","title":"End Time","description":"End time for benchmark period"},"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/CustomerVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"List of variables to compute metrics for"},"metrics":{"anyOf":[{"items":{"type":"string","enum":["rmse","mae","bias","crps"]},"type":"array"},{"type":"null"}],"title":"Metrics","description":"Which metrics to compute and return. One or more of 'rmse', 'mae', 'bias', 'crps'. None (the default) returns all four (backward compatible). Selecting only mean-based metrics ('rmse'/'mae'/'bias') is significantly cheaper for ensemble models: CRPS is the only metric that needs the per-member error distribution, so omitting it lets the query skip the per-member array materialisation (and the per-model fan-out it requires)."},"max_prediction_timedelta_minutes":{"type":"integer","title":"Max Prediction Timedelta Minutes","description":"Maximum prediction lead time in minutes","default":28800},"debias":{"type":"boolean","title":"Debias","description":"If True, evaluate supported variables using Jua's bias-corrected forecast errors, keyed by model, valid-time ISO week, forecast-init hour and minute, and prediction lead. Supported variables are air temperature at 2 m, wind speed at 10 m, and surface solar radiation.","default":false},"calibrate":{"type":"boolean","title":"Calibrate","description":"If True, evaluate calibratable Jua ensemble models using the calibrated spread delivered in Jua's forecast product. Set to False to evaluate the raw ensemble spread. Incompatible with obs_buckets.","default":true},"init_hours":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Init Hours","description":"Filter to forecasts initialised at the given UTC hours. Each value must be in 0..23 (e.g. [0, 12] keeps only 00Z and 12Z runs). None or empty list = all hours (no filtering)."},"obs_buckets":{"type":"boolean","title":"Obs Buckets","description":"If True, additionally stratify RMSE / MAE / bias by the observed value's distribution. Each metric is reported per observed-value bucket: < P5, P5-P25, P25-P75, P75-P95, > P95 (plus an 'all' bucket). The P5/P25/P75/P95 thresholds are computed once over the selected stations and time window so the buckets are identical across models and lead times. This option is heavier than the default aggregation and requires exactly one variable.","default":false}},"type":"object","required":["models","start_time","end_time"],"title":"StationBenchmarkQuery","description":"Query parameters for station benchmark data."},"StationDataQuery":{"properties":{"station_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Station Ids","description":"List of ICAO station codes to query. Mutually exclusive with geo.","examples":[["EDDT","EDDH","LFPG"]]},"geo":{"anyOf":[{"$ref":"#/components/schemas/GeoFilter"},{"type":"null"}],"description":"Geographic filter for selecting stations by region. Supports: bounding_box, market_zone, country_key, polygon. Mutually exclusive with station_ids."},"bounding_box":{"anyOf":[{"$ref":"#/components/schemas/BoundingBox"},{"type":"null"}],"description":"[Deprecated] Use geo with type='bounding_box' instead.","examples":[{"max_lat":50.0,"max_lon":10.0,"min_lat":40.0,"min_lon":-10.0}]},"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/StationVariable"},"type":"array","minItems":1},{"type":"null"}],"title":"Variables","description":"Synoptic observation variables to return. If not set, returns all synoptic variables. Solar flux is not part of this enum — use the v2 stations route (or v1 solar-data) for surface_downwelling_shortwave_flux_sum_1h.","examples":[["air_temperature_at_height_level_2m","wind_speed_at_height_level_10m"]]},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)","examples":["2024-01-01T00:00:00Z"]},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time for the query (exclusive). If not set, no upper bound.","examples":["2024-01-07T00:00:00Z"]},"aggregation":{"$ref":"#/components/schemas/jua_query_v2__station_data__query__TemporalAggregation","description":"Temporal aggregation to apply (none, hourly, daily)","default":"none"},"aggregate_across_stations":{"type":"boolean","title":"Aggregate Across Stations","description":"If True and aggregation is hourly/daily, compute mean across all stations (regional average). If False, compute mean per station.","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for time formatting. Defaults to UTC.","examples":["UTC","Europe/Berlin","America/New_York"]},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by. Supports direction suffix: 'time__desc' for descending, 'time__asc' for ascending (default). Can also use object format: {'field': 'time', 'direction': 'desc'}","examples":[["time","station"],["time__desc"],[{"direction":"desc","field":"time"}]]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (limit, offset)"}},"type":"object","required":["start_time"],"title":"StationDataQuery","description":"Query parameters for station observation data.\n\nSupports filtering by:\n- station_ids: List of specific station IDs (mutually exclusive with geo)\n- geo: GeoFilter for region-based filtering (bounding_box, market_zone,\n  country_key, polygon)\n- variables: List of observation variables to return\n- start_time / end_time: Time range for observations\n- aggregation: Temporal aggregation (none, hourly, daily)"},"StationInfo":{"properties":{"station":{"type":"string","title":"Station","description":"Unique station identifier"},"name":{"type":"string","title":"Name","description":"Station name"},"latitude":{"type":"number","title":"Latitude","description":"Station latitude"},"longitude":{"type":"number","title":"Longitude","description":"Station longitude"},"elevation":{"type":"number","title":"Elevation","description":"Station elevation in meters"}},"type":"object","required":["station","name","latitude","longitude","elevation"],"title":"StationInfo","description":"Basic station information."},"StationVariable":{"type":"string","enum":["air_temperature_at_height_level_2m","dew_point_temperature_at_height_level_2m","wind_speed_at_height_level_10m","wind_direction_at_height_level_10m"],"title":"StationVariable","description":"Available synoptic station observation variables.\n\nThese correspond to columns in the synoptic_station_data table.\nValues use max value as NULL indicator (UInt8: 255, UInt16: 65535).\n\nNote: Only variables with reliable data availability (>60%) are included.\nPressure, precipitation, and cloud cover are NOT available in this synoptic\nfeed. Solar radiation is NOT in this table — it lives in\n``solar_station_obs`` as :data:`SOLAR_OBS_VARIABLE` and is selected via the\nsolar leaf of the unified stations query (or v1\n``POST /v1/station-data/solar-data``)."},"StationVariableInfo":{"properties":{"name":{"type":"string","title":"Name","description":"Variable name (column name)"},"description":{"type":"string","title":"Description","description":"Human-readable description"},"unit":{"type":"string","title":"Unit","description":"Unit of measurement"}},"type":"object","required":["name","description","unit"],"title":"StationVariableInfo","description":"Information about a station variable."},"StatsResponse":{"properties":{"stats":{"items":{"$ref":"#/components/schemas/SubjectStats"},"type":"array","title":"Stats"}},"type":"object","title":"StatsResponse"},"SubjectInfo":{"properties":{"key":{"type":"string","title":"Key"},"kind":{"type":"string","enum":["weather","power","provider"],"title":"Kind"},"display_name":{"type":"string","title":"Display Name"},"published":{"type":"boolean","title":"Published"},"schedule":{"oneOf":[{"$ref":"#/components/schemas/WeatherSubjectSchedule"},{"$ref":"#/components/schemas/PowerSubjectSchedule"},{"$ref":"#/components/schemas/ProviderSubjectSchedule"}],"title":"Schedule","discriminator":{"propertyName":"kind","mapping":{"power":"#/components/schemas/PowerSubjectSchedule","provider":"#/components/schemas/ProviderSubjectSchedule","weather":"#/components/schemas/WeatherSubjectSchedule"}}}},"type":"object","required":["key","kind","display_name","published","schedule"],"title":"SubjectInfo"},"SubjectStats":{"properties":{"subject_key":{"type":"string","title":"Subject Key"},"audience":{"type":"string","enum":["internal","early","standard"],"title":"Audience"},"overall":{"$ref":"#/components/schemas/RunGroupStats"},"by_init_clock":{"items":{"$ref":"#/components/schemas/InitClockStats"},"type":"array","title":"By Init Clock"},"daily":{"items":{"$ref":"#/components/schemas/DailyStats"},"type":"array","title":"Daily"}},"type":"object","required":["subject_key","audience","overall","by_init_clock","daily"],"title":"SubjectStats","description":"Per-subject statistics for one audience. Returned verbatim by query-engine."},"SubjectSummary":{"properties":{"key":{"type":"string","title":"Key"},"kind":{"type":"string","enum":["weather","power","provider"],"title":"Kind"},"display_name":{"type":"string","title":"Display Name"},"state":{"type":"string","enum":["ok","delayed","outage","notice"],"title":"State"},"latest_run":{"anyOf":[{"$ref":"#/components/schemas/CustomerRunStatus"},{"type":"null"}]},"next_expected":{"anyOf":[{"$ref":"#/components/schemas/NextExpected"},{"type":"null"}]},"active_notice":{"anyOf":[{"$ref":"#/components/schemas/ActiveNotice"},{"type":"null"}]},"reachability":{"anyOf":[{"$ref":"#/components/schemas/ProviderReachability"},{"type":"null"}]}},"type":"object","required":["key","kind","display_name","state","latest_run","next_expected","active_notice"],"title":"SubjectSummary"},"SubjectsResponse":{"properties":{"subjects":{"items":{"$ref":"#/components/schemas/SubjectInfo"},"type":"array","title":"Subjects"}},"type":"object","title":"SubjectsResponse"},"SummaryResponse":{"properties":{"subjects":{"items":{"$ref":"#/components/schemas/SubjectSummary"},"type":"array","title":"Subjects"}},"type":"object","title":"SummaryResponse"},"TimeRangeClimatologyQuery":{"properties":{"geo":{"$ref":"#/components/schemas/GeoFilter","description":"Geographic filter specifying the query location(s) or region(s)","examples":[{"method":"nearest","type":"point","value":[[52.52,13.405]]},{"type":"bounding_box","value":[[[45.0,5.0],[55.0,15.0]]]},{"type":"market_zone","value":"DE"},{"type":"country_key","value":["DE","FR"]}]},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the climatology query (inclusive). UTC timezone."},"end_time":{"type":"string","format":"date-time","title":"End Time","description":"End time for the climatology query (exclusive). UTC timezone."},"variables":{"items":{"$ref":"#/components/schemas/CustomerVariable"},"type":"array","title":"Variables","description":"List of weather variables to query. If empty, returns all available climatology variables.","examples":[["air_temperature_at_height_level_2m","wind_speed_at_height_level_10m"]]},"group_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Group By","description":"List of dimensions to group by for aggregation. Time aggregation options: 'hourly', 'daily', 'weekly'. Other valid fields: 'market_zone', 'country_key', 'point', 'latitude', 'longitude'. Include latitude and longitude to keep the native grid under daily/weekly aggregation (bounding boxes and polygons). Omit group_by entirely for an unaggregated hourly grid.","examples":[["hourly"],["hourly","market_zone"],["daily"],["daily","market_zone"],["daily","latitude","longitude"],["weekly"]]},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"Timezone for time-based aggregations (daily, weekly). If not specified, UTC is used. Example: 'Europe/Berlin'.","examples":["UTC","Europe/Berlin","America/New_York"]},"aggregation":{"anyOf":[{"items":{"$ref":"#/components/schemas/Aggregation"},"type":"array"},{"type":"null"}],"title":"Aggregation","description":"List of aggregation functions to apply when grouping (e.g., ['avg', 'std']). Requires 'group_by' to be specified."},"order_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Order By","description":"List of dimensions to sort results by. Use 'time' for time-based ordering.","examples":[["time"],["time","latitude","longitude"]]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters for limiting result size.","examples":[{"limit":100,"offset":0}]},"weighting":{"anyOf":[{"$ref":"#/components/schemas/Weighting"},{"type":"null"}],"description":"Optional weighting scheme for geographic aggregation. Applies weighted averages based on capacity or population. Only valid with spatial aggregation (market_zone or country_key).","examples":[{"type":"population"},{"type":"wind_capacity"},{"type":"solar_capacity"}]}},"type":"object","required":["geo","start_time","end_time"],"title":"TimeRangeClimatologyQuery","description":"Query for retrieving ERA5 WMO climatology data over a time range.\n\nInstead of specifying day_of_year/hour directly, provide a time range\n(start_time, end_time) and the query will return climatology data\nmatched to each hour in the range. The response includes a 'time'\ncolumn with the full datetime values.\n\nExample:\n    ```python\n    query = TimeRangeClimatologyQuery(\n        geo={\"type\": \"point\", \"value\": [(52.52, 13.405)]},\n        start_time=datetime(2024, 1, 15, 0, 0, 0),\n        end_time=datetime(2024, 1, 16, 0, 0, 0),\n        variables=[\"air_temperature_at_height_level_2m\"],\n    )\n    # Returns 24 hourly rows with daily-smoothed climatology values\n    ```"},"TimeSlice":{"properties":{"start":{"type":"string","format":"date-time","title":"Start","description":"Start datetime (inclusive)","examples":["2025-01-01T00:00:00Z","2025-05-02 12:00:00"]},"end":{"type":"string","format":"date-time","title":"End","description":"End datetime (inclusive) in ISO 8601 format"}},"type":"object","required":["start","end"],"title":"TimeSlice","description":"Time range for querying forecasts between two datetime values."},"TotalNumberOfForecastsQueryResult":{"properties":{"forecasts_per_model":{"additionalProperties":{"type":"integer"},"propertyNames":{"$ref":"#/components/schemas/Model"},"type":"object","title":"Forecasts Per Model","description":"Mapping of model identifiers to the number of available forecasts"}},"type":"object","required":["forecasts_per_model"],"title":"TotalNumberOfForecastsQueryResult","description":"Result containing forecast counts per model."},"UkPowerTimeseriesQuery":{"properties":{"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/UkPowerVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"Variables to query. If not set, returns all.","examples":[["wind","solar"]]},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)","examples":["2025-12-01T00:00:00Z"]},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time for the query (exclusive). If None, no upper bound.","examples":["2025-12-15T00:00:00Z"]},"aggregation":{"$ref":"#/components/schemas/jua_query_v2__uk_power__query__TemporalAggregation","description":"Temporal aggregation to apply","default":"none"},"temporal_resolution_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Temporal Resolution Minutes","description":"Target temporal resolution in minutes.  When set, data is linearly interpolated in ClickHouse to the requested cadence (native NESO data is 30-minute; use 15 for 15-minute interpolation).  Set to None (the default) to return data at its native resolution."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for time formatting (e.g. 'Europe/London').","examples":["UTC","Europe/London"]},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by (e.g. 'time__desc').","examples":[["time"],["time__desc"]]},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters"}},"type":"object","required":["start_time"],"title":"UkPowerTimeseriesQuery","description":"Query parameters for UK power generation timeseries data.\n\nVariables are aggregated totals:\n- wind: transmission + embedded wind generation\n- solar: total solar generation\n- wind_forecast: day-ahead total wind forecast\n- solar_forecast: day-ahead solar forecast\n\nStored components (``wind_transmission``, ``wind_embedded``, …) can be\nrequested explicitly, including together with the matching total."},"UkPowerVariable":{"type":"string","enum":["wind","wind_transmission","wind_transmission_boa","wind_transmission_boa_live","wind_transmission_pn","wind_transmission_uncurtailed","wind_uncurtailed","wind_embedded","solar","load","wind_forecast","wind_transmission_forecast","wind_embedded_forecast","solar_forecast"],"title":"UkPowerVariable","description":"UK power generation variable types (aggregated)."},"UkPowerVariableInfo":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"unit":{"type":"string","title":"Unit"}},"type":"object","required":["name","description","unit"],"title":"UkPowerVariableInfo","description":"Information about a UK power variable."},"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"},"VersionInfo":{"properties":{"model_version":{"type":"string","title":"Model Version"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Human-readable metadata packaged with the run id, when known."},"zone_key":{"type":"string","title":"Zone Key"},"psr_type":{"type":"string","title":"Psr Type"},"is_stable":{"type":"boolean","title":"Is Stable","default":false},"is_latest":{"type":"boolean","title":"Is Latest","default":false},"is_stable_uncurtailed":{"type":"boolean","title":"Is Stable Uncurtailed","default":false},"is_latest_uncurtailed":{"type":"boolean","title":"Is Latest Uncurtailed","default":false},"earliest_init_time":{"type":"string","format":"date-time","title":"Earliest Init Time"},"latest_init_time":{"type":"string","format":"date-time","title":"Latest Init Time"}},"type":"object","required":["model_version","zone_key","psr_type","earliest_init_time","latest_init_time"],"title":"VersionInfo","description":"One model_version available for a (zone_key, psr_type) cell."},"VersionPin":{"properties":{"zone_key":{"type":"string","title":"Zone Key","description":"Zone code (e.g. 'DE')","examples":["DE"]},"psr_type":{"type":"string","title":"Psr Type","description":"PSR type (e.g. 'Solar')","examples":["Solar","Wind Onshore"]},"version":{"type":"string","minLength":1,"title":"Version","description":"stable | latest | run id","examples":["stable","latest","586rhosh"]},"regime":{"anyOf":[{"type":"string","enum":["curtailed","uncurtailed"]},{"type":"null"}],"title":"Regime","description":"Alias map for this pin when version is stable/latest. None inherits the request regime. Ignored for a concrete run id.","examples":["curtailed","uncurtailed"]}},"type":"object","required":["zone_key","psr_type","version"],"title":"VersionPin","description":"Per-(zone, psr) version override.\n\n``version`` accepts the same values as ``PowerForecastQuery.version``:\n``stable``, ``latest``, or a concrete run id from ``GET /versions``.\n\n``regime`` selects which packaged alias map ``stable`` / ``latest``\nresolve against for this cell. ``None`` inherits the request regime.\nA concrete run id ignores ``regime``."},"WeatherRunClock":{"properties":{"init_clock":{"type":"string","title":"Init Clock","description":"UTC ``HH:MM`` of the run's init."},"communicated_complete_clock":{"type":"string","title":"Communicated Complete Clock","description":"UTC ``HH:MM`` the run is communicated to complete, on the caller's track."},"communicated_complete_day_offset":{"type":"integer","title":"Communicated Complete Day Offset","description":"Days after the init date the communicated clock falls on (0, 1, 5…)."}},"type":"object","required":["init_clock","communicated_complete_clock","communicated_complete_day_offset"],"title":"WeatherRunClock"},"WeatherSubjectSchedule":{"properties":{"kind":{"type":"string","const":"weather","title":"Kind","default":"weather"},"init_schedule":{"type":"string","title":"Init Schedule","description":"5-field cron for which dates the model runs."},"runs":{"items":{"$ref":"#/components/schemas/WeatherRunClock"},"type":"array","title":"Runs"}},"type":"object","required":["init_schedule","runs"],"title":"WeatherSubjectSchedule"},"Weighting":{"properties":{"type":{"type":"string","enum":["wind_capacity","wind_capacity_combined","wind_capacity_transmission","wind_capacity_embedded","solar_capacity","population"],"title":"Type","description":"Weighting type for geographic aggregation. 'wind_capacity': Weight by installed wind power capacity. 'solar_capacity': Weight by installed solar power capacity. 'population': Weight by population density","examples":["wind_capacity","solar_capacity","population"]},"unit":{"type":"string","enum":["weather","mw"],"title":"Unit","description":"Output unit. 'weather': return capacity-weighted raw weather values E[wu]. 'mw': apply power curves in ClickHouse and return predicted MW.","default":"weather"},"target":{"type":"string","enum":["metered_nonneg_price","potential"],"title":"Target","description":"Which actuals series the power curve was fitted to reproduce; applies only when unit='mw'. Weather inputs, capacity and curve family are the same for both values; only the fitting target differs. 'metered_nonneg_price' (default): fitted against metered generation (ENTSO-E / Elexon) on hours with a non-negative day-ahead price, so economically curtailed hours are left out of the fit. 'potential': fitted against the TSO's uncurtailed potential (DE: Netztransparenz Online-Hochrechnung; GB: FUELHH minus NESO Wind BOA), with no price filter. Only available for 'wind_capacity', 'wind_capacity_transmission' and 'solar_capacity', and only in zones with a potential fit (today DE and GB). A zone with no fit for the requested target contributes no rows: it is dropped from a per-zone result and excluded from a merged aggregate, exactly as a zone with no curve at all is under the default, so check the zones in the response. GB caveat: 'wind_capacity' on a combined-wind zone normally resolves to total wind (transmission + embedded, column wind_total_mw); there is no potential fit for embedded wind, so under 'potential' it resolves to transmission only (column wind_transmission_mw). The two are not directly comparable. 'mw_walkforward_debias' with 'potential' fits the bias against the same uncurtailed series (pairing rule), so it is available for DE and GB only.","default":"metered_nonneg_price"}},"type":"object","required":["type"],"title":"Weighting","description":"Weighting scheme for aggregating forecast data over geographic areas.\n\nApplies weighted averages based on capacity or population distribution within\nthe queried area."},"jua_query_v2__climate_indices__types__AvailableSourcesResult":{"properties":{"sources":{"items":{"type":"string"},"type":"array","title":"Sources"}},"type":"object","required":["sources"],"title":"AvailableSourcesResult","description":"Result for available climate indices data sources query."},"jua_query_v2__entsoe__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for ENTSOE queries."},"jua_query_v2__entsoe__types__AvailableVariablesResult":{"properties":{"variables":{"items":{"$ref":"#/components/schemas/EntsoeVariableInfo"},"type":"array","title":"Variables"}},"type":"object","required":["variables"],"title":"AvailableVariablesResult","description":"Result for available variables query."},"jua_query_v2__epex_spot__types__AvailableVariablesResult":{"properties":{"variables":{"items":{"$ref":"#/components/schemas/EpexSpotVariableInfo"},"type":"array","title":"Variables"}},"type":"object","required":["variables"],"title":"AvailableVariablesResult","description":"Result for available EPEX SPOT variables query."},"jua_query_v2__netztransparenz__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for Netztransparenz queries."},"jua_query_v2__netztransparenz__types__AvailableVariablesResult":{"properties":{"variables":{"items":{"$ref":"#/components/schemas/NetztransparenzVariableInfo"},"type":"array","title":"Variables"}},"type":"object","required":["variables"],"title":"AvailableVariablesResult","description":"Result for available variables query."},"jua_query_v2__station_data__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for station data queries."},"jua_query_v2__station_data__types__AvailableVariablesResult":{"properties":{"variables":{"items":{"$ref":"#/components/schemas/StationVariableInfo"},"type":"array","title":"Variables"}},"type":"object","required":["variables"],"title":"AvailableVariablesResult","description":"Result containing list of available variables."},"jua_query_v2__uk_power__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for UK power queries."},"jua_query_v2__uk_power__types__AvailableSourcesResult":{"properties":{"sources":{"items":{"type":"string"},"type":"array","title":"Sources"}},"type":"object","required":["sources"],"title":"AvailableSourcesResult","description":"Result for available UK power data sources query."},"jua_query_v2__uk_power__types__AvailableVariablesResult":{"properties":{"variables":{"items":{"$ref":"#/components/schemas/UkPowerVariableInfo"},"type":"array","title":"Variables"}},"type":"object","required":["variables"],"title":"AvailableVariablesResult","description":"Result for available UK power variables query."},"query_engine__climatology__router__AvailableVariablesResult":{"properties":{"variables":{"items":{"$ref":"#/components/schemas/ClimatologyVariableInfo"},"type":"array","title":"Variables"}},"type":"object","required":["variables"],"title":"AvailableVariablesResult","description":"Result containing available climatology variables."}},"securitySchemes":{}},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform.","externalDocs":{"description":"Forecast API Guide","url":"https://docs.jua.ai/"}},{"name":"benchmarks","description":"Query station benchmark metrics for model evaluation and comparison.","externalDocs":{"description":"Benchmarks API Guide","url":"https://docs.jua.ai/"}},{"name":"entsoe","description":"Query ENTSOE energy market data including prices, load, and generation.","externalDocs":{"description":"ENTSOE API Guide","url":"https://docs.jua.ai/"}},{"name":"netztransparenz","description":"Query German TSO transparency data (netztransparenz.de) including NRV balance, balancing prices, reserve activation, and renewable forecasts.","externalDocs":{"description":"Netztransparenz API Guide","url":"https://docs.jua.ai/"}},{"name":"climatology","description":"Query ERA5 WMO 30-year climatology data (1991-2020) for historical baselines.","externalDocs":{"description":"Climatology API Guide","url":"https://docs.jua.ai/"}},{"name":"station-data","description":"Query weather station observation data including temperature, wind, precipitation, and more.","externalDocs":{"description":"Station Data API Guide","url":"https://docs.jua.ai/"}},{"name":"reanalysis","description":"Query reanalysis data from models like ARCO ERA5 for historical weather analysis.","externalDocs":{"description":"Reanalysis API Guide","url":"https://docs.jua.ai/"}},{"name":"power-forecast","description":"Query power generation forecast data for renewable energy sources (Solar, Wind, etc.).","externalDocs":{"description":"Power Forecast API Guide","url":"https://docs.jua.ai/"}},{"name":"uk-power","description":"Query UK power generation actuals and NESO day-ahead forecasts (wind, solar).","externalDocs":{"description":"UK Power API Guide","url":"https://docs.jua.ai/"}},{"name":"climate-indices","description":"Query climate oscillation indices (ENSO, NAO, AO, PDO, QBO, sunspots, etc.)."}]}