# Jua Documentation

Welcome to Jua! We provide state-of-the-art earth systems forecasts (weather, climate and more) optimized for the energy industry. This documentation will help you get started with our API and data products.

## Find Answers with AI

Use our AI-powered documentation search to get direct answers to your specific questions. Simply type your query in the search bar at the top of the page to find relevant information quickly.

## Quick Start

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Getting Started</strong></td><td>Get started in 2 minutes with our Python SDK</td><td><a href="/pages/JVOtQC90g0yZGK7321Dz">/pages/JVOtQC90g0yZGK7321Dz</a></td></tr><tr><td><strong>Weather Models</strong></td><td>Learn about our EPT-2 and EPT-1.5 models</td><td><a href="/pages/ISrR5VUMQxk0aWxAln8N">/pages/ISrR5VUMQxk0aWxAln8N</a></td></tr><tr><td><strong>API Documentation</strong></td><td>Integrate Jua's services with your favorite coding language</td><td><a href="/pages/Qdvkn27yI1TJnM1jzCzy">/pages/Qdvkn27yI1TJnM1jzCzy</a></td></tr><tr><td><strong>Python SDK: Forecasts</strong></td><td>Access forecasts with ease</td><td><a href="/pages/jqZvTg62hwOuF3kDTEjs">/pages/jqZvTg62hwOuF3kDTEjs</a></td></tr><tr><td><strong>Python SDK: Hindcasts</strong></td><td>Perform backtesting using historical data</td><td><a href="/pages/jqZvTg62hwOuF3kDTEjs">/pages/jqZvTg62hwOuF3kDTEjs</a></td></tr><tr><td><strong>Dissemination Times</strong></td><td>Check when forecasts are available</td><td><a href="/pages/UxEe9FwH55sC5f0imaRQ">/pages/UxEe9FwH55sC5f0imaRQ</a></td></tr><tr><td><strong>API Endpoints</strong></td><td>View &#x26; test our OpenAPI endpoints</td><td><a href="https://query.jua.ai/docs">https://query.jua.ai/docs</a></td></tr></tbody></table>

## For Energy Traders & Analysts

* [About Jua](/introduction/about-jua) - Learn what makes our forecasts unique
* [Models Overview](/models-and-products/models-and-products) - Discover our specialized weather forecasting capabilities
* [Model Evaluation](/guides/evaluation) - Learn how to assess forecast quality and accuracy
* [Getting Started](/api-v2/getting-started) - Follow our integration guide
* [Release Notes](/release-notes) - Stay updated with the latest platform features

## For Developers & Data Scientists

* [Forecast API](/api-v2/getting-started) - Access weather data programmatically
* [Weather Parameters](/python-sdk/weather/naming) - Understand variable naming conventions across models
* [EPT-2 Model](/models-and-products/jua-models/ept-2) - Access our flagship model including hindcast specifications
* [API Reference](https://query.jua.ai/docs) - Full documentation of available endpoints
* [Release Notes](/release-notes) - Track API changes and model updates

## Support

* Contact our support team at <support@jua.ai>


# About Jua

Jua's EPT (Earth Physics Transformer) weather model learns historical weather patterns and fundamental atmospheric physics principles through its end-to-end transformer architecture. It is trained on public and proprietary observed data and physics-based simulations, such as ERA5. This dual approach allows it to capture complex atmospheric dynamics and physical laws while maintaining rapid processing speeds — unlike traditional NWP models, which solve physical equations sequentially by dividing the atmosphere into 3D grid cells and requiring precise initial conditions.

Further reading: [EPT-2 Launch Announcement](https://jua.ai/company/blog/ept-2-launch-announcement) & [EPT-2 Technical Report](https://arxiv.org/abs/2507.09703)

### Key differences vs. traditional numerical modelling

End-to-end AI models learn both historical weather patterns and atmospheric physics through advanced neural networks trained on observed data and physics-based simulations. Jua's models can predict weather events outside their training dataset by learning fundamental physics. Processing raw observational input directly into forecasts provides key advantages:

1. **Accuracy** - Generate accurate forecasts for hyper-local predictions
2. **Resource efficiency** - Less computational power needed during inference
3. **Adaptation capability** - Quick incorporation of new data patterns
4. **Resolution flexibility** - Seamless scaling across different resolutions
5. **Uncertainty handling** - Direct probability distribution outputs

### Why does it matter for energy trading?

Our AI weather model's speed and accuracy directly impact energy trading decisions by:

1. Enabling faster reactions to weather shifts that affect renewable generation and demand
2. Adapting quickly to emerging weather patterns that influence market pricing
3. Delivering consistent accuracy across multiple forecast horizons critical for different trading products

### Ready to get started?

Dive into our [getting started guide](/api-v2/getting-started) now!


# Overview

Jua's product suite offers several advanced models for weather forecasting, including our proprietary EPT models and selected third-party models.

## What's Inside

* **Jua Models** - Our proprietary deep-learning weather forecast models
  * [EPT-1.5 Family](/models-and-products/jua-models/ept-1.5) - Our core product offerings
  * [EPT-2 Family](/models-and-products/jua-models/ept-2) - Our flagship state-of-the-art models
* **Third-party Models** - Third-party weather models we integrate
  * [ECMWF AIFS](/models-and-products/third-party-models/ecmwf-aifs) - ECMWF's AI-powered forecasting system
  * [ECMWF AIFS Ensemble](/models-and-products/third-party-models/ecmwf-aifs-ens) - ECMWF's AI-powered ensemble forecasting system
  * [ECMWF IFS](/models-and-products/third-party-models/ec-ifs) - ECMWF's operational numerical weather prediction model
  * [ECMWF IFS Ensemble](/models-and-products/third-party-models/ecmwf-ens) - ECMWF's ensemble forecasting system
  * [GFS NOAA](/models-and-products/third-party-models/gfs-noaa) - NOAA's Global Forecast System
  * [GFS GraphCast](https://github.com/juaAI/docs/blob/main/models-and-products/third-party-models/gfs-graphcast.md) - Google DeepMind's ML weather model
  * [Microsoft Aurora](/models-and-products/third-party-models/microsoft-aurora) - Microsoft's global weather AI model
  * [DWD ICON Global](/models-and-products/third-party-models/dwd-icon-global) - DWD's global numerical weather model
  * [DWD ICON-EU](/models-and-products/third-party-models/dwd-icon-eu) - DWD's regional European model
  * [Open Meteo Models](/models-and-products/third-party-models/open-meteo) - Additional models via Open Meteo (KNMI, UKMO, AROME, and more)
* **Power Trading Analytics (Beta)** - Energy production forecasting and capacity insights
  * Power Forecasts - Weather-based energy production predictions
  * Capacity Analysis - Renewable energy capacity insights

The [weather parameter availability tables](#summary-available-weather-models-and-data) give an overview of the weather parameters available for each model.

## Hindcast Datasets

Comprehensive historical forecast data is available for all our models. For detailed hindcast specifications, temporal coverage, and data availability, please refer to the individual model documentation:

* [EPT-1.5 Family](/models-and-products/jua-models/ept-1.5) - Historical forecast data for our legacy model
* [EPT-2 Family](/models-and-products/jua-models/ept-2) - Our flagship model hindcasts
* [ECMWF AIFS](/models-and-products/third-party-models/ecmwf-aifs) - ECMWF's AI model hindcasts
* [ECMWF AIFS Ensemble](/models-and-products/third-party-models/ecmwf-aifs-ens) - ECMWF's AI ensemble model hindcasts
* [ECMWF IFS](/models-and-products/third-party-models/ec-ifs) - ECMWF's operational model hindcasts
* [ECMWF IFS Ensemble](/models-and-products/third-party-models/ecmwf-ens) - ECMWF's ensemble model hindcasts
* [GFS NOAA](/models-and-products/third-party-models/gfs-noaa) - NOAA's GFS model hindcasts
* [Microsoft Aurora](/models-and-products/third-party-models/microsoft-aurora) - Microsoft's AI model hindcasts
* [DWD ICON Global](/models-and-products/third-party-models/dwd-icon-global) - DWD's global model hindcasts
* [DWD ICON-EU](/models-and-products/third-party-models/dwd-icon-eu) - DWD's regional European model hindcasts

## Summary: Available Weather Models and Data

<table data-full-width="true"><thead><tr><th width="200">Model</th><th width="110">Latitude Extent</th><th width="110">Longitude Extent</th><th>Grid Resolution</th><th>Resolution</th><th>Runs/Day</th><th width="200">Forecast Horizon</th><th width="200">Time Step</th><th width="450">Variables: Solar</th><th width="350">Variables: Wind</th><th width="450">Variables: Other</th><th width="250">Data Availability</th><th width="250">Notes</th></tr></thead><tbody><tr><td>EPT 1.5</td><td>[90, -90)</td><td>[-180, 180)</td><td>2221×4440</td><td>0.081°</td><td>4</td><td>480h (20 days)</td><td>0 - 240h: Hourly<br>240 - 480h: 6-Hourly</td><td>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa</td><td>2025-01-06 - today</td><td>More data available upon request<br></td></tr><tr><td>EPT 1.5 Early</td><td>[90, -90)</td><td>[-180, 180)</td><td>2221×4440</td><td>0.081°</td><td>4</td><td>480h (20 days)</td><td>0 - 240h: Hourly<br>240 - 480h: 6-Hourly</td><td>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa</td><td>2025-08-12 - today</td><td>missing data:<br>2025-08-29T00:00:00<br>2025-09-01T12:00:00<br></td></tr><tr><td>EPT 2</td><td>[90, -90)</td><td>[-180, 180)</td><td>2160×4320</td><td>0.081°</td><td>4</td><td>480h (20 days)</td><td>0 - 240h: Hourly<br>240 - 480h: 6-Hourly</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_20m<br>wind_speed_at_height_level_40m<br>wind_speed_at_height_level_60m<br>wind_speed_at_height_level_80m<br>wind_speed_at_height_level_100m<br>wind_speed_at_height_level_120m<br>wind_speed_at_height_level_140m<br>wind_speed_at_height_level_160m<br>wind_speed_at_height_level_180m<br>wind_speed_at_height_level_200m</td><td>air_density_at_height_level_2m<br>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_1h<br>relative_humidity_at_height_level_2m<br>surface_air_pressure</td><td>2023-01-01 - today</td><td>—</td></tr><tr><td>EPT 2 Early</td><td>[90, -90)</td><td>[-180, 180)</td><td>1440×2880</td><td>0.125°</td><td>4</td><td>480h (20 days)</td><td>0 - 240h: Hourly<br>240 - 480h: 6-Hourly</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>relative_humidity_at_height_level_2m</td><td>2025-09-01 - today</td><td>—</td></tr><tr><td>EPT 2e</td><td>[90, -90)</td><td>[-180, 180)</td><td>720×1440</td><td>0.25°</td><td>4</td><td>00:00:<br>1440h (60 days)<br><br>Other runs:<br>480h (20 days)</td><td>0 - 240h: Hourly<br>240 - 1440h: 6-Hourly</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_20m<br>wind_speed_at_height_level_40m<br>wind_speed_at_height_level_60m<br>wind_speed_at_height_level_80m<br>wind_speed_at_height_level_100m<br>wind_speed_at_height_level_120m<br>wind_speed_at_height_level_140m<br>wind_speed_at_height_level_160m<br>wind_speed_at_height_level_180m<br>wind_speed_at_height_level_200m</td><td>air_density_at_height_level_2m<br>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_1h<br>relative_humidity_at_height_level_2m<br>surface_air_pressure</td><td>2025-08-16 - today</td><td>60-day forecast available from 2025-08-29 - today (previously 20 days)</td></tr><tr><td>EPT 2 Reasoning</td><td>[90, -90)</td><td>[-180, 180)</td><td>2160×4320</td><td>0.081°</td><td>4</td><td>480h (20 days)</td><td>0 - 240h: Hourly<br>240 - 480h: 6-Hourly</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_20m<br>wind_speed_at_height_level_40m<br>wind_speed_at_height_level_60m<br>wind_speed_at_height_level_80m<br>wind_speed_at_height_level_100m<br>wind_speed_at_height_level_120m<br>wind_speed_at_height_level_140m<br>wind_speed_at_height_level_160m<br>wind_speed_at_height_level_180m<br>wind_speed_at_height_level_200m</td><td>air_density_at_height_level_2m<br>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_1h<br>surface_air_pressure</td><td>2025-08-27 - today</td><td>—</td></tr><tr><td>EPT 2 RR</td><td>[90, -90)</td><td>[-180, 180)</td><td>720×1440</td><td>0.25°</td><td>24</td><td>48h (2 days)</td><td>Hourly</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_1h<br>relative_humidity_at_height_level_2m</td><td>2024-01-01 04:00:00 - today</td><td>missing data:<br>2025-10-20T18:00:00<br>2025-10-20T17:00:00<br>2025-10-20T09:00:00<br>2025-10-20T08:00:00<br>2025-10-20T07:00:00<br></td></tr><tr><td>EPT 2 HRRR</td><td>[36, 72]</td><td>[-15, 45]</td><td>721×1201</td><td>0.05°</td><td>24</td><td>48h (2 days)</td><td>Hourly</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_20m<br>wind_speed_at_height_level_40m<br>wind_speed_at_height_level_60m<br>wind_speed_at_height_level_80m<br>wind_speed_at_height_level_100m<br>wind_speed_at_height_level_120m<br>wind_speed_at_height_level_140m<br>wind_speed_at_height_level_160m<br>wind_speed_at_height_level_180m<br>wind_speed_at_height_level_200m</td><td>air_density_at_height_level_2m<br>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>precipitation_amount_sum_1h<br>relative_humidity_at_height_level_2m<br>surface_air_pressure</td><td>2025-01-01 04:00:00 - today</td><td>16 ensemble members<br><br>missing data:<br>2025-10-20T18:00:00<br>2025-10-20T17:00:00<br>2025-10-20T09:00:00<br>2025-10-20T08:00:00<br>2025-10-20T07:00:00<br></td></tr><tr><td>EPT 2.1 Helios</td><td>[-64.875, 64.875]</td><td>[-64.875, 64.875]</td><td>520×520 (±65° band)</td><td>0.25°</td><td>48</td><td>48h (2 days)</td><td>30-Minutely</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_direct_downwelling_shortwave_flux_sum_30min<br>surface_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_30min</td><td>—</td><td>—</td><td>2024-01-01 - today</td><td>Solar-only nowcast, served over Europe (36–65°N, 14°W–30°E)</td></tr><tr><td>EPT 2.1 Europa</td><td>[36, 70.5]</td><td>[-15, 45]</td><td>553×961</td><td>0.0625°</td><td>24</td><td>48h (2 days)</td><td>Hourly</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_20m<br>wind_speed_at_height_level_40m<br>wind_speed_at_height_level_60m<br>wind_speed_at_height_level_80m<br>wind_speed_at_height_level_100m<br>wind_speed_at_height_level_120m<br>wind_speed_at_height_level_140m<br>wind_speed_at_height_level_160m<br>wind_speed_at_height_level_180m<br>wind_speed_at_height_level_200m</td><td>air_density_at_height_level_2m<br>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere<br>dew_point_temperature_at_height_level_2m<br>precipitation_amount_sum_1h<br>relative_humidity_at_height_level_2m<br>surface_air_pressure</td><td>2025-08-14 - today</td><td>16 ensemble members</td></tr><tr><td>Aurora (Microsoft)</td><td>[90, -90)</td><td>[-180, 180)</td><td>2160×4320</td><td>0.081°</td><td>4</td><td>480h (20 days)</td><td>6-Hourly</td><td>—</td><td>wind_direction_at_height_level_10m<br>wind_speed_at_height_level_10m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa</td><td>2025-08-16 - today</td><td>—</td></tr><tr><td>EC AIFS</td><td>[90, -90)</td><td>[-180, 180)</td><td>720×1440</td><td>0.25°</td><td>4</td><td>480h (20 days)</td><td>6-Hourly</td><td>surface_downwelling_shortwave_flux_sum_6h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_6h<br>relative_humidity_at_height_level_2m</td><td>2025-01-06 06:00:00 - today</td><td>—</td></tr><tr><td>EC IFS</td><td>[90, -90)</td><td>[-180, 180)</td><td>2160×4320</td><td>0.081°</td><td>4</td><td>00:00 and 12:00 runs:<br>360h (15 days)<br><br>06:00 and 18:00 runs:<br>144h (6 days)</td><td>0 - 90h: Hourly<br>90h - 144h: 3-Hourly<br>144h - 360h: 6-Hourly</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m<br>wind_speed_at_height_level_200m</td><td>air_density_at_height_level_2m<br>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_1h<br>surface_air_pressure</td><td>2022-01-01 - today</td><td>00/12 UTC: 360h since 12-11-2024 06:00 (previously 240h)<br>06/18 UTC: 144h since 12-11-2024 06:00 (previously 90h)</td></tr><tr><td>ECMWF ENS</td><td>[90, -90)</td><td>[-180, 180)</td><td>720×1440</td><td>0.25°</td><td>4</td><td>00:00 and 12:00 runs:<br>360h (15 days)<br><br>06:00 and 18:00 runs:<br>144h (6 days)</td><td>0 - 144h: 3-Hourly<br>144h - 360h: 6-Hourly</td><td>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_1h</td><td>2025-09-01 - today</td><td>50 ensemble members (perturbed forecasts only)</td></tr><tr><td>EC AIFS ENS</td><td>[90, -90)</td><td>[-180, 180)</td><td>720×1440</td><td>0.25°</td><td>4</td><td>360h (15 days)</td><td>6-Hourly</td><td>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>dew_point_temperature_at_height_level_2m<br>precipitation_amount_sum_1h<br>surface_air_pressure<br>surface_temperature</td><td>2025-07-01 - today</td><td>Control + 50 ensemble members</td></tr><tr><td>EC46</td><td>[90, -89.6)</td><td>[-180, 179.6)</td><td>450×900</td><td>0.4°</td><td>1</td><td>1104h (46 days)</td><td>6-Hourly</td><td>surface_downwelling_shortwave_flux_sum_6h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_6h</td><td>2026-02-03 - today</td><td>Control + 100 ensemble members</td></tr><tr><td>ERA5</td><td>[90, -90)</td><td>[-180, 180)</td><td>720×1440</td><td>0.25°</td><td>24 (Hourly)</td><td>— (Reanalysis)</td><td>Hourly</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_1h<br>surface_net_downward_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m<br>wind_speed_of_gust_at_height_level_10m_max</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>atmosphere_convective_available_potential_energy<br>cloud_area_fraction_at_entire_atmosphere<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>precipitation_amount_sum_1h<br>predominant_precipitation_type_at_surface<br>sea_surface_temperature<br>surface_air_pressure<br>surface_temperature</td><td>1990-01-01 - today</td><td>~5-7 days delay</td></tr><tr><td>ICON Global</td><td>[90, -90)</td><td>[-180, 180)</td><td>1440×2880</td><td>0.125°</td><td>4</td><td>00:00 and 12:00 runs:<br>180h (7.5 days)<br><br>06:00 and 18:00 runs:<br>120h (5 days)</td><td>0 - 78h: Hourly<br>78h - 180h: 3-Hourly</td><td>surface_direct_downwelling_shortwave_flux_sum_1h<br>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m<br>wind_speed_at_height_level_200m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_1h<br>surface_air_pressure</td><td>2025-08-16 - today</td><td>—</td></tr><tr><td>ICON EU</td><td>[29.5, 70.5]</td><td>[-23.5, 62.5]</td><td>657x1377</td><td>0.0625°</td><td>8</td><td>00:00, 06:00, 12:00, 18:00 runs:<br>120h (5 days)<br><br>03:00, 09:00, 15:00, 21:00 runs:<br>48h (2 days)</td><td>00/06/12/18 UTC runs:<br>0 - 78h: Hourly<br>78h - 120h: 3-Hourly<br><br>03/09/15/21 UTC runs:<br>0 - 30h: Hourly<br>30h - 48h: 6-Hourly</td><td>surface_downwelling_shortwave_flux_sum_1h<br>surface_direct_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m<br>wind_speed_at_height_level_200m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_1h<br>surface_air_pressure</td><td>2026-02-06 12:00:00 - today</td><td>missing data:<br>2025-10-20T18:00:00<br></td></tr><tr><td>NOAA GFS</td><td>[90, -90)</td><td>[-180, 180)</td><td>720×1440</td><td>0.25°</td><td>4</td><td>384h (16 days)</td><td>0 - 120h: Hourly<br>120h - 384h: 3-Hourly</td><td>surface_downwelling_shortwave_flux_sum_1h</td><td>wind_direction_at_height_level_10m<br>wind_direction_at_height_level_100m<br>wind_speed_at_height_level_10m<br>wind_speed_at_height_level_100m</td><td>air_pressure_at_mean_sea_level<br>air_temperature_at_height_level_2m<br>cloud_area_fraction_at_entire_atmosphere_high_type<br>cloud_area_fraction_at_entire_atmosphere_low_type<br>cloud_area_fraction_at_entire_atmosphere_medium_type<br>dew_point_temperature_at_height_level_2m<br>geopotential_at_pressure_level_50000Pa<br>precipitation_amount_sum_1h<br>surface_air_pressure<br>surface_temperature</td><td>2023-01-01 - today</td><td>—</td></tr></tbody></table>


# Jua Models

Jua's proprietary deep-learning models delivering high-resolution global weather forecasts:

* **EPT-1.5 and EPT-1.5 Early** - Our core product offerings
* **EPT-2 and EPT-2 Early** - Our flagship state-of-the-art models

Both model families provide global coverage with four daily runs and a 20-day prediction horizon.

**Out now**: Our newest additions to the EPT-2 family

* **EPT-2e** is our ensemble model for probabilistic forecasting, ideal for long-term risk hedging strategies
* **EPT-2 Reasoning** is our advanced reasoning model based on active learning from live data
* **EPT-2 RR** is our rapid refresh forecast model, with our fastest dissemination times and 24 updates per day
* **EPT-2 HRRR** is out high-resolution rapid refresh forecast model, with unprecedented detail over Europe

## EPT-2: Our Latest Flagship

EPT-2 is our state-of-the-art weather model that outperforms leading public AI weather models including Microsoft Aurora, DeepMind's GraphCast, ECMWF's AIFS, and our previous EPT-1.5 model. Released in April 2024, EPT-2 represents our most advanced forecasting technology yet.

* **Full hindcast dataset** available for performance analysis and evaluation
* **Enhanced accuracy** across all weather parameters
* **Improved resolution** for more precise forecasting


# EPT-1.5 Family

**EPT-1.5** and **EPT-1.5 Early** are our core product offerings. EPT-1.5 provides the highest accuracy and hindcast coverage, while EPT-1.5 Early offers dissemination 2.5 hours earlier to anticipate market movements.

## Live Forecast Data

* Global coverage at 0.081°x0.081° (approx. 9x9km) resolution
* Four daily runs (00, 06, 12, 18 UTC)
* 20-day prediction horizon
* Real-time data access via [Python SDK](/python-sdk/weather/forecast) or [REST API](/api-v2/getting-started)

## Technical Specifications

### Available Weather Parameters

| Parameter Code | API Name                                       | Description                       | Units        |
| -------------- | ---------------------------------------------- | --------------------------------- | ------------ |
| 2t             | air\_temperature\_at\_height\_level\_2m        | Air temperature at 2m             | Kelvin       |
| 10si           | wind\_speed\_at\_height\_level\_10m            | Wind speed at 10m                 | m s⁻¹        |
| 10wdir         | wind\_direction\_at\_height\_level\_10m        | Wind direction at 10m             | Degrees true |
| 100si          | wind\_speed\_at\_height\_level\_100m           | Wind speed at 100m                | m s⁻¹        |
| 100wdir        | wind\_direction\_at\_height\_level\_100m       | Wind direction at 100m            | Degrees true |
| msl            | air\_pressure\_at\_mean\_sea\_level            | Mean sea-level pressure           | Pa           |
| ssrd           | surface\_downwelling\_shortwave\_flux\_sum\_1h | Surface solar downward irradiance | J m⁻²        |
| z\_500         | geopotential\_at\_pressure\_level\_50000Pa     | Geopotential at 500hPa            | m² s⁻²       |

{% hint style="info" %}
Note that wind direction is expressed as the direction in which the wind is blowing *from* as measured clockwise from true North. For example, wind blowing from the South East would have a `10wdir` value of 135.0.
{% endhint %}

The legacy parameter naming convention used in EPT-1.5 is deprecated. All new integrations should use the standardized naming shown above. See [Weather Variable Naming](/python-sdk/weather/naming) for full details.

For most forecast parameters (non-accumulated), the value at a given timestamp (e.g., 13:00) represents the weather conditions exactly at that time. The only exception is SSRD, which reflects the total solar radiation from 12:01 to 13:00 rather than just the conditions at 13:00 — making it an accumulated parameter.

## Hindcast Data

**Spatial Extent:** Global, on a grid of 2220x4440 (9 km resolution).

**Data Access:** Hindcasts are accessible via our [Python SDK](/python-sdk/getting-started) and [API](/api-v2/getting-started). For bulk, grid-based access, please contact <support@jua.ai>.

| **Model**     | **Temporal Extent**                                   | **Forecast Horizon and Resolution**                                               |
| ------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------- |
| EPT-1.5       | <p>2025-01-06 - today</p><p>at 00, 06, 12, 18 UTC</p> | <p>480h</p><p>- From 1h to 240h: hourly</p><p>- From 240h to 480h: six-hourly</p> |
| EPT-1.5 Early | 2025-08-12 - today at 00, 06, 12, 18 UTC              | <p>480h</p><p>- From 1h to 240h: hourly</p><p>- From 240h to 480h: six-hourly</p> |

### Extended Hindcast Data (Special Request Only)

{% hint style="warning" %}
**Special Request Required**: The following extended hindcast data is available but requires special access permissions and is not accessible through standard API/SDK access. Please contact <support@jua.ai> to request access.
{% endhint %}

| **Model**     | **Spatial Extent**           | **Extended Temporal Coverage**           | **Forecast Horizon and Resolution**                                               |
| ------------- | ---------------------------- | ---------------------------------------- | --------------------------------------------------------------------------------- |
| EPT-1.5       | Global                       | 2024-10-16 - today at 00, 06, 12, 18 UTC | <p>480h</p><p>- From 1h to 240h: hourly</p><p>- From 240h to 480h: six-hourly</p> |
| EPT-1.5       | Europe (36°-72°N, -15°-35°E) | 2022-01-01 - 2024-07-31 at 00 UTC        | 360h, hourly                                                                      |
| EPT-1.5       | North America (Various)      | 2022-01-01 - 2024-07-31 at 00 UTC        | 360h, hourly                                                                      |
| EPT-1.5 Early | Global                       | 2025-01-01 - today at 00, 06, 12, 18 UTC | <p>480h</p><p>- From 1h to 240h: hourly</p><p>- From 240h to 480h: six-hourly</p> |
| EPT-1.5 Early | Global                       | 2025-01-01 - today at 00, 06, 12, 18 UTC | <p>480h</p><p>- From 1h to 240h: hourly</p><p>- From 240h to 480h: six-hourly</p> |
| EPT-1.5 Early | Europe (36°-72°N, -15°-35°E) | 2024-01-01 - 2024-12-31 at 00 UTC        | 360h, hourly                                                                      |

## Dissemination Times

For detailed dissemination times of EPT-1.5 and EPT-1.5 Early, please refer to the [Dissemination Times](/models-and-products/dissemination-times) page.


# EPT-2 Family

Jua's flagship state-of-the-art weather model was first released in April 2025. The EPT-2 family outperforms leading public AI weather models including Microsoft Aurora, DeepMind's GraphCast, ECMWF's AIFS, and our previous EPT-1.5 model.

* **EPT-2**: Our deterministic model for precise weather forecasting
* **EPT-2 Early**: Our early-dissemination model delivering forecasts ahead of the market
* **EPT-2e**: Our ensemble model for probabilistic weather forecasting, especially for the long term
* **EPT-2 RR**: Our rapid-refresh model for hourly global weather intelligence
* **EPT-2 HRRR**: Our high-resolution rapid-refresh model
* **EPT-2 Reasoning**: Our AI weather forecast model with active learning from live data
* **EPT-2.1 Helios**: Our solar nowcasting model for Europe
* **EPT-2.1 Europa**: The next generation of EPT-2 HRRR — our high-resolution regional European ensemble

For more information on our EPT-2 family of models, take a look at our [EPT-2 Technical Report](https://arxiv.org/abs/2507.09703).

## EPT-2 Family Comparison

<table><thead><tr><th>Model</th><th>Update Frequency</th><th>Ensemble<select><option value="bWyG2zvUpykn" label="Yes" color="blue"></option><option value="5ME4rgE38zxn" label="No" color="blue"></option></select></th><th>Forecast Horizon</th><th data-type="checkbox">Global coverage</th></tr></thead><tbody><tr><td>EPT-2</td><td>4 updates/day</td><td><span data-option="5ME4rgE38zxn">No</span></td><td>20 days</td><td>true</td></tr><tr><td>EPT-2 Early</td><td>4 updates/day</td><td><span data-option="5ME4rgE38zxn">No</span></td><td>20 days</td><td>true</td></tr><tr><td>EPT-2e</td><td>4 updates/day + 1 daily 60 day</td><td><span data-option="bWyG2zvUpykn">Yes</span></td><td>60 days</td><td>true</td></tr><tr><td>EPT-2 RR</td><td>24 updates/day</td><td><span data-option="5ME4rgE38zxn">No</span></td><td>2 days</td><td>true</td></tr><tr><td>EPT-2 HRRR</td><td>24 updates/day</td><td><span data-option="bWyG2zvUpykn">Yes</span></td><td>2 days</td><td>false</td></tr><tr><td>EPT-2 Reasoning</td><td>4 updates/day</td><td><span data-option="5ME4rgE38zxn">No</span></td><td>20 days</td><td>true</td></tr><tr><td>EPT-2.1 Helios</td><td>48 updates/day</td><td><span data-option="5ME4rgE38zxn">No</span></td><td>2 days</td><td>false</td></tr><tr><td>EPT-2.1 Europa</td><td>24 updates/day</td><td><span data-option="bWyG2zvUpykn">Yes</span></td><td>2 days</td><td>false</td></tr></tbody></table>

## Live Forecast Data

* Global coverage for EPT-2, EPT-2 Early, EPT-2e, and EPT-2 RR
* European coverage for EPT-2 HRRR
* Four daily runs (00, 06, 12, 18 UTC) for EPT-2, EPT-2 Early, EPT-2e
* 24 hourly runs for EPT-2 RR and EPT-2 HRRR
* 2-day prediction horizon (EPT-2 RR, EPT-2 HRRR)
* 20-day prediction horizon (EPT-2, EPT-2 Early, EPT-2e)
* 60-day prediction horizon for the EPT-2e forecast at 00 UTC
* Real-time data access via [Python SDK](/python-sdk/weather/forecast) or [REST API](/api-v2/getting-started)

## Technical Specifications

### Coordinates

| **Name**              | **Description**                           | **Units**           |
| --------------------- | ----------------------------------------- | ------------------- |
| init\_time            | Initialization time of forecast at UTC    | Absolute time (UTC) |
| prediction\_timedelta | Lead time relative to initialization time | Timedelta           |
| latitude              | Latitudinal coordinate                    | Degrees true        |
| longitude             | Longitudinal coordinate                   | Degrees true        |

### Spatial Extent

<table><thead><tr><th width="120.3515625">Model</th><th width="120.01953125">Latitudes</th><th width="120.44140625">Longitudes</th><th width="174.859375">Grid Size</th><th>Resolution</th></tr></thead><tbody><tr><td>EPT-2</td><td>[90, -90)</td><td>[-180, 180)</td><td>2160x4320</td><td>0.081° (9 km)</td></tr><tr><td>EPT-2 Early</td><td>[90, -90)</td><td>[-180, 180)</td><td>1440x2880</td><td>0.125° (12 km)</td></tr><tr><td>EPT-2e</td><td>[90, -90)</td><td>[-180, 180)</td><td>720x1440</td><td>0.25° (25 km)</td></tr><tr><td>EPT-2 RR</td><td>[90, -90)</td><td>[-180, 180)</td><td>720x1440</td><td>0.25° (25 km)</td></tr><tr><td>EPT-2 HRRR</td><td>[36, 72]</td><td>[-15, 45]</td><td>721x1201</td><td>0.05° (5.5 km)</td></tr><tr><td>EPT-2 Reasoning</td><td>[90, -90)</td><td>[-180, 180)</td><td>2160x4320</td><td>0.081° (9 km)</td></tr><tr><td>EPT-2.1 Helios</td><td>[-64.875, 64.875]</td><td>[-64.875, 64.875]</td><td>520x520</td><td>0.25° (25 km)</td></tr><tr><td>EPT-2.1 Europa</td><td>[36, 70.5]</td><td>[-15, 45]</td><td>553x961</td><td>0.0625° (7 km)</td></tr></tbody></table>

### Available Weather Parameters

EPT-2 uses standardized variable naming conventions. For full details on the naming structure, see [Weather Variable Naming](/python-sdk/weather/naming).

{% hint style="info" %}
Wind speed at additional heights (20m, 40m, 60m, 80m, 120m, 140m, 160m, 180m, 200m) and air density at 2m are available from **March 1, 2026** onwards.
{% endhint %}

<table data-full-width="false"><thead><tr><th width="101.25390625">Code</th><th width="362.796875">API Name</th><th width="180.859375">Description</th><th>Units</th></tr></thead><tbody><tr><td>2t</td><td>air_temperature_at_height_level_2m</td><td>Air temperature at 2m</td><td>Kelvin</td></tr><tr><td>2d</td><td>dew_point_temperature_at_height_level_2m</td><td>Dew point temperature at 2m</td><td>Kelvin</td></tr><tr><td>r</td><td>relative_humidity_at_height_level_2m</td><td>Relative humidity at 2m</td><td>%</td></tr><tr><td>10si</td><td>wind_speed_at_height_level_10m</td><td>Horizontal wind speed at 10m</td><td>m s⁻¹</td></tr><tr><td>10wdir</td><td>wind_direction_at_height_level_10m</td><td>Horizontal wind direction at 10m</td><td>Degrees true</td></tr><tr><td>100si</td><td>wind_speed_at_height_level_100m</td><td>Horizontal wind speed at 100m</td><td>m s⁻¹</td></tr><tr><td>100wdir</td><td>wind_direction_at_height_level_100m</td><td>Horizontal wind direction at 100m</td><td>Degrees true</td></tr><tr><td>20si</td><td>wind_speed_at_height_level_20m</td><td>Horizontal wind speed at 20m</td><td>m s⁻¹</td></tr><tr><td>40si</td><td>wind_speed_at_height_level_40m</td><td>Horizontal wind speed at 40m</td><td>m s⁻¹</td></tr><tr><td>60si</td><td>wind_speed_at_height_level_60m</td><td>Horizontal wind speed at 60m</td><td>m s⁻¹</td></tr><tr><td>80si</td><td>wind_speed_at_height_level_80m</td><td>Horizontal wind speed at 80m</td><td>m s⁻¹</td></tr><tr><td>120si</td><td>wind_speed_at_height_level_120m</td><td>Horizontal wind speed at 120m</td><td>m s⁻¹</td></tr><tr><td>140si</td><td>wind_speed_at_height_level_140m</td><td>Horizontal wind speed at 140m</td><td>m s⁻¹</td></tr><tr><td>160si</td><td>wind_speed_at_height_level_160m</td><td>Horizontal wind speed at 160m</td><td>m s⁻¹</td></tr><tr><td>180si</td><td>wind_speed_at_height_level_180m</td><td>Horizontal wind speed at 180m</td><td>m s⁻¹</td></tr><tr><td>200si</td><td>wind_speed_at_height_level_200m</td><td>Horizontal wind speed at 200m</td><td>m s⁻¹</td></tr><tr><td>2rho</td><td>air_density_at_height_level_2m</td><td>Air density at 2m</td><td>kg m⁻³</td></tr><tr><td>msl</td><td>air_pressure_at_mean_sea_level</td><td>Mean Sea-level Pressure</td><td>Pa</td></tr><tr><td>lcc</td><td>cloud_area_fraction_at_entire_atmosphere_low_type</td><td>Low Cloud Cover</td><td>%</td></tr><tr><td>mcc</td><td>cloud_area_fraction_at_entire_atmosphere_medium_type</td><td>Medium Cloud Cover</td><td>%</td></tr><tr><td>hcc</td><td>cloud_area_fraction_at_entire_atmosphere_high_type</td><td>High Cloud Cover</td><td>%</td></tr><tr><td>tp</td><td>precipitation_amount_sum_1h</td><td>Total Precipitation</td><td>mm m⁻²</td></tr><tr><td>ssrd</td><td>surface_downwelling_shortwave_flux_sum_1h</td><td>Surface solar downward irradiance</td><td>J m⁻²</td></tr><tr><td>fdir</td><td>surface_direct_downwelling_shortwave_flux_sum_1h</td><td>Direct solar radiation at the surface</td><td>J m⁻²</td></tr><tr><td>z_500</td><td>geopotential_at_pressure_level_50000Pa</td><td>Geopotential</td><td>m² s⁻²</td></tr></tbody></table>

Note: The previous naming convention used in EPT-1.5 is deprecated. All new integrations should use the standardized naming shown above.

#### EPT-2 HRRR

EPT-2 HRRR produces a subset of the EPT-2 variables.

| Parameter Code | API Name                                                    | Description                           | Units        |
| -------------- | ----------------------------------------------------------- | ------------------------------------- | ------------ |
| 2t             | air\_temperature\_at\_height\_level\_2m                     | Air temperature at 2m                 | Kelvin       |
| 2d             | dew\_point\_temperature\_at\_height\_level\_2m              | Dew point temperature at 2m           | Kelvin       |
| r              | relative\_humidity\_at\_height\_level\_2m                   | Relative humidity at 2m               | %            |
| 10si           | wind\_speed\_at\_height\_level\_10m                         | Horizontal wind speed at 10m          | m s⁻¹        |
| 10wdir         | wind\_direction\_at\_height\_level\_10m                     | Horizontal wind direction at 10m      | Degrees true |
| 100si          | wind\_speed\_at\_height\_level\_100m                        | Horizontal wind speed at 100m         | m s⁻¹        |
| 100wdir        | wind\_direction\_at\_height\_level\_100m                    | Horizontal wind direction at 100m     | Degrees true |
| 20si           | wind\_speed\_at\_height\_level\_20m                         | Horizontal wind speed at 20m          | m s⁻¹        |
| 40si           | wind\_speed\_at\_height\_level\_40m                         | Horizontal wind speed at 40m          | m s⁻¹        |
| 60si           | wind\_speed\_at\_height\_level\_60m                         | Horizontal wind speed at 60m          | m s⁻¹        |
| 80si           | wind\_speed\_at\_height\_level\_80m                         | Horizontal wind speed at 80m          | m s⁻¹        |
| 120si          | wind\_speed\_at\_height\_level\_120m                        | Horizontal wind speed at 120m         | m s⁻¹        |
| 140si          | wind\_speed\_at\_height\_level\_140m                        | Horizontal wind speed at 140m         | m s⁻¹        |
| 160si          | wind\_speed\_at\_height\_level\_160m                        | Horizontal wind speed at 160m         | m s⁻¹        |
| 180si          | wind\_speed\_at\_height\_level\_180m                        | Horizontal wind speed at 180m         | m s⁻¹        |
| 200si          | wind\_speed\_at\_height\_level\_200m                        | Horizontal wind speed at 200m         | m s⁻¹        |
| 2rho           | air\_density\_at\_height\_level\_2m                         | Air density at 2m                     | kg m⁻³       |
| msl            | air\_pressure\_at\_mean\_sea\_level                         | Mean Sea-level Pressure               | Pa           |
| lcc            | cloud\_area\_fraction\_at\_entire\_atmosphere\_low\_type    | Low Cloud Cover                       | %            |
| mcc            | cloud\_area\_fraction\_at\_entire\_atmosphere\_medium\_type | Medium Cloud Cover                    | %            |
| hcc            | cloud\_area\_fraction\_at\_entire\_atmosphere\_high\_type   | High Cloud Cover                      | %            |
| tp             | precipitation\_amount\_sum\_1h                              | Total Precipitation                   | mm m⁻²       |
| ssrd           | surface\_downwelling\_shortwave\_flux\_sum\_1h              | Surface solar downward irradiance     | J m⁻²        |
| fdir           | surface\_direct\_downwelling\_shortwave\_flux\_sum\_1h      | Direct solar radiation at the surface | J m⁻²        |

### Additional Variables on Request

| Parameter Code | API Name                                    | Description                                                            | Units  |
| -------------- | ------------------------------------------- | ---------------------------------------------------------------------- | ------ |
| tcwv           | atmosphere\_mass\_content\_of\_water\_vapor | Total column vertically-integrated water vapour                        | kg m⁻² |
| t              | air\_temperature\_at\_pressure\_level       | Temperature at a specified pressure level                              | K      |
| u              | eastward\_wind\_at\_pressure\_level         | U component of wind                                                    | m s⁻¹  |
| v              | northward\_wind\_at\_pressure\_level        | V component of wind                                                    | m s⁻¹  |
| q              | specific\_humidity\_at\_pressure\_level     | The mass of water vapour per kilogram of moist air at a pressure level | kg     |
| z              | geopotential\_at\_pressure\_level           | The gravitational potential energy of a unit mass                      | m² s⁻² |

* Pressure levels: 5'000, 10'000, 15'000, 20'000, 25'000, 30'000, 40'000, 50'000, 60'000, 70'000, 85'000, 92'500, 100'000

## Hindcast Data

**Data Access:** Hindcasts are available via our [Python SDK](/python-sdk/getting-started) and [API](/api-v2/getting-started). For large requests, please contact <support@jua.ai>.

| **Model**       | **Temporal Extent**                                                         | **Forecast Horizon and Resolution**                                                                                    |
| --------------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| EPT-2           | <p>2023-01-01 - today</p><p>at 00, 06, 12, 18 UTC</p>                       | <p>480h</p><p>- From 1h to 240h: hourly</p><p>- From 240h to 480h: six-hourly</p>                                      |
| EPT-2e          | <p>2025-08-16 - today</p><p>at 00, 06, 12, 18 UTC</p>                       | <p>00 UTC: 1440h; 06, 12, 18 UTC: 480h</p><p>- From 1h to 240h: hourly</p><p>- From 240h to 480h/1440h: six-hourly</p> |
| EPT-2 RR        | <p>2024-01-01 04:00:00 - today</p><p>at 00-23 UTC (every hour)</p><p>\*</p> | 48h, hourly                                                                                                            |
| EPT-2 HRRR      | <p>2025-01-01 04:00:00 - today</p><p>at 00-23 UTC (every hour)</p><p>\*</p> | 48h, hourly                                                                                                            |
| EPT-2 Early     | <p>2025-09-01 - today</p><p>at 00, 06, 12, 18 UTC</p>                       | <p>480h</p><p>- From 1h to 240h: hourly</p><p>- From 240h to 480h: six-hourly</p>                                      |
| EPT-2 Reasoning | <p>2025-08-27 - today</p><p>at 00, 06, 12, 18 UTC</p>                       | <p>480h</p><p>- From 1h to 240h: hourly</p><p>- From 240h to 480h: six-hourly</p>                                      |
| EPT-2.1 Helios  | <p>2024-01-01 - today</p><p>at 00:00-23:30 UTC (every 30 minutes)</p>       | 48h, 30-minutely (solar variables only)                                                                                |
| EPT-2.1 Europa  | <p>2025-08-14 - today</p><p>at 00-23 UTC (every hour)</p>                   | 48h, hourly                                                                                                            |

\* EPT-2 RR and EPT-2 HRRR have missing data on the 2025-10-20.

### Extended Hindcast Data (Special Request Only)

{% hint style="warning" %}
**Special Request Required**: The following extended hindcast data is available but requires special access permissions and is not accessible through standard API/SDK access. Please contact <support@jua.ai> to request access.
{% endhint %}

| **Model**   | **Extended Temporal Coverage**                                                      | **Forecast Horizon and Resolution**                                               |
| ----------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| EPT-2 Early | <p>2024-03-01 - 2024-03-13, 2024-06-05 - 2024-12-31</p><p>at 00, 06, 12, 18 UTC</p> | <p>480h</p><p>- From 1h to 240h: hourly</p><p>- From 240h to 480h: six-hourly</p> |

## Performance Benchmarks

EPT-2 consistently outperforms other leading weather models, including:

* Microsoft Aurora
* DeepMind's GraphCast
* ECMWF's AIFS
* Our previous EPT-1.5 model

For more details on EPT-2 performance benchmarks, check out our [benchmarking analysis](https://jua.ai/products/benchmarks).

## Dissemination Times

For detailed dissemination times of the EPT-2 family please refer to the [Dissemination Times](/models-and-products/dissemination-times) page.


# Dissemination Times

This page provides the dissemination times for all Jua weather model products.

## EPT-1.5 Family

### EPT-1.5

| Base time (UTC) | Start (UTC) | 90 Hours | 240 Hours (10d) | 480 Hours (20d) |
| --------------- | ----------- | -------- | --------------- | --------------- |
| 00:00           | 05:40       | 05:50    | 05:57           | 06:05           |
| 06:00           | 11:40       | 11:50    | 11:57           | 12:05           |
| 12:00           | 17:40       | 17:50    | 17:57           | 19:05           |
| 18:00           | 23:40       | 23:50    | 23:57           | 01:05           |

### EPT-1.5 Early

| Base time (UTC) | Start (UTC) | 90 Hours | 240 Hours (10d) | 480 Hours (20d) |
| --------------- | ----------- | -------- | --------------- | --------------- |
| 00:00           | 03:15       | 03:25    | 03:35           | 03:40           |
| 06:00           | 09:15       | 09:25    | 09:35           | 09:40           |
| 12:00           | 15:15       | 15:25    | 15:35           | 15:40           |
| 18:00           | 21:15       | 21:25    | 21:35           | 21:40           |

## EPT-2 Family

The first 10 days are in hourly resolution. Between day 10 and 20 in 6h resolution.

### EPT-2

| Base time (UTC) | Start (UTC) | 90 Hours | 240 Hours (10d) | 480 Hours (20d) |
| --------------- | ----------- | -------- | --------------- | --------------- |
| 00:00           | 05:50       | 06:00    | 06:15           | 06:25           |
| 06:00           | 11:50       | 12:00    | 12:15           | 12:25           |
| 12:00           | 17:50       | 18:00    | 18:15           | 18:25           |
| 18:00           | 23:50       | 00:00    | 00:15           | 00:25           |

### EPT-2e

| Base time (UTC) | Start (UTC) | 90 Hours | 240 Hours (10d) | 480 Hours (20d) | 1440 Hours (60d) |
| --------------- | ----------- | -------- | --------------- | --------------- | ---------------- |
| 00:00           | 05:55       | 06:15    | 06:50           | 06:55           | 07:45            |
| 06:00           | 11:55       | 12:15    | 12:50           | 13:00           | N/A              |
| 12:00           | 17:55       | 18:15    | 18:50           | 18:55           | N/A              |
| 18:00           | 23:55       | 00:15    | 00:50           | 01:00           | N/A              |

### EPT-2 Early

| Base time (UTC) | Start (UTC) | 90 Hours | 240 Hours (10d) | 480 Hours (20d) |
| --------------- | ----------- | -------- | --------------- | --------------- |
| 00:00           | 03:15       | 03:25    | 03:35           | 03:40           |
| 06:00           | 09:15       | 09:25    | 09:35           | 09:40           |
| 12:00           | 15:15       | 15:25    | 15:35           | 15:40           |
| 18:00           | 21:15       | 21:25    | 21:35           | 21:40           |

### EPT-2 RR

| Base time (UTC) | Start (UTC) | 48 Hours |
| --------------- | ----------- | -------- |
| 00:00           | 01:50       | 02:00    |
| 01:00           | 02:50       | 03:00    |
| 02:00           | 03:50       | 04:00    |
| 03:00           | 04:50       | 05:00    |
| 04:00           | 05:50       | 06:00    |
| 05:00           | 06:50       | 07:00    |
| 06:00           | 07:50       | 08:00    |
| 07:00           | 08:50       | 09:00    |
| 08:00           | 09:50       | 10:00    |
| 09:00           | 10:50       | 11:00    |
| 10:00           | 11:50       | 12:00    |
| 11:00           | 12:50       | 13:00    |
| 12:00           | 13:50       | 14:00    |
| 13:00           | 14:50       | 15:00    |
| 14:00           | 15:50       | 16:00    |
| 15:00           | 16:50       | 17:00    |
| 16:00           | 17:50       | 18:00    |
| 17:00           | 18:50       | 19:00    |
| 18:00           | 19:50       | 20:00    |
| 19:00           | 20:50       | 21:00    |
| 20:00           | 21:50       | 22:00    |
| 21:00           | 22:50       | 23:00    |
| 22:00           | 23:50       | 00:00    |
| 23:00           | 00:50       | 01:00    |

### EPT-2 HRRR

| Base time (UTC) | Start (UTC) | 48 Hours |
| --------------- | ----------- | -------- |
| 00:00           | 01:55       | 02:25    |
| 01:00           | 02:55       | 03:25    |
| 02:00           | 03:55       | 04:25    |
| 03:00           | 04:55       | 05:25    |
| 04:00           | 05:55       | 06:25    |
| 05:00           | 06:55       | 07:25    |
| 06:00           | 07:55       | 08:25    |
| 07:00           | 08:55       | 09:25    |
| 08:00           | 09:55       | 10:25    |
| 09:00           | 10:55       | 11:25    |
| 10:00           | 11:55       | 12:25    |
| 11:00           | 12:55       | 13:25    |
| 12:00           | 13:55       | 14:25    |
| 13:00           | 14:55       | 15:25    |
| 14:00           | 15:55       | 16:25    |
| 15:00           | 16:55       | 17:25    |
| 16:00           | 17:55       | 18:25    |
| 17:00           | 18:55       | 19:25    |
| 18:00           | 19:55       | 20:25    |
| 19:00           | 20:55       | 21:25    |
| 20:00           | 21:55       | 22:25    |
| 21:00           | 22:55       | 23:25    |
| 22:00           | 23:55       | 00:25    |
| 23:00           | 00:55       | 01:25    |

### EPT-2 Reasoning

| Base time (UTC) | Start (UTC) | 90 Hours | 240 Hours (10d) | 480 Hours (20d) |
| --------------- | ----------- | -------- | --------------- | --------------- |
| 00:00           | 05:40       | 05:55    | 06:45           | 06:45           |
| 06:00           | 11:40       | 11:55    | 12:45           | 12:45           |
| 12:00           | 17:40       | 17:55    | 18:45           | 18:45           |
| 18:00           | 23:40       | 23:55    | 00:45           | 00:45           |

### EPT-2.1 Helios

Solar-only nowcast for Europe. 48h horizon, updated every 30 minutes.

| Base time (UTC) | Start (UTC) | 48 Hours |
| --------------- | ----------- | -------- |
| 00:00           | 00:30       | 01:00    |
| 00:30           | 01:00       | 01:30    |
| 01:00           | 01:30       | 02:00    |
| 01:30           | 02:00       | 02:30    |
| 02:00           | 02:30       | 03:00    |
| 02:30           | 03:00       | 03:30    |
| 03:00           | 03:30       | 04:00    |
| 03:30           | 04:00       | 04:30    |
| 04:00           | 04:30       | 05:00    |
| 04:30           | 05:00       | 05:30    |
| 05:00           | 05:30       | 06:00    |
| 05:30           | 06:00       | 06:30    |
| 06:00           | 06:30       | 07:00    |
| 06:30           | 07:00       | 07:30    |
| 07:00           | 07:30       | 08:00    |
| 07:30           | 08:00       | 08:30    |
| 08:00           | 08:30       | 09:00    |
| 08:30           | 09:00       | 09:30    |
| 09:00           | 09:30       | 10:00    |
| 09:30           | 10:00       | 10:30    |
| 10:00           | 10:30       | 11:00    |
| 10:30           | 11:00       | 11:30    |
| 11:00           | 11:30       | 12:00    |
| 11:30           | 12:00       | 12:30    |
| 12:00           | 12:30       | 13:00    |
| 12:30           | 13:00       | 13:30    |
| 13:00           | 13:30       | 14:00    |
| 13:30           | 14:00       | 14:30    |
| 14:00           | 14:30       | 15:00    |
| 14:30           | 15:00       | 15:30    |
| 15:00           | 15:30       | 16:00    |
| 15:30           | 16:00       | 16:30    |
| 16:00           | 16:30       | 17:00    |
| 16:30           | 17:00       | 17:30    |
| 17:00           | 17:30       | 18:00    |
| 17:30           | 18:00       | 18:30    |
| 18:00           | 18:30       | 19:00    |
| 18:30           | 19:00       | 19:30    |
| 19:00           | 19:30       | 20:00    |
| 19:30           | 20:00       | 20:30    |
| 20:00           | 20:30       | 21:00    |
| 20:30           | 21:00       | 21:30    |
| 21:00           | 21:30       | 22:00    |
| 21:30           | 22:00       | 22:30    |
| 22:00           | 22:30       | 23:00    |
| 22:30           | 23:00       | 23:30    |
| 23:00           | 23:30       | 00:00    |
| 23:30           | 00:00       | 00:30    |

### EPT-2.1 Europa

High-resolution regional European ensemble (successor to EPT-2 HRRR). 48h horizon, hourly runs.

| Base time (UTC) | Start (UTC) | 48 Hours |
| --------------- | ----------- | -------- |
| 00:00           | 01:55       | 02:25    |
| 01:00           | 02:55       | 03:25    |
| 02:00           | 03:55       | 04:25    |
| 03:00           | 04:55       | 05:25    |
| 04:00           | 05:55       | 06:25    |
| 05:00           | 06:55       | 07:25    |
| 06:00           | 07:55       | 08:25    |
| 07:00           | 08:55       | 09:25    |
| 08:00           | 09:55       | 10:25    |
| 09:00           | 10:55       | 11:25    |
| 10:00           | 11:55       | 12:25    |
| 11:00           | 12:55       | 13:25    |
| 12:00           | 13:55       | 14:25    |
| 13:00           | 14:55       | 15:25    |
| 14:00           | 15:55       | 16:25    |
| 15:00           | 16:55       | 17:25    |
| 16:00           | 17:55       | 18:25    |
| 17:00           | 18:55       | 19:25    |
| 18:00           | 19:55       | 20:25    |
| 19:00           | 20:55       | 21:25    |
| 20:00           | 21:55       | 22:25    |
| 21:00           | 22:55       | 23:25    |
| 22:00           | 23:55       | 00:25    |
| 23:00           | 00:55       | 01:25    |

## AIFS Single

20 day forecast horizon with six-hourly temporal resolution.

| Base time (UTC) | Start (UTC) | 480 Hours (20d) |
| --------------- | ----------- | --------------- |
| 00:00           | 05:40       | 05:50           |
| 06:00           | 11:40       | 11:50           |
| 12:00           | 17:40       | 17:50           |
| 18:00           | 23:40       | 23:50           |

## Aurora

20 day forecast horizon with six-hourly temporal resolution.

| Base time (UTC) | Start (UTC) | 480 Hours (20d) |
| --------------- | ----------- | --------------- |
| 00:00           | 05:50       | 06:00           |
| 06:00           | 11:50       | 12:00           |
| 12:00           | 17:50       | 18:00           |
| 18:00           | 23:50       | 00:00           |

## AIFS Ensemble

15 day forecast horizon with six-hourly temporal resolution. Control + 50 perturbed members.

| Base time (UTC) | Start (UTC) | 360 Hours (15d) |
| --------------- | ----------- | --------------- |
| 00:00           | 07:30       | 07:40           |
| 06:00           | 13:30       | 13:40           |
| 12:00           | 19:30       | 19:40           |
| 18:00           | 01:30       | 01:40           |

## NWP models

The tables below show the time at which 90% of recent forecast steps were available via the standard API tier (early-access subscribers see them up to 30 minutes earlier). Values are derived from observed dissemination over the last 14 days (4 days for ECMWF ENS, which moved to a new pipeline on 2026-05-19), capped at the dissemination SLA configured in `jua-query-v2` and at 1 hour above the worst run observed in the last 3 days, and refreshed periodically.

### EC IFS

ECMWF IFS HRES, deterministic. 360h horizon on 00/12 runs, 144h on 06/18.

| Base time (UTC) | Start (UTC) | 90 Hours | 144 Hours (6d) | 240 Hours (10d) | 360 Hours (15d) |
| --------------- | ----------- | -------- | -------------- | --------------- | --------------- |
| 00:00           | 06:20       | 06:50    | 06:50          | 07:00           | 07:10           |
| 06:00           | 12:10       | 12:40    | 12:40          | N/A             | N/A             |
| 12:00           | 18:30       | 19:00    | 19:00          | 19:10           | 19:10           |
| 18:00           | 00:20       | 00:20    | 00:20          | N/A             | N/A             |

### EC ENS

ECMWF Ensemble (51 members). 360h horizon on 00/12 runs, 144h on 06/18.

| Base time (UTC) | Start (UTC) | 90 Hours | 144 Hours (6d) | 240 Hours (10d) | 360 Hours (15d) |
| --------------- | ----------- | -------- | -------------- | --------------- | --------------- |
| 00:00           | 07:00       | 07:20    | 07:20          | 07:40           | 07:50           |
| 06:00           | 13:00       | 13:10    | 13:20          | N/A             | N/A             |
| 12:00           | 18:50       | 19:00    | 19:00          | 19:20           | 19:30           |
| 18:00           | 02:10       | 02:10    | 02:20          | N/A             | N/A             |

### EC46

ECMWF Extended Range (46 days). Single daily run at 00 UTC.

| Base time (UTC) | Start (UTC) | 240 Hours (10d) | 480 Hours (20d) | 840 Hours (35d) | 1104 Hours (46d) |
| --------------- | ----------- | --------------- | --------------- | --------------- | ---------------- |
| 00:00           | 13:20       | 14:00           | 14:10           | 14:20           | 14:30            |

### ICON-D2

DWD ICON-D2 (regional, central Europe). 48h horizon, eight runs/day.

| Base time (UTC) | Start (UTC) | 48 Hours |
| --------------- | ----------- | -------- |
| 00:00           | 03:10       | 03:20    |
| 03:00           | 06:10       | 06:20    |
| 06:00           | 09:10       | 09:20    |
| 09:00           | 12:10       | 12:20    |
| 12:00           | 15:10       | 15:20    |
| 15:00           | 18:10       | 18:20    |
| 18:00           | 21:10       | 21:20    |
| 21:00           | 00:10       | 00:20    |

### ICON-EU

DWD ICON-EU (regional, Europe). Main runs (00, 06, 12, 18) cover 120h; intermediate runs (03, 09, 15, 21) cover 48h.

| Base time (UTC) | Start (UTC) | 48 Hours | 90 Hours | 120 Hours (5d) |
| --------------- | ----------- | -------- | -------- | -------------- |
| 00:00           | 04:30       | 04:30    | 04:30    | 04:30          |
| 03:00           | 07:00       | 07:00    | N/A      | N/A            |
| 06:00           | 10:30       | 10:30    | 10:30    | 10:30          |
| 09:00           | 13:00       | 13:00    | N/A      | N/A            |
| 12:00           | 16:30       | 16:30    | 16:30    | 16:30          |
| 15:00           | 19:00       | 19:00    | N/A      | N/A            |
| 18:00           | 22:30       | 22:30    | 22:30    | 22:30          |
| 21:00           | 01:00       | 01:00    | N/A      | N/A            |

### ICON Global

DWD ICON-Global. 180h horizon on 00/12 runs, 120h on 06/18.

| Base time (UTC) | Start (UTC) | 90 Hours | 120 Hours (5d) | 144 Hours (6d) | 180 Hours (7.5d) |
| --------------- | ----------- | -------- | -------------- | -------------- | ---------------- |
| 00:00           | 04:50       | 04:50    | 04:50          | 04:50          | 04:50            |
| 06:00           | 10:50       | 10:50    | 10:50          | N/A            | N/A              |
| 12:00           | 16:50       | 16:50    | 16:50          | 16:50          | 16:50            |
| 18:00           | 22:50       | 22:50    | 22:50          | N/A            | N/A              |

### GFS

NOAA GFS deterministic. 384h (16d) horizon at 0.25° resolution.

| Base time (UTC) | Start (UTC) | 48 Hours | 90 Hours | 144 Hours (6d) | 240 Hours (10d) | 384 Hours (16d) |
| --------------- | ----------- | -------- | -------- | -------------- | --------------- | --------------- |
| 00:00           | 04:20       | 04:30    | 04:50    | 05:00          | 05:20           | 06:00           |
| 06:00           | 10:10       | 10:30    | 10:40    | 11:00          | 11:20           | 12:00           |
| 12:00           | 16:10       | 16:30    | 16:40    | 16:50          | 17:20           | 18:00           |
| 18:00           | 22:20       | 22:40    | 22:50    | 23:00          | 23:20           | 00:00           |


# Third Party Models

The Jua platform provides access to several third-party weather models alongside our proprietary EPT models. These models can be accessed through both the platform interface and API.

## Available Models

### ECMWF Models

* **ECMWF IFS Operational** - ECMWF IFS HRES model, often referred as ops. See [ECMWF IFS](/models-and-products/third-party-models/ec-ifs) for details.
* **ECMWF IFS Ensemble** - Multiple ECMWF IFS Ensemble runs, often referred to as ENS. See [ECMWF IFS Ensemble](/models-and-products/third-party-models/ecmwf-ens) for details.
* **ECMWF AIFS** - EC's AI-based forecasting model [(learn more)](https://www.ecmwf.int/en/about/media-centre/news/2025/ecmwfs-ai-forecasts-become-operational)
* **ECMWF AIFS Ensemble** - EC's AI-based ensemble (control + 50 perturbed members). See [ECMWF AIFS Ensemble](/models-and-products/third-party-models/ecmwf-aifs-ens) for details.

### NOAA Models

* **GFS** - Global Forecast System from NOAA. See [GFS NOAA](/models-and-products/third-party-models/gfs-noaa) for details.
* **GFS Ensemble Mean** - Average of multiple GFS ensemble runs

### AI Models

* **Microsoft Aurora** - Microsoft's AI-based global weather model. See [Microsoft Aurora](/models-and-products/third-party-models/microsoft-aurora) for details.
* **GFS GraphCast** - Google DeepMind's ML-based weather prediction model, initialised by GFS. See [GFS GraphCast](https://github.com/juaAI/docs/blob/main/models-and-products/third-party-models/gfs-graphcast.md) for details.

### DWD Models

* **ICON Global** - Global model from DWD (Deutscher Wetterdienst). See [DWD ICON Global](/models-and-products/third-party-models/dwd-icon-global) for details.
* **ICON-EU** - Higher-resolution regional European model from DWD (Deutscher Wetterdienst). See [DWD ICON-EU](/models-and-products/third-party-models/dwd-icon-eu) for details.

### Regional Models

* **AROME France HD** - High-definition regional model from Météo-France

### Open Meteo Models

Additional models are available through [Open Meteo](https://open-meteo.com/en/docs/), including ECMWF AIFS/IFS variants, GFS/NCEP models, and regional European models (ICON-D2, KNMI HARMONIE-AROME, AROME France HD, UKMO). These models have some restrictions: point queries, no streaming, latest forecast, and nearest interpolation. See [Open Meteo Models](/models-and-products/third-party-models/open-meteo) for the full list.

## Hindcasts

The following hindcast datasets are available:

* **ECMWF AIFS** - Historical forecast data available for performance analysis and evaluation. See [ECMWF AIFS](/models-and-products/third-party-models/ecmwf-aifs) for details.
* **ECMWF AIFS Ensemble** - Historical ensemble forecast data available. See [ECMWF AIFS Ensemble](/models-and-products/third-party-models/ecmwf-aifs-ens) for details.
* **ECMWF IFS Operational** - Historical forecast data available. See [ECMWF IFS](/models-and-products/third-party-models/ec-ifs) for details.
* **GFS NOAA** - Historical forecast data available. See [GFS NOAA](/models-and-products/third-party-models/gfs-noaa) for details.
* **Microsoft Aurora** - Hindcast data available. See [Microsoft Aurora](/models-and-products/third-party-models/microsoft-aurora) for details.

## API Access

All models are accessible through the [Query Engine API](/api-v2/getting-started) using the `POST /v1/forecast/data` endpoint or the [Python SDK](/python-sdk/weather/forecast). Specify the model name using the API model strings shown in the tables above.

For complete API documentation, please refer to our [API Reference](https://query.jua.ai/docs).


# ECMWF AIFS

ECMWF's AI-based forecasting model that provides global weather forecasts at 0.25° resolution.

## Live Forecast Data

* Global coverage at 0.25° resolution (721x1440 grid)
* Four daily runs (00, 06, 12, 18 UTC)
* 20-day prediction horizon (480h, six-hourly)
* Real-time data access via [Python SDK](/python-sdk/weather/forecast) or [REST API](/api-v2/getting-started)

## Technical Specifications

### Available Weather Parameters

AIFS uses standardized variable naming conventions. For full details on the naming structure, see [Weather Variable Naming](/python-sdk/weather/naming).

| Parameter Code | API Name                                       | Description                                    | Units                |
| -------------- | ---------------------------------------------- | ---------------------------------------------- | -------------------- |
| 2t             | air\_temperature\_at\_height\_level\_2m        | Air temperature at 2m                          | K                    |
| 2d             | dew\_point\_temperature\_at\_height\_level\_2m | Dew point temperature at 2m                    | K                    |
| r              | relative\_humidity\_at\_height\_level\_2m      | Relative humidity at 2m                        | %                    |
| 10si           | wind\_speed\_at\_height\_level\_10m            | Horizontal wind speed at 10m                   | m s⁻¹                |
| 10wdir         | wind\_direction\_at\_height\_level\_10m        | Horizontal wind direction at 10m               | Degrees true         |
| 100si          | wind\_speed\_at\_height\_level\_100m           | Horizontal wind speed at 100m                  | m s⁻¹                |
| 100wdir        | wind\_direction\_at\_height\_level\_100m       | Horizontal wind direction at 100m              | Degrees true         |
| msl            | air\_pressure\_at\_mean\_sea\_level            | Mean Sea-level Pressure                        | Pa                   |
| z\_500         | geopotential\_at\_pressure\_level\_50000Pa     | Geopotential                                   | m² s⁻²               |
| hcc            | high\_type\_cloud\_area\_fraction              | Cloud fraction in high levels of troposphere   | range between \[0,1] |
| mcc            | medium\_type\_cloud\_area\_fraction            | Cloud fraction in medium levels of troposphere | range between \[0,1] |
| lcc            | low\_type\_cloud\_area\_fraction               | Cloud fraction in low levels of troposphere    | range between \[0,1] |
| tp             | precipitation\_amount\_sum\_6h                 | Total Precipitation                            | mm m⁻²               |
| ssrd           | surface\_downwelling\_shortwave\_flux\_sum\_6h | Surface solar downward irradiance              | J m⁻²                |

### Additional Variables on Request

| Parameter Code | API Name                                               | Description                                                                      | Units   |
| -------------- | ------------------------------------------------------ | -------------------------------------------------------------------------------- | ------- |
| tcwv           | atmosphere\_mass\_content\_of\_water\_vapor            | Total column vertically-integrated water vapour                                  | kg m⁻²  |
| t              | air\_temperature\_at\_pressure\_level (at 13 levels)   | Temperature at a specified pressure level                                        | K       |
| u              | eastward\_wind\_at\_pressure\_level (at 13 levels)     | U component of wind                                                              | m s⁻¹   |
| v              | northward\_wind\_at\_pressure\_level (at 13 levels)    | V component of wind                                                              | m s⁻¹   |
| q              | specific\_humidity\_at\_pressure\_level (at 13 levels) | The mass of water vapour per kilogram of moist air at a specified pressure level | kg kg⁻¹ |
| z              | geopotential\_at\_pressure\_level (at 13 levels)       | The gravitational potential energy of a unit mass                                | m² s⁻²  |

Note: The previous naming convention used in EPT-1.5 is deprecated. All new integrations should use the standardized naming shown above.

## Hindcast Data

**Spatial Extent:** Global, on a grid of 721x1440 (25 km resolution).

**Data Access:** Hindcasts are available via [API](/api-v2/getting-started) or [SDK](/python-sdk/getting-started). For bulk, grid-based access, please contact <support@jua.ai>.

| **Model**        | **Temporal Extent**                                            | **Forecast Horizon and Resolution** |
| ---------------- | -------------------------------------------------------------- | ----------------------------------- |
| AIFS-Single v1.1 | <p>2025-01-06 06:00:00 - today</p><p>at 00, 06, 12, 18 UTC</p> | 480h, six-hourly                    |


# ECMWF AIFS Ensemble

The ECMWF AIFS Ensemble (AIFS ENS) is ECMWF's data-driven (AI) global ensemble, providing a control forecast plus 50 perturbed-forecast members. Jua serves it from ECMWF Open Data.

## Live Forecast Data

* Global coverage at 25 km resolution (720x1440 grid)
* Four daily runs (00, 06, 12, 18 UTC)
* 360h forecast (15 days) for every run
* 6-hourly time steps throughout (0–360h)
* Real-time data access via [Python SDK](/python-sdk/weather/forecast) or [REST API](/api-v2/getting-started)

## Technical Specifications

### Available Weather Parameters

ECMWF AIFS ENS uses standardized variable naming conventions. For full details on the naming structure, see [Weather Variable Naming](/python-sdk/weather/naming).

| Code    | API Name                                       | Description                       | Units        |
| ------- | ---------------------------------------------- | --------------------------------- | ------------ |
| 2t      | air\_temperature\_at\_height\_level\_2m        | Air temperature at 2m             | Kelvin       |
| 2d      | dew\_point\_temperature\_at\_height\_level\_2m | Dew-point temperature at 2m       | Kelvin       |
| skt     | surface\_temperature                           | Surface (skin) temperature        | Kelvin       |
| 10si    | wind\_speed\_at\_height\_level\_10m            | Horizontal wind speed at 10m      | m s⁻¹        |
| 100si   | wind\_speed\_at\_height\_level\_100m           | Horizontal wind speed at 100m     | m s⁻¹        |
| 10wdir  | wind\_direction\_at\_height\_level\_10m        | Horizontal wind direction at 10m  | Degrees true |
| 100wdir | wind\_direction\_at\_height\_level\_100m       | Horizontal wind direction at 100m | Degrees true |
| sp      | surface\_air\_pressure                         | Surface pressure                  | Pa           |
| msl     | air\_pressure\_at\_mean\_sea\_level            | Mean Sea-level Pressure           | Pa           |
| tp      | precipitation\_amount\_sum\_1h                 | Total Precipitation               | mm m⁻²       |
| ssrd    | surface\_downwelling\_shortwave\_flux\_sum\_1h | Surface solar downward irradiance | J m⁻²        |

## Hindcast Data

**Data Access:** Hindcasts are available via [API](/api-v2/getting-started) or [SDK](/python-sdk/getting-started). For bulk, grid-based access, please contact <support@jua.ai>.

| **Model**      | **Spatial Extent**                       | **Temporal Extent** |
| -------------- | ---------------------------------------- | ------------------- |
| ECMWF AIFS ENS | Global, 25 km resolution (720x1440 grid) | 2025-07-01 - today  |


# ECMWF IFS

The European Centre for Medium-Range Weather Forecasts (ECMWF) Integrated Forecasting System (IFS) is one of the world's leading global numerical weather prediction models.

## Live Forecast Data

* Global coverage at 9km resolution (2160x4320 grid)
* Four daily runs (00, 06, 12, 18 UTC)
* Extended prediction horizons up to 15 days
* Real-time data access via [Python SDK](/python-sdk/weather/forecast) or [REST API](/api-v2/getting-started)

## Technical Specifications

### Available Weather Parameters

IFS uses standardized variable naming conventions. For full details on the naming structure, see [Weather Variable Naming](/python-sdk/weather/naming).

{% hint style="info" %}
Wind speed at additional heights (20m, 40m, 60m, 80m, 120m, 140m, 160m, 180m, 200m) and air density at 2m are available from **March 1, 2026** onwards.
{% endhint %}

| Code    | API Name                                               | Description                           | Units        |
| ------- | ------------------------------------------------------ | ------------------------------------- | ------------ |
| 2t      | air\_temperature\_at\_height\_level\_2m                | Air temperature at 2m                 | Kelvin       |
| 2d      | dew\_point\_temperature\_at\_height\_level\_2m         | Dew point temperature at 2m           | Kelvin       |
| 10si    | wind\_speed\_at\_height\_level\_10m                    | Horizontal wind speed at 10m          | m s⁻¹        |
| 10wdir  | wind\_direction\_at\_height\_level\_10m                | Horizontal wind direction at 10m      | Degrees true |
| 100si   | wind\_speed\_at\_height\_level\_100m                   | Horizontal wind speed at 100m         | m s⁻¹        |
| 100wdir | wind\_direction\_at\_height\_level\_100m               | Horizontal wind direction at 100m     | Degrees true |
| 20si    | wind\_speed\_at\_height\_level\_20m                    | Horizontal wind speed at 20m          | m s⁻¹        |
| 40si    | wind\_speed\_at\_height\_level\_40m                    | Horizontal wind speed at 40m          | m s⁻¹        |
| 60si    | wind\_speed\_at\_height\_level\_60m                    | Horizontal wind speed at 60m          | m s⁻¹        |
| 80si    | wind\_speed\_at\_height\_level\_80m                    | Horizontal wind speed at 80m          | m s⁻¹        |
| 120si   | wind\_speed\_at\_height\_level\_120m                   | Horizontal wind speed at 120m         | m s⁻¹        |
| 140si   | wind\_speed\_at\_height\_level\_140m                   | Horizontal wind speed at 140m         | m s⁻¹        |
| 160si   | wind\_speed\_at\_height\_level\_160m                   | Horizontal wind speed at 160m         | m s⁻¹        |
| 180si   | wind\_speed\_at\_height\_level\_180m                   | Horizontal wind speed at 180m         | m s⁻¹        |
| 200si   | wind\_speed\_at\_height\_level\_200m                   | Horizontal wind speed at 200m         | m s⁻¹        |
| 2rho    | air\_density\_at\_height\_level\_2m                    | Air density at 2m                     | kg m⁻³       |
| msl     | air\_pressure\_at\_mean\_sea\_level                    | Mean Sea-level Pressure               | Pa           |
| lcc     | low\_type\_cloud\_area\_fraction                       | Low Cloud Cover                       | %            |
| mcc     | medium\_type\_cloud\_area\_fraction                    | Medium Cloud Cover                    | %            |
| hcc     | high\_type\_cloud\_area\_fraction                      | High Cloud Cover                      | %            |
| tp      | precipitation\_amount\_sum\_1h                         | Total Precipitation                   | mm m⁻²       |
| ssrd    | surface\_downwelling\_shortwave\_flux\_sum\_1h         | Surface solar downward irradiance     | J m⁻²        |
| fdir    | surface\_direct\_downwelling\_shortwave\_flux\_sum\_1h | Direct solar radiation at the surface | J m⁻²        |
| z\_500  | geopotential\_at\_pressure\_level\_50000Pa             | Geopotential                          | m² s⁻²       |

## Hindcast Data

**Data Access:** Hindcasts are available via [API](/api-v2/getting-started) or [SDK](/python-sdk/getting-started). For bulk, grid-based access, please contact <support@jua.ai>.

### Current Hindcast Availability

| **Model** | **Spatial Extent**                       | **Temporal Extent**                        | **Forecast Horizon and Resolution**                                                                                                                                                                       |
| --------- | ---------------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| IFS HRES  | Global, 9 km resolution (2160x4320 grid) | January 2022 - today at 00, 06, 12, 18 UTC | <p>00/12 UTC: 360h since 12-11-2024T06 before 240h; 06/18 UTC: 144h since 12-11-2024T06 before 90h<br>- From 1h to 90h: hourly<br>- From 90h to 144h: three-hourly<br>- From 144h to 360h: six-hourly</p> |

### Extended Hindcast Data (Special Request Only)

{% hint style="warning" %}
**Special Request Required**: The following extended hindcast data is available but requires special access permissions and is not accessible through standard API/SDK access. Contact <support@jua.ai> to request access.
{% endhint %}

| **Model** | **Spatial Extent**                       | **Extended Temporal Coverage**        | **Forecast Horizon and Resolution** | **Available Parameters**                                                    |
| --------- | ---------------------------------------- | ------------------------------------- | ----------------------------------- | --------------------------------------------------------------------------- |
| IFS HRES  | Global, 25 km resolution (1440x721 grid) | 2018-01-01 - 2023-12-31 at 00, 12 UTC | 240h, six-hourly                    | 10m wind, 100m wind, 2m temperature, surface solar radiation, precipitation |

{% hint style="info" %}
**Ad-hoc Request Only**: The extended historical data (2018-2023) is only available through special ad-hoc requests due to its large data volume and storage requirements.
{% endhint %}


# ECMWF IFS Ensemble

The ECMWF IFS Ensemble (ENS) provides 50 perturbed-forecast runs with slightly varied starting conditions.

## Live Forecast Data

* Global coverage at 25 km resolution (720x1440 grid)
* Four daily runs (00, 06, 12, 18 UTC)
* 00/12 UTC runs: 360h forecast (15 days); 06/18 UTC runs: 144h forecast (6 days)
* 3-hourly time steps to 144h, then 6-hourly out to 360h
* Real-time data access via [Python SDK](/python-sdk/weather/forecast) or [REST API](/api-v2/getting-started)

## Technical Specifications

### Available Weather Parameters

ECMWF ENS uses standardized variable naming conventions. For full details on the naming structure, see [Weather Variable Naming](/python-sdk/weather/naming).

| Code    | API Name                                       | Description                            | Units        |
| ------- | ---------------------------------------------- | -------------------------------------- | ------------ |
| 2t      | air\_temperature\_at\_height\_level\_2m        | Air temperature at 2m                  | Kelvin       |
| 10si    | wind\_speed\_at\_height\_level\_10m            | Horizontal wind speed at 10m           | m s⁻¹        |
| 100si   | wind\_speed\_at\_height\_level\_100m           | Horizontal wind speed at 100m          | m s⁻¹        |
| 10wdir  | wind\_direction\_at\_height\_level\_10m        | Horizontal wind direction at 10m       | Degrees true |
| 100wdir | wind\_direction\_at\_height\_level\_100m       | Horizontal wind direction at 100m      | Degrees true |
| msl     | air\_pressure\_at\_mean\_sea\_level            | Mean Sea-level Pressure                | Pa           |
| tp      | precipitation\_amount\_sum\_1h                 | Total Precipitation                    | mm m⁻²       |
| ssrd    | surface\_downwelling\_shortwave\_flux\_sum\_1h | Surface solar downward irradiance      | J m⁻²        |
| z       | geopotential\_at\_pressure\_level\_50000Pa     | Geopotential at 500 hPa pressure level | m² s⁻²       |

## Hindcast Data

**Data Access:** Hindcasts are available via [API](/api-v2/getting-started) or [SDK](/python-sdk/getting-started). For bulk, grid-based access, please contact <support@jua.ai>.

| **Model** | **Spatial Extent**                       | **Temporal Extent** |
| --------- | ---------------------------------------- | ------------------- |
| ECMWF ENS | Global, 25 km resolution (720x1440 grid) | 2025-09-01 - today  |


# GFS NOAA

The Global Forecast System (GFS) is a global numerical weather prediction model operated by the National Oceanic and Atmospheric Administration (NOAA).

## Live Forecast Data

* Global coverage at 25km resolution (720x1440 grid)
* Four daily runs (00, 06, 12, 18 UTC)
* Extended prediction horizons up to 16 days
* Real-time data access via [Python SDK](/python-sdk/weather/forecast) or [REST API](/api-v2/getting-started)

## Technical Specifications

### Available Weather Parameters

GFS uses standardized variable naming conventions. For full details on the naming structure, see [Weather Variable Naming](/python-sdk/weather/naming).

| Code    | API Name                                                    | Description                       | Units        |
| ------- | ----------------------------------------------------------- | --------------------------------- | ------------ |
| 2t      | air\_temperature\_at\_height\_level\_2m                     | Air temperature at 2m             | Kelvin       |
| 2d      | dew\_point\_temperature\_at\_height\_level\_2m              | Dew point temperature at 2m       | Kelvin       |
| sp      | surface\_air\_pressure                                      | Surface Pressure                  | Pa           |
| msl     | air\_pressure\_at\_mean\_sea\_level                         | Mean Sea-level Pressure           | Pa           |
| z\_500  | geopotential\_at\_pressure\_level\_50000Pa                  | Geopotential                      | m² s⁻²       |
| skt     | surface\_temperature                                        | Surface Temperature               | Kelvin       |
| 10si    | wind\_speed\_at\_height\_level\_10m                         | Horizontal wind speed at 10m      | m s⁻¹        |
| 10wdir  | wind\_direction\_at\_height\_level\_10m                     | Horizontal wind direction at 10m  | Degrees true |
| 100si   | wind\_speed\_at\_height\_level\_100m                        | Horizontal wind speed at 100m     | m s⁻¹        |
| 100wdir | wind\_direction\_at\_height\_level\_100m                    | Horizontal wind direction at 100m | Degrees true |
| lcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_low\_type    | Low Cloud Cover                   | %            |
| mcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_medium\_type | Medium Cloud Cover                | %            |
| hcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_high\_type   | High Cloud Cover                  | %            |
| ssrd    | surface\_downwelling\_shortwave\_flux\_sum\_1h              | Surface solar downward irradiance | J m⁻²        |
| tp      | precipitation\_amount\_sum\_1h                              | Total Precipitation               | mm m⁻²       |

## Hindcast Data

**Data Access:** Hindcasts are available via [API](/api-v2/getting-started) or [SDK](/python-sdk/getting-started). For bulk, grid-based access, please contact <support@jua.ai>.

### Current Hindcast Availability

| **Model** | **Spatial Extent**                       | **Temporal Extent**                      | **Forecast Horizon and Resolution**                                                    |
| --------- | ---------------------------------------- | ---------------------------------------- | -------------------------------------------------------------------------------------- |
| GFS       | Global, 25 km resolution (720x1440 grid) | 2023-01-01 - today at 00, 06, 12, 18 UTC | <p>384h forecast<br>- From 1h to 120h: hourly<br>- From 120h to 384h: three-hourly</p> |


# Microsoft Aurora

Microsoft's AI-based global weather model that provides forecasts at 0.25° resolution.

## Live Forecast Data

* Global coverage at 0.25° resolution (721x1440 grid)
* Four daily runs (00, 06, 12, 18 UTC)
* 20-day prediction horizon (480h, six-hourly)
* Real-time data access via [Python SDK](/python-sdk/weather/forecast) or [REST API](/api-v2/getting-started)

## Technical Specifications

### Available Weather Parameters

Aurora uses standardized variable naming conventions. For full details on the naming structure, see [Weather Variable Naming](/python-sdk/weather/naming).

| Parameter Code | API Name                                   | Description                      | Units        |
| -------------- | ------------------------------------------ | -------------------------------- | ------------ |
| 2t             | air\_temperature\_at\_height\_level\_2m    | Air temperature at 2m            | Kelvin       |
| 10si           | wind\_speed\_at\_height\_level\_10m        | Horizontal wind speed at 10m     | m s⁻¹        |
| 10wdir         | wind\_direction\_at\_height\_level\_10m    | Horizontal wind direction at 10m | Degrees true |
| msl            | air\_pressure\_at\_mean\_sea\_level        | Mean Sea-level Pressure          | Pa           |
| z\_500         | geopotential\_at\_pressure\_level\_50000Pa | Geopotential                     | m² s⁻²       |

Note: The previous naming convention used in EPT-1.5 is deprecated. All new integrations should use the standardized naming shown above.

## Hindcast Data

**Spatial Extent:** Global, on a grid of 721x1440 (25 km resolution).

**Data Access:** Hindcasts are available via [API](/api-v2/getting-started) or [SDK](/python-sdk/getting-started). For bulk, grid-based access, please contact <support@jua.ai>.

| **Model**       | **Temporal Extent**                                   | **Forecast Horizon and Resolution** |
| --------------- | ----------------------------------------------------- | ----------------------------------- |
| Aurora 0.25 deg | <p>2025-06-03 - today</p><p>at 00, 06, 12, 18 UTC</p> | 480h, six-hourly                    |

### Extended Hindcast Data (Special Request Only)

{% hint style="warning" %}
**Special Request Required**: The following extended hindcast data is available but requires special access permissions and is not accessible through standard API/SDK access. Please contact <support@jua.ai> to request access.
{% endhint %}

| **Model**       | **Extended Temporal Coverage**                                                 | **Forecast Horizon and Resolution** |
| --------------- | ------------------------------------------------------------------------------ | ----------------------------------- |
| Aurora 0.25 deg | <p>2023-01-02 - 2024-12-27, 2025-06-03 - today</p><p>at 00, 06, 12, 18 UTC</p> | 480h, six-hourly                    |


# DWD ICON Global

The ICON (Icosahedral Nonhydrostatic) model is a numerical weather prediction model developed by the German Weather Service (Deutscher Wetterdienst, DWD).

## Live Forecast Data

* Global coverage at 13 km resolution (1440x2880 grid)
* Four daily runs (00, 06, 12, 18 UTC)
* 00/12 UTC runs: 180h forecast (7.5 days); 06/18 UTC runs: 120h forecast (5 days)
* Hourly up to 78h, then 3-hourly
* Real-time data access via [Python SDK](/python-sdk/weather/forecast) or [REST API](/api-v2/getting-started)

## Technical Specifications

### Available Weather Parameters

ICON uses standardized variable naming conventions. For full details on the naming structure, see [Weather Variable Naming](/python-sdk/weather/naming).

| Code    | API Name                                                    | Description                           | Units        |
| ------- | ----------------------------------------------------------- | ------------------------------------- | ------------ |
| 2t      | air\_temperature\_at\_height\_level\_2m                     | Air temperature at 2m                 | Kelvin       |
| 2d      | dew\_point\_temperature\_at\_height\_level\_2m              | Dew point temperature at 2m           | Kelvin       |
| sp      | surface\_air\_pressure                                      | Surface Pressure                      | Pa           |
| msl     | air\_pressure\_at\_mean\_sea\_level                         | Mean Sea-level Pressure               | Pa           |
| z\_500  | geopotential\_at\_pressure\_level\_50000Pa                  | Geopotential                          | m² s⁻²       |
| 10si    | wind\_speed\_at\_height\_level\_10m                         | Horizontal wind speed at 10m          | m s⁻¹        |
| 10wdir  | wind\_direction\_at\_height\_level\_10m                     | Horizontal wind direction at 10m      | Degrees true |
| 20si    | wind\_speed\_at\_height\_level\_20m                         | Horizontal wind speed at 20m          | m s⁻¹        |
| 40si    | wind\_speed\_at\_height\_level\_40m                         | Horizontal wind speed at 40m          | m s⁻¹        |
| 60si    | wind\_speed\_at\_height\_level\_60m                         | Horizontal wind speed at 60m          | m s⁻¹        |
| 80si    | wind\_speed\_at\_height\_level\_80m                         | Horizontal wind speed at 80m          | m s⁻¹        |
| 100si   | wind\_speed\_at\_height\_level\_100m                        | Horizontal wind speed at 100m         | m s⁻¹        |
| 100wdir | wind\_direction\_at\_height\_level\_100m                    | Horizontal wind direction at 100m     | Degrees true |
| 120si   | wind\_speed\_at\_height\_level\_120m                        | Horizontal wind speed at 120m         | m s⁻¹        |
| 140si   | wind\_speed\_at\_height\_level\_140m                        | Horizontal wind speed at 140m         | m s⁻¹        |
| 160si   | wind\_speed\_at\_height\_level\_160m                        | Horizontal wind speed at 160m         | m s⁻¹        |
| 180si   | wind\_speed\_at\_height\_level\_180m                        | Horizontal wind speed at 180m         | m s⁻¹        |
| 200si   | wind\_speed\_at\_height\_level\_200m                        | Horizontal wind speed at 200m         | m s⁻¹        |
| tcc     | cloud\_area\_fraction\_at\_entire\_atmosphere               | Total Cloud Cover                     | %            |
| lcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_low\_type    | Low Cloud Cover                       | %            |
| mcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_medium\_type | Medium Cloud Cover                    | %            |
| hcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_high\_type   | High Cloud Cover                      | %            |
| ssrd    | surface\_downwelling\_shortwave\_flux\_sum\_1h              | Surface solar downward irradiance     | J m⁻²        |
| fdir    | surface\_direct\_downwelling\_shortwave\_flux\_sum\_1h      | Direct solar radiation at the surface | J m⁻²        |
| tp      | precipitation\_amount\_sum\_1h                              | Total Precipitation                   | mm m⁻²       |

## Hindcast Data

**Data Access:** Hindcasts are available via [API](/api-v2/getting-started) or [SDK](/python-sdk/getting-started). For bulk, grid-based access, please contact <support@jua.ai>.

| **Model**   | **Spatial Extent**                        | **Temporal Extent**      |
| ----------- | ----------------------------------------- | ------------------------ |
| ICON Global | Global, 13 km resolution (1440x2880 grid) | 2025-08-16 00:00 - today |


# DWD ICON-EU

The ICON (Icosahedral Nonhydrostatic) model is a numerical weather prediction model developed by the German Weather Service (Deutscher Wetterdienst, DWD). ICON-EU is the higher-resolution European regional variant.

## Live Forecast Data

* European regional coverage at 6.5 km resolution (657x1377 grid)
* Eight daily runs (00, 03, 06, 09, 12, 15, 18, 21 UTC)
* 00/06/12/18 UTC runs: 120h forecast (5 days); 03/09/15/21 UTC runs: 48h forecast (2 days)
* Hourly up to 78h, then 3-hourly
* Real-time data access via [Python SDK](/python-sdk/weather/forecast) or [REST API](/api-v2/getting-started)

## Technical Specifications

### Available Weather Parameters

ICON uses standardized variable naming conventions. For full details on the naming structure, see [Weather Variable Naming](/python-sdk/weather/naming).

| Code    | API Name                                                    | Description                           | Units        |
| ------- | ----------------------------------------------------------- | ------------------------------------- | ------------ |
| 2t      | air\_temperature\_at\_height\_level\_2m                     | Air temperature at 2m                 | Kelvin       |
| 2d      | dew\_point\_temperature\_at\_height\_level\_2m              | Dew point temperature at 2m           | Kelvin       |
| sp      | surface\_air\_pressure                                      | Surface Pressure                      | Pa           |
| msl     | air\_pressure\_at\_mean\_sea\_level                         | Mean Sea-level Pressure               | Pa           |
| z\_500  | geopotential\_at\_pressure\_level\_50000Pa                  | Geopotential                          | m² s⁻²       |
| 10si    | wind\_speed\_at\_height\_level\_10m                         | Horizontal wind speed at 10m          | m s⁻¹        |
| 10wdir  | wind\_direction\_at\_height\_level\_10m                     | Horizontal wind direction at 10m      | Degrees true |
| 20si    | wind\_speed\_at\_height\_level\_20m                         | Horizontal wind speed at 20m          | m s⁻¹        |
| 40si    | wind\_speed\_at\_height\_level\_40m                         | Horizontal wind speed at 40m          | m s⁻¹        |
| 60si    | wind\_speed\_at\_height\_level\_60m                         | Horizontal wind speed at 60m          | m s⁻¹        |
| 80si    | wind\_speed\_at\_height\_level\_80m                         | Horizontal wind speed at 80m          | m s⁻¹        |
| 100si   | wind\_speed\_at\_height\_level\_100m                        | Horizontal wind speed at 100m         | m s⁻¹        |
| 100wdir | wind\_direction\_at\_height\_level\_100m                    | Horizontal wind direction at 100m     | Degrees true |
| 120si   | wind\_speed\_at\_height\_level\_120m                        | Horizontal wind speed at 120m         | m s⁻¹        |
| 140si   | wind\_speed\_at\_height\_level\_140m                        | Horizontal wind speed at 140m         | m s⁻¹        |
| 160si   | wind\_speed\_at\_height\_level\_160m                        | Horizontal wind speed at 160m         | m s⁻¹        |
| 180si   | wind\_speed\_at\_height\_level\_180m                        | Horizontal wind speed at 180m         | m s⁻¹        |
| 200si   | wind\_speed\_at\_height\_level\_200m                        | Horizontal wind speed at 200m         | m s⁻¹        |
| tcc     | cloud\_area\_fraction\_at\_entire\_atmosphere               | Total Cloud Cover                     | %            |
| lcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_low\_type    | Low Cloud Cover                       | %            |
| mcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_medium\_type | Medium Cloud Cover                    | %            |
| hcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_high\_type   | High Cloud Cover                      | %            |
| ssrd    | surface\_downwelling\_shortwave\_flux\_sum\_1h              | Surface solar downward irradiance     | J m⁻²        |
| fdir    | surface\_direct\_downwelling\_shortwave\_flux\_sum\_1h      | Direct solar radiation at the surface | J m⁻²        |
| tp      | precipitation\_amount\_sum\_1h                              | Total Precipitation                   | mm m⁻²       |

## Hindcast Data

**Data Access:** Hindcasts are available via [API](/api-v2/getting-started) or [SDK](/python-sdk/getting-started). For bulk, grid-based access, please contact <support@jua.ai>.

| **Model** | **Spatial Extent**                          | **Temporal Extent**      |
| --------- | ------------------------------------------- | ------------------------ |
| ICON-EU   | European, 6.5 km resolution (657x1377 grid) | 2026-02-06 12:00 - today |


# Open Meteo Models

The Jua platform provides access to a selection of weather models served through [Open Meteo](https://open-meteo.com/en/docs/), a third-party weather data aggregator. These models cover global and regional forecasts from multiple providers including ECMWF, NOAA/NCEP, DWD, KNMI, Météo-France, and UKMO.

## Available Models

### ECMWF

| Model Name           | API Model String         | Type          | Forecast Horizon | Notes              |
| -------------------- | ------------------------ | ------------- | ---------------- | ------------------ |
| EC AIFS              | `ecmwf_aifs025`          | Deterministic | 15 days          | Open-Meteo variant |
| ECMWF AIFS Ensemble  | `ecmwf_aifs025_ensemble` | Ensemble      | 15 days          | Open-Meteo variant |
| EC IFS               | `ecmwf_ifs025`           | Deterministic | 15 days          | Open-Meteo variant |
| EC IFS Ensemble Mean | `ecmwf_ifs025_ensemble`  | Ensemble      | 15 days          | Open-Meteo variant |

### GFS

| Model Name        | API Model String      | Type          | Forecast Horizon |
| ----------------- | --------------------- | ------------- | ---------------- |
| GFS               | `gfs_global_single`   | Deterministic | 16 days          |
| GFS Ensemble Mean | `gfs_global_ensemble` | Ensemble      | 10 days          |
| GFS GraphCast     | `gfs_graphcast025`    | Deterministic | 16 days          |

### Regional

| Model Name                      | API Model String                  | Type          | Forecast Horizon |
| ------------------------------- | --------------------------------- | ------------- | ---------------- |
| DWD ICON-D2                     | `icon_d2`                         | Deterministic | 2 days           |
| KNMI HARMONIE-AROME Europe      | `knmi_harmonie_arome_europe`      | Deterministic | 2.5 days         |
| KNMI HARMONIE-AROME Netherlands | `knmi_harmonie_arome_netherlands` | Deterministic | 2.5 days         |
| AROME France HD                 | `meteofrance_arome_france_hd`     | Deterministic | 4 days           |

### UKMO

| Model Name         | API Model String                 | Type          | Forecast Horizon |
| ------------------ | -------------------------------- | ------------- | ---------------- |
| UKMO Global (10km) | `ukmo_global_deterministic_10km` | Deterministic | 7 days           |
| UKMO UKV (2km)     | `ukmo_uk_deterministic_2km`      | Deterministic | 2 days           |

## Limitations

Open Meteo models have the following restrictions compared to natively ingested models:

* **Latest forecast only** — only the most recent forecast run is available. Historical forecasts are not supported.
* **Point queries only** — regional and grid-based queries are not supported.
* **No streaming** — streaming responses are not available for Open Meteo models.


# ERA5

ERA5 is the fifth generation of ECMWF atmospheric reanalysis of the global climate, produced by the Copernicus Climate Change Service (C3S). It provides hourly estimates of atmospheric, land, and oceanic climate variables from 1990 to present.

## Data Access

* Global coverage at 0.25° resolution (720x1440 grid)
* Hourly temporal resolution
* Real-time data access via [REST API](/api-v2/getting-started)

{% hint style="info" %}
ERA5 data is available with approximately 5-7 days delay from the present.
{% endhint %}

## Technical Specifications

### Available Weather Parameters

ERA5 uses standardized variable naming conventions. For full details on the naming structure, see [Weather Variable Naming](/python-sdk/weather/naming).

| Code    | API Name                                                    | Description                           | Units        |
| ------- | ----------------------------------------------------------- | ------------------------------------- | ------------ |
| 2t      | air\_temperature\_at\_height\_level\_2m                     | Air temperature at 2m                 | Kelvin       |
| 2d      | dew\_point\_temperature\_at\_height\_level\_2m              | Dew point temperature at 2m           | Kelvin       |
| sp      | surface\_air\_pressure                                      | Surface Pressure                      | Pa           |
| msl     | air\_pressure\_at\_mean\_sea\_level                         | Mean Sea-level Pressure               | Pa           |
| skt     | surface\_temperature                                        | Surface Temperature                   | Kelvin       |
| 10si    | wind\_speed\_at\_height\_level\_10m                         | Horizontal wind speed at 10m          | m s⁻¹        |
| 10wdir  | wind\_direction\_at\_height\_level\_10m                     | Horizontal wind direction at 10m      | Degrees true |
| 100si   | wind\_speed\_at\_height\_level\_100m                        | Horizontal wind speed at 100m         | m s⁻¹        |
| 100wdir | wind\_direction\_at\_height\_level\_100m                    | Horizontal wind direction at 100m     | Degrees true |
| 10fg    | wind\_speed\_of\_gust\_at\_height\_level\_10m\_max          | Maximum wind gust at 10m              | m s⁻¹        |
| tcc     | cloud\_area\_fraction\_at\_entire\_atmosphere               | Total Cloud Cover                     | %            |
| lcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_low\_type    | Low Cloud Cover                       | %            |
| mcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_medium\_type | Medium Cloud Cover                    | %            |
| hcc     | cloud\_area\_fraction\_at\_entire\_atmosphere\_high\_type   | High Cloud Cover                      | %            |
| ssrd    | surface\_downwelling\_shortwave\_flux\_sum\_1h              | Surface solar downward irradiance     | J m⁻²        |
| fdir    | surface\_direct\_downwelling\_shortwave\_flux\_sum\_1h      | Direct solar radiation at the surface | J m⁻²        |
| ssr     | surface\_net\_downward\_shortwave\_flux\_sum\_1h            | Net surface solar radiation           | J m⁻²        |
| tp      | precipitation\_amount\_sum\_1h                              | Total Precipitation                   | mm m⁻²       |
| ptype   | predominant\_precipitation\_type\_at\_surface               | Precipitation Type                    | categorical  |
| cape    | atmosphere\_convective\_available\_potential\_energy        | CAPE                                  | J kg⁻¹       |
| sst     | sea\_surface\_temperature                                   | Sea Surface Temperature               | Kelvin       |

## Data Availability

| **Dataset** | **Spatial Extent**                       | **Temporal Extent** |
| ----------- | ---------------------------------------- | ------------------- |
| ERA5        | Global, 0.25° resolution (720x1440 grid) | 1990-01-01 - today  |


# Power Forecast

{% hint style="warning" %}
**Preview** - Power Forecast is currently in preview. Features and availability may change.
{% endhint %}

Jua's Power Forecast is an end-to-end model trained directly on actual generation data, delivering renewable energy generation forecasts in MW for power trading and grid management.

{% hint style="info" %}
**Power Forecast vs Market Aggregates MW** — The Power Forecast is a purpose-built model trained on real generation data, providing a forecast of **actual production**. [Market Aggregates with MW output](/api-v2/query-engine/market-aggregates) applies generic power curves to weather forecasts, providing a model-specific forecast of **potential production**. Power Forecast is significantly more accurate for the zones it covers. Both use the same facility datasets.
{% endhint %}

## Availability

| Country            | Solar | Wind Onshore | Wind Offshore | Wind Transmission | Wind Embedded | Load           |
| ------------------ | ----- | ------------ | ------------- | ----------------- | ------------- | -------------- |
| 🇩🇪 Germany       | ✅     | ✅            | ✅             |                   |               | ✅              |
| 🇫🇷 France        | ✅     | ✅            | ✅             |                   |               | 🔜 Coming soon |
| 🇬🇧 Great Britain | ✅     |              |               | ✅                 | ✅             | 🔜 Coming soon |
| 🇧🇪 Belgium       | ✅     | ✅            | ✅             |                   |               | 🔜 Coming soon |
| 🇳🇱 Netherlands   | ✅     | ✅            | ✅             |                   |               | 🔜 Coming soon |

Additional European countries are being added progressively. Contact <support@jua.ai> for details.

{% hint style="info" %}
**Need a load (demand) forecast today?** The end-to-end Power Forecast does not yet cover Load for all zones, but a population-weighted load forecast in MW is already available for \~48 European zones via the Query Engine [Market Aggregates MW endpoint](/api-v2/query-engine/market-aggregates) using `weighting=population` with `unit=mw`. It applies a temperature-driven load curve to 2m air temperature and returns a `load_mw` column.
{% endhint %}

## Specifications

| Property                   | Value                           |
| -------------------------- | ------------------------------- |
| Temporal Resolution        | 15-minute intervals             |
| Forecast Horizon           | Variable, until end of next day |
| Forecast becomes available | \~1.5 hours from init time      |
| Units                      | MW (Megawatts)                  |

| Country            | Update Frequency |
| ------------------ | ---------------- |
| 🇩🇪 Germany       | 15 min           |
| 🇫🇷 France        | 15 min           |
| 🇳🇱 Netherlands   | 15 min           |
| 🇬🇧 Great Britain | 30 min           |
| 🇧🇪 Belgium       | 1 hour           |

### Forecast becomes available

The table below shows the first three hours of the day; the same cadence continues for the rest of the day. The Zones column lists which countries publish a run at that init time (DE/FR/NL every 15 min, GB every 30 min, BE every hour).

| Init time (UTC) | Forecast becomes available (UTC) | Zones              |
| --------------- | -------------------------------- | ------------------ |
| 00:00           | 01:30                            | DE, FR, NL, GB, BE |
| 00:15           | 01:45                            | DE, FR, NL         |
| 00:30           | 02:00                            | DE, FR, NL, GB     |
| 00:45           | 02:15                            | DE, FR, NL         |
| 01:00           | 02:30                            | DE, FR, NL, GB, BE |
| 01:15           | 02:45                            | DE, FR, NL         |
| 01:30           | 03:00                            | DE, FR, NL, GB     |
| 01:45           | 03:15                            | DE, FR, NL         |
| 02:00           | 03:30                            | DE, FR, NL, GB, BE |
| 02:15           | 03:45                            | DE, FR, NL         |
| 02:30           | 04:00                            | DE, FR, NL, GB     |
| 02:45           | 04:15                            | DE, FR, NL         |
| ...             | ...                              | ...                |

## Access

Power Forecast has dedicated endpoints under `/v1/power-forecast/*` on the [Query Engine](/api-v2/query-engine). They are separate from the generic `/v1/forecast/*` endpoints and use the dimensions `zone_key` (country/region code) and `psr_type` (generation source type).

| Endpoint                                 | Method | Purpose                                                                 |
| ---------------------------------------- | ------ | ----------------------------------------------------------------------- |
| `/v1/power-forecast/data`                | POST   | Query power forecast values (MW) by `zone_keys`, `psr_types`, init time |
| `/v1/power-forecast/zones`               | GET    | List supported zones                                                    |
| `/v1/power-forecast/psr-types`           | GET    | List supported PSR (generation-source) types                            |
| `/v1/power-forecast/init-times`          | GET    | List available init times for a zone                                    |
| `/v1/power-forecast/versions`            | GET    | List available model versions and their stable/latest status            |
| `/v1/power-forecast/fallback-init-times` | GET    | List init times that fall back to a different model                     |
| `/v1/power-forecast/fallback-status`     | GET    | Inspect fallback status for an init time                                |

**Example — latest 4-hour Solar forecast for Germany:**

```bash
curl -X POST "https://query.jua.ai/v1/power-forecast/data" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "zone_keys": ["DE"],
    "psr_types": ["Solar"],
    "init_time": "latest",
    "max_prediction_timedelta": 240
  }'
```

**Response columns:** `zone_key`, `psr_type`, `init_time`, `time`, `value` (MW).

`max_prediction_timedelta` is in minutes for power-forecast endpoints. Use `start_time` / `end_time` to query in time-range mode instead of init-time mode.

### Model versioning

Power Forecast supports aliases and concrete model-version pins:

* Omit `version` (or use `"stable"`) to follow Jua's stable model. This pointer moves when Jua promotes a new checkpoint.
* Use `"latest"` to follow the latest preview model.
* Use a concrete run ID to freeze the selected model across future promotions.

#### Current versions

| Description                                                                    | Version hash | Stable | Latest |
| ------------------------------------------------------------------------------ | ------------ | :----: | :----: |
| Initial production checkpoint for the Belgium offshore wind forecast           | `p8unxyd8`   |    ✅   |    ✅   |
| Initial production checkpoint for the Belgium onshore wind forecast            | `0ze11rfm`   |    ✅   |    ✅   |
| Adds EPT 2.1 Helios to the Belgium solar forecast                              | `0dc4kiqs`   |    —   |    ✅   |
| Initial production checkpoint for the Belgium solar forecast                   | `k9jet0rs`   |    ✅   |    —   |
| Initial production checkpoint for the France offshore wind forecast            | `a0mxgzdn`   |    ✅   |    ✅   |
| Initial production checkpoint for the France onshore wind forecast             | `rtoz3nvb`   |    ✅   |    ✅   |
| Adds EPT 2.1 Helios to the France solar forecast                               | `den0y9ln`   |    —   |    ✅   |
| Initial production checkpoint for the France solar forecast                    | `z37di12p`   |    ✅   |    —   |
| Initial production checkpoint for the Germany load forecast                    | `590ieffq`   |    ✅   |    ✅   |
| Initial production checkpoint for the Germany offshore wind forecast           | `blcqp8ll`   |    ✅   |    ✅   |
| Initial production checkpoint for the Germany onshore wind forecast            | `8n8rqlpn`   |    ✅   |    ✅   |
| Initial production checkpoint for the Germany solar forecast                   | `586rhosh`   |    ✅   |    —   |
| Adds EPT 2.1 Helios to the Germany solar forecast                              | `rv7orbtm`   |    —   |    ✅   |
| Initial production checkpoint for the Great Britain embedded wind forecast     | `uawes0b4`   |    ✅   |    ✅   |
| Initial production checkpoint for the Great Britain solar forecast             | `t2vixgrl`   |    ✅   |    —   |
| Adds EPT 2.1 Helios to the Great Britain solar forecast                        | `wc0y235q`   |    —   |    ✅   |
| Initial production checkpoint for the Great Britain transmission wind forecast | `l5xpioly`   |    ✅   |    ✅   |
| Initial production checkpoint for the Great Britain wind forecast              | `pwaazna8`   |    ✅   |    ✅   |
| Initial production checkpoint for the Netherlands offshore wind forecast       | `va5ucy4o`   |    ✅   |    ✅   |
| Initial production checkpoint for the Netherlands onshore wind forecast        | `zh2nppj8`   |    ✅   |    ✅   |
| Adds EPT 2.1 Helios to the Netherlands solar forecast                          | `n21abyr0`   |    —   |    ✅   |
| Initial production checkpoint for the Netherlands solar forecast               | `w1ivau1x`   |    ✅   |    —   |

Call `GET /v1/power-forecast/versions`, optionally filtered by `zone_key` and `psr_type`, to discover run IDs. The response marks the current aliases with `is_stable` and `is_latest`. To freeze today's stable model, copy the `model_version` from the row where `is_stable` is `true` and pass it to the data request:

```bash
# Discover the current stable run ID for German Solar
curl "https://query.jua.ai/v1/power-forecast/versions?zone_key=DE&psr_type=Solar" \
  -H "X-API-Key: YOUR_API_KEY"

# Replace RUN_ID with that row's model_version
curl -X POST "https://query.jua.ai/v1/power-forecast/data" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "zone_keys": ["DE"],
    "psr_types": ["Solar"],
    "version": "RUN_ID",
    "init_time": "latest"
  }'
```

For multi-zone or multi-technology requests, `version_pins` can override individual `(zone_key, psr_type)` combinations while all unlisted combinations use the top-level `version`:

```json
{
  "zone_keys": ["DE", "FR"],
  "psr_types": ["Solar", "Wind Onshore"],
  "version": "stable",
  "version_pins": [
    {
      "zone_key": "DE",
      "psr_type": "Solar",
      "version": "RUN_ID"
    }
  ],
  "init_time": "latest"
}
```

The `version` parameter on `/v1/power-forecast/init-times` uses the same `stable`, `latest`, or concrete-run-ID semantics, allowing you to discover runs for the exact model version you intend to query.

### Python SDK

The same data is available through the Jua Python SDK via `client.power_forecast`, which returns an `xarray.Dataset` in MW:

```python
from jua import JuaClient

client = JuaClient()

# Latest German Solar forecast, up to 4 hours ahead (240 minutes)
ds = client.power_forecast.get_data(
    zone_keys=["DE"],
    psr_types=["Solar"],
    init_time="latest",
    max_prediction_timedelta=240,
)
```

See the [Power Forecast SDK page](/python-sdk/power-forecast) for zones/PSR-type discovery, init-time selection, time-range queries, and the day-ahead stitching helper.

## Hindcast Data

| **Zone** | **Temporal Extent**         | **Forecast Types**                            |
| -------- | --------------------------- | --------------------------------------------- |
| DE       | 2025-06-01 00:00:00 - today | Solar, Wind Onshore, Wind Offshore, Load      |
| FR       | 2025-06-21 00:00:00 - today | Solar, Wind Onshore, Wind Offshore            |
| GB       | 2025-04-16 00:00:00 - today | Solar, Wind, Wind Transmission, Wind Embedded |
| BE       | 2025-06-21 00:00:00 - today | Solar, Wind Onshore, Wind Offshore            |
| NL       | 2025-06-21 00:00:00 - today | Solar, Wind Onshore, Wind Offshore            |


# Historical Data

This section covers access to historical weather data (hindcasts) for comprehensive backtesting and model evaluation.

The [summary model & data table](/models-and-products/models-and-products#summary-available-weather-models-and-data) contains information about data availability for the models we support.

## Hindcast Coverage

We provide as much hindcast data for backtesting as we can. Custom time periods are available upon request. Please contact us for more information on extended historical data access.

For detailed hindcast specifications model specifications, temporal coverage, and data availability, please refer to the individual model documentation:

* [EPT-1.5 Model](/models-and-products/jua-models/ept-1.5)
* [EPT-2 Family](/models-and-products/jua-models/ept-2)
* [ECMWF AIFS](/models-and-products/third-party-models/ecmwf-aifs)
* [ECMWF AIFS Ensemble](/models-and-products/third-party-models/ecmwf-aifs-ens)
* [ECMWF IFS](/models-and-products/third-party-models/ec-ifs)
* [ECMWF IFS Ensemble](/models-and-products/third-party-models/ecmwf-ens)
* [GFS NOAA](/models-and-products/third-party-models/gfs-noaa)
* [Microsoft Aurora](/models-and-products/third-party-models/microsoft-aurora)
* [DWD ICON Global](/models-and-products/third-party-models/dwd-icon-global)
* [DWD ICON-EU](/models-and-products/third-party-models/dwd-icon-eu)

## Accessing Historical Data

You can read and visualize our hindcast data through the [Jua Python SDK](/python-sdk/getting-started), or directly through Athena.


# Release Notes

This document outlines the features and improvements included in each release of the Jua platform.

## Latest Release 2.9.2025

### Jua EPT-2.0 Rapid Refresh (Research Preview)

* **Hourly Updated Global Model** - Released **Jua EPT-2.0 Rapid Refresh**, a research preview global weather model updated **24 times a day (every hour)** with **direct satellite observations**.
* **Industry First** - Unlike existing numerical and AI weather models (which update only 4 times a day using numerically assimilated conditions), Rapid Refresh provides real time updates and high accuracy.

### 60-Day Ensemble Forecast EPT2e

* **New Long-Range Forecasting** - Introduced a **60-day probabilistic ensemble forecast** that outperforms the ECMWF Ensemble Mean (EC Ens).
* **Daily Updates** - Forecasts are updated **every day** by default, with the option for **more frequent updates upon request**.
* **Paradigm Shift** - Fully probabilistic and designed for long-horizon decision-making, setting a new standard in ensemble-based forecasting.

### Jua Maps: Next-Generation Visualization

* **Browser-Based Visualization Platform** - Launched **Jua Maps** in the Jua platform, providing a high-performance tool for exploring and animating weather data.
* **Interactive Weather Layers** - Supports visualization of **wind, precipitation, temperature, geopotential, isobars, pressure, and cloud coverage**.
* **Model Coverage** - Available for **Jua EPT-2, EPT-1.5, EPT-1.5 Early, ECMWF AIFS, and Microsoft Aurora**.
* **Fast & Performant** - Built for responsive, smooth animation and exploration directly in the browser.

### Jua Market Aggregates 2.0

* **Expanded Energy Forecasting Tools** - Released an updated version of **Jua Market Aggregates** with capacity-weighted **wind and solar forecasts**.
* **Cross-Model Comparisons** - Covers all Jua models and major third-party models including **EC, EC Ens, GFS, ICON, AIFS**, and more.
* **Advanced Analytics** - New tools include **graphs, deltas, disagreements, and heatmaps**, enabling deeper analysis of market impacts from weather variability.

## Release 29.6.2025

### Platform Accessibility & Enhanced User Experience

This release focuses on making the Jua platform more accessible to new users while expanding model availability and improving forecast visualization capabilities.

### Self Sign-Up & Simplified Access

* **Self Sign-Up Enabled** - Users can now create accounts independently without requiring manual approval, streamlining the onboarding process for new customers and trial users
* **Usage-Based Pricing with Tokens** - Introduced a usage-based pricing option based on tokens (like LLM tokens), providing a more flexible and transparent cost structure for API consumption
* **Token Usage Calculator** - Added a built-in calculator that helps users estimate API consumption costs and track usage patterns before committing to API calls

### Improved User Onboarding

* **Guided Onboarding Flows** - New users are now guided through interactive tutorials that demonstrate key platform features, model selection, and basic forecasting workflows
* **Progressive Feature Discovery** - The onboarding process introduces advanced features gradually, helping users understand the platform's capabilities without overwhelming them initially

### EPT-2e Ensemble Model Deployment

* **EPT-2e Ensemble Forecasts** - Deployed our probabilistic ensemble version of EPT-2, providing uncertainty quantification and confidence intervals for all forecasts
* **Ensemble Statistics** - Full statistical analysis available across the dashboard, Python SDK, and API endpoints, including percentiles, standard deviation, and confidence bands
* **Updated Documentation** - Comprehensive documentation updates explaining ensemble interpretation and best practices for probabilistic forecasting in energy trading applications

### Enhanced Forecast Visualization & Control

* **Historical Initial Conditions** - Users can now select any forecast initialization time from the past 36 hours, enabling comparison of how forecasts evolved and analysis of forecast consistency over multiple model runs
* **Live vs. Cached Forecasts** - Toggle between the latest available forecast and any cached forecast from recent initialization times, perfect for tracking forecast changes and model performance
* **Dynamic Confidence Bands** - Interactive confidence interval visualization that adjusts based on selected ensemble percentiles, providing visual uncertainty quantification for any forecast period

### Expanded Model Portfolio

* **EPT-2 Early Model** - Deployed the early-release version of EPT-2 that provides forecasts 2.5 hours ahead of the standard EPT-2 timeline, crucial for time-sensitive trading decisions
* **Microsoft Aurora Integration** - Added Microsoft's state-of-the-art Aurora AI weather model to the platform, providing additional model diversity for ensemble-based decision making
* **ECMWF AIFS Platform Access** - ECMWF's Artificial Intelligence Forecasting System is now fully integrated into the platform interface, complementing existing API access

### User Experience Improvements

* **Global Timezone Settings** - Users can now set their preferred timezone in account settings, with all timestamps and forecast displays automatically adjusted to their local time zone, eliminating confusion around UTC conversions

## Release 25.4.2025

### New Flagship EPT-2 Model & Power Trading Analytics

This release introduces our new state-of-the-art EPT-2 model and the first version of Jua power trading analytics.

### EPT-2: Our New Flagship Model

* **EPT-2** - State-of-the-art weather model outperforming leading public AI weather models including Microsoft Aurora, DeepMind's GraphCast, ECMWF's AIFS, and our previous EPT-1.5 model
* **Hindcasts for EPT-2** - Historical forecast data available for performance analysis and evaluation
* **Hindcasts for ECMWF AIFS** - Historical forecast data now available for ECMWF's AI model

### Power Trading Analytics (Beta)

The first version of Jua power trading analytics is now available for selected beta users, including:

* **Power Forecasts** - Energy production forecasting based on weather data
* **Capacity Analysis** - Renewable energy capacity insights and predictions

## Release 12.3.2025

### New weather models & API enhancements

The latest release significantly expands the available weather models and enhances the API functionality.

### Available Weather Models

The following models are now available through both the platform interface and API:

* **ECMWF Operational** - ECMWF IFS HRES model, often referred as ops
* **ECMWF Ensemble Mean** - Average of multiple ECMWF IFS Ensemble runs
* **ECMWF AIFS** - EC's new AI model
* **GFS** - Global Forecast System from NOAA
* **GFS Ensemble Mean** - Average of multiple GFS ensemble runs
* **AROME France HD** - Model from France Meteo
* **ICON-EU** - Model from DWD - Deutscher Wetterdienst

### Enhanced API Endpoints

The second release introduces the `init_time` parameter, allowing users to query forecasts from specific model initialization times. This enables:

**GET /v1/forecasting/model\_name/forecasts/init\_time**\
Retrieves forecast metadata for a specific model initialization time.

```http
GET /v1/forecasting/ecmwf-operational/forecasts/20240310T000000Z
```

* Historical forecast comparison
* Forecast accuracy analysis over time
* Access to specific model runs for research or operational purposes

Format: `YYYYMMDDTHHMMSSZ` (ISO 8601 format with Z indicating UTC time)

### Using the New Models

To access the newly added weather models, simply specify the model name in your API requests:

{% tabs %}
{% tab title="REST API Examples" %}

```http
# ECMWF Operational
GET /v1/forecasting/ecmwf-operational/forecasts/latest/47.37,8.54
# ECMWF Ensemble Mean
GET /v1/forecasting/ecmwf-ensemble-mean/forecasts/latest/47.37,8.54
# GFS
GET /v1/forecasting/gfs/forecasts/latest/47.37,8.54
# ECMWF AIFS
GET /v1/forecasting/ecmwf-aifs/forecasts/latest/47.37,8.54
# GFS Ensemble Mean
GET /v1/forecasting/gfs-ensemble-mean/forecasts/latest/47.37,8.54
# AROME France HD (regional model)
GET /v1/forecasting/arome-france-hd/forecasts/latest/48.85,2.35
# ICON-EU (European regional model)
GET /v1/forecasting/icon-eu/forecasts/latest/52.52,13.40
```

{% endtab %}
{% endtabs %}

## Initial Release of Jua Platform

### First deployment of new home of Jua data, analytics & tools

#### The initial release of the Jua platform included:

* Launch of the main application at **app.jua.ai**
* Introduction of core platform features:
  * Weather forecast visualization interface
  * Comparison of forecasts from multiple models
  * Location-based weather data retrieval
  * Customizable forecast parameters

### Key Features

* **/benchmarking** - Performance comparison against ERA5 reanalysis data
* **/documentation** - Comprehensive API and usage documentation
* **/legal** - Terms of service and legal information
* **/forecast** - Interactive REST API testing tool

### Forecast Interface

The forecast interface allows users to:

* Select locations through search or from preset city options
* Configure forecast horizons (up to 480h)
* Choose from multiple weather models
* View customizable parameters (temperature, precipitation, etc.)
* Compare model performance live through interactive charts


# Data Available in Athena

Athena can pull and analyze the data sources listed on this page. For each source you can see what data it contains, the regions it covers, and the time range available. Date ranges run to the present and keep growing, so the start dates and update cadence are the stable facts to rely on.

Weather forecast models (Jua's EPT family and third party models such as ECMWF, GFS and ICON) are documented separately in the [Summary: Available Weather Models and Data](/models-and-products/models-and-products#summary-available-weather-models-and-data) table. This page covers power, energy market, climate and historical data.

## Power & Energy Markets

### Power Forecast

Jua's dedicated machine learning forecast for electricity generation (Solar and Wind) in key European power markets. See the [Power Forecast](/models-and-products/power-forecast) page for coverage, generation types, horizon and update frequency.

### ENTSO-E

European electricity market and power system data from the ENTSO-E Transparency Platform: prices, demand, generation, transmission system operator (TSO) forecasts, cross border exchanges, and generation and transmission outages.

**Market and system data**

| Field          | Details                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Data available | Day-ahead electricity prices; imbalance (balancing) prices and volumes; actual electricity demand (load); actual generation broken down by source type; day-ahead and intraday TSO forecasts (total generation, load, and wind and solar by type); cross border physical flows; commercial scheduled exchanges; net positions; net transfer capacity (day-ahead, week-ahead, month-ahead); redispatch and countertrading volumes; intraday offered capacity; and available hydro capacity. Generation is split across roughly 20 source types including Wind Onshore, Wind Offshore, Solar, Nuclear, Fossil Gas, Hard coal, Lignite, Oil, three Hydro types, Biomass, Geothermal, Waste, Energy storage and Other. |
| Coverage       | Around 55 European bidding zones across Western, Central and Southeast Europe, the Nordics, the Baltics and the Balkans. Includes France, Germany (DE\_LU plus the four TSO control areas), the Netherlands, Belgium, Spain, Portugal, Italy (six zones), Norway (five zones), Sweden (four zones), Denmark (two zones), Poland and many more. Great Britain data is mostly historical and stops around 2020 to 2021 following Brexit. Northern Ireland (GB\_NIR) remains fully covered and current through the all island market. For current GB power data, use the NESO source instead.                                                                                                                         |
| Date range     | Continuous coverage from January 2020 to present. Forward looking series such as day-ahead prices and forecasts extend into the future.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| Freshness      | Current to the present day. Actual prices, load and generation are available through the current day. Imbalance prices and volumes can lag 1 to 14 days depending on the zone.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |

**Outages**

| Field          | Details                                                                                                                                                                                                                                                                    |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Data available | Planned maintenance and unplanned outage records for individual power generation units (with available capacity, plant type and unit identity) and for transmission lines. Generation outages span roughly 20 plant types matching the generation source categories above. |
| Coverage       | Around 30 countries across Europe, including Germany, Italy, France, Czechia, Poland, Greece, Hungary, Spain, Switzerland and Great Britain.                                                                                                                               |
| Date range     | Outage records carry start and end dates from 2015 through future dated planned maintenance. Continuous ingested coverage begins around October 2025.                                                                                                                      |
| Freshness      | Updated daily, current to the present day.                                                                                                                                                                                                                                 |

### NESO (UK Power)

UK (Great Britain) power generation actuals plus NESO day-ahead forecasts. Use this for British power data, since the UK is not on the ENTSO-E platform.

| Type                | What you get                                                                                                            |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| Actuals             | Wind (single combined total of transmission and embedded), Solar (national estimate), Load (transmission system demand) |
| Day-ahead forecasts | Wind (transmission and embedded), Embedded solar                                                                        |

* Coverage: Great Britain (national level).
* Date range: actuals (wind, solar, load) continuous from January 2021. Day-ahead wind forecast from January 2021. Day-ahead embedded solar and embedded wind forecasts from January 2023. Continuous to present.
* Freshness: updated daily. Actuals are current to within roughly a day. Day-ahead forecasts extend into the next day.

Wind is reported as one combined figure with no onshore or offshore split. Prices and cross border flows are not provided through this source.

### EPEX SPOT

EPEX SPOT power exchange data for the German and Luxembourg (DE-LU) electricity market: day-ahead auction prices, intraday auction prices and volumes, and continuous intraday trading statistics and indices.

**Day-ahead auction**

| Field          | Value                                                                                                      |
| -------------- | ---------------------------------------------------------------------------------------------------------- |
| Data available | Day-ahead auction clearing prices and cleared volumes, plus the official day-ahead price index.            |
| Coverage       | DE-LU                                                                                                      |
| Date range     | September 2018 to present. Hourly history through September 2025, quarter hourly from October 2025 onward. |
| Freshness      | Current. Next day prices are available after the auction clears (around 13:00 CET daily).                  |

**Intraday auctions (IDA1, IDA2, IDA3)**

| Field          | Value                                                                                                                                                                                       |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Data available | Intraday auction clearing prices and cleared volumes for the three intraday auctions, at quarter hourly resolution. IDA3 has occasional gaps because it is a late, sparsely traded auction. |
| Coverage       | DE-LU                                                                                                                                                                                       |
| Date range     | June 2024 to present                                                                                                                                                                        |
| Freshness      | Current, ingested daily.                                                                                                                                                                    |

**Continuous intraday trading**

| Field          | Value                                                                                                                                                                                                          |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Data available | Continuous trading statistics (volume weighted average price, last, low and high price, buy and sell volumes) and the official intraday price indices ID1, ID3 and IDFULL at 15, 30 and 60 minute resolutions. |
| Coverage       | DE-LU                                                                                                                                                                                                          |
| Date range     | December 2020 to present                                                                                                                                                                                       |
| Freshness      | Updated end of day. May lag the auction data by roughly a day.                                                                                                                                                 |

### Netztransparenz

German electricity grid transparency and balancing data, published by the four German transmission system operators through Netztransparenz.de.

| Group                                     | What it covers                                                                                                                                |
| ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Balancing energy and control reserve      | Activated secondary (aFRR) and tertiary (mFRR) reserve, primary reserve (FCR), network control balance, and the rebap balancing energy price. |
| Balancing cost accounting (AEP)           | Balancing energy price components and modules (AEP Module 1 to 3), financial impact, and intraday balancing price.                            |
| Curtailment and emergency measures (AbSM) | Adjustment measure quantities (allotted, declared, generation bans), interruptible loads, and emergency assistance flows.                     |
| Renewable feed-in and marketing           | Solar and wind feed-in estimates and EEG marketing volumes across exchanges (EPEX, EXAA) for solar, wind and other sources.                   |
| Relief region detail                      | Quantities broken down by grid relief regions (H1 to H2, T1 to T6) and by hourly windows.                                                     |

* Coverage: Germany (national, plus per operator and per relief region breakdowns). Many series are available per transmission operator (50Hertz, Amprion, TenneT, TransnetBW) and combined for all of Germany.
* Date range: continuous from January 2023 to present.
* Freshness: current, refreshed daily. The most recent weeks are preliminary figures that are later replaced by quality assured values.

## Climate & Historical

### Reanalysis (ERA5)

Historical actual weather, meaning what really happened at a given place and time. This is ECMWF's ERA5 reanalysis, the most widely trusted record of past global weather. It is not a forecast.

| Field            | Value                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Data available   | 2m air temperature, surface (skin) temperature, sea surface temperature, 2m dew point, mean sea level pressure, surface pressure, 10m and 100m wind speed and direction, 10m wind gust, surface solar irradiance (downwelling, net and direct), total cloud cover plus high, medium and low cloud cover, hourly precipitation total, convective available potential energy (a storm and instability indicator), and predominant precipitation type. |
| Coverage         | Global. 0.25° grid (about 25 km spacing, roughly 1.04 million grid points per hour). Hourly.                                                                                                                                                                                                                                                                                                                                                        |
| Date range       | 1 January 1990 to roughly one week before the present day.                                                                                                                                                                                                                                                                                                                                                                                          |
| Update frequency | Not real time. ERA5 runs about a week behind the present, so use it for historical analysis rather than current conditions.                                                                                                                                                                                                                                                                                                                         |

### Climatology (ERA5)

A 30-year "normal" that tells you the typical weather for any given day and hour of the year, anywhere on Earth. It answers "what is usual for this time of year here?" rather than "what is the forecast?" or "what actually happened?". It is built from ERA5 reanalysis and smoothed so each day blends in the weather from the surrounding two weeks.

| Field            | Value                                                                                                                                                                                                                                                              |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Data available   | Typical conditions for each day and hour of the year: 2m air temperature, 2m dew point, mean sea level pressure, 10m and 100m wind speed and direction, low, medium and high cloud cover, hourly precipitation total, and hourly total and direct solar radiation. |
| Coverage         | Global. 0.25° grid (about 25 km), latitude 89.75°S to 90°N, longitude 180°W to 179.75°E.                                                                                                                                                                           |
| Reference period | 1991 to 2020, the WMO standard 30-year climate normal.                                                                                                                                                                                                             |
| Resolution       | One value per day of year and hour (366 days by 24 hours), with each day smoothed over a 15-day window on either side.                                                                                                                                             |

Because this is a climatology, there is no single calendar date. Values repeat every year. Day 366 (29 February) is included.

### Climate Indices

Standardized climate oscillation indices that describe large scale atmospheric and ocean patterns (for example NAO, the El Nino and La Nina ENSO indices, the Arctic Oscillation, the Madden-Julian Oscillation, the Pacific Decadal Oscillation, and solar sunspot activity). These are the slow moving background drivers behind seasonal weather regimes.

Data available: 44 indices in total, grouped by theme.

| Theme                                | Count | Notable examples                                                                                              |
| ------------------------------------ | ----- | ------------------------------------------------------------------------------------------------------------- |
| Atmospheric oscillations             | 11    | NAO, AO, AAO, PNA, PDO, QBO, AMO, SOI, WPO, EPO, GBI                                                          |
| Teleconnection patterns              | 4     | EA, SCAND, EAWR, TNH                                                                                          |
| ENSO (El Nino and La Nina)           | 12    | Nino 1+2, 3, 4 and 3.4 sea surface temperatures and their anomalies, plus MEI and ONI                         |
| Atlantic sea surface temperature     | 3     | TNA, TSA, AMM                                                                                                 |
| Indian Ocean sea surface temperature | 1     | IOD (Indian Ocean Dipole, the Dipole Mode Index)                                                              |
| Madden-Julian Oscillation (MJO)      | 14    | Four daily RMM components (RMM1, RMM2, phase, amplitude) plus 10 longitude resolved velocity potential series |
| Solar                                | 1     | SUNSPOT (monthly sunspot number)                                                                              |

* Coverage: global climate patterns, not tied to a single region. Each index is a single time series describing a hemispheric or basin scale mode.
* Date range: the earliest record is the sunspot series at 1749. Most atmospheric and ENSO indices start in the 1950s. The Indian Ocean Dipole series runs continuously from 1870. The daily MJO RMM series starts 1974, and the MJO velocity potential series starts 1978. Latest values run to the most recent completed period.
* Update cadence: mixed. Monthly for most indices, daily for the MJO RMM indices, and every five days (pentad) for the velocity potential MJO series.
* Sources: NOAA (PSL and CPC), the Australian Bureau of Meteorology (daily MJO RMM), and SIDC (sunspots).


# Model Evaluation

## Overview

This guide systematically evaluates weather model performance for energy market applications, emphasizing quantitative validation and operational testing.

## Evaluation Steps

Focus on metrics most relevant to your operations, such as power or price forecasts powered by Jua. If starting with weather data, prioritize real-life observations over analysis datasets like ERA5, as these often contain internal biases.

### Step 1: Model Assessment

1. Review model performance reports ([EPT-1.5](https://arxiv.org/abs/2410.15076), [EPT-2](https://arxiv.org/abs/2507.09703))
2. Decision: Proceed with evaluation.

{% hint style="info" %}
We recommend starting with our technical report to understand the model's capabilities before proceeding with your own evaluation.
{% endhint %}

### Step 2.1: Evaluate Your Impact Forecast

1. Generate generation or demand forecasts using model data
2. Compare with your existing provider
3. Decision: Proceed to trade evaluation.

### Step 2.2: Observations Benchmark

1. The best results are usually achieved by generating an impact forecast, but if you aim to have a weather comparison, we recommend comparing initial performance vs. station observations
2. Evaluate basic accuracy metrics
3. Decision: Continue to detailed testing?

### Step 3: Trading Signal Test and PnL Backtest

1. Simulate historical market scenarios and strategies and conduct paper trading tests.
2. Decision: Is ROI there?

## Example: Weather Model Testing Framework for Spot Markets

#### Approach 1: Generation or Demand Forecast

**Prerequisites:**

* Existing operational forecast using the current forecast provider
* New Impact forecast powered by Jua

**Key Metrics:**

* **Wind Power Forecast accuracy (12-36hr horizon)**
* Solar Power Forecast accuracy (12-36hr horizon)
* Demand forecast accuracy (12-36hr horizon)
* Price forecast accuracy (12-36hr horizon)

**Evaluation Approach, example Day-Ahead Germany:**

1. Jua EPT-2 & 3rd party forecast based Wind Power Forecast performance against realized power data in Germany
2. Compare each model performance against actuals
3. Calculate improvement metrics between models

#### Approach 2: Ground Truth Validation

**Prerequisites:**

* Weather station data
* Defined forecast window (typically 12-36hr for day-ahead markets)

**Testing Protocol:**

1. Forecast Evaluation:
   * Compare ECMWF HRES or your preferred model 12-36hr forecasts against ground truth
   * Compare Jua 12-36hr forecasts against ground truth
2. Performance Analysis:
   * Calculate error metrics (RMSE, MAE, bias)
   * Analyze temporal patterns in forecast accuracy
   * Identify systematic biases or errors

### Approach 3: Advanced Validation

**Option A: Live Strategy Testing & Historical PnL Backtesting**

1. Setup:
   * Historical market simulation with trading strategy
   * Trading strategy implementation
2. Analysis:
   * Calculate theoretical PnL
   * Stress test under different market conditions
   * Sensitivity analysis to forecast errors


# Getting Started

Whether you're an energy trader, meteorologist, or any industry professional, our comprehensive solutions are designed to meet your needs: getting started is as easy as 3, 2, 1

**3. Install & authenticate**

Make sure you are already logged in the [developer portal](https://developer.jua.ai/).

```bash
pip install jua
jua auth
```

{% hint style="info" %}
Tip: try [uv](https://docs.astral.sh/uv/getting-started/), an extremely fast Python package and project manager

```bash
uv init && uv add jua
```

{% endhint %}

**2. Import Jua**

```python
from jua import JuaClient
from jua.types.geo import LatLon
from jua.weather import Models, Variables

import matplotlib.pyplot as plt

ZURICH = LatLon(lat=47.3769, lon=8.5417)
```

**1. Get the latest forecast**

```python
client = JuaClient()
model = client.weather.get_model(Models.EPT1_5)
forecast = model.get_forecasts(
    points=ZURICH,
)[Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M]
```

**🚀 Liftoff 🚀**

```python
forecast.to_absolute_time().plot()
plt.title("Temperature in Zurich")
plt.ylabel(Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M.display_name_with_unit)
plt.xlabel("Time")
plt.show()
```

<figure><img src="/files/wd9QbxTlqLOVYQmdgRO8" alt=""><figcaption></figcaption></figure>

### Next Steps

Familiarize yourself with the examples provided in[ Jua's Python SDK Repository](https://github.com/juaAI/jua-python-sdk/tree/main/examples)


# Installation

## Dependencies and Installation

This guide will walk you through setting up the Jua SDK for your project.

### System Requirements

Before you begin, ensure your environment can meet these fundamental needs for the Jua SDK to function correctly:

* **Python:** Version 3.11 or higher.
* **Zarr:** Version 3.0 or newer.

{% hint style="info" %}
Tip: try [uv](https://docs.astral.sh/uv/getting-started/), an extremely fast Python package and project manager.

```bash
uv init && uv add jua
```

{% endhint %}

### Installation Methods

We strongly recommend using a virtual environment to manage your project's dependencies. This prevents conflicts with other Python projects or your system-wide Python installation.

#### Installation using `pip`

1. **Ensure you have Python 3.11 or higher.**\
   You must have a Python 3.11+ interpreter installed and available in your PATH. You can download it from [python.org](https://www.python.org/downloads/) if needed.
2. **Install `jua`:**

   ```bash
   pip install jua
   ```

   This command will download and install `jua` and its dependencies (including a compatible Zarr version) from the Python Package Index (PyPI).

#### Installation using `uv` (optional)

[uv](https://docs.astral.sh/uv/) is an extremely fast Python package installer and resolver. It's designed as a drop-in replacement for `pip` and `pip-tools` and can significantly speed up your workflows.

1. **Set up your project and install `jua`:**\
   Navigate to your desired project directory or create a new one:

   ```bash
   mkdir my-jua-project
   cd my-jua-project
   ```

   Then, initialize a `uv` managed environment and add `jua`:

   ```bash
   uv init
   uv add jua
   ```
2. **Run your Python scripts:**

   ```bash
   uv run your_script_using_jua.py
   ```


# Authentication

## Authenticating with Jua

To interact with Jua services and APIs, your application or client needs to be authenticated. This page outlines the available methods for providing your credentials.

We primarily use an API Key ID and an API Key Secret for authentication. You can generate these credentials from your Jua dashboard.

### Methods for Authentication

Choose the method that best suits your workflow and security requirements. Here's an overview, from the generally recommended to more specific use cases:

1. **Jua CLI**: For interactive sessions and local development.
2. **Using Environment Variables**: Set the key id and secret in the environment.
3. **Programmatic Configuration (Using `JuaClient`)**: Offers flexibility for various environments and dynamic setups.
4. **Global `api-key.json` File**: For system-wide configuration, use with caution.

***

#### 1. Jua CLI (`jua auth`)

The Jua Command Line Interface (CLI) will offer the simplest way to authenticate for many users, especially during local development and interactive use.

```bash
jua auth login
```

{% hint style="info" %}
Make sure you are already logged in the [developer portal](https://developer.jua.ai/)
{% endhint %}

This command will:

* Open a browser window, guiding you through the Jua authentication process.
* Store the obtained credentials locally (i.e. in a configuration file in your home directory, specific to the Jua CLI).
* Automatically make these credentials available to the Jua SDK and other CLI commands when run in the same user context.

***

#### 2. Environment Variables

1. **Obtain your Credentials:**
   * Navigate to the [API Keys section in your Jua dashboard.](https://developer.jua.ai/api-keys)
   * Generate a new API key, which will provide you with an `API Key ID` and an `API Key Secret`.
2. **Set the variables:**

   ```bash
   export JUA_API_KEY_ID="your_actual_api_key_id"
   export JUA_API_KEY_SECRET="your_actual_api_key_secret"
   ```

**Usage:** The Jua SDK will typically automatically detect and load credentials if they are found int the environment variables.

***

#### 3. Programmatic Configuration (Using `JuaClient`)

You can directly provide your authentication credentials when initializing the `JuaClient` in your Python code. This method offers maximum flexibility, especially for applications running in environments where `.env` files or a global CLI configuration are not suitable.

1. **Obtain your Credentials:**
   * Navigate to the [API Keys section in your Jua dashboard.](https://developer.jua.ai/api-keys)
   * Generate a new API key, which will provide you with an `API Key ID` and an `API Key Secret`.
2. **Pass credentials to `JuaClient`:**
   * **Directly in code (use with caution for hardcoded secrets):**

     ```python
     from jua import JuaClient

     settings = {
         "auth": {
             "api_key_id": "your_actual_api_key_id",
             "api_key_secret": "your_actual_api_key_secret"
         }
     }
     client = JuaClient(settings=settings)
     ```

     **Note:** Hardcoding secrets directly in your source code is generally discouraged for security reasons. Prefer loading them from environment variables or a secure vault.
   * **Pointing to an API Key JSON file:** You can store your API key ID and secret in a JSON file and provide the path to the `JuaClient`. Create a JSON file (e.g., `my_jua_key.json`):

     ```json
     {
         "api_key_id": "your_actual_api_key_id",
         "api_key_secret": "your_actual_api_key_secret"
     }
     ```

     Then, configure the client:

     Python

     ```python
     from jua import JuaClient

     settings = {
         "auth": {
             "api_key_path": "/path/to/your/my_jua_key.json"
         }
     }
     client = JuaClient(settings=settings)
     ```

     Ensure the path to the JSON file is correct and the file is appropriately secured.

***

#### 4. Using a Global `api-key.json` File

This method allows for a system-wide default API key. It should be used with caution, as it makes the key available to any Jua SDK usage by that user on the system.

1. **Obtain your Credentials:** Get your `API Key ID` and `API Key Secret` from the Jua dashboard.
2. **Create the JSON file:** Create a file named `api-key.json` with the following content:

   JSON

   ```jsonp
   {
       "api_key_id": "your_actual_api_key_id",
       "api_key_secret": "your_actual_api_key_secret"
   }
   ```
3. **Place the file in the correct directory:** Save or copy this file to `~/.jua/default/api-key.json`.
   * `~` refers to your user's home directory (e.g., `/home/username` on Linux, `/Users/username` on macOS).
   * You may need to create the `.jua` and `default` directories if they don't exist:

     ```bash
     mkdir -p ~/.jua/default
     ```

**Security Note:** Ensure that file permissions for `~/.jua/default/api-key.json` are restrictive (e.g., readable only by the user) to protect your credentials.

***

### Order of Precedence

If multiple authentication methods are configured, the Jua SDK typically follows this order of precedence (from highest to lowest):

1. **Programmatic Configuration:** Credentials passed directly to the `JuaClient` constructor (either as direct parameters/settings object or via `api_key_path`).
2. **Environment Variables:** `JUA_API_KEY_ID` and `JUA_API_KEY_SECRET`
3. **Jua CLI Configuration:** (Once available) Credentials configured via `jua auth login`.
4. **Global `api-key.json` File:** Credentials from `~/.jua/default/api-key.json`.

The first valid set of credentials found will be used.

### Security Best Practices

* **Never commit API keys or secrets directly into your version control system (e.g., Git).** Use `.gitignore` for files like `.env` or specific key files.
* **Use the principle of least privilege:** Generate API keys with only the necessary permissions for the task at hand if your dashboard supports scoped keys.
* **Store secrets securely:** For production environments, consider using dedicated secret management services (e.g., HashiCorp Vault, AWS Secrets Manager, Google Cloud Secret Manager, Azure Key Vault) and load them into environment variables or directly into your application at runtime.
* **Rotate your API keys regularly** as a security precaution.

***

For further details, advanced configuration options, or troubleshooting, please refer to the **Technical Documentation** or contact Jua support.


# JuaDataset

## JuaDataset

The `JuaDataset` is the primary container for weather data in the Jua Python SDK. When you request weather forecasts or hindcasts from any Jua model, the results are returned as a `JuaDataset` object.

### Overview

`JuaDataset` serves as a specialized wrapper around [xarray](https://xarray.dev/) Datasets, providing:

* Extensions to xarray functionality for weather-specific operations
* Convenient methods to save data to disk in Zarr format
* Memory usage information and management

### Working with JuaDataset

#### Getting a JuaDataset

```python
from datetime import datetime

from jua import JuaClient
from jua.weather import Models

client = JuaClient()

# Get the forecast for all of Switzerland from the 1st of January 2024
model = client.weather.get_model(Models.EPT2)
forecast_data = model.get_forecasts(  # Returns a JuaDataset
    init_time=datetime(2024, 1, 1, 0),
    latitude=slice(45, 48),
    longitude=slice(5, 11),
)
```

#### Accessing Variables

You can access variables directly using dictionary syntax:

```python
# Using string variable names
temperature = forecast_data["air_temperature_at_height_level_2m"]

# Using the Variables enum (recommended for type safety)
from jua.weather import Variables
temperature = forecast_data[Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M]
```

#### Working with xarray

`JuaDataset` seamlessly integrates with xarray's functionality:

```python
# Convert to xarray Dataset
ds = forecast_data.to_xarray()

# Direct variable access returns a TypedDataArray (extended xarray.DataArray)
temperature = forecast_data[Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M]

# Use xarray's powerful selection methods
temp_zurich = temperature.sel(latitude=47.3769, longitude=8.5417, method="nearest")

# convert temperature from Kelvin to Celcius
temperature_celcius = temperature.to_celcius()

# Convert lead time to absolute time
temperature_abs_time = temperature.to_absolute_time()

# Create visualizations
temperature.plot()
```

### Saving Data

`JuaDataset` can be saved to disk in Zarr format for later use:

```python
# Save with default settings (to ~/.jua/datasets/<model_name>/<dataset_name>.zarr)
forecast_data.save()

# Save to custom location with progress bar
from pathlib import Path
forecast_data.save(
    output_path=Path("./my_data/forecast"),
    show_progress=True,
    overwrite=True
)
```

### Obtaining Statistics from Ensemble Models

Ensemble statistics can be obtained from EPT-2e. The default behavior of `get_forecasts` is to simply return the ensemble mean. To obtain forecast statistics, specify which ones are needed.

```python
from jua.weather import Statistics

# Get a forecast
model = client.weather.get_model(Models.EPT2_E)

# Using strings
forecast_data = model.get_forecasts(
    latitude=51.5,
    longitude=-0.12,
    statistics=["mean", "std", "q5", "q95"]
)

# Using the Statistics enum (recommended for type safety)
forecast_data = model.get_forecasts(
    latitude=51.5,
    longitude=-0.12,
    statistics=[
        Statistics.MEAN,
        Statistics.STD,
        Statistics.QUANTILE_5,
        Statistics.QUANTILE_95,
    ]
)
```

Statistics can then be accessed through the `stat` coordinate:

```python
import matplotlib.pyplot as plt

# Use xarray's powerful selection methods
ds_forecast = forecast_data.to_xarray()
ds_forecast = ds_forecast.isel(points=0, init_time=0)
wind_speed = ds_forecast[Variables.WIND_SPEED_AT_HEIGHT_LEVEL_10M]
wind_speed = wind_speed.to_absolute_time()

# Create visualizations
wind_speed.sel(stat=Statistics.MEAN).plot(label=Statistics.MEAN.display_name)
wind_speed.sel(stat=Statistics.QUANTILE_5).plot(label=Statistics.QUANTILE_5.display_name)
wind_speed.sel(stat=Statistics.QUANTILE_95).plot(label=Statistics.QUANTILE_95.display_name)
plt.legend()
plt.show()
```

### Best Practices

1. **Use Variables enum** for type-safe access to variables
2. **Convert to xarray** for complex operations and analysis
3. **Save large datasets** to disk for repeated use

### Complete Example

```python
from jua import JuaClient
from jua.weather import Models, Variables
import matplotlib.pyplot as plt

# Initialize client
client = JuaClient()

# Get a specific forecast for a model
#   specify the forecast run to obtain data for (init_time)
#   specify the latitude, longitude to get the data for
model = client.weather.get_model(Models.EPT2)
forecast_paris = model.get_forecasts(
    init_time=datetime(2024, month=8, day=19, hour=0),
    latitude=48.8566,
    longitude=2.3522,
    method="bilinear",
    variables=[
        Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M,
        Variables.WIND_SPEED_AT_HEIGHT_LEVEL_10M,
    ],
)

# Access temperature data
temperature = forecast_paris[Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M]

# Convert to Celsius and plot
temperature.to_celcius().plot()
plt.title("Temperature Forecast for Paris")
plt.ylabel("Temperature (°C)")
plt.show()

# Access wind data
wind_speed = forecast_paris[Variables.WIND_SPEED_AT_HEIGHT_LEVEL_10M]

# Plot wind speed
wind_speed.plot()
plt.title("Wind Speed (10m) for Paris")
plt.ylabel("Wind Speed (m/s)")
plt.show()

# Save the dataset for later use
forecast_paris.save(show_progress=True)
```


# Weather

## Weather

The `Weather` class is your gateway to Jua's weather forecasting capabilities, providing access to all available weather models and their data services.

### Overview

The `Weather` class serves as the central hub for accessing Jua's weather models. Each model provides access to:

* Weather forecast data (future predictions)
* Weather hindcast data (historical records)

This class is not meant to be instantiated directly. Instead, you should always access it through the `weather` property of a `JuaClient` instance.

A default `request_credit_limit` exists, which blocks users from making requests which will cost more than a given number of credits. If you ever hit that limit but want to make the query anyway (and override the limit), you can just set the `request_credit_limit` in the `JuaClient` to the desired value.

### Accessing Weather Models

```python
from jua import JuaClient
from jua.weather import Models

# Initialize the client
client = JuaClient()

# Initialize the client with a higher request_credit_limit
client = JuaClient(request_credit_limit=100)

# Access the Weather instance
weather = client.weather

# Get a specific model
ept2_model = weather.get_model(Models.EPT2)
```

#### Available Models

Jua provides several weather models with different characteristics (resolution, forecast range, etc.). You can access any model using the `Models` enum:

```python
# Get different models
ept2 = client.weather.get_model(Models.EPT2)
ept15 = client.weather.get_model(Models.EPT1_5)
```

**Note:** Some models are only available in premium subscriptions.

#### Dictionary-Style Access

For convenience, you can also use dictionary-style syntax to access models:

```python
# These are equivalent
ept2 = client.weather.get_model(Models.EPT2)
ept2 = client.weather[Models.EPT2]
```

### Working with Models

Once you have a model instance, you can access its capabilities:

```python
# Get a model
model = client.weather.get_model(Models.EPT2)

# Get a forecast (returns a JuaDataset)
forecast_data = model.get_forecasts(...)

```

### Best Practices

1. **Always use the Models enum** for type-safe access to weather models
2. **Access Weather through the client** - never create Weather instances directly


# Variables

## Weather Variables

The Jua Python SDK provides a comprehensive set of standardized weather variables through the `Variables` enum. These variables can be used to access specific weather data across different models with consistent naming.

### Overview

The `Variables` enum serves as a centralized registry of all available weather variables in Jua, offering:

* Type-safe access to weather variables
* Standardized naming across different models
* Unit information
* Display names for visualization
* Model-specific name mappings (ECMWF codes)

### Standardized Naming

We use the [CFConvention's](https://cfconventions.org/) standard name and extend athmospheric variables with their reference surface and accumulated variables with their accumulation to create distinct and clear names for climate and weather variables.

```
{parameter_name}[_at_{ref_type}_{ref_value}{ref_unit}][_{agg_type}_{agg_duration}{agg_unit}]
```

Where:

* `{parameter_name}`: physical quantity based on the CF convention's standard name (e.g., air\_temperature)
* `_at_`: connecting phrase
* `{ref_type}`: reference surface type (e.g., pressure\_level, height\_level, surface)
* `{ref_value}`: numerical value of the reference surface level (e.g., 2, 100000)
* `{ref_unit}`: unit of the level measurement (e.g., m for meters, Pa for Pascals)
* `{agg_type}`: aggregation type of accumulated variable (e.g., mean or sum)
* `{agg_duration}`: duration of the aggregation (e.g., 6, 3, 1)
* `{agg_unit}`: unit of the aggregation (e.g., h, min)

The suffix groups `[_at_{ref_type}_{ref_value}{ref_unit}]` and `[_{agg_type}_{agg_duration}{agg_unit}]` are only applied for atmospheric and accumulated variables respectively.

### Using Variables

```python
from jua.weather import Variables

# Access a variable in a JuaDataset
temperature = forecast_data[Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M]

# Get variable metadata
print(f"Unit: {Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M.unit}")
print(f"ECMWF code: {Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M.emcwf_code}")
print(f"Display name: {Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M.display_name}")
```

### Available Variables

| Variable Enum                                          | Standardized Name                                           | Unit   | ECMWF Code |
| ------------------------------------------------------ | ----------------------------------------------------------- | ------ | ---------- |
| `AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M`                   | air\_temperature\_at\_height\_level\_2m                     | K      | 2t         |
| `DEW_POINT_TEMPERATURE_AT_HEIGHT_LEVEL_2M`             | dew\_point\_temperature\_at\_height\_level\_2m              | K      | 2d         |
| `RELATIVE_HUMIDITY_AT_HEIGHT_LEVEL_2M`                 | relative\_humidity\_at\_height\_level\_2m                   | %      | r          |
| `AIR_DENSITY_AT_HEIGHT_LEVEL_2M`                       | air\_density\_at\_height\_level\_2m                         | kg/m³  | —          |
| `AIR_PRESSURE_AT_MEAN_SEA_LEVEL`                       | air\_pressure\_at\_mean\_sea\_level                         | Pa     | msl        |
| `SURFACE_AIR_PRESSURE`                                 | surface\_air\_pressure                                      | Pa     | —          |
| `SURFACE_TEMPERATURE`                                  | surface\_temperature                                        | K      | —          |
| `WIND_SPEED_AT_HEIGHT_LEVEL_10M`                       | wind\_speed\_at\_height\_level\_10m                         | m/s    | 10si       |
| `WIND_DIRECTION_AT_HEIGHT_LEVEL_10M`                   | wind\_direction\_at\_height\_level\_10m                     | °      | 10wdir     |
| `WIND_SPEED_AT_HEIGHT_LEVEL_20M`                       | wind\_speed\_at\_height\_level\_20m                         | m/s    | —          |
| `WIND_SPEED_AT_HEIGHT_LEVEL_40M`                       | wind\_speed\_at\_height\_level\_40m                         | m/s    | —          |
| `WIND_SPEED_AT_HEIGHT_LEVEL_60M`                       | wind\_speed\_at\_height\_level\_60m                         | m/s    | —          |
| `WIND_SPEED_AT_HEIGHT_LEVEL_80M`                       | wind\_speed\_at\_height\_level\_80m                         | m/s    | —          |
| `WIND_SPEED_AT_HEIGHT_LEVEL_100M`                      | wind\_speed\_at\_height\_level\_100m                        | m/s    | 100si      |
| `WIND_DIRECTION_AT_HEIGHT_LEVEL_100M`                  | wind\_direction\_at\_height\_level\_100m                    | °      | 100wdir    |
| `WIND_SPEED_AT_HEIGHT_LEVEL_120M`                      | wind\_speed\_at\_height\_level\_120m                        | m/s    | —          |
| `WIND_SPEED_AT_HEIGHT_LEVEL_140M`                      | wind\_speed\_at\_height\_level\_140m                        | m/s    | —          |
| `WIND_SPEED_AT_HEIGHT_LEVEL_160M`                      | wind\_speed\_at\_height\_level\_160m                        | m/s    | —          |
| `WIND_SPEED_AT_HEIGHT_LEVEL_180M`                      | wind\_speed\_at\_height\_level\_180m                        | m/s    | —          |
| `WIND_SPEED_AT_HEIGHT_LEVEL_200M`                      | wind\_speed\_at\_height\_level\_200m                        | m/s    | —          |
| `WIND_DIRECTION_AT_HEIGHT_LEVEL_200M`                  | wind\_direction\_at\_height\_level\_200m                    | °      | —          |
| `GEOPOTENTIAL_AT_PRESSURE_LEVEL_50000PA`               | geopotential\_at\_pressure\_level\_50000Pa                  | m² s⁻² | z\_500     |
| `EASTWARD_WIND_AT_HEIGHT_LEVEL_10M`                    | eastward\_wind\_at\_height\_level\_10m                      | m/s    | —          |
| `NORTHWARD_WIND_AT_HEIGHT_LEVEL_10M`                   | northward\_wind\_at\_height\_level\_10m                     | m/s    | —          |
| `EASTWARD_WIND_AT_HEIGHT_LEVEL_100M`                   | eastward\_wind\_at\_height\_level\_100m                     | m/s    | —          |
| `NORTHWARD_WIND_AT_HEIGHT_LEVEL_100M`                  | northward\_wind\_at\_height\_level\_100m                    | m/s    | —          |
| `PRECIPITATION_AMOUNT_SUM_1H`                          | precipitation\_amount\_sum\_1h                              | mm/m²  | tp         |
| `CLOUD_AREA_FRACTION_AT_ENTIRE_ATMOSPHERE`             | cloud\_area\_fraction\_at\_entire\_atmosphere               | \[0,1] | tcc        |
| `CLOUD_AREA_FRACTION_AT_ENTIRE_ATMOSPHERE_HIGH_TYPE`   | cloud\_area\_fraction\_at\_entire\_atmosphere\_high\_type   | \[0,1] | hcc        |
| `CLOUD_AREA_FRACTION_AT_ENTIRE_ATMOSPHERE_MEDIUM_TYPE` | cloud\_area\_fraction\_at\_entire\_atmosphere\_medium\_type | \[0,1] | mcc        |
| `CLOUD_AREA_FRACTION_AT_ENTIRE_ATMOSPHERE_LOW_TYPE`    | cloud\_area\_fraction\_at\_entire\_atmosphere\_low\_type    | \[0,1] | lcc        |
| `SURFACE_DOWNWELLING_SHORTWAVE_FLUX_SUM_1H`            | surface\_downwelling\_shortwave\_flux\_sum\_1h              | J/m²   | ssrd       |
| `SURFACE_DIRECT_DOWNWELLING_SHORTWAVE_FLUX_SUM_1H`     | surface\_direct\_downwelling\_shortwave\_flux\_sum\_1h      | J/m²   | fdir       |
| `SURFACE_NET_DOWNWARD_SHORTWAVE_FLUX_SUM_1H`           | surface\_net\_downward\_shortwave\_flux\_sum\_1h            | J/m²   | ssr        |
| `SURFACE_DOWNWELLING_SHORTWAVE_FLUX_SUM_6H`            | surface\_downwelling\_shortwave\_flux\_sum\_6h              | J/m²   | ssrd\_6hr  |
| `SURFACE_DOWNWELLING_SHORTWAVE_FLUX_SUM_30MIN`         | surface\_downwelling\_shortwave\_flux\_sum\_30min           | J/m²   | —          |
| `SURFACE_DIRECT_DOWNWELLING_SHORTWAVE_FLUX_SUM_30MIN`  | surface\_direct\_downwelling\_shortwave\_flux\_sum\_30min   | J/m²   | —          |

### Correspondence of radiation variables

* Direct normal irradiance (DNI or beam radiation) ≙ surface\_direct\_downwelling\_shortwave\_flux (fdir).
* Global horizontal irradiance (GHI) ≙ surface\_downwelling\_shortwave\_flux\_1h (ssrd).
* Diffuse horizontal irradiance (DHI) can be computed upon request.

### Accessing Variable Properties

Each variable in the enum provides access to several properties:

```python
variable = Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M

# Get the standardized name
name = variable.name  # "air_temperature_at_height_level_2m"

# Get the unit
unit = variable.unit  # "K"

# Get the ECMWF code
ecmwf_code = variable.emcwf_code  # "2t"

# Get a formatted display name
display = variable.display_name  # "Air Temperature At Height Level 2m"

# Get display name with unit
display_with_unit = variable.display_name_with_unit  # "Air Temperature At Height Level 2m (K)"
```

### Variable Conversion

The SDK provides utility functions to convert between different variable naming conventions:

```python
from jua.weather.variables import rename_variable

# Convert from ECMWF code to standardized name
std_name = rename_variable("2t")  # Returns "air_temperature_at_height_level_2m"
```

### Using Variables in Data Selection

You can use the Variables enum to select specific variables when requesting forecast or hindcast data:

```python
# Request only specific variables in a forecast
forecast = model.get_forecasts(
    variables=[
        Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M,
        Variables.WIND_SPEED_AT_HEIGHT_LEVEL_10M,
        Variables.PRECIPITATION_AMOUNT_1HOUR
    ]
)
```

### Best Practices

1. **Always use the Variables enum** instead of string literals for type safety and code clarity
2. **Access variable metadata** through the enum properties when needed


# Model

The Model class provides access to weather forecast data from Jua's weather prediction models. It allows you to retrieve future weather predictions with flexible spatial and temporal selection options.

Historical weather data (known as hindcasts) are also available directly directly through the `Model` class. Hindcasts are past model runs that allow you to analyze historical weather patterns, evaluate model performance, or test your pipelines. All model runs that are older that **90 days** (i.e. an having an `init_time` that is more than 90 days in the past) are classified as **hindcasts**.

Information about model/query pricing is available in the [developer portal](https://developer.jua.ai).

### Overview

The Model class serves as your interface to Jua's weather forecasting capabilities. It provides methods to:

* Retrieve forecast data for global coverage or specific locations
* Access forecasts for specific initialization times or the latest available forecast
* Query metadata about available forecasts
* Check forecast availability and readiness

### List Available Models

{% tabs %}
{% tab title="Code" %}

```python
from jua.weather import Models

print("Available models:")
for model in Models:
    print(f"  - {model}")
```

{% endtab %}

{% tab title="Output" %}

```
Available models:
  - Models.EPT1_5
  - Models.EPT1_5_EARLY
  - Models.EPT2
  - Models.EPT2_E
  - Models.EPT2_EARLY
  - Models.EPT2_HRRR
  - Models.EPT2_RR
  - Models.EPT2_REASONING
  - Models.AIFS
  - Models.AURORA
  - Models.ECMWF_IFS_SINGLE
  - Models.ICON_EU
  - Models.ICON_GLOBAL
  - Models.NOAA_GFS_SINGLE
  - Models.ECMWF_AIFS_ENSEMBLE
  - Models.ECMWF_AIFS_SINGLE
  - Models.ECMWF_IFS_ENSEMBLE
  - Models.GFS_GLOBAL_ENSEMBLE
  - Models.GFS_GLOBAL_SINGLE
  - Models.GFS_GRAPHCAST
  - Models.ICON_D2
  - Models.KNMI_HARMONIE_AROME_EUROPE
  - Models.KNMI_HARMONIE_AROME_NETHERLANDS
  - Models.METEOFRANCE_AROME_FRANCE_HD
  - Models.UKMO_GLOBAL_DETERMINISTIC_10KM
  - Models.UKMO_UK_DETERMINISTIC_2KM

```

{% endtab %}
{% endtabs %}

### Request model metadata

{% tabs %}
{% tab title="Code" %}

```python
import json

from jua import JuaClient
from jua.weather import Models

client = JuaClient()
model = client.weather.get_model(Models.EPT1_5)
metadata = model.get_metadata()
print(json.dumps(metadata.model_dump(), indent=4, default=str))
```

{% endtab %}

{% tab title="Output" %}

```
{
    "model": "ept1_5",
    "variables": [
        "air_temperature_at_height_level_2m",
        "wind_speed_at_height_level_10m",
        "wind_direction_at_height_level_10m",
        "wind_speed_at_height_level_100m",
        "wind_direction_at_height_level_100m",
        "air_pressure_at_mean_sea_level",
        "geopotential_at_pressure_level_50000Pa",
        "surface_downwelling_shortwave_flux_sum_1h"
    ],
    "grid": {
        "num_latitudes": 2221,
        "num_longitudes": 4440
    }
}
```

{% endtab %}
{% endtabs %}

### Getting the Forecasts Available for a Model

{% tabs %}
{% tab title="Code" %}

```python
from jua import JuaClient
from jua.weather import Models

client = JuaClient()
model = client.weather.get_model(Models.EPT2)

# The available forecasts will be returned in descending order,
#  from most recent to oldest; this returns the 10 most recent forecasts
available_forecasts = model.get_available_forecasts(limit=10)
for forecast in available_forecasts:
    print(f" - {forecast.init_time}")

```

{% endtab %}

{% tab title="Output" %}

```
Available init times for ept2
 - 2025-10-30 06:00:00
 - 2025-10-30 00:00:00
 - 2025-10-29 18:00:00
 - 2025-10-29 12:00:00
 - 2025-10-29 06:00:00
 - 2025-10-29 00:00:00
 - 2025-10-28 18:00:00
 - 2025-10-28 12:00:00
 - 2025-10-28 06:00:00
 - 2025-10-28 00:00:00
```

{% endtab %}
{% endtabs %}

The `get_available_forecasts` forecast response is paginated. So to obtain all available forecasts for a model, you need to iterate through the responses.

{% tabs %}
{% tab title="Code" %}

```python
from jua import JuaClient
from jua.weather import Models

client = JuaClient()
model = client.weather.get_model(Models.EPT2)

# Paginate through the response to get all available init_times
result = model.get_available_forecasts(limit=1000)
available_forecasts = list(result.forecasts)
while result.has_more:
    result = result.next()
    available_forecasts.extend(result.forecasts)

print(f"Available init times for {model}: {len(available_forecasts)}")

```

{% endtab %}

{% tab title="Output" %}

```
Available init times for ept2: 4134
```

{% endtab %}
{% endtabs %}

You can also specify a range of dates for which you want to get available `init_times`.

{% tabs %}
{% tab title="Code" %}

```python
from datetime import datetime

from jua import JuaClient
from jua.weather import Models

client = JuaClient()
model = client.weather.get_model(Models.EPT2)

# get the available hindcasts from EPT-2 for January 2025
available_forecasts = model.get_available_forecasts(
    since=datetime(2025, 1, 1),
    before=datetime(2025, 2, 1),
    limit=200,
)
for forecast in available_forecasts:
    print(f" - {forecast.init_time}")
```

{% endtab %}

{% tab title="Output" %}

<pre><code><strong> - 2025-02-01 00:00:00
</strong> - 2025-01-31 18:00:00
 - 2025-01-31 12:00:00
 - 2025-01-31 06:00:00
 - 2025-01-31 00:00:00
 - 2025-01-30 18:00:00
 - 2025-01-30 12:00:00
 - 2025-01-30 06:00:00
 - 2025-01-30 00:00:00
 - 2025-01-29 18:00:00
 - 2025-01-29 12:00:00
 - 2025-01-29 06:00:00
 - 2025-01-29 00:00:00
 - 2025-01-28 18:00:00
 - 2025-01-28 12:00:00
 - 2025-01-28 06:00:00
 - 2025-01-28 00:00:00
 - 2025-01-27 18:00:00
 - 2025-01-27 12:00:00
 - 2025-01-27 06:00:00
 - 2025-01-27 00:00:00
 - 2025-01-26 18:00:00
 - 2025-01-26 12:00:00
 - 2025-01-26 06:00:00
 - 2025-01-26 00:00:00
 - 2025-01-25 18:00:00
 - 2025-01-25 12:00:00
 - 2025-01-25 06:00:00
 - 2025-01-25 00:00:00
 - 2025-01-24 18:00:00
 - 2025-01-24 12:00:00
 - 2025-01-24 06:00:00
 - 2025-01-24 00:00:00
 - 2025-01-23 18:00:00
 - 2025-01-23 12:00:00
 - 2025-01-23 06:00:00
 - 2025-01-23 00:00:00
 - 2025-01-22 18:00:00
 - 2025-01-22 12:00:00
 - 2025-01-22 06:00:00
 - 2025-01-22 00:00:00
 - 2025-01-21 18:00:00
 - 2025-01-21 12:00:00
 - 2025-01-21 06:00:00
 - 2025-01-21 00:00:00
 - 2025-01-20 18:00:00
 - 2025-01-20 12:00:00
 - 2025-01-20 06:00:00
 - 2025-01-20 00:00:00
 - 2025-01-19 18:00:00
 - 2025-01-19 12:00:00
 - 2025-01-19 06:00:00
 - 2025-01-19 00:00:00
 - 2025-01-18 18:00:00
 - 2025-01-18 12:00:00
 - 2025-01-18 06:00:00
 - 2025-01-18 00:00:00
 - 2025-01-17 18:00:00
 - 2025-01-17 12:00:00
 - 2025-01-17 06:00:00
 - 2025-01-17 00:00:00
 - 2025-01-16 18:00:00
 - 2025-01-16 12:00:00
 - 2025-01-16 06:00:00
 - 2025-01-16 00:00:00
 - 2025-01-15 18:00:00
 - 2025-01-15 12:00:00
 - 2025-01-15 06:00:00
 - 2025-01-15 00:00:00
 - 2025-01-14 18:00:00
 - 2025-01-14 12:00:00
 - 2025-01-14 06:00:00
 - 2025-01-14 00:00:00
 - 2025-01-13 18:00:00
 - 2025-01-13 12:00:00
 - 2025-01-13 06:00:00
 - 2025-01-13 00:00:00
 - 2025-01-12 18:00:00
 - 2025-01-12 12:00:00
 - 2025-01-12 06:00:00
 - 2025-01-12 00:00:00
 - 2025-01-11 18:00:00
 - 2025-01-11 12:00:00
 - 2025-01-11 06:00:00
 - 2025-01-11 00:00:00
 - 2025-01-10 18:00:00
 - 2025-01-10 12:00:00
 - 2025-01-10 06:00:00
 - 2025-01-10 00:00:00
 - 2025-01-09 18:00:00
 - 2025-01-09 12:00:00
 - 2025-01-09 06:00:00
 - 2025-01-09 00:00:00
 - 2025-01-08 18:00:00
 - 2025-01-08 12:00:00
 - 2025-01-08 06:00:00
 - 2025-01-08 00:00:00
 - 2025-01-07 18:00:00
 - 2025-01-07 12:00:00
 - 2025-01-07 06:00:00
 - 2025-01-07 00:00:00
 - 2025-01-06 18:00:00
 - 2025-01-06 12:00:00
 - 2025-01-06 06:00:00
 - 2025-01-06 00:00:00
 - 2025-01-05 18:00:00
 - 2025-01-05 12:00:00
 - 2025-01-05 06:00:00
 - 2025-01-05 00:00:00
 - 2025-01-04 18:00:00
 - 2025-01-04 12:00:00
 - 2025-01-04 06:00:00
 - 2025-01-04 00:00:00
 - 2025-01-03 18:00:00
 - 2025-01-03 12:00:00
 - 2025-01-03 06:00:00
 - 2025-01-03 00:00:00
 - 2025-01-02 18:00:00
 - 2025-01-02 12:00:00
 - 2025-01-02 06:00:00
 - 2025-01-02 00:00:00
 - 2025-01-01 18:00:00
 - 2025-01-01 12:00:00
 - 2025-01-01 06:00:00
 - 2025-01-01 00:00:00
</code></pre>

{% endtab %}
{% endtabs %}

### Check if the forecasted data is available

{% tabs %}
{% tab title="Code" %}

```python
from jua import JuaClient
from jua.weather import Models

client = JuaClient()
model = client.weather.get_model(Models.EPT1_5)

# init_time might be any valid datetime object or datetime string
if model.is_ready(forecasted_hours=480, init_time="latest"):
    print(f"{model.name} has at least 480 hours of forecast data available")
else:
    print(f"{model.name} does not yet have 480 hours of forecast data available")

```

{% endtab %}

{% tab title="Output" %}

```
ept1_5 has at least 480 hours of forecast data available
```

{% endtab %}
{% endtabs %}

### Requesting the forecast data

{% tabs %}
{% tab title="Point-Based" %}

```python
from jua import JuaClient
from jua.types.geo import LatLon
from jua.weather import Models, Variables

# Setup JuaClient
client = JuaClient()

# Choose the model
model = client.weather.get_model(Models.EPT1_5)

# Defining the sites that we are interested in
sites = [
    # label is optional
    LatLon(55.06, 13.00, label="Kriegers Flak"),
    LatLon(54.04, 5.96, label="Gemini Wind Farm"),
    LatLon(51.71, 2.91, label="Borssele III & IV"),
    LatLon(53.89, 1.79, label="Hornsea Two"),
]

# Define the variables we are interested in
# If set to `None` all available variables will be loaded
variables = [
    Variables.WIND_SPEED_AT_HEIGHT_LEVEL_100M,
]

site_forecasts = model.get_forecasts(
    init_time="latest", # or any valid datetime / datetime string
    points=sites,
    # The below parameters are optional
    variables=variables,
    min_lead_time=0, # hours
    max_lead_time=72, # hours
    method="bilinear",
)

# Convert the response to an xarray dataset
print(site_forecasts.to_xarray()) 
```

```
<xarray.Dataset> Size: 2kB
Dimensions:                          (points: 4, init_time: 1,
                                      prediction_timedelta: 73)
Coordinates:
  * points                           (points) object 32B 'borssele_iii_&_iv' ...
  * init_time                        (init_time) datetime64[ns] 8B 2025-10-30...
  * prediction_timedelta             (prediction_timedelta) timedelta64[ns] 584B ...
    latitude                         (points) float32 16B 51.71 54.04 ... 55.06
    longitude                        (points) float32 16B 2.91 5.96 1.79 13.0
    requested_lat                    (points) float64 32B 51.71 54.04 ... 55.06
    requested_lon                    (points) float64 32B 2.91 5.96 1.79 13.0
Data variables:
    wind_speed_at_height_level_100m  (points, init_time, prediction_timedelta) float32 1kB ...
```

> ⚠️ When querying data with `method="nearest"` the returned coordinates will be slightly different to the requested ones, as it will return the coordinates of the nearest grid points for the model.
> {% endtab %}

{% tab title="Region-Based" %}

> ⚠️ Region-based requests can be expensive. For more information, see our [pricing](https://developer.jua.ai) docs.
>
> ⚠️ Requests might be large and take a long time to load.

```python
from datetime import datetime

from jua import JuaClient
from jua.weather import Models, Variables

client = JuaClient()
model = client.weather.get_model(Models.EPT2)
 
# Define the data we want to load
# In all cases scalars, lists and slices are supported
# If set to `None` the whole dimension will be loaded
europe_lat_slice = slice(36, 71) 
europe_lon_slice = slice(-15, 50)
forecast_window = [0, 12, 24]  # Hours
variables = [
    Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M,
    Variables.WIND_SPEED_AT_HEIGHT_LEVEL_100M,
]

forecast = model.get_forecasts(
    init_time=datetime(2025, month=7, day=1, hour=0),
    variables=variables,
    latitude=europe_lat_slice,
    longitude=europe_lon_slice,
    prediction_timedelta=forecast_window,
)

print(forecast.to_xarray())

```

```
Reading data... | 35.8 MB | 30.2 MB/s
<xarray.Dataset> Size: 8MB
Dimensions:                             (init_time: 1, prediction_timedelta: 3,
                                         latitude: 421, longitude: 781)
Coordinates:
  * init_time                           (init_time) datetime64[ns] 8B 2025-07-01
  * prediction_timedelta                (prediction_timedelta) timedelta64[ns] 24B ...
  * latitude                            (latitude) float32 2kB 36.0 ... 71.0
  * longitude                           (longitude) float32 3kB -15.0 ... 50.0
Data variables:
    air_temperature_at_height_level_2m  (init_time, prediction_timedelta, latitude, longitude) float32 4MB ...
    wind_speed_at_height_level_100m     (init_time, prediction_timedelta, latitude, longitude) float32 4MB ...
```

{% endtab %}
{% endtabs %}

### Requesting Hindcasts for Models

Hindcasts can be obtained directly through the same `get_forecasts` method.

{% tabs %}
{% tab title="Point-Based" %}

```python
from datetime import datetime
from jua import JuaClient
from jua.types.geo import LatLon
from jua.weather import Models, Variables

# Setup JuaClient
client = JuaClient()

# Choose the model
model = client.weather.get_model(Models.EPT2)

# Defining the sites that we are interested in
sites = [
    # label is optional
    LatLon(55.06, 13.00, label="Kriegers Flak"),
    LatLon(54.04, 5.96, label="Gemini Wind Farm"),
    LatLon(51.71, 2.91, label="Borssele III & IV"),
    LatLon(53.89, 1.79, label="Hornsea Two"),
]

# Define the variables we are interested in
# If set to `None` all available variables will be loaded
variables = [
    Variables.WIND_SPEED_AT_HEIGHT_LEVEL_10M,
]

site_forecasts = model.get_forecasts(
    init_time=slice(
        datetime(2025, month=1, day=1),
        datetime(2025, month=3, day=31, hour=23, minute=59),
    ),
    points=sites,
    # The below parameters are optional
    variables=variables,
    min_lead_time=0, # hours
    max_lead_time=72, # hours
    method="bilinear",
)

# Convert the response to an xarray dataset
print(site_forecasts.to_xarray()) 
```

```
<xarray.Dataset> Size: 424kB
Dimensions:                         (points: 4, init_time: 360,
                                     prediction_timedelta: 73)
Coordinates:
  * points                          (points) object 32B 'borssele_iii_&_iv' ....
  * init_time                       (init_time) datetime64[ns] 3kB 2025-01-01...
  * prediction_timedelta            (prediction_timedelta) timedelta64[ns] 584B ...
    latitude                        (points) float32 16B 51.71 54.04 53.89 55.06
    longitude                       (points) float32 16B 2.91 5.96 1.79 13.0
    requested_lat                   (points) float64 32B 51.71 54.04 53.89 55.06
    requested_lon                   (points) float64 32B 2.91 5.96 1.79 13.0
Data variables:
    wind_speed_at_height_level_10m  (points, init_time, prediction_timedelta) float32 420kB ...
```

> ⚠️ When querying data with `method="nearest"` the returned coordinates will be slightly different to the requested ones, as it will return the coordinates of the nearest grid points for the model.
> {% endtab %}

{% tab title="Region-Based" %}

> ⚠️ Region-based requests can be expensive. For more information, see our [pricing](https://developer.jua.ai) docs. In this example, the `request_credit_limit` needs to be increased for the `JuaClient` or the request will fail.
>
> ⚠️ Requests might be large and take a long time to load.
>
> ⚠️ When pulling large grids, it's better to make smaller requests and combine the data locally (also so that your local memory does not run out)

```python
europe_lat_slice = slice(36, 71) 
europe_lon_slice = slice(-15, 50)
variables = [
    Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M,
    Variables.WIND_SPEED_AT_HEIGHT_LEVEL_100M,
]

forecast = model.get_forecasts(
    init_time=slice(
        datetime(2025, month=1, day=1, hour=0),
        datetime(2025, month=1, day=1, hour=18),
    ),
    variables=variables,
    latitude=europe_lat_slice,
    longitude=europe_lon_slice,
    max_lead_time=2 * 24,
)

```

```
<xarray.Dataset> Size: 516MB
Dimensions:                             (init_time: 4,
                                         prediction_timedelta: 49,
                                         latitude: 421, longitude: 781)
Coordinates:
  * init_time                           (init_time) datetime64[ns] 32B 2025-0...
  * prediction_timedelta                (prediction_timedelta) timedelta64[ns] 392B ...
  * latitude                            (latitude) float32 2kB 36.0 ... 71.0
  * longitude                           (longitude) float32 3kB -15.0 ... 50.0
Data variables:
    air_temperature_at_height_level_2m  (init_time, prediction_timedelta, latitude, longitude) float32 258MB ...
    wind_speed_at_height_level_100m     (init_time, prediction_timedelta, latitude, longitude) float32 258MB ...
```

{% endtab %}
{% endtabs %}


# Large Requests

Making very large requests for data can fail as the request can stall, time out, or the requested data could be so large that it does not fit in your computer's memory. It's better practice to make smaller requests and combine data locally.

Once a stream breaks you also have to retry the whole job. There's also no restart point when everything sits inside a single request. A mid-stream error wipes out all progress.

### Best practices

* Grouping request in the `init_time` dimension will lead to the best performance. Make requests for a single `init_time` (or group them together, such as by requesting all forecasts for a given day).
* Write results to disk as soon as they arrive so you can resume from the last successful batch.
* Use an append-friendly format such as Zarr, which avoids keeping the entire dataset in memory.

### Example: Fetching Europe for August 2024

```python
from datetime import datetime
from pathlib import Path

import pandas as pd

from jua import JuaClient
from jua.weather import Models, Variables


# Increase the request_credit_limit if desired or needed
client = JuaClient(request_credit_limit=10_000)

model = client.weather.get_model(Models.EPT2)

# Get all daily init_times for a week of EPT2
init_times = (
    pd.date_range(
        start=datetime(2024, 8, 1, 0),
        end=datetime(2024, 8, 31, 18),
        freq="6H",
        inclusive="both",
    )
    .to_pydatetime()
    .tolist()
)

zarr_path = Path("./hindcast_2024_august.zarr")

for index, init_time in enumerate(init_times):
    print(
        f"Fetching {index + 1}/{len(init_times)} "
        f"for init_time={init_time.isoformat()} ..."
    )

    jua_ds = model.get_forecasts(
        init_time=init_time,
        variables=[
            Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M,
            Variables.WIND_SPEED_AT_HEIGHT_LEVEL_10M,
            Variables.WIND_SPEED_AT_HEIGHT_LEVEL_100M,
            Variables.SURFACE_DIRECT_DOWNWELLING_SHORTWAVE_FLUX_SUM_1H,
            Variables.SURFACE_DOWNWELLING_SHORTWAVE_FLUX_SUM_1H,
        ],
        latitude=slice(72, 36),
        longitude=slice(-15, 35),
        max_lead_time=48,
    )

    dataset = jua_ds.to_xarray().chunk({"init_time": 1})

    if index == 0:
        dataset.to_zarr(zarr_path, mode="w")
        print(f"Wrote initial dataset to {zarr_path}")
    else:
        dataset.to_zarr(zarr_path, mode="a", append_dim="init_time")
        print(f"Appended dataset for {init_time.isoformat()} to {zarr_path}")
```

The loop fetches a handful of init times at a time, stores each batch immediately, and prints simple progress messages. If the connection drops after batch 5, rerun the script: the first five init times finish instantly thanks to caching, and the script resumes with batch 6. Memory use stays bounded because only one batch is loaded at any moment.

Treat this pattern as the baseline for long backfills. It keeps requests short, makes restarts painless, and protects local machines from surprises.


# xarray Extensions

## Jua xarray Extensions

The Jua Python SDK extends the popular [xarray](https://docs.xarray.dev/) library with weather-specific functionality to make working with meteorological data more intuitive and convenient.

### Overview

Jua's xarray extensions provide:

1. Weather-specific data selection capabilities
2. Unit conversion utilities
3. Time handling enhancements
4. Point-based geographic selection
5. Enhanced type hints for better IDE support

These extensions are automatically applied when you use the SDK - no extra steps required.

### Extended Functionality at a Glance

The SDK adds several powerful extensions to xarray:

* **Enhanced `sel()` method** with additional parameters:
  * `prediction_timedelta` - Select by forecast lead time
  * `points` - Select by geographic points
  * Support for proper North-to-South latitude slicing
* **New accessor methods** via `.jua` accessor or direct methods:
  * `.to_celcius()` - Convert temperature from Kelvin to Celsius
  * `.to_absolute_time()` - Convert from lead times to absolute dates
  * `.select_point()` - Select data at specific geographic locations
* **Variable access** with Jua's `Variables` enum for type safety

### Key Features

#### Extended Data Selection

```python
# Select data using prediction lead times
forecast_data.sel(prediction_timedelta=24)  # 24-hour forecast
forecast_data.sel(prediction_timedelta=slice(24, 72))  # 1-3 day forecast
forecast_data.sel(prediction_timedelta=slice(0, 120, 6))  # Every 6 hours up to 5 days

# Select geographic regions with natural ordering
# Note: latitude goes from North to South (higher to lower values)
europe_data = forecast_data.sel(
    latitude=slice(72, 36),    # North to South
    longitude=slice(-15, 35)   # West to East
)
```

#### Point-Based Selection

```python
from jua.types.geo import LatLon

# Select data for specific locations
cities = [
    LatLon(lat=51.5074, lon=-0.1278, name="London"),
    LatLon(lat=40.7128, lon=-74.0060, name="New York")
]

# Using direct selection
city_data = forecast_data.sel(points=cities)

# Or using the accessor
city_data = forecast_data.jua.select_point(cities)

# Access data for a specific city
london_data = city_data.sel(points="London")
```

#### Unit Conversions

```python
# Get temperature data
temperature = forecast_data["air_temperature_at_height_level_2m"]

# Convert from Kelvin to Celsius
celsius = temperature.to_celcius()
# or
celsius = temperature.jua.to_celcius()
```

#### Time Handling

```python
# Convert from prediction lead times to absolute times
absolute_times = forecast_data.to_absolute_time()
# or
absolute_times = forecast_data.jua.to_absolute_time()
```

#### Type-Safe Variable Access

```python
from jua.weather import Variables

# Access variables using enum members (with autocompletion and type checking)
temperature = forecast_data[Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M]
wind_speed = forecast_data[Variables.WIND_SPEED_AT_HEIGHT_LEVEL_10M]
```

Best Practices

1. **Use Variables enum** for type-safe variable access
2. **Use xarray's powerful data analysis capabilities** - these extensions preserve all standard xarray functionality


# Market Aggregates

Market aggregates, especially used with weighting such as capacity weighting, are useful proxies to estimate how differences in forecasts - either between models or between different forecasts of the same model - impact energy production & consumption. For more information about market aggregates, see the [Market Aggregates](/api-v2/query-engine/market-aggregates) page.

Market aggregates can be queried directly through the Jua Python SDK, using the `MarketAggregates` class.

## Example

As an introduction to market aggregates in the SDK, see this simple example. For more examples, please see [our GitHub repository](https://github.com/juaAI/jua-python-sdk/tree/main/examples/market_aggregates).

```python
from datetime import datetime

import matplotlib.pyplot as plt
from jua import JuaClient
from jua.market_aggregates import AggregateVariables, ModelRuns
from jua.types import MarketZones
from jua.weather import Models

client = JuaClient()

# Create an energy market for specific zones
germany = client.market_aggregates.get_market(market_zone=MarketZones.DE)

# Select two EPT-2 forecasts and two ECMWF IFS forecasts to compare
model_runs = [
    ModelRuns(
        Models.EPT2, 
        [
            datetime(2025, 9, 29, 0),
            datetime(2025, 9, 29, 6),
        ]
    ),
    ModelRuns(
        Models.ECMWF_IFS_SINGLE, 
        [
            datetime(2025, 9, 29, 0),
            datetime(2025, 9, 29, 6),
        ]
    ),
]

# Retrieve the 2-day 10m wind market aggregates for Germany
# An xarray.Dataset is returned, containing the market aggregates
# for each model run
wind_data = germany.compare_runs(
    agg_variable=AggregateVariables.WIND_SPEED_AT_HEIGHT_LEVEL_10M,
    model_runs=model_runs,
    max_lead_time=48,
)

# Plot the 4 market aggregates using matplotlib
fig, ax = plt.subplots(figsize=(15, 5))
wind_data["wind_speed_at_height_level_10m"].plot(ax=ax, x="time", hue="model_run")
ax.set_title("10m Wind Market Aggregates: Germany")
plt.show()
```

This will plot the following:

<figure><img src="/files/OlOLcVMUPFnOO4jJ9PXM" alt=""><figcaption></figcaption></figure>

## Documentation

### Aggregate Variables

The `AggregateVariables` enum provides the following variables:

* `AggregateVariables.WIND_SPEED_AT_HEIGHT_LEVEL_10M`
* `AggregateVariables.WIND_SPEED_AT_HEIGHT_LEVEL_100M`
* `AggregateVariables.SURFACE_DOWNWELLING_SHORTWAVE_FLUX_SUM_1H`
* `AggregateVariables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M`

Aggregate variables automatically uses the appropriate weighting from the `Weighting` enum:

* **Wind variables** use `Weighting.WIND_CAPACITY`
* **Solar variables** use `Weighting.SOLAR_CAPACITY`
* **Temperature** uses `Weighting.POPULATION`

Example:

{% tabs %}
{% tab title="Accessing all available AggregateVariables" %}

```python
# Listing all available AggregateVariables
print("Available AggregateVariables:")
for var in AggregateVariables:
    print(f"  - variable: {var}")
```

{% endtab %}

{% tab title="Output" %}

```
Available AggregateVariables:
  - variable: AggregateVariables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M
  - variable: AggregateVariables.SURFACE_DOWNWELLING_SHORTWAVE_FLUX_SUM_1H
  - variable: AggregateVariables.WIND_SPEED_AT_HEIGHT_LEVEL_10M
  - variable: AggregateVariables.WIND_SPEED_AT_HEIGHT_LEVEL_100M
```

{% endtab %}
{% endtabs %}

### Energy Market

An `EnergyMarket` provides access to spatially aggregated forecast data for specific market zones. Data is weighted by the appropriate factor (wind capacity, solar capacity, or population) depending on the variable requested. This is useful for energy market analysis where you need regionally aggregated forecasts.

```
Attributes:
    client: JuaClient
        The JuaClient instance for API communication.
    market_zone: MarketZones | str | list[MarketZones | str]
        The market zones or list of market zones to aggregate data for.

Methods:
    compare_runs():
        Attributes:
            agg_variable: AggregateVariable | AggregateVariables
                The AggregateVariable specifying which variable to query.
        
            model_runs: list[ModelRuns]
                List of ModelRuns instances specifying which model forecasts to
                query. Each ModelRuns contains a model and one or more init_times
                (datetimes or non-negative integers).

            min_lead_time: int
                Minimum forecast lead time in hours (default: 0).
            
            max_lead_time: int | None
                Maximum forecast lead time in hours. If None, returns
                all available lead times.

            temporal_aggregation: TemporalAggregation | None
                Optional temporal resampling configuration. When provided,
                the `time` dimension is resampled to the specified frequency
                (e.g. daily) using the chosen method (e.g. mean, sum).

        Returns:
            xarray.Dataset containing `model_run` and `time` dimensions, with
            `prediction_timedelta` and the queried variable as data_vars.

    compare_runs_mw():
        Like compare_runs(), but returns predicted megawatt (MW) values
        instead of raw weather variables. Takes a `weighting` argument
        instead of `agg_variable`; all other arguments are identical.
        See the MW Output section below.
```

Examples:

```python
from datetime import datetime

from jua import JuaClient
from jua.market_aggregates import AggregateVariables, ModelRuns
from jua.types import MarketZones
from jua.weather import Models

client = JuaClient()

# Create an energy market for specific zones
germany = client.market_aggregates.get_market(market_zone=MarketZones.DE)

# Select two EPT-2 forecasts and two ECMWF IFS forecasts to compare
model_runs = [ModelRuns(Models.EPT2, [0, 1])]

# Retrieve the 2-day 10m wind market aggregates for Germany
wind_data = germany.compare_runs(
    agg_variable=AggregateVariables.SURFACE_DOWNWELLING_SHORTWAVE_FLUX_SUM_1H,
    model_runs=model_runs,
    max_lead_time=48,
)
```

### MW Output

`compare_runs_mw()` returns predicted **megawatts (MW)** instead of raw weather values. This is useful for comparing different models and quick MW estimates across many European zones.

```python
from jua import JuaClient
from jua.market_aggregates import ModelRuns
from jua.types import MarketZones
from jua.weather import Models

client = JuaClient()
germany = client.market_aggregates.get_market(market_zone=MarketZones.DE)

# Wind production in MW for the two most recent EPT-2 runs
wind_mw = germany.compare_runs_mw(
    weighting="wind_capacity",
    model_runs=[ModelRuns(Models.EPT2, [0, 1])],
    max_lead_time=48,
)

print(list(wind_mw.data_vars))
# ['prediction_timedelta', 'market_zone', 'wind_onshore_mw', 'wind_offshore_mw']
```

Instead of `agg_variable`, `compare_runs_mw()` takes a `weighting`, which determines the returned data variables:

| Weighting          | Data variables                                            |
| ------------------ | --------------------------------------------------------- |
| `"wind_capacity"`  | `wind_onshore_mw`, `wind_offshore_mw`, or `wind_total_mw` |
| `"solar_capacity"` | `solar_mw`                                                |

Zones with a single combined wind capacity return `wind_total_mw` (today: `GB` only). Zones with only onshore capacity return `wind_offshore_mw` with `None` values.

The returned `xarray.Dataset` has the same `model_run` and `time` dimensions as `compare_runs()`, with `unit` set to `"MW"` in its attributes.

{% hint style="info" %}
**Looking for actual production forecasts?** MW output provides a forecast of **potential production**. For a forecast of **actual production**, use the [Power Forecast](/python-sdk/power-forecast) — significantly more accurate, and currently available for Germany, France, United Kingdom, Belgium, and Netherlands (Solar, Wind).
{% endhint %}

#### MW-capable zones

MW output is available for a subset of market zones. The list grows over time as new zones are onboarded, so query it rather than hard-coding a list:

```python
mw_zones = client.market_aggregates.get_mw_zones()

print(mw_zones["wind"])   # ['AT', 'BA', 'BE', 'BG', 'CH', 'CY', 'CZ', 'DE', ...]
print(mw_zones["solar"])  # ['AT', 'BA', 'BE', 'BG', 'CH', 'CY', 'CZ', 'DE', ...]
```

* `wind` — zones supporting `"wind_capacity"` weighting
* `solar` — zones supporting `"solar_capacity"` weighting

### Temporal Aggregation

By default, market aggregates are returned at hourly resolution. Pass a `TemporalAggregation` to resample the `time` dimension into daily or weekly buckets. This works with both `compare_runs()` and `compare_runs_mw()`.

```python
from jua.market_aggregates import (
    AggregateVariables,
    AggregationFrequency,
    AggregationMethod,
    ModelRuns,
    TemporalAggregation,
)

# Daily mean wind speed over a 5-day forecast
daily = germany.compare_runs(
    agg_variable=AggregateVariables.WIND_SPEED_AT_HEIGHT_LEVEL_100M,
    model_runs=[ModelRuns(Models.EPT2, 0)],
    max_lead_time=120,
    temporal_aggregation=TemporalAggregation(
        AggregationFrequency.DAILY,
        AggregationMethod.MEAN,
    ),
)

# Daily total solar production
daily_solar = germany.compare_runs_mw(
    weighting="solar_capacity",
    model_runs=[ModelRuns(Models.EPT2, 0)],
    max_lead_time=120,
    temporal_aggregation=TemporalAggregation(
        AggregationFrequency.DAILY,
        AggregationMethod.SUM,
    ),
)
```

`AggregationFrequency` supports `DAILY` and `WEEKLY`. `AggregationMethod` supports `MEAN` (the default if omitted), `SUM`, `MIN` and `MAX`.

`prediction_timedelta` is not included in the returned dataset when temporal aggregation is applied.

### Market Zones

The `MarketZones` is a simple helper Enum containing the available market zones for market aggregate queries.

Example:

{% tabs %}
{% tab title="List Available MarketZones" %}

```python
from jua.types import MarketZones

print("Available MarketZones:")
for market_zone in MarketZones:
    print(f"  - {market_zone.name} (country: {market_zone.country})")
```

{% endtab %}

{% tab title="Output" %}

```
Available MarketZones:
  - AD (country: Countries.ANDORRA)
  - AE (country: Countries.UNITED_ARAB_EMIRATES)
  - AF (country: Countries.AFGHANISTAN)
  - AG (country: Countries.ANTIGUA_AND_BARBUDA)
  - AL (country: Countries.ALBANIA)
  - AM (country: Countries.ARMENIA)
  - AO (country: Countries.ANGOLA)
  - AR (country: Countries.ARGENTINA)
  - AT (country: Countries.AUSTRIA)
  - AU_LH (country: Countries.AUSTRALIA)
  - AU_NSW (country: Countries.AUSTRALIA)
  - AU_NT (country: Countries.AUSTRALIA)
  - AU_QLD (country: Countries.AUSTRALIA)
  - AU_SA (country: Countries.AUSTRALIA)
  - AU_TAS (country: Countries.AUSTRALIA)
  - AU_TAS_CBI (country: Countries.AUSTRALIA)
  - AU_TAS_FI (country: Countries.AUSTRALIA)
  - AU_TAS_KI (country: Countries.AUSTRALIA)
  - AU_VIC (country: Countries.AUSTRALIA)
  - AU_WA (country: Countries.AUSTRALIA)
  - AW (country: Countries.ARUBA)
  - AX (country: Countries.ALAND_ISLANDS)
  - AZ (country: Countries.AZERBAIJAN)
  - BA (country: Countries.BOSNIA_AND_HERZEGOVINA)
  - BB (country: Countries.BARBADOS)
  - BD (country: Countries.BANGLADESH)
  - BE (country: Countries.BELGIUM)
  - BF (country: Countries.BURKINA_FASO)
  - BG (country: Countries.BULGARIA)
  - BH (country: Countries.BAHRAIN)
  - BI (country: Countries.BURUNDI)
  - BJ (country: Countries.BENIN)
  - BM (country: Countries.BERMUDA)
  - BN (country: Countries.BRUNEI_DARUSSALAM)
  - BO (country: Countries.BOLIVIA_PLURINATIONAL_STATE_OF)
  - BR_CS (country: Countries.BRAZIL)
  - BR_N (country: Countries.BRAZIL)
  - BR_NE (country: Countries.BRAZIL)
  - BR_S (country: Countries.BRAZIL)
  - BS (country: Countries.BAHAMAS)
  - BT (country: Countries.BHUTAN)
  - BW (country: Countries.BOTSWANA)
  - BY (country: Countries.BELARUS)
  - BZ (country: Countries.BELIZE)
  - CA_AB (country: Countries.CANADA)
  - CA_BC (country: Countries.CANADA)
  - CA_MB (country: Countries.CANADA)
  - CA_NB (country: Countries.CANADA)
  - CA_NL (country: Countries.CANADA)
  - CA_NS (country: Countries.CANADA)
  - CA_NT (country: Countries.CANADA)
  - CA_NU (country: Countries.CANADA)
  - CA_ON (country: Countries.CANADA)
  - CA_PE (country: Countries.CANADA)
  - CA_QC (country: Countries.CANADA)
  - CA_SK (country: Countries.CANADA)
  - CA_YT (country: Countries.CANADA)
  - CD (country: Countries.CONGO_THE_DEMOCRATIC_REPUBLIC_OF_THE)
  - CF (country: Countries.CENTRAL_AFRICAN_REPUBLIC)
  - CG (country: Countries.CONGO)
  - CH (country: Countries.SWITZERLAND)
  - CI (country: Countries.COTE_DIVOIRE)
  - CL_CHP (country: Countries.CHILE)
  - CL_SEA (country: Countries.CHILE)
  - CL_SEM (country: Countries.CHILE)
  - CL_SEN (country: Countries.CHILE)
  - CM (country: Countries.CAMEROON)
  - CN (country: Countries.CHINA)
  - CO (country: Countries.COLOMBIA)
  - CR (country: Countries.COSTA_RICA)
  - CU (country: Countries.CUBA)
  - CV (country: Countries.CABO_VERDE)
  - CW (country: Countries.CURACAO)
  - CY (country: Countries.CYPRUS)
  - CZ (country: Countries.CZECHIA)
  - DE (country: Countries.GERMANY)
  - DJ (country: Countries.DJIBOUTI)
  - DK_BHM (country: Countries.DENMARK)
  - DK_DK1 (country: Countries.DENMARK)
  - DK_DK2 (country: Countries.DENMARK)
  - DM (country: Countries.DOMINICA)
  - DO (country: Countries.DOMINICAN_REPUBLIC)
  - DZ (country: Countries.ALGERIA)
  - EC (country: Countries.ECUADOR)
  - EE (country: Countries.ESTONIA)
  - EG (country: Countries.EGYPT)
  - EH (country: Countries.WESTERN_SAHARA)
  - ER (country: Countries.ERITREA)
  - ES (country: Countries.SPAIN)
  - ES_CN_FV (country: Countries.SPAIN)
  - ES_CN_GC (country: Countries.SPAIN)
  - ES_CN_HI (country: Countries.SPAIN)
  - ES_CN_IG (country: Countries.SPAIN)
  - ES_CN_LP (country: Countries.SPAIN)
  - ES_CN_LZ (country: Countries.SPAIN)
  - ES_CN_TE (country: Countries.SPAIN)
  - ES_IB_FO (country: Countries.SPAIN)
  - ES_IB_IZ (country: Countries.SPAIN)
  - ES_IB_MA (country: Countries.SPAIN)
  - ES_IB_ME (country: Countries.SPAIN)
  - ET (country: Countries.ETHIOPIA)
  - FI (country: Countries.FINLAND)
  - FJ (country: Countries.FIJI)
  - FK (country: Countries.FALKLAND_ISLANDS_MALVINAS)
  - FM (country: Countries.MICRONESIA_FEDERATED_STATES_OF)
  - FO_MI (country: Countries.FAROE_ISLANDS)
  - FO_SI (country: Countries.FAROE_ISLANDS)
  - FR (country: Countries.FRANCE)
  - FR_COR (country: Countries.FRANCE)
  - GA (country: Countries.GABON)
  - GB (country: Countries.UNITED_KINGDOM)
  - GB_NIR (country: Countries.UNITED_KINGDOM)
  - GB_ORK (country: Countries.UNITED_KINGDOM)
  - GB_ZET (country: Countries.UNITED_KINGDOM)
  - GE (country: Countries.GEORGIA)
  - GF (country: Countries.FRENCH_GUIANA)
  - GG (country: Countries.GUERNSEY)
  - GH (country: Countries.GHANA)
  - GL (country: Countries.GREENLAND)
  - GM (country: Countries.GAMBIA)
  - GN (country: Countries.GUINEA)
  - GP (country: Countries.GUADELOUPE)
  - GQ (country: Countries.EQUATORIAL_GUINEA)
  - GR (country: Countries.GREECE)
  - GT (country: Countries.GUATEMALA)
  - GU (country: Countries.GUAM)
  - GW (country: Countries.GUINEA_BISSAU)
  - GY (country: Countries.GUYANA)
  - HK (country: Countries.HONG_KONG)
  - HN (country: Countries.HONDURAS)
  - HR (country: Countries.CROATIA)
  - HT (country: Countries.HAITI)
  - HU (country: Countries.HUNGARY)
  - ID (country: Countries.INDONESIA)
  - IE (country: Countries.IRELAND)
  - IL (country: Countries.ISRAEL)
  - IM (country: Countries.ISLE_OF_MAN)
  - IN_AN (country: Countries.INDIA)
  - IN_EA (country: Countries.INDIA)
  - IN_NE (country: Countries.INDIA)
  - IN_NO (country: Countries.INDIA)
  - IN_SO (country: Countries.INDIA)
  - IN_WE (country: Countries.INDIA)
  - IQ (country: Countries.IRAQ)
  - IR (country: Countries.IRAN_ISLAMIC_REPUBLIC_OF)
  - IS (country: Countries.ICELAND)
  - IT_CNO (country: Countries.ITALY)
  - IT_CSO (country: Countries.ITALY)
  - IT_NO (country: Countries.ITALY)
  - IT_SAR (country: Countries.ITALY)
  - IT_SIC (country: Countries.ITALY)
  - IT_SO (country: Countries.ITALY)
  - JE (country: Countries.JERSEY)
  - JM (country: Countries.JAMAICA)
  - JO (country: Countries.JORDAN)
  - JP_CB (country: Countries.JAPAN)
  - JP_CG (country: Countries.JAPAN)
  - JP_HKD (country: Countries.JAPAN)
  - JP_HR (country: Countries.JAPAN)
  - JP_KN (country: Countries.JAPAN)
  - JP_KY (country: Countries.JAPAN)
  - JP_ON (country: Countries.JAPAN)
  - JP_SK (country: Countries.JAPAN)
  - JP_TH (country: Countries.JAPAN)
  - JP_TK (country: Countries.JAPAN)
  - KE (country: Countries.KENYA)
  - KG (country: Countries.KYRGYZSTAN)
  - KH (country: Countries.CAMBODIA)
  - KM (country: Countries.COMOROS)
  - KP (country: Countries.KOREA_DEMOCRATIC_PEOPLES_REPUBLIC_OF)
  - KR (country: Countries.KOREA_REPUBLIC_OF)
  - KW (country: Countries.KUWAIT)
  - KY (country: Countries.CAYMAN_ISLANDS)
  - KZ (country: Countries.KAZAKHSTAN)
  - LA (country: Countries.LAO_PEOPLES_DEMOCRATIC_REPUBLIC)
  - LB (country: Countries.LEBANON)
  - LC (country: Countries.SAINT_LUCIA)
  - LI (country: Countries.LIECHTENSTEIN)
  - LK (country: Countries.SRI_LANKA)
  - LR (country: Countries.LIBERIA)
  - LS (country: Countries.LESOTHO)
  - LT (country: Countries.LITHUANIA)
  - LU (country: Countries.LUXEMBOURG)
  - LV (country: Countries.LATVIA)
  - LY (country: Countries.LIBYA)
  - MA (country: Countries.MOROCCO)
  - MD (country: Countries.MOLDOVA_REPUBLIC_OF)
  - ME (country: Countries.MONTENEGRO)
  - MG (country: Countries.MADAGASCAR)
  - MK (country: Countries.NORTH_MACEDONIA)
  - ML (country: Countries.MALI)
  - MM (country: Countries.MYANMAR)
  - MN (country: Countries.MONGOLIA)
  - MQ (country: Countries.MARTINIQUE)
  - MR (country: Countries.MAURITANIA)
  - MT (country: Countries.MALTA)
  - MU (country: Countries.MAURITIUS)
  - MV (country: Countries.MALDIVES)
  - MW (country: Countries.MALAWI)
  - MX (country: Countries.MEXICO)
  - MY_EM (country: Countries.MALAYSIA)
  - MY_WM (country: Countries.MALAYSIA)
  - MZ (country: Countries.MOZAMBIQUE)
  - NA (country: Countries.NAMIBIA)
  - NC (country: Countries.NEW_CALEDONIA)
  - NE (country: Countries.NIGER)
  - NG (country: Countries.NIGERIA)
  - NI (country: Countries.NICARAGUA)
  - NL (country: Countries.NETHERLANDS)
  - NO_NO1 (country: Countries.NORWAY)
  - NO_NO2 (country: Countries.NORWAY)
  - NO_NO3 (country: Countries.NORWAY)
  - NO_NO4 (country: Countries.NORWAY)
  - NO_NO5 (country: Countries.NORWAY)
  - NP (country: Countries.NEPAL)
  - NZ (country: Countries.NEW_ZEALAND)
  - NZ_NZC (country: Countries.NEW_ZEALAND)
  - NZ_NZST (country: Countries.NEW_ZEALAND)
  - OM (country: Countries.OMAN)
  - PA (country: Countries.PANAMA)
  - PE (country: Countries.PERU)
  - PF (country: Countries.FRENCH_POLYNESIA)
  - PG (country: Countries.PAPUA_NEW_GUINEA)
  - PH_LU (country: Countries.PHILIPPINES)
  - PH_MI (country: Countries.PHILIPPINES)
  - PH_VI (country: Countries.PHILIPPINES)
  - PK (country: Countries.PAKISTAN)
  - PL (country: Countries.POLAND)
  - PM (country: Countries.SAINT_PIERRE_AND_MIQUELON)
  - PR (country: Countries.PUERTO_RICO)
  - PS (country: Countries.PALESTINE_STATE_OF)
  - PT (country: Countries.PORTUGAL)
  - PT_AC (country: Countries.PORTUGAL)
  - PT_MA (country: Countries.PORTUGAL)
  - PW (country: Countries.PALAU)
  - PY (country: Countries.PARAGUAY)
  - QA (country: Countries.QATAR)
  - RE (country: Countries.REUNION)
  - RO (country: Countries.ROMANIA)
  - RS (country: Countries.SERBIA)
  - RU_1 (country: Countries.RUSSIAN_FEDERATION)
  - RU_2 (country: Countries.RUSSIAN_FEDERATION)
  - RU_AS (country: Countries.RUSSIAN_FEDERATION)
  - RU_EU (country: Countries.RUSSIAN_FEDERATION)
  - RU_FE (country: Countries.RUSSIAN_FEDERATION)
  - RU_KGD (country: Countries.RUSSIAN_FEDERATION)
  - RW (country: Countries.RWANDA)
  - SA (country: Countries.SAUDI_ARABIA)
  - SB (country: Countries.SOLOMON_ISLANDS)
  - SC (country: Countries.SEYCHELLES)
  - SD (country: Countries.SUDAN)
  - SE_SE1 (country: Countries.SWEDEN)
  - SE_SE2 (country: Countries.SWEDEN)
  - SE_SE3 (country: Countries.SWEDEN)
  - SE_SE4 (country: Countries.SWEDEN)
  - SG (country: Countries.SINGAPORE)
  - SI (country: Countries.SLOVENIA)
  - SJ (country: Countries.SVALBARD_AND_JAN_MAYEN)
  - SK (country: Countries.SLOVAKIA)
  - SL (country: Countries.SIERRA_LEONE)
  - SN (country: Countries.SENEGAL)
  - SO (country: Countries.SOMALIA)
  - SR (country: Countries.SURINAME)
  - SS (country: Countries.SOUTH_SUDAN)
  - ST (country: Countries.SAO_TOME_AND_PRINCIPE)
  - SV (country: Countries.EL_SALVADOR)
  - SY (country: Countries.SYRIAN_ARAB_REPUBLIC)
  - SZ (country: Countries.ESWATINI)
  - TD (country: Countries.CHAD)
  - TG (country: Countries.TOGO)
  - TH (country: Countries.THAILAND)
  - TJ (country: Countries.TAJIKISTAN)
  - TL (country: Countries.TIMOR_LESTE)
  - TM (country: Countries.TURKMENISTAN)
  - TN (country: Countries.TUNISIA)
  - TO (country: Countries.TONGA)
  - TR (country: Countries.TURKEY)
  - TT (country: Countries.TRINIDAD_AND_TOBAGO)
  - TW (country: Countries.TAIWAN_PROVINCE_OF_CHINA)
  - TZ (country: Countries.TANZANIA_UNITED_REPUBLIC_OF)
  - UA (country: Countries.UKRAINE)
  - UA_CR (country: Countries.UKRAINE)
  - UG (country: Countries.UGANDA)
  - US_AK (country: Countries.UNITED_STATES)
  - US_AK_SEAPA (country: Countries.UNITED_STATES)
  - US_CAL_BANC (country: Countries.UNITED_STATES)
  - US_CAL_CISO (country: Countries.UNITED_STATES)
  - US_CAL_IID (country: Countries.UNITED_STATES)
  - US_CAL_LDWP (country: Countries.UNITED_STATES)
  - US_CAL_TIDC (country: Countries.UNITED_STATES)
  - US_CAR_CPLE (country: Countries.UNITED_STATES)
  - US_CAR_CPLW (country: Countries.UNITED_STATES)
  - US_CAR_DUK (country: Countries.UNITED_STATES)
  - US_CAR_SC (country: Countries.UNITED_STATES)
  - US_CAR_SCEG (country: Countries.UNITED_STATES)
  - US_CENT_SPA (country: Countries.UNITED_STATES)
  - US_CENT_SWPP (country: Countries.UNITED_STATES)
  - US_FLA_FMPP (country: Countries.UNITED_STATES)
  - US_FLA_FPC (country: Countries.UNITED_STATES)
  - US_FLA_FPL (country: Countries.UNITED_STATES)
  - US_FLA_GVL (country: Countries.UNITED_STATES)
  - US_FLA_HST (country: Countries.UNITED_STATES)
  - US_FLA_JEA (country: Countries.UNITED_STATES)
  - US_FLA_SEC (country: Countries.UNITED_STATES)
  - US_FLA_TAL (country: Countries.UNITED_STATES)
  - US_FLA_TEC (country: Countries.UNITED_STATES)
  - US_HI (country: Countries.UNITED_STATES)
  - US_MIDA_PJM (country: Countries.UNITED_STATES)
  - US_MIDW_AECI (country: Countries.UNITED_STATES)
  - US_MIDW_LGEE (country: Countries.UNITED_STATES)
  - US_MIDW_MISO (country: Countries.UNITED_STATES)
  - US_NE_ISNE (country: Countries.UNITED_STATES)
  - US_NW_AVA (country: Countries.UNITED_STATES)
  - US_NW_BPAT (country: Countries.UNITED_STATES)
  - US_NW_CHPD (country: Countries.UNITED_STATES)
  - US_NW_DOPD (country: Countries.UNITED_STATES)
  - US_NW_GCPD (country: Countries.UNITED_STATES)
  - US_NW_IPCO (country: Countries.UNITED_STATES)
  - US_NW_NEVP (country: Countries.UNITED_STATES)
  - US_NW_NWMT (country: Countries.UNITED_STATES)
  - US_NW_PACE (country: Countries.UNITED_STATES)
  - US_NW_PACW (country: Countries.UNITED_STATES)
  - US_NW_PGE (country: Countries.UNITED_STATES)
  - US_NW_PSCO (country: Countries.UNITED_STATES)
  - US_NW_PSEI (country: Countries.UNITED_STATES)
  - US_NW_SCL (country: Countries.UNITED_STATES)
  - US_NW_TPWR (country: Countries.UNITED_STATES)
  - US_NW_WACM (country: Countries.UNITED_STATES)
  - US_NW_WAUW (country: Countries.UNITED_STATES)
  - US_NY_NYIS (country: Countries.UNITED_STATES)
  - US_SE_SOCO (country: Countries.UNITED_STATES)
  - US_SW_AZPS (country: Countries.UNITED_STATES)
  - US_SW_EPE (country: Countries.UNITED_STATES)
  - US_SW_PNM (country: Countries.UNITED_STATES)
  - US_SW_SRP (country: Countries.UNITED_STATES)
  - US_SW_TEPC (country: Countries.UNITED_STATES)
  - US_SW_WALC (country: Countries.UNITED_STATES)
  - US_TEN_TVA (country: Countries.UNITED_STATES)
  - US_TEX_ERCO (country: Countries.UNITED_STATES)
  - UY (country: Countries.URUGUAY)
  - UZ (country: Countries.UZBEKISTAN)
  - VC (country: Countries.SAINT_VINCENT_AND_THE_GRENADINES)
  - VE (country: Countries.VENEZUELA_BOLIVARIAN_REPUBLIC_OF)
  - VI (country: Countries.VIRGIN_ISLANDS_U_S)
  - VN (country: Countries.VIET_NAM)
  - VU (country: Countries.VANUATU)
  - WS (country: Countries.SAMOA)
  - XK (country: Countries.KOSOVO)
  - XX (country: Countries.CYPRUS)
  - YE (country: Countries.YEMEN)
  - YT (country: Countries.MAYOTTE)
  - ZA (country: Countries.SOUTH_AFRICA)
  - ZM (country: Countries.ZAMBIA)
  - ZW (country: Countries.ZIMBABWE)
```

{% endtab %}
{% endtabs %}

### Model Runs

`ModelRuns` is a simple data container that combines a weather model with one or more initialization times. The initialization times can be specified as `datetime` objects or as integer indices to select from recent runs. Integers from 0 to 12 can be used to select any of the 12 most recent initialization times:

* `0`: latest run
* `1`: second latest run
* `2`: third latest run, etc.

```
Attributes:
    model: The weather model (from Models enum).
    init_times: The initialization times. Can be:
        - A single datetime or a non-negative integer (0 to 12).
        - A list of datetimes.
        - A list of non-negative integers (0 to 12)
```

Example:

```python
from datetime import datetime
from jua.market_aggregates import ModelRuns
from jua.weather import Models

# the latest EPT2 forecast
run = ModelRuns(Models.EPT2, 0)

# the 3 most recent EPT2 forecasts
run = ModelRuns(Models.EPT2, [0, 1, 2])

# a specific EPT2 forecast from the 5th of August 2024
run = ModelRuns(Models.EPT2, datetime(2024, 8, 5, 0))

# all EPT2 forecasts from the 5th of August 2024
run = ModelRuns(
    Models.EPT2,
    [
        datetime(2024, 8, 5, 0),
        datetime(2024, 8, 5, 6),
        datetime(2024, 8, 5, 12),
        datetime(2024, 8, 5, 18),
    ]
)
```

### Country Aggregates

Some countries are split into different market zones. You can still obtain aggregates for the entire country with the following code.

```python
# Filter zones by country
norway_zones = MarketZones.filter_by_country(Countries.NORWAY)
print([z.zone_name for z in norway_zones])
# ['NO-NO1', 'NO-NO2', 'NO-NO3', 'NO-NO4', 'NO-NO5']

# Create market using filtered zones
norway = client.market_aggregates.get_market(market_zone=norway_zones)

# Use in queries
data = norway.compare_runs(
    agg_variable=AggregateVariables.WIND_SPEED_AT_HEIGHT_LEVEL_10M,
    model_runs=[ModelRuns(Models.EPT2, 0)],
)
```


# Power Forecast

Jua's [Power Forecast](/models-and-products/power-forecast) is an end-to-end model trained directly on actual generation data, delivering renewable energy generation forecasts in MW for power trading and grid management.

Power forecasts can be queried directly through the Jua Python SDK using the `client.power_forecast` interface. Forecasts are returned as an `xarray.Dataset` with dimensions `(zone_key, psr_type, time)` and a `value` data variable in MW.

{% hint style="info" %}
Power Forecast support requires `jua >= 0.22.0`. See [Installation](/python-sdk/installation) to upgrade.
{% endhint %}

## Example

As an introduction to power forecasts in the SDK, see this simple example. For more examples, please see [our GitHub repository](https://github.com/juaAI/jua-python-sdk/tree/main/examples/power_forecast).

```python
import matplotlib.pyplot as plt
from jua import JuaClient

client = JuaClient()
pf = client.power_forecast

# Fetch the latest German Solar forecast, up to 48h ahead (2880 minutes)
ds = pf.get_data(
    zone_keys=["DE"],
    psr_types=["Solar"],
    init_time="latest",
    max_prediction_timedelta=2880,
)

# The result is an xarray.Dataset; select the single zone/PSR slice and plot it
series = ds["value"].sel(zone_key="DE", psr_type="Solar")

fig, ax = plt.subplots(figsize=(15, 5))
series.plot(ax=ax, x="time")
ax.set_title("Germany — Solar Power Forecast (latest run)")
ax.set_ylabel("Power [MW]")
plt.show()
```

## Documentation

The `PowerForecast` interface is available as `client.power_forecast`. It exposes metadata helpers (`get_zones`, `get_psr_types`, `get_init_times`), the main `get_data` query method, and a `get_day_ahead_timeseries` helper for stitching a continuous day-ahead series across runs.

### Zones and PSR Types

Power Forecast covers a set of market zones, each serving one or more **PSR types** (Production Source types, e.g. `Solar`, `Wind Onshore`). The available zones and PSR types differ per zone, so query them before building requests.

{% tabs %}
{% tab title="List zones and PSR types" %}

```python
from jua import JuaClient

client = JuaClient()
pf = client.power_forecast

# All available zones
zones = pf.get_zones()
print("Zones:", zones)

# All PSR types across all zones
print("All PSR types:", pf.get_psr_types())

# PSR types served for a specific zone
print("DE PSR types:", pf.get_psr_types(zone_key="DE"))
```

{% endtab %}

{% tab title="Output" %}

```
Zones: ['BE', 'DE', 'FR', 'GB', 'NL']
All PSR types: ['Load', 'Solar', 'Wind', 'Wind Embedded', 'Wind Offshore', 'Wind Onshore', 'Wind Transmission']
DE PSR types: ['Load', 'Solar', 'Wind Offshore', 'Wind Onshore']
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
Requesting a PSR type that a zone does not serve raises a `ValueError` listing the available types. For predicted demand in zones without a fitted `Load` model, use [Market Aggregates](/python-sdk/market-aggregates) with `weighting=population` and `unit=mw`, which returns a `load_mw` column.
{% endhint %}

### Init Times

`get_init_times` lists the available forecast runs (init times), newest first. Use **count mode** for the most recent runs, or **time-window mode** to retrieve every run in a date range.

```python
from datetime import datetime, timezone

# Count mode: the 5 most recent German runs
for it in pf.get_init_times(zone_key="DE", limit=5):
    print(it.init_time, "max horizon (min):", it.max_prediction_timedelta)

# Time-window mode: every run in January 2025 (can exceed 1000)
init_times = pf.get_init_times(
    zone_key="DE",
    start_time=datetime(2025, 1, 1, tzinfo=timezone.utc),
    end_time=datetime(2025, 2, 1, tzinfo=timezone.utc),
)
print(f"{len(init_times)} runs in January 2025")
```

Each entry is an `InitTimeInfo` with an `init_time` (timezone-aware `datetime`) and `max_prediction_timedelta` (forecast horizon in minutes).

### Querying Data

`get_data` supports two mutually exclusive query modes.

**Horizon mode** is init-time-centric. Specify `init_time` as a `datetime`, an integer offset (`0` = latest), or a relative token (`"latest"`, `"latest-N"`), and optionally cap the horizon with `max_prediction_timedelta` (in minutes). Relative tokens resolve to the most recent run where *all* requested zone/PSR-type combinations have data.

```python
# Latest run, 48h horizon, German Solar
ds = pf.get_data(
    zone_keys=["DE"],
    psr_types=["Solar"],
    init_time="latest",
    max_prediction_timedelta=2880,
)

# The two most recent runs for several zones, all PSR types, localized times
ds = pf.get_data(
    zone_keys=["DE", "FR"],
    init_time=[0, 1],
    max_prediction_timedelta=1440,
    time_zone="Europe/Berlin",
)
```

**Time range mode** is valid-time-centric. Specify `start_time` and/or `end_time` to filter by the forecast's valid time instead of by run.

```python
from datetime import datetime

ds = pf.get_data(
    zone_keys=["DE"],
    psr_types=["Solar", "Wind Onshore"],
    start_time=datetime(2025, 12, 1),
    end_time=datetime(2025, 12, 3),
)
```

The two modes cannot be combined; passing both horizon and time-range parameters raises a `ValueError`.

```
Attributes:
    zone_keys: list[str] | None
        Zone codes to query (e.g. ["DE", "FR"]).
    psr_types: list[str] | None
        PSR types to query (e.g. ["Solar", "Wind Onshore"]).
        If None, returns all available types.
    init_time: str | int | datetime | list | None
        Horizon-mode run selection: "latest", "latest-N", a datetime,
        an integer offset (0 = latest), or a list of these.
    max_prediction_timedelta: int | None
        Horizon-mode maximum forecast horizon in minutes.
    start_time: datetime | None
        Time-range-mode lower bound on valid time (inclusive).
    end_time: datetime | None
        Time-range-mode upper bound on valid time (exclusive).
    time_zone: str | None
        IANA time zone name for time formatting (e.g. "Europe/Berlin").

Returns:
    xarray.Dataset with dimensions (zone_key, psr_type, time) and the
    data variable `value` in MW.
```

### Day-Ahead Time Series

`get_day_ahead_timeseries` stitches a continuous day-ahead series from the runs whose local init-time hour matches `init_hour`. For each matching run it takes the day-ahead window and concatenates the results onto a single `time` axis — useful for plotting or backtesting a consistent day-ahead product over a long history.

```python
from datetime import datetime, timedelta, timezone

# Last year of German Solar day-ahead generation from the 09:00 UTC run
end = datetime.now(timezone.utc)
start = end - timedelta(days=365)

ds = pf.get_day_ahead_timeseries(
    zone_keys=["DE"],
    psr_types=["Solar"],
    init_hour=9,
    time_zone="UTC",
    start_date=start,
    end_date=end,
)

# Plot the stitched series
df = ds.to_dataframe().reset_index().dropna(subset=["value"])
df.plot(x="time", y="value", figsize=(16, 6), title="DE Solar — day-ahead (09:00 UTC run)")
```

When `start_date`/`end_date` are given (date-range mode), one init run per day is constructed over the range, bypassing the init-times listing limit so arbitrarily long histories can be stitched. When no dates are given (latest mode), the most recent matching runs are discovered automatically (bounded by `max_init_times`).


# Technical Documentation

## jua.weather.Model

### ***class*****&#x20;jua.weather.Model(client: jua.client.JuaClient, model: jua.weather.models.Models)**

Represents a specific weather model with access to its data. A Model provides unified access to both forecast and hindcast data for a specific weather model. Each model has unique characteristics such as spatial resolution, update frequency, and forecast horizon.

#### Examples

```pycon
>>> from jua import JuaClient
>>> from jua.weather import Models, Variables
>>> from jua.types.geo import LatLon
>>>
>>> client = JuaClient()
>>> model = client.weather.get_model(Models.EPT2)
>>>
>>> # access a 5-day forecast for all of europe from the model:
>>> data = model.get_forecasts(
...     init_time=datetime(2024, 8, 5, 0),
...     latitude=slice(72, 36),
...     longitude=slice(-15, 35),
...     max_lead_time=5 * 24,
...     variables=[Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M],
... )
>>>
>>> # Get latest forecast for specific points
>>> zurich = LatLon(lat=47.3769, lon=8.5417)
>>> london = LatLon(lat=51.5074, lon=-0.1278)
>>> forecast = model.get_forecasts(
...     init_time="latest",
...     points=[zurich, london],
...     variables=[Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M]
... )
```

#### **def get\_metadata() -> ModelMetadata:**

Get metadata for this model including available variables and grid.

This method retrieves comprehensive metadata about the model, including:

* List of all available weather variables
* Spatial grid resolution (number of latitude/longitude points)
* Model identifier

**Returns:**

* ModelMetadata containing variables list and grid information.

#### Examples

```pycon
>>> metadata = model.get_metadata()
>>> print(f"Variables available: {metadata.variables}")
>>> print(f"Variables available: {metadata.grid}")
```

#### get\_latest\_init\_tim&#x65;**(**&#x6D;in\_prediction\_timedelta: int = &#x30;**) →** LatestForecastInfo

Get the latest available forecast initialization time for this model.

This method retrieves information about the most recent forecast run, including its initialization time and maximum available forecast horizon.

Parameters:

* `min_prediction_timedelta`: Minimum required forecast horizon in hours.

Returns:

* `LatestForecastInfo` containing the init\_time and prediction\_timedelta in hours.

#### Examples

```pycon
>>> latest = model.get_latest_init_time()
>>> print(f"Latest forecast initialized at: {latest.init_time}")
>>> print(f"Max lead time: {latest.prediction_timedelta} hours")
```

#### **is\_ready(** **forecasted\_hours: int,** **init\_time: datetime.datetime | str = 'latest'** \&#xNAN;**) →** [**bool**](https://docs.python.org/3/library/functions.html#bool)

Check if a forecast is ready up to a specific lead time.

This method is useful for checking if a forecast has been processed\
up to a certain number of hours into the future. Forecasts may become\
available incrementally, with longer lead times becoming available\
as processing completes.

* **Parameters:**
  * **forecasted\_hours** – The number of forecast hours needed.
  * **init\_time** – The initialization time of the forecast to check.\
    Use “latest” for the most recent forecast, or provide a specific\
    datetime or string in ISO format. Must be an exact match.
* **Returns:**\
  True if the forecast is available for the specified hours, False otherwise.

#### Examples

```pycon
>>> # Check if 10-day forecast is ready
>>> is_ten_day_ready = model.is_ready(240)
>>> if is_ten_day_ready:
>>>     # Now we can safely request 10-day forecast data
>>>     forecast = model.forecast.get_forecast(max_lead_time=240)
```

#### **get\_forecast(** init\_time: "latest" | datetime | list\[datetime] | slice | None = None, variables: list\[Variables] | list\[str] | None = None, prediction\_timedelta: PredictionTimeDelta | None = None, latitude: SpatialSelection | None = None, longitude: SpatialSelection | None = None, points: list\[LatLon] | LatLon | None = None, min\_lead\_time: int | None = None, max\_lead\_time: int | None = None, statistics: list\[str] | list\[Statistics] | None = None, method: "nearest" | "bilinear" = "nearest", stream: bool | None = None, print\_progress: bool | None = None, \&#xNAN;**) → jua.weather.JuaDataset**

Retrieve forecasts for this model.

This method loads weather data from any model run, allowing to fetch the latest forecast as well as obtaining data for analysis of historical forecasts and verification against actual observations.

There is currently no lazy-loading for this method, meaning that all requested data will be downloaded once a call is made.

You can filter the forecasts by:

* Time period (`init_time`)
* Geographic area (`latitude`/`longitude` or `points`)
* Lead time (`prediction_timedelta` or min/max\_lead\_time)
* Weather variables (variables)

**Parameters:**

* `init_time`: Filter by forecast initialization time. Can be:
  * `None` or `'latest'` (default): The latest available forecast
  * A single `datetime`: Specific initialization time
  * A list of `datetime`: Multiple specific times
  * A `slice(start, end)`: Range of initialization times
* `variables`: List of weather variables to include. If None, returns only `Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M`.
* `prediction_timedelta`: Filter by forecast lead time. Can be:
  * `None`: All available lead times (default)
  * A single value (hours or timedelta): Specific lead time
  * A `slice(start, stop)`: Range of lead times
  * A `slice(start, stop, step)`: Lead times at regular intervals
* `latitude`: Latitude selection. Can be a single value, list of values, or a slice(min\_lat, max\_lat) for a geographical range.
* `longitude`: Longitude selection. Can be a single value, list of values, or a slice(`min_lon`, `max_lon`) for a geographical range.
* `points`: Specific geographic points to get forecasts for. Can be a single `LatLon` object or a list of `LatLon` objects (alternative to `latitude`, `longitude`).
* `min_lead_time`: Minimum lead time in hours (alternative to `prediction_timedelta`).
* `max_lead_time`: Maximum lead time in hours (alternative to `prediction_timedelta`).
* `statistics`: For ensemble models, the statistics to return.
* `method`: Interpolation method for selecting points:
  * `"nearest"`: Use nearest grid point (default).
  * `"bilinear"`: Bilinear interpolation to the selected point.
* `stream`: Whether to stream the response content. Recommended when querying slices or large amounts of data. Default is set to False for points, and True for grid slices. Streaming does not support method="bilinear" when requesting points.
* `print_progress`: Whether to display a progress bar during data loading. If None, uses the client's default setting.

**Returns:**

* JuaDataset containing the forecast data matching your selection criteria.

**Raises:**

* [**ValueError**](https://docs.python.org/3/library/exceptions.html#ValueError) – If both points and latitude/longitude are provided, or if other parameter combinations are invalid.

#### Examples

```pycon
>>> # Get the latest global forecast for temperature and wind speed
>>> forecast = model.get_forecasts(
...     variables=[
...         Variables.AIR_TEMPERATURE_AT_HEIGHT_LEVEL_2M,
...         Variables.WIND_SPEED_AT_HEIGHT_LEVEL_10M
...     ]
... )
>>>
>>> # Get forecast for a specific region (Europe)
>>> europe = model.get_forecasts(
...     latitude=slice(71, 36),  # North to South
...     longitude=slice(-15, 50),  # West to East
...     max_lead_time=120  # 5 days
... )
>>>
>>> # Get forecast for specific cities
>>> cities = model.get_forecasts(
...     points=[
...         LatLon(lat=40.7128, lon=-74.0060),  # New York
...         LatLon(lat=51.5074, lon=-0.1278),   # London
...         LatLon(lat=35.6762, lon=139.6503)   # Tokyo
...     ],
...     max_lead_time=72  # 3 days
... )
```


# Getting Started

{% hint style="info" %}
Are you using Python? Check out our [Python SDK](/python-sdk/getting-started) to get started in no time!
{% endhint %}

### Authentication

To access Jua's API, you must create an API key in the [developer portal](https://developer.jua.ai). Include the key in your requests using the `X-API-Key` header.

```
X-API-Key: API_KEY_ID:API_KEY_SECRET
```

### Query Data

{% hint style="info" %}
Details about the request parameters & response formats are available in the [Query Engine documentation](/api-v2/query-engine)
{% endhint %}

#### 1. Query a 3-day forecast for Zurich

{% tabs %}
{% tab title="Curl" %}

```bash
curl -X GET "https://query.jua.ai/v1/forecast/?models=ept2&init_time=latest&latitude=47.37&longitude=8.54&variables=air_temperature_at_height_level_2m&variables=wind_speed_at_height_level_10m&max_prediction_timedelta=72" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Accept: application/json"
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://query.jua.ai/v1/forecast/"
headers = {
    "X-API-Key": "YOUR_API_KEY",
    "Accept": "application/json"
}
params = {
    "models": "ept2",
    "init_time": "latest",
    "latitude": 47.37,
    "longitude": 8.54,
    "variables": [
        "air_temperature_at_height_level_2m",
        "wind_speed_at_height_level_10m"
    ],
    "max_prediction_timedelta": 72, # hours
}

response = requests.get(url, headers=headers, params=params)
data = response.json()
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
const url = new URL("https://query.jua.ai/v1/forecast/");
url.searchParams.append("models", "ept2");
url.searchParams.append("init_time", "latest");
url.searchParams.append("latitude", "47.37");
url.searchParams.append("longitude", "8.54");
url.searchParams.append("variables", "air_temperature_at_height_level_2m");
url.searchParams.append("variables", "wind_speed_at_height_level_10m");
url.searchParams.append("max_prediction_timedelta", "72");

const response = await fetch(url, {
  method: "GET",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    Accept: "application/json",
  },
});

const data = await response.json();
```

{% endtab %}

{% tab title="Response" %}

```json
{
    "model": [
        "ept2",
        "ept2",
        71 more entries...
    ],
    "init_time": ["2025-10-08T00:00:00Z", ...],
    "prediction_timedelta": [0, 1, ...., 72],
    "latitude": [...],
    "longitude": [...],
    "air_temperature_at_height_level_2m": [285.34, 285.91, ...],
    "wind_speed_at_height_level_10m": [0.23, 0.51, ...]
}
    
```

{% endtab %}
{% endtabs %}

#### 2. Query market aggregated data

{% hint style="info" %}
You can find more details about market aggregates [here](/api-v2/query-engine/market-aggregates)
{% endhint %}

Query the average windspeed over Germany, weighted by wind energy production capacity

{% tabs %}
{% tab title="Curl" %}

```bash
curl -X GET "https://query.jua.ai/v1/forecast/market-aggregate\
?models=ept2\
&init_time=2025-10-22T00:00:00Z\
&weighting=wind_capacity\
&market_zones=DE\
&variables=wind_speed_at_height_level_100m\
&max_prediction_timedelta=72\
&include_time=true \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Accept: application/json"
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://query.jua.ai/v1/forecast/market-aggregate"
headers = {
    "X-API-Key": "YOUR_API_KEY",
    "Accept": "application/json"
}
params = {
    "models": "ept2",
    "init_time": "2025-10-22T00:00:00Z",
    "weighting": "wind_capacity",
    "market_zones": ["DE"],  # Germany
    "variables": ["wind_speed_at_height_level_100m"],
    "max_prediction_timedelta": 72, # hours
    "include_time": True,
}

response = requests.get(url, headers=headers, params=params)
data = response.json()
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
const url = new URL("https://query.jua.ai/v1/forecast/market-aggregate");
url.searchParams.append("models", "ept2");
url.searchParams.append("init_time", "2025-10-22T00:00:00Z");
url.searchParams.append("weighting", "wind_capacity");
url.searchParams.append("market_zones", "DE");
url.searchParams.append("variables", "wind_speed_at_height_level_100m");
url.searchParams.append("max_prediction_timedelta", "2880");
url.searchParams.append("include_time", "true");

const response = await fetch(url, {
  method: "GET",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    Accept: "application/json",
  },
});

const data = await response.json();
```

{% endtab %}

{% tab title="Response" %}

```json
{
    "model": [
        "ept2",
        "ept2",
        71 more entries...
    ],
    "init_time": ["2025-10-22T00:00:00Z", ...],
    "prediction_timedelta": [0, 1, ...., 72],
    "time": ["2025-10-22T00:00:00Z", "2025-10-22T01:00:00Z", ...],
    "avg__wind_speed_at_height_level_100m": [0.23, 0.51, ...]
}    
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
To query wind speed at 100m your subscription must be `Pro` or higher
{% endhint %}

#### 3. Using the general \`data\` endpoint (POST)

`/data` allows to make complex analytical queries, select regions, apply custom aggregations and much more.

The features include:

* Making complex geospatial queries, supporting points, bounding boxes, polygons, market zones and countries
* Querying multiple times at once, including historical time slices
* Apply groupings and aggregations such as "hourly minimum and maximum temperature in Switzerland"
* Apply solar & wind capacity or population density weighting to your queries

{% hint style="info" %}
Checkout our [examples](/api-v2/query-engine/examples) for a hands on overview of Query Engine's capabilities
{% endhint %}

**3.1 Request 3 months of historical data for Zurich for EPT2 and IFS**

{% tabs %}
{% tab title="Python" %}

```python
import requests

url = "https://query.jua.ai/v1/forecast/data"
headers = {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
    "Accept": "application/json"
}
params = {
    # use arrow for larger requests, see query engine docs
    "format": "json" 
}
payload = {
    "models": ["ept2", "ecmwf_ifs_single"],
    "geo": {
        "type": "point",
        "value": [47.37, 8.54]  # Zurich [latitude, longitude]
    },
    "variables": [
        "air_temperature_at_height_level_2m",
        "wind_speed_at_height_level_10m"
    ],
    "init_time": {
        "start": "2025-02-01T00:00:00Z",
        "end": "2025-04-30T23:59:59Z"
    },
    "prediction_timedelta": {
        "start": 0,
        "end": 72
    },
    "order_by": ["model", "init_time", "time"],
    "include_time": True,
    "time_zone": "Europe/Zurich",
}

response = requests.post(url, headers=headers, params=params, json=payload)
data = response.json()
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
const url = "https://query.jua.ai/v1/forecast/data?format=json";

const payload = {
  models: ["ept2", "ecmwf_ifs_single"],
  geo: {
    type: "point",
    value: [47.37, 8.54], // Zurich [latitude, longitude]
  },
  variables: [
    "air_temperature_at_height_level_2m",
    "wind_speed_at_height_level_10m",
  ],
  init_time: {
    start: "2025-02-01T00:00:00Z",
    end: "2025-04-30T23:59:59Z",
  },
  prediction_timedelta: {
    start: 0,
    end: 72,
  },
  order_by: ["model", "init_time", "time"],
  include_time: true,
  time_zone: "Europe/Zurich",
};

const response = await fetch(url, {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
    Accept: "application/json",
  },
  body: JSON.stringify(payload),
});

const data = await response.json();
```

{% endtab %}

{% tab title="Response" %}

```json
{
  "model": ["ept2", "ept2", ..., "ecmwf_ifs_single", "ecmwf_ifs_single", ...],
  "init_time": [
    "2025-02-01T00:00:00.000000Z",
    "2025-02-01T00:00:00.000000Z",
    ...
    "2025-02-01T00:00:00.000000Z",
    "2025-02-01T00:00:00.000000Z",
    ...
  ],
  "latitude": [47.37, 47.37, 47.37, 47.37, ...],
  "longitude": [8.54, 8.54, 8.54, 8.54, ...],
  "prediction_timedelta": [0, 1, ..., 0, 1, ...],
  "time": [
    "2025-02-01T00:00:00.000000Z",
    "2025-02-01T01:00:00.000000Z",
    ...,
    "2025-02-01T00:00:00.000000Z",
    "2025-02-01T01:00:00.000000Z"
  ],
  "air_temperature_at_height_level_2m": [275.5, 275.2, 276.1, 275.8, ...],
  "wind_speed_at_height_level_10m": [2.3, 2.5, 2.4, 2.6]
}
```

{% endtab %}
{% endtabs %}

**3.2 Compute population-weighted temperature average for a custom polygon region**

{% tabs %}
{% tab title="Python" %}

```python
import requests

url = "https://query.jua.ai/v1/forecast/data"
headers = {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
    "Accept": "application/json"
}
params = {
    "format": "json"
}
payload = {
    "models": ["ept2"],
    "geo": {
        "type": "polygon",
        "value": [
            # Custom polygon around a region
            [45.82, 5.96],
            [45.82, 10.49], 
            [47.81, 10.49], 
            [47.81, 5.96],  
            [45.82, 5.96]
        ]
    },
    "variables": ["air_temperature_at_height_level_2m"],
    "init_time": "latest",
    "prediction_timedelta": {
        "start": 0,
        "end": 72
    },
    "weighting": {
        "type": "population"
    },
    "group_by": ["model", "init_time", "prediction_timedelta", "time"],
    "aggregation": ["avg"],
    "include_time": True,
    "time_zone": "Europe/Zurich"
}

response = requests.post(url, headers=headers, params=params, json=payload)
data = response.json()
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
const url = "https://query.jua.ai/v1/forecast/data?format=json";

const payload = {
  models: ["ept2"],
  geo: {
    type: "polygon",
    value: [
      // Custom polygon around a region
      [45.82, 5.96],
      [45.82, 10.49],
      [47.81, 10.49],
      [47.81, 5.96],
      [45.82, 5.96],
    ],
  },
  variables: ["air_temperature_at_height_level_2m"],
  init_time: "latest",
  prediction_timedelta: {
    start: 0,
    end: 48,
  },
  weighting: {
    type: "population",
  },
  group_by: ["model", "init_time", "prediction_timedelta", "time"],
  aggregation: ["avg"],
  include_time: true,
  time_zone: "Europe/Zurich",
};

const response = await fetch(url, {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
    Accept: "application/json",
  },
  body: JSON.stringify(payload),
});

const data = await response.json();
```

{% endtab %}

{% tab title="Response" %}

```json
{
    "model": [
        "ept2",
        "ept2",
        71 more entries...
    ],
    "init_time": ["2025-10-08T00:00:00Z", ...],
    "prediction_timedelta": [0, 1, ...., 72],
    "avg__air_temperature_at_height_level_2m": [285.34, 285.91, ...],
}
```

{% endtab %}
{% endtabs %}

### Key Differences Between GET and POST

| **Use Case**         | Simple queries                  | Complex queries, large datasets |
| -------------------- | ------------------------------- | ------------------------------- |
| **Response Format**  | JSON only                       | JSON or Apache Arrow            |
| **Streaming**        | Not supported                   | Supported with Arrow format     |
| **Query Complexity** | Limited parameters              | Full query flexibility          |
| **URL Length**       | Limited by URL length           | No practical limit              |
| **Aggregation**      | Limited (market-aggregate only) | Full aggregation support        |

***

### Common Parameters

#### Time Parameters

* **init\_time**: Forecast initialization time (ISO 8601 format) or `"latest"` for most recent forecast
* **prediction\_timedelta**: Lead time(s) from init\_time. Units are controlled by the `timedelta_unit` parameter (default: `"h"` for hours).
  * Range: `{"start": 0, "end": 72}` for 0-72 hours
  * List: `[0, 6, 12, 24]` for specific lead times
  * Or use `min_prediction_timedelta` and `max_prediction_timedelta` on the GET endpoints

#### Location Parameters

* **Point**: `{"type": "point", "value": [latitude, longitude], "method": "nearest"}`
* **Market Zone**: `{"type": "market_zone", "value": ["DE", "FR"]}`
* **Country**: `{"type": "country_key", "value": ["DE"]}`
* **Bounding Box**: `{"type": "bounding_box", "value": [[lat_min, lon_min], [lat_max, lon_max]]}`

#### Aggregation & Weighting

* **weighting**: `wind_capacity`, `solar_capacity`, or `population`
* **group\_by**: Columns to group by (e.g., `["model", "init_time", "time"]`)

#### Credit Management

* **request\_credit\_limit**: Maximum credits allowed for the request (prevents unexpectedly large charges). Pass as a query-string parameter on both GET and POST endpoints, e.g. `POST /v1/forecast/data?request_credit_limit=200`. Default: `5` for GET endpoints, `50` for POST `/data`.

***

### Error Handling

Common HTTP status codes:

* **200**: Success
* **400**: Invalid parameters or response size exceeded
* **401**: Missing or invalid API key
* **402**: Insufficient credits
* **403**: Model or variable not in subscription


# Query Engine

The Jua Query Engine is the primary API for accessing weather forecast data. It supports flexible geospatial queries, temporal filtering, aggregation, and multiple response formats.

* [Query Structure](/api-v2/query-engine/query-structure) - Learn how to construct queries
* [Response Formats](/api-v2/query-engine/response-formats) - JSON, Apache Arrow, and streaming options
* [Market Aggregates](/api-v2/query-engine/market-aggregates) - Capacity-weighted regional forecasts
* [Examples](/api-v2/query-engine/examples) - Ready-to-use query examples
* [OpenAPI Docs](https://query.jua.ai/docs) - Interactive endpoint reference


# Query Structure

### Overview

A forecast query to the data endpoint is a JSON object that specifies:

1. **What data** you want (models, variables)
2. **Where** you want it (geographic filter)
3. **When** you want it (temporal filter)
4. **How** to process it (aggregation, grouping, weighting)
5. **How** to return it (format, ordering, pagination)

#### Basic Query Structure

```json
{
  "models": ["ept2"],
  "geo": { ... },
  "init_time": "latest",
  "variables": [ ... ],
  "prediction_timedelta": { ... },
  ...
}
```

***

### Required Parameters

Every query must include these three parameters:

#### `models` (required)

List of forecast model identifiers to query.

**Type:** `array of strings`\
**Minimum length:** 1

```json
{
  "models": ["ept2"]
}
```

**Multiple models:**

```json
{
  "models": ["ept2", "aifs", "ecmwf_ifs_single"]
}
```

You can find an overview of the available models [here](/models-and-products/models-and-products).

{% hint style="info" %}
Use `GET /v1/forecast/meta` to fetch available models and supported variables programmatically
{% endhint %}

***

#### `geo` (required)

Geographic filter specifying where to query data.

**Type:** `object`\
**Structure:**

```json
{
  "type": "point" | "bounding_box" | "polygon" | "market_zone" | "country_key" | "poi",
  "value": ...,
  "method": "nearest" | "bilinear"  // Only for type="point" or "poi"
}
```

See Geographic Filtering section below for details.

***

#### `init_time` (required)

Forecast initialization time(s).

**Type:** `string | array | object`

**Options:**

1. **Latest forecast:**

   ```json
   { "init_time": "latest" }
   ```
2. **Specific datetime** (ISO 8601 format):

   ```json
   { "init_time": "2025-10-22T00:00:00Z" }
   { "init_time": "2025-10-22 00:00:00" }
   ```
3. **List of datetimes:**

   ```json
   {
     "init_time": ["2025-10-22T00:00:00Z", "2025-10-22T12:00:00Z"]
   }
   ```
4. **Time range:**

   ```json
   {
     "init_time": {
       "start": "2025-10-01T00:00:00Z",
       "end": "2025-10-31T23:59:59Z"
     }
   }
   ```
5. **Relative offsets** (`"latest-N"`):

   ```json
   { "init_time": "latest-1" }
   ```

   Returns the second-latest run. `"latest-2"` returns the third-latest, etc.

***

#### `model_runs` (optional, alternative to `models` + `init_time`)

Per-model init\_time specification. Use this when you want to query different models at different init times (for example, comparing the latest run of one model against a specific historical run of another). Cannot be combined with `models`/`init_time`.

**Type:** `object` mapping model identifier to an init\_time spec (same shapes as `init_time`: `"latest"`, `"latest-N"`, integer offset, ISO datetime, list, or `{start, end}` range).

```json
{
  "model_runs": {
    "ept2": "latest",
    "aifs": "2025-10-22T00:00:00Z"
  }
}
```

***

### Geographic Filtering

The `geo` parameter supports six types of geographic queries.

#### 1. Point Query

Query at specific coordinate(s).

**Coordinates:** `[latitude, longitude]`

**Single point:**

```json
{
  "type": "point",
  "value": [47.37, 8.54], // Zurich [lat, lon]
  "method": "nearest" // or "bilinear"
}
```

**Multiple points:**

```json
{
  "type": "point",
  "value": [
    [52.52, 13.4], // Berlin
    [47.37, 8.54], // Zurich
    [48.86, 2.35] // Paris
  ],
  "method": "nearest"
}
```

{% hint style="warning" %}
When querying multiple points together with `group_by`, include `"point"` in the `group_by` list to get a separate time series per location. The response then contains a `point` index column (matching the order of the requested coordinates) plus `latitude` and `longitude` columns.

Without a location dimension (`point`, `latitude`, `longitude`) in `group_by`, values are averaged across all requested points into a single series.
{% endhint %}

**Interpolation methods:**

* `"nearest"` (default): Returns value from nearest grid point
* `"bilinear"`: Interpolates between 4 surrounding grid points

***

#### 2. Bounding Box

Query a rectangular region.

**Format:** `[[lat_min, lon_min], [lat_max, lon_max]]`

```json
{
  "type": "bounding_box",
  "value": [
    [45.0, 5.0],
    [50.0, 15.0]
  ]
}
```

This queries all grid points within the rectangle from (45°N, 5°E) to (50°N, 15°E).

{% hint style="warning" %}
Large bounding boxes return many grid points. Consider using `group_by` with `aggregation` to aggregate data over the region.

Large requests might get blocked by the `request_credit_limit`, which helps avoid large costs but can be increased for intentionally querying large amounts of raw data.
{% endhint %}

***

#### 3. Polygon

Query data within a custom polygon area.

**Format:** Array of `[latitude, longitude]` coordinates defining the polygon boundary.

```json
{
  "type": "polygon",
  "value": [
    [45.82, 5.96], // Southwest corner
    [45.82, 10.49], // Southeast corner
    [47.81, 10.49], // Northeast corner
    [47.81, 5.96], // Northwest corner
    [45.82, 5.96] // Close the polygon (repeat first point)
  ]
}
```

**Requirements:**

* Minimum 4 points (3 unique vertices + closing point)
* Polygon should follow counter-clockwise ordering

{% hint style="warning" %}
Polygons covering a large area return many grid points. Consider using `group_by` with `aggregation` to aggregate data over the region.

Large requests might get blocked by the `request_credit_limit`, which helps avoid large costs but can be increased for intentionally querying large amounts of raw data.
{% endhint %}

***

#### 4. Market Zone

Query data for predefined energy market zones.

**Format:** String or array of market zone codes

```json
{
  "type": "market_zone",
  "value": "DE" // Germany
}
```

**Multiple market zones:**

```json
{
  "type": "market_zone",
  "value": ["IR", "GB-NIR"]
}
```

{% hint style="warning" %}
Market zones covering a large area return many grid points. Consider using `group_by` with `aggregation` to aggregate data over the region.

Large requests might get blocked by the `request_credit_limit`, which helps avoid large costs but can be increased for intentionally querying large amounts of raw data.
{% endhint %}

***

#### 5. Country

Query data for entire countries.

**Format:** ISO country codes

```json
{
  "type": "country_key",
  "value": "DE"
}
```

**Multiple countries:**

```json
{
  "type": "country_key",
  "value": ["DE", "FR", "US"]
}
```

{% hint style="warning" %}
Querying countries returns many grid points. Consider using `group_by` with `aggregation` to aggregate data over the region.

Large requests might get blocked by the `request_credit_limit`, which helps avoid large costs but can be increased for intentionally querying large amounts of raw data.
{% endhint %}

***

#### 6. Points of Interest (POI)

Query at specific coordinates while attaching an `id` and/or `label` to each location, so the response carries the labels back.

**Format:** Array of objects with `coordinates: [latitude, longitude]` and optional `id` / `label`.

```json
{
  "type": "poi",
  "value": [
    { "coordinates": [47.37, 8.54], "id": "zurich", "label": "Zurich HQ" },
    { "coordinates": [52.52, 13.4], "id": "berlin", "label": "Berlin office" }
  ],
  "method": "nearest"
}
```

Use this instead of `point` when you need to track which row corresponds to which location without round-tripping the coordinates yourself.

***

### Temporal Filtering

Control which forecast times to retrieve using temporal filters.

#### Forecast Time Concepts

* **`init_time`** (required): When the forecast was generated
* **`prediction_timedelta`**: How far ahead from init\_time (lead time)
* **`time`**: Absolute forecast valid time (`init_time + prediction_timedelta`)

#### `prediction_timedelta` (optional)

Forecast lead time from initialization.

**Units:** Controlled by `timedelta_unit` parameter (default: `"h"` for hours)

{% hint style="info" %}
The `timedelta_unit` also affects the unit in which `prediction_timedelta` is returned
{% endhint %}

**Single value:**

```json
{
  "prediction_timedelta": 24,
  "timedelta_unit": "h" // 24 hours ahead
}
```

**List of values:**

```json
{
  "prediction_timedelta": [0, 6, 12, 18, 24],
  "timedelta_unit": "h"
}
```

**Range:**

```json
{
  "prediction_timedelta": {
    "start": 0,
    "end": 168 // 0 to 168 hours (7 days)
  },
  "timedelta_unit": "h"
}
```

**If omitted:** Returns all available lead times for the specified init\_time(s).

{% hint style="warning" %}
Requesting longer time periods results in higher costs. Only request the time period you are interested in to save costs.
{% endhint %}

***

#### `time` (optional)

Filter by absolute forecast valid time.

**Single datetime:**

```json
{
  "time": "2025-10-22T12:00:00Z"
}
```

**List of datetimes:**

```json
{
  "time": [
    "2025-10-22T00:00:00Z",
    "2025-10-22T06:00:00Z",
    "2025-10-22T12:00:00Z"
  ]
}
```

**Time range:**

```json
{
  "time": {
    "start": "2025-10-22T00:00:00Z",
    "end": "2025-10-23T00:00:00Z"
  }
}
```

{% hint style="info" %}
`time` and `prediction_timedelta` are complementary ways to filter temporal data. You can use either or both.

You can use `time` with multiple `init_time` to compare how the forecast for a given point in time has changed.
{% endhint %}

***

#### `timedelta_unit` (optional)

Units for `prediction_timedelta` and `latest_min_prediction_timedelta`.

**Type:** `string`\
**Default:** `"h"` (hours)

**Supported values:**

* `"m"`, `"minute"`, `"minutes"` - Minutes
* `"h"`, `"hour"`, `"hours"` - Hours
* `"d"`, `"day"`, `"days"` - Days

**Example:**

```json
{
  "prediction_timedelta": {
    "start": 0,
    "end": 7
  },
  "timedelta_unit": "d" // 0 to 7 days
}
```

***

#### `temporal_resolution` (optional)

Resample lead times onto a regular cadence (specified in **minutes**), regardless of the model's native time step. Useful when you want a uniform cadence across the horizon — finer or coarser than the model produces natively — without listing leads manually.

**Type:** `integer`\
**Supported values:** `15`, `30`, `60`, `120`, `180`, `240`, `300`, `360` (minutes)

The behaviour depends on how the requested resolution compares to the model's native time step (e.g. 60 minutes for an hourly model):

* **Coarser than native** (e.g. `180` on an hourly model) — **downsampling**. The result is filtered to the requested cadence; intermediate native steps are dropped.
* **Finer than native** (e.g. `15` on an hourly model) — **linear interpolation**. New lead times are inserted at the requested cadence and each variable is linearly interpolated between the surrounding native steps.
* **Equal to native** (e.g. `60` on an hourly model) — no-op; the native steps are returned unchanged.

**Downsampling example** — coarsen an hourly model to every 3 hours:

```json
{
  "models": ["ept2"],
  "prediction_timedelta": { "start": 0, "end": 12 },
  "timedelta_unit": "h",
  "temporal_resolution": 180
}
```

This returns leads `[0, 3, 6, 9, 12]` (every 3 hours) inside the requested window.

**Interpolation example** — refine an hourly model to every 15 minutes:

```json
{
  "models": ["ept2"],
  "prediction_timedelta": { "start": 0, "end": 3 },
  "timedelta_unit": "h",
  "temporal_resolution": 15
}
```

This returns leads `[0, 0.25, 0.5, 0.75, 1.0, …, 3.0]`. Values at non-native leads (e.g. `0.25h`) are **linearly interpolated** between the bracketing native steps — for temperature, a value of `294.7` at lead `0h` and `297.0` at lead `1h` yields `295.275` at lead `0.25h`.

{% hint style="info" %}
Interpolated values are estimates derived from the model's native output, not additional model timesteps. Interpolation is linear and applied per variable. When temporal aggregation (`group_by` with a time bucket) is active, interpolation is applied to the aggregated `time` axis instead of the raw `prediction_timedelta` axis.
{% endhint %}

The requested cadence is interpreted in minutes and is independent of `timedelta_unit` (which only controls the units of `prediction_timedelta` in the request and response).

***

#### `latest_min_prediction_timedelta` (optional)

When using `init_time: "latest"`, only include forecasts with at least this much lead time available.

**Example:**

```json
{
  "init_time": "latest",
  "latest_min_prediction_timedelta": 24,
  "timedelta_unit": "h" // Only use latest forecast if it has ≥24h lead time
}
```

This is useful when you need a minimum forecast horizon regardless of when the forecast was generated.

***

### Variable Selection

#### `variables` (optional)

Weather variables to retrieve.

**Type:** `array of strings`\
**Default:** All variables available for the selected models

```json
{
  "variables": [
    "air_temperature_at_height_level_2m",
    "wind_speed_at_height_level_100m",
    "precipitation_amount_sum_1h"
  ]
}
```

**Common variables:**

* `air_temperature_at_height_level_2m` - Temperature at 2m (Kelvin)
* `wind_speed_at_height_level_10m` - Wind speed at 10m (m/s)
* `wind_speed_at_height_level_100m` - Wind speed at 100m (m/s)
* `relative_humidity_at_height_level_2m` - Relative humidity (%)
* `precipitation_amount_sum_1h` - 1-hour accumulated precipitation (mm)
* `surface_downwelling_shortwave_flux_sum_1h` - 1-hour accumulated downwelling shortwave radiation (J/m²)
* `air_pressure_at_mean_sea_level` - Sea level pressure (Pa)
* And many more...

{% hint style="info" %}
You can always query `/v1/forecast/meta` to check the available variables per model.
{% endhint %}

**If omitted:** Returns all variables common to the selected models.

{% hint style="warning" %}
Only request the variables you are interested in to save costs.

Some variables such as solar and wind at 100m are only available in a Pro subscription or higher.
{% endhint %}

***

### Aggregation and Grouping

Aggregate data across space and/or time using `group_by` and `aggregation`.

#### Concept

* **`group_by`**: Dimensions to preserve in the result
* **`aggregation`**: How to aggregate values within each group

#### `group_by` (optional)

Dimensions to group by.

**Type:** `array of strings`

**Supported dimensions:**

* `"model"` - Model identifier
* `"init_time"` - Forecast initialization time
* `"time"` - Forecast valid time
* `"prediction_timedelta"` - Lead time
* `"latitude"` - Latitude coordinate
* `"longitude"` - Longitude coordinate
* `"point"` - Groups by requested location and automatically adds `latitude` and `longitude` to the result. The response includes a `point` index column matching the order of the requested coordinates. Required to get one series per location when querying multiple points; also useful for ensemble models where you are interested in statistics per location (e.g. min, max, std)
* `"ensemble_member"` - Per-member dimension for ensemble models (e.g. `ept2_e`). Use together with `include_ensemble_members: true`
* `"market_zone"` - Market zone (when using geo type market\_zone)
* `"country_key"` - Country (when using geo type country\_key)

**Time transformations:**

* `"time__to_start_of(hour)"` or `"hourly"` - Grouped by start of hour
* `"time__to_start_of(day)"` or `"daily"` - Grouped by start of day
* `"time__to_start_of(week)"` or `"weekly"` - Grouped by start of week
* `"time__to_start_of(month)"` or `"monthly"` - Grouped by start of month
* `"time__to_start_of(year)"` or `"yearly"` - Grouped by start of year
* Same transformations available for `init_time`

{% hint style="info" %}
You can use time transformations to get for example the daily min & max temperature for a given location. Make sure to set `time_zone` to get the data group by the start-of-day in the region you are interested in.
{% endhint %}

**Example - Average over all grid points for each valid time:**

```json
{
  "group_by": ["model", "init_time", "time"],
  "aggregation": ["avg"]
}
```

**Example - Daily min & max:**

```json
{
  "group_by": ["model", "daily"], // "daily" is shortcut for "time__to_start_of(day)"
  "aggregation": ["min", "max"]
}
```

{% hint style="info" %}
If `group_by` is set without `aggregation`, `avg` is applied by default.
{% endhint %}

***

#### `aggregation` (optional)

Aggregation functions to apply when grouping.

**Type:** `array of objects or strings`

**Supported functions:**

* `"avg"` - Average
* `"std"` - Standard deviation
* `"min"` - Minimum
* `"max"` - Maximum
* `"sum"` - Sum
* `"count"` - Count
* `"median"` - Median
* `"quantile"` - Quantile (requires parameter)
* `"argmin"` - Returns the value of a column at the row where another variable is minimum (requires parameter for the column to return)
* `"argmax"` - Returns the value of a column at the row where another variable is maximum (requires parameter for the column to return)

**Simple aggregation (all variables):**

```json
{
  "aggregation": ["avg"]
}
```

**Multiple aggregations:**

```json
{
  "aggregation": ["avg", "std", "min", "max"]
}
```

**Variable-specific aggregation:**

```json
{
  "aggregation": [
    {
      "aggregation": "avg",
      "variables": ["air_temperature_at_height_level_2m"]
    },
    {
      "aggregation": "max",
      "variables": ["wind_speed_at_height_level_100m"]
    }
  ]
}
```

**Parameterized aggregation (quantile):**

```json
{
  "aggregation": [
    {
      "aggregation": "quantile",
      "parameters": [0.95], // 95th percentile
      "variables": ["wind_speed_at_height_level_100m"]
    }
  ]
}
```

**Short syntax for parameterized aggregation:**

```json
{
  "aggregation": ["quantile_(0.95)__wind_speed_at_height_level_100m"]
}
```

**`argmin` / `argmax`** — return the value of one column at the row where another variable hits its min/max within the group. The parameter is the column to return; the variable is the column to find the extreme of. For example, `argmin_(time)__air_temperature_at_height_level_2m` returns the time at which temperature was minimum.

```json
{
  "group_by": ["model", "daily"],
  "aggregation": [
    "min__air_temperature_at_height_level_2m",
    "argmin_(time)__air_temperature_at_height_level_2m"
  ]
}
```

{% hint style="warning" %}
`group_by` is required when `aggregation` is set.
{% endhint %}

***

#### Common Aggregation Patterns

**1. Spatial average at each timestep:**

```json
{
  "geo": { "type": "market_zone", "value": "DE" },
  "group_by": ["model", "init_time", "time"],
  "aggregation": ["avg"]
}
```

**2. Daily maximum over a region:**

```json
{
  "geo": {
    "type": "bounding_box",
    "value": [
      [45.0, 5.0],
      [50.0, 15.0]
    ]
  },
  "group_by": ["model", "daily"],
  "aggregation": ["max"]
}
```

**3. Statistics at a specific location (for ensemble models, e.g. `ept2_e`):**

```json
{
  "geo": { "type": "point", "value": [47.37, 8.54] },
  "group_by": ["model", "latitude", "longitude", "time"],
  "aggregation": ["avg", "std", "min", "max"]
}
```

***

### Weighting

Apply weighted aggregation based on capacity or population distribution.

#### `weighting` (optional)

**Type:** `object`

**Structure:**

```json
{
  "type": "wind_capacity" | "wind_capacity_combined" | "solar_capacity" | "population",
  "unit": "weather" | "mw"
}
```

**Weighting types:**

1. **`wind_capacity`** - Weight by installed wind power capacity (split into onshore and offshore where available)

   ```json
   {
     "weighting": { "type": "wind_capacity" }
   }
   ```
2. **`wind_capacity_combined`** - Weight by installed wind power capacity stored as a single combined value rather than split into onshore/offshore. Used for zones such as `GB` where capacity is not split. With `unit="mw"` the output column is `wind_total_mw`.

   ```json
   {
     "weighting": { "type": "wind_capacity_combined", "unit": "mw" }
   }
   ```
3. **`solar_capacity`** - Weight by installed solar power capacity

   ```json
   {
     "weighting": { "type": "solar_capacity" }
   }
   ```
4. **`population`** - Weight by population density. With `unit="mw"` and `air_temperature_at_height_level_2m`, returns a population-weighted load (demand) forecast in MW (`load_mw`).

   ```json
   {
     "weighting": { "type": "population" }
   }
   ```

**`unit` (optional)** — Defaults to `"weather"` (returns capacity-weighted raw weather values). Set to `"mw"` to apply power curves and return predicted megawatts. See [Market Aggregates](/api-v2/query-engine/market-aggregates) for the variable-to-output-column mapping in MW mode.

**Example - Wind capacity-weighted average:**

```json
{
  "models": ["ept2"],
  "geo": { "type": "market_zone", "value": "DE" },
  "init_time": "latest",
  "variables": ["wind_speed_at_height_level_100m"],
  "prediction_timedelta": { "start": 0, "end": 72 },
  "weighting": { "type": "wind_capacity" },
  "group_by": ["model", "init_time", "time"],
  "aggregation": ["avg"]
}
```

This computes the wind speed weighted by where wind turbines are located, giving more weight to regions with higher wind capacity and less weight to regions without production capacity.

{% hint style="warning" %}
Weighting only applies when using `aggregation` with `"avg"`. Other aggregation functions ignore the weighting parameter.
{% endhint %}

***

### Output Control

Control how results are formatted and returned.

#### `include_time` (optional)

Include the forecast valid time column in results.

**Type:** `boolean`\
**Default:** `false`

```json
{
  "include_time": true
}
```

**Result with `include_time: true`:**

```json
{
  "model": ["ept2", "ept2"],
  "init_time": ["2025-10-22T00:00:00Z", "2025-10-22T00:00:00Z"],
  "prediction_timedelta": [1.0, 2.0],
  "time": ["2025-10-22T01:00:00Z", "2025-10-22T02:00:00Z"],
  "air_temperature_at_height_level_2m": [285.3, 284.8]
}
```

{% hint style="info" %}
Automatically set to `true` if `time` is in `group_by` or `order_by`.
{% endhint %}

***

#### `time_zone` (optional)

IANA time zone for time formatting.

**Type:** `string`\
**Default:** `"UTC"`

```json
{
  "time_zone": "Europe/Berlin"
}
```

**Common time zones:**

* `"UTC"` (default)
* `"Europe/Berlin"`
* `"America/New_York"`
* `"America/Los_Angeles"`
* `"Asia/Tokyo"`

All `time` in responses are formatted in the specified time zone.

{% hint style="warning" %}
The time zone is **not** applied to `init_time`, which is always in UTC
{% endhint %}

***

#### `order_by` (optional)

Sort results by specific dimensions.

**Type:** `array of strings`

```json
{
  "order_by": ["model", "init_time", "prediction_timedelta"]
}
```

**Sortable dimensions:**

* `"model"`
* `"init_time"`
* `"time"`
* `"prediction_timedelta"`
* `"latitude"`
* `"longitude"`
* Any variable name (e.g., `"air_temperature_at_height_level_2m"`)

**Constraints:**

* When using `group_by`, `order_by` dimensions must be in the `group_by` list
* Required when using `pagination`

***

#### `pagination` (optional)

Limit the number of results returned.

**Type:** `object`

**Structure:**

```json
{
  "limit": 1000, // Max rows to return
  "offset": 0 // Number of rows to skip
}
```

**Example - Get first 1000 rows:**

```json
{
  "order_by": ["model", "init_time", "time"],
  "pagination": {
    "limit": 1000,
    "offset": 0
  }
}
```

**Example - Get next 1000 rows:**

```json
{
  "order_by": ["model", "init_time", "time"],
  "pagination": {
    "limit": 1000,
    "offset": 1000
  }
}
```

{% hint style="warning" %}
`order_by` is required when using `pagination`.
{% endhint %}

***

### Best Practices

#### Performance

1. **Use Arrow format for large queries:** Set `?format=arrow` in the URL for queries returning >10k rows
2. **Enable streaming for very large queries:** Add `&stream=true` with Arrow format for >100k rows
3. **Limit prediction\_timedelta range:** Request only the lead times you need
4. **Split historical data into multiple requests:** Fetch data in chunks

#### Cost Optimization

1. **Set `request_credit_limit`:** Prevents accidentally expensive queries. Pass as a query-string parameter, e.g. `?request_credit_limit=200`. Default: `50` for POST `/data`, `5` for GET endpoints.
2. **Aggregate when possible:** Grouped queries accessing many points cost less per point
3. **Select specific variables:** Don't request all variables if you only need a few

#### Query Construction

1. **Use `group_by` for spatial aggregates:** When querying regions, group by time dimensions
2. **Include `time` in results:** Set `include_time: true` for easier result interpretation
3. **Specify time zones:** Use `time_zone` to get times in your local timezone
4. **Order results:** Use `order_by` for predictable result ordering
5. **Test with small queries first:** Start with short time ranges, then expand

***

### Validation and Errors

The API validates all query parameters and returns helpful error messages.

**Common validation errors:**

* **Invalid model:** Model not available or not in your subscription

  ```json
  { "detail": "Model 'xyz' is not valid" }
  ```
* **Variable not supported:** Variable not available for selected model(s)

  ```json
  { "detail": "Variables ['xyz'] are not supported by all models" }
  ```
* **Invalid geo filter:** Geographic coordinates out of range

  ```json
  { "detail": "Latitude must be between -90 and 90" }
  ```
* **Missing required parameter:** Required field not provided

  ```json
  { "detail": "Field required: 'models'" }
  ```
* **Insufficient credits:** Not enough credits for the query

  ```json
  { "detail": "Insufficient credits. Available: 10.5. Required: 25.3" }
  ```
* **Response too large:** Query returns too many rows

  ```json
  {
    "detail": "Query exceeds maximum rows for JSON format (50000). Use format=arrow or add pagination."
  }
  ```

***

### Next Steps

* **See examples:** Check out the [collection of example queries](/api-v2/query-engine/examples)
* **Explore variables:** Use `GET /v1/forecast/meta` to see all available models and variables
* **Check availability:** Use `GET /v1/forecast/available-forecasts` to see available forecast times
* **Check the OpenAPI docs:** [Endpoint & data models](https://query.jua.ai/docs) ready for you to try out


# Response Formats

## Response Formats

The Jua Query Engine supports three response formats optimized for different use cases: JSON, Apache Arrow, and Arrow Streaming. This guide explains each format and provides examples for working with responses in Python and JavaScript.

***

### Format Overview

| Feature             | JSON                          | Arrow                                 | Arrow Streaming                       |
| ------------------- | ----------------------------- | ------------------------------------- | ------------------------------------- |
| **Query Parameter** | `?format=json`                | `?format=arrow`                       | `?format=arrow&stream=true`           |
| **Content-Type**    | `application/json`            | `application/vnd.apache.arrow.stream` | `application/vnd.apache.arrow.stream` |
| **Max Rows**        | 50,000                        | 5,000,000                             | 1,000,000,000                         |
| **Use Case**        | Small queries, quick testing  | Medium to large datasets              | Very large datasets                   |
| **Memory Usage**    | Higher                        | Lower                                 | Lowest (incremental)                  |
| **Parse Speed**     | Slower                        | Faster                                | Fastest                               |
| **Best For**        | Quick exploration, small data | Data analysis, medium data            | Production, historical data           |

***

### JSON Format

#### Description

JSON format returns data in a columnar structure where each column is a key with an array of values. This format is human-readable and easy to work with but becomes inefficient for large datasets.

#### Request

Add `?format=json` to the query endpoint (this is the default):

```bash
POST /v1/forecast/data?format=json
```

#### Response Structure

```json
{
  "model": ["ept2", "ept2", "ept2"],
  "init_time": [
    "2025-10-22T00:00:00Z",
    "2025-10-22T00:00:00Z",
    "2025-10-22T00:00:00Z"
  ],
  "latitude": [47.37, 47.37, 47.37],
  "longitude": [8.54, 8.54, 8.54],
  "prediction_timedelta": [0, 60, 120],
  "time": [
    "2025-10-22T00:00:00Z",
    "2025-10-22T01:00:00Z",
    "2025-10-22T02:00:00Z"
  ],
  "air_temperature_at_height_level_2m": [285.3, 284.8, 284.5],
  "wind_speed_at_height_level_100m": [12.5, 13.2, 13.8]
}
```

#### Limitations

* **Maximum 50,000 rows**
* Larger memory footprint compared to Arrow
* Slower parsing for large datasets
* Not suitable for production queries with large data volumes

#### When to Use

* Quick testing and exploration
* Small queries (<10k rows)
* Debugging query structure
* Simple web applications with limited data needs

***

### Apache Arrow Format

#### Description

Apache Arrow is a high-performance columnar data format designed for efficient data interchange. It provides zero-copy reads and significantly faster parsing compared to JSON.

#### Request

Add `?format=arrow` to the query endpoint:

```bash
POST /v1/forecast/data?format=arrow
```

#### Response Format

Returns a binary stream in Apache Arrow IPC format. The response must be parsed using an Arrow library.

#### Limitations

* **Maximum 5,000,000 rows** (non-streaming)
* Requires Arrow library to parse
* Binary format (not human-readable)

#### When to Use

* Medium to large datasets (10k - 1M rows)
* Data science workflows with pandas/polars
* When performance is important
* Batch processing

***

### Arrow Streaming Format

#### Description

Arrow Streaming builds on the Arrow format but streams data in chunks, allowing you to process datasets larger than available memory. This is the most efficient format for very large queries.

#### Request

Add `?format=arrow&stream=true` to the query endpoint:

```bash
POST /v1/forecast/data?format=arrow&stream=true
```

#### Response Format

Returns a chunked binary stream in Apache Arrow IPC format. Data arrives incrementally and can be processed as it's received.

#### Limitations

* Requires Arrow library with streaming support
* Binary format (not human-readable)
* Cannot easily inspect data during transfer

#### When to Use

* Very large datasets (>1M rows)
* Historical data queries
* Production applications
* When memory is constrained
* Long-running queries

{% hint style="info" %}
Are you using Python? [Jua's Python SDK](/python-sdk/weather/forecast) handles requests and streaming responses for you.
{% endhint %}

***

### Choosing the Right Format

#### Decision Flow

```
Query returning < 10k rows?
  └─ Yes → Use JSON (easiest to work with)
  └─ No → Continue

Query returning < 10M rows?
  └─ Yes → Use Arrow (good performance)
  └─ No → Use Arrow Streaming (more complex to get started)
```

#### Recommendations by Use Case

| Use Case                 | Recommended Format       | Reason                      |
| ------------------------ | ------------------------ | --------------------------- |
| API testing in browser   | JSON                     | Easy to inspect             |
| Dashboard (live data)    | JSON or Arrow            | Fast updates, moderate data |
| Data analysis (Jupyter)  | Arrow                    | Fast pandas conversion      |
| Historical data download | Arrow Streaming          | Handles large volumes       |
| Production ETL pipeline  | Arrow or Arrow Streaming | Most efficient              |

***

### Examples

{% tabs %}
{% tab title="Python" %}
**Prerequisites**

```bash
pip install requests pandas pyarrow
```

**Example 1: JSON Format**

```python
import requests
import pandas as pd

# Query configuration
url = "https://query.jua.ai/v1/forecast/data"
api_key = "your_api_key_id:your_api_key_secret"

headers = {
    "X-API-Key": api_key,
    "Content-Type": "application/json"
}

payload = {
    "models": ["ept2"],
    "geo": {
        "type": "point",
        "value": [47.37, 8.54],
        "method": "nearest"
    },
    "init_time": "latest",
    "variables": [
        "air_temperature_at_height_level_2m",
        "wind_speed_at_height_level_100m"
    ],
    "prediction_timedelta": {
        "start": 0,
        "end": 72
    },
    "timedelta_unit": "h",
    "include_time": True
}

# Make request with JSON format (default)
response = requests.post(
    f"{url}?format=json",
    headers=headers,
    json=payload
)

# Check response
if response.ok:
    # Parse JSON response
    data = response.json()

    # Convert to pandas DataFrame
    df = pd.DataFrame(data)

    print(f"Downloaded {len(df)} rows")
    print(f"Columns: {list(df.columns)}")
    print("\nFirst few rows:")
    print(df.head())

    # Data is ready to use
    avg_temp = df['air_temperature_at_height_level_2m'].mean()
    print(f"\nAverage temperature: {avg_temp:.2f} K")
else:
    print(f"Error: {response.status_code}")
    print(response.text)
```

**Output:**

```
Downloaded 73 rows
Columns: ['model', 'init_time', 'latitude', 'longitude', 'prediction_timedelta', 'time', 'air_temperature_at_height_level_2m', 'wind_speed_at_height_level_100m']

First few rows:
   model             init_time  latitude  longitude  prediction_timedelta                 time  air_temperature_at_height_level_2m  wind_speed_at_height_level_100m
0   ept2  2025-10-22T00:00:00Z     47.37       8.54                     0  2025-10-22T00:00:00Z                              285.3                                 12.5
1   ept2  2025-10-22T00:00:00Z     47.37       8.54                     1  2025-10-22T01:00:00Z                              284.8                                 13.2
2   ept2  2025-10-22T00:00:00Z     47.37       8.54                     2  2025-10-22T02:00:00Z                              284.5                                 13.8

Average temperature: 285.12 K
```

***

**Example 2: Apache Arrow Format**

```python
import requests
import pandas as pd
import pyarrow as pa
import pyarrow.ipc as pa_ipc

# Query configuration (same as JSON example)
url = "https://query.jua.ai/v1/forecast/data"
api_key = "your_api_key_id:your_api_key_secret"

headers = {
    "X-API-Key": api_key,
    "Content-Type": "application/json"
}

payload = {
    "models": ["ept2"],
    "geo": {
        "type": "market_zone",
        "value": "DE"
    },
    "init_time": {
        "start": "2025-10-01T00:00:00Z",
        "end": "2025-10-07T23:59:59Z"
    },
    "variables": ["wind_speed_at_height_level_100m"],
    "prediction_timedelta": {
        "start": 0,
        "end": 168
    },
    "timedelta_unit": "h",
    "group_by": ["model", "init_time", "time"],
    "aggregation": ["avg"],
    "weighting": {"type": "wind_capacity"},
    "include_time": True
}

# Make request with Arrow format
response = requests.post(
    f"{url}?format=arrow",
    headers=headers,
    json=payload
)

if response.ok:
    # Parse Arrow response
    arrow_buffer = pa.py_buffer(response.content)

    # Read Arrow IPC stream
    with pa_ipc.open_stream(arrow_buffer) as reader:
        # Read all batches into a table
        table = reader.read_all()

    # Convert to pandas DataFrame
    df = table.to_pandas()

    print(f"Downloaded {len(df)} rows")
    print(f"Memory usage: {df.memory_usage(deep=True).sum() / 1024**2:.2f} MB")
    print(f"\nArrow schema: {table.schema}")
    print("\nDataFrame:")
    print(df.head())

    # Work with the data
    print(f"\nAverage wind speed: {df['wind_speed_at_height_level_100m'].mean():.2f} m/s")
else:
    print(f"Error: {response.status_code}")
    print(response.text)
```

**Output:**

```
Downloaded 1176 rows
Memory usage: 0.18 MB

Arrow schema: model: string
init_time: timestamp[us, tz=UTC]
time: timestamp[us, tz=UTC]
wind_speed_at_height_level_100m: double

DataFrame:
  model             init_time                 time  wind_speed_at_height_level_100m
0  ept2  2025-10-01T00:00:00Z  2025-10-01T00:00:00Z                             8.23
1  ept2  2025-10-01T00:00:00Z  2025-10-01T01:00:00Z                             8.45
2  ept2  2025-10-01T00:00:00Z  2025-10-01T02:00:00Z                             8.67

Average wind speed: 8.52 m/s
```

***

**Example 3: Arrow Streaming Format**

```python
import requests
import pandas as pd
import pyarrow as pa
import pyarrow.ipc as pa_ipc

# Query configuration
url = "https://query.jua.ai/v1/forecast/data"
api_key = "your_api_key_id:your_api_key_secret"

headers = {
    "X-API-Key": api_key,
    "Content-Type": "application/json",
    "Accept-Encoding": "identity"  # Disable compression for streaming
}

payload = {
    "models": ["ept2", "aifs"],
    "geo": {
        "type": "market_zone",
        "value": ["DE", "FR", "IT"]
    },
    "init_time": {
        "start": "2025-01-01T00:00:00Z",
        "end": "2025-03-31T23:59:59Z"
    },
    "variables": [
        "air_temperature_at_height_level_2m",
        "wind_speed_at_height_level_100m"
    ],
    "prediction_timedelta": {
        "start": 0,
        "end": 168
    },
    "timedelta_unit": "h",
    "group_by": ["model", "market_zone", "init_time", "time"],
    "aggregation": ["avg"],
    "weighting": {"type": "wind_capacity"},
    "include_time": True,
    "order_by": ["model", "market_zone", "init_time", "time"]
}

# Make request with Arrow streaming format
response = requests.post(
    f"{url}?format=arrow&stream=true",
    headers=headers,
    json=payload,
    stream=True,  # Important: enable streaming in requests
    timeout=(10, 600)  # (connect timeout, read timeout)
)

if response.ok:
    # Enable decoding for the raw stream
    response.raw.decode_content = True

    # Read Arrow stream incrementally
    with pa_ipc.open_stream(response.raw) as reader:
        # Read all batches into a table
        table = reader.read_all()

    # Convert to pandas DataFrame
    df = table.to_pandas()

    print(f"Downloaded {len(df)} rows")
    print(f"Columns: {list(df.columns)}")
    print(f"Memory usage: {df.memory_usage(deep=True).sum() / 1024**2:.2f} MB")
    print("\nFirst few rows:")
    print(df.head())

    # Save to file for later use
    df.to_parquet("forecast_data.parquet", compression="snappy")
    print("\nSaved to forecast_data.parquet")
else:
    print(f"Error: {response.status_code}")
    print(response.text)
```

**Output:**

```
Downloaded 45360 rows
Columns: ['model', 'market_zone', 'init_time', 'time', 'air_temperature_at_height_level_2m', 'wind_speed_at_height_level_100m']
Memory usage: 6.92 MB

First few rows:
   model market_zone             init_time                 time  air_temperature_at_height_level_2m  wind_speed_at_height_level_100m
0   aifs          DE  2025-01-01T00:00:00Z  2025-01-01T00:00:00Z                              278.45                                 9.23
1   aifs          DE  2025-01-01T00:00:00Z  2025-01-01T01:00:00Z                              278.12                                 9.45
2   aifs          DE  2025-01-01T00:00:00Z  2025-01-01T02:00:00Z                              277.89                                 9.67

Saved to forecast_data.parquet
```

***

{% endtab %}

{% tab title="Javascript" %}
**Prerequisites**

```bash
npm install axios apache-arrow
```

**Example 1: JSON Format (Node.js)**

```javascript
const axios = require("axios");

async function fetchForecastJSON() {
  const url = "https://query.jua.ai/v1/forecast/data";
  const apiKey = "your_api_key_id:your_api_key_secret";

  const headers = {
    "X-API-Key": apiKey,
    "Content-Type": "application/json",
  };

  const payload = {
    models: ["ept2"],
    geo: {
      type: "point",
      value: [47.37, 8.54],
      method: "nearest",
    },
    init_time: "latest",
    variables: [
      "air_temperature_at_height_level_2m",
      "wind_speed_at_height_level_100m",
    ],
    prediction_timedelta: {
      start: 0,
      end: 72,
    },
    timedelta_unit: "h",
    include_time: true,
  };

  try {
    const response = await axios.post(`${url}?format=json`, payload, {
      headers,
    });

    const data = response.data;

    console.log(`Downloaded ${data.model.length} rows`);
    console.log(`Columns: ${Object.keys(data).join(", ")}`);

    // Access data by column
    console.log("\nFirst 3 temperatures:");
    for (let i = 0; i < 3; i++) {
      console.log(
        `  ${data.time[i]}: ${data.air_temperature_at_height_level_2m[i]} K`
      );
    }

    // Calculate average temperature
    const avgTemp =
      data.air_temperature_at_height_level_2m.reduce((a, b) => a + b, 0) /
      data.air_temperature_at_height_level_2m.length;
    console.log(`\nAverage temperature: ${avgTemp.toFixed(2)} K`);

    return data;
  } catch (error) {
    console.error("Error:", error.response?.data || error.message);
    throw error;
  }
}

// Run
fetchForecastJSON();
```

**Output:**

```
Downloaded 73 rows
Columns: model, init_time, latitude, longitude, prediction_timedelta, time, air_temperature_at_height_level_2m, wind_speed_at_height_level_100m

First 3 temperatures:
  2025-10-22T00:00:00Z: 285.3 K
  2025-10-22T01:00:00Z: 284.8 K
  2025-10-22T02:00:00Z: 284.5 K

Average temperature: 285.12 K
```

***

**Example 2: JSON Format (Browser)**

```javascript
// Modern browser with fetch API
async function fetchForecastData() {
  const url = "https://query.jua.ai/v1/forecast/data?format=json";
  const apiKey = "your_api_key_id:your_api_key_secret";

  const payload = {
    models: ["ept2"],
    geo: {
      type: "point",
      value: [47.37, 8.54],
      method: "nearest",
    },
    init_time: "latest",
    variables: ["air_temperature_at_height_level_2m"],
    prediction_timedelta: { start: 0, end: 24 },
    timedelta_unit: "h",
    include_time: true,
  };

  try {
    const response = await fetch(url, {
      method: "POST",
      headers: {
        "X-API-Key": apiKey,
        "Content-Type": "application/json",
      },
      body: JSON.stringify(payload),
    });

    if (!response.ok) {
      throw new Error(`HTTP ${response.status}: ${await response.text()}`);
    }

    const data = await response.json();

    console.log(`Received ${data.model.length} rows`);

    // Create a chart-friendly format
    const chartData = data.time.map((time, i) => ({
      time: new Date(time),
      temperature: data.air_temperature_at_height_level_2m[i] - 273.15, // Convert to Celsius
    }));

    console.log("Chart data:", chartData);

    // You can now use chartData with libraries like Chart.js, D3.js, etc.
    return chartData;
  } catch (error) {
    console.error("Error fetching forecast:", error);
    throw error;
  }
}

// Usage
fetchForecastData().then((data) => {
  // Use data for visualization
  console.log("Ready to plot:", data.length, "points");
});
```

***

**Example 3: Apache Arrow Format (Node.js)**

```javascript
const axios = require("axios");
const arrow = require("apache-arrow");

async function fetchForecastArrow() {
  const url = "https://query.jua.ai/v1/forecast/data";
  const apiKey = "your_api_key_id:your_api_key_secret";

  const headers = {
    "X-API-Key": apiKey,
    "Content-Type": "application/json",
  };

  const payload = {
    models: ["ept2"],
    geo: {
      type: "market_zone",
      value: "DE",
    },
    init_time: {
      start: "2025-10-01T00:00:00Z",
      end: "2025-10-07T23:59:59Z",
    },
    variables: ["wind_speed_at_height_level_100m"],
    prediction_timedelta: { start: 0, end: 168 },
    timedelta_unit: "h",
    group_by: ["model", "init_time", "time"],
    aggregation: ["avg"],
    weighting: { type: "wind_capacity" },
    include_time: true,
  };

  try {
    // Request with Arrow format
    const response = await axios.post(`${url}?format=arrow`, payload, {
      headers,
      responseType: "arraybuffer", // Important for binary data
    });

    // Parse Arrow IPC stream
    const table = arrow.tableFromIPC(response.data);

    console.log(`Downloaded ${table.numRows} rows`);
    console.log(
      `Columns: ${table.schema.fields.map((f) => f.name).join(", ")}`
    );
    console.log(`Schema:`, table.schema.toString());

    // Access data
    const windSpeeds = table.getChild("wind_speed_at_height_level_100m");
    const times = table.getChild("time");

    // Convert to JavaScript objects
    const data = [];
    for (let i = 0; i < table.numRows; i++) {
      data.push({
        time: times.get(i),
        windSpeed: windSpeeds.get(i),
      });
    }

    console.log("\nFirst 5 rows:");
    data.slice(0, 5).forEach((row) => {
      console.log(`  ${row.time}: ${row.windSpeed.toFixed(2)} m/s`);
    });

    // Calculate statistics
    const avgWindSpeed =
      windSpeeds.toArray().reduce((a, b) => a + b, 0) / table.numRows;
    console.log(`\nAverage wind speed: ${avgWindSpeed.toFixed(2)} m/s`);

    return data;
  } catch (error) {
    console.error("Error:", error.response?.data || error.message);
    throw error;
  }
}

// Run
fetchForecastArrow();
```

**Output:**

```
Downloaded 1176 rows
Columns: model, init_time, time, wind_speed_at_height_level_100m
Schema: model: Utf8
init_time: Timestamp(Microsecond, Some("UTC"))
time: Timestamp(Microsecond, Some("UTC"))
wind_speed_at_height_level_100m: Float64

First 5 rows:
  2025-10-01T00:00:00.000Z: 8.23 m/s
  2025-10-01T01:00:00.000Z: 8.45 m/s
  2025-10-01T02:00:00.000Z: 8.67 m/s
  2025-10-01T03:00:00.000Z: 8.89 m/s
  2025-10-01T04:00:00.000Z: 9.12 m/s

Average wind speed: 8.52 m/s
```

***

**Example 4: Arrow Streaming Format (Node.js)**

```javascript
const axios = require("axios");
const arrow = require("apache-arrow");
const { Readable } = require("stream");

async function fetchForecastArrowStreaming() {
  const url = "https://query.jua.ai/v1/forecast/data";
  const apiKey = "your_api_key_id:your_api_key_secret";

  const headers = {
    "X-API-Key": apiKey,
    "Content-Type": "application/json",
    "Accept-Encoding": "identity", // Disable compression
  };

  const payload = {
    models: ["ept2"],
    geo: { type: "market_zone", value: ["DE", "FR"] },
    init_time: {
      start: "2025-01-01T00:00:00Z",
      end: "2025-03-31T23:59:59Z",
    },
    variables: ["wind_speed_at_height_level_100m"],
    prediction_timedelta: { start: 0, end: 168 },
    timedelta_unit: "h",
    group_by: ["model", "market_zone", "init_time", "time"],
    aggregation: ["avg"],
    weighting: { type: "wind_capacity" },
    include_time: true,
  };

  try {
    // Request with Arrow streaming format
    const response = await axios.post(
      `${url}?format=arrow&stream=true`,
      payload,
      {
        headers,
        responseType: "stream", // Enable streaming
      }
    );

    console.log("Receiving Arrow stream...");

    // Process Arrow stream
    const chunks = [];
    let totalBytes = 0;

    for await (const chunk of response.data) {
      chunks.push(chunk);
      totalBytes += chunk.length;
      process.stdout.write(
        `\rReceived: ${(totalBytes / 1024 / 1024).toFixed(2)} MB`
      );
    }

    console.log("\n\nParsing Arrow data...");

    // Combine chunks and parse
    const buffer = Buffer.concat(chunks);
    const table = arrow.tableFromIPC(buffer);

    console.log(`Downloaded ${table.numRows} rows`);
    console.log(
      `Columns: ${table.schema.fields.map((f) => f.name).join(", ")}`
    );

    // Process data
    const windSpeeds = table
      .getChild("wind_speed_at_height_level_100m")
      .toArray();
    const avgWindSpeed =
      windSpeeds.reduce((a, b) => a + b, 0) / windSpeeds.length;

    console.log(`Average wind speed: ${avgWindSpeed.toFixed(2)} m/s`);

    return table;
  } catch (error) {
    console.error("Error:", error.response?.data || error.message);
    throw error;
  }
}

// Run
fetchForecastArrowStreaming();
```

**Output:**

```
Receiving Arrow stream...
Received: 12.45 MB

Parsing Arrow data...
Downloaded 30240 rows
Columns: model, market_zone, init_time, time, wind_speed_at_height_level_100m
Average wind speed: 8.73 m/s
```

{% endtab %}
{% endtabs %}

### Next Steps

* **Query Structure:** Learn how to construct queries in the [Query Structure](/api-v2/query-engine/query-structure) guide
* **Examples:** See complete examples in the [Examples](/api-v2/query-engine/examples) section
* **API Reference:** Explore all endpoints in the [OpenAPI documentation](https://query.jua.ai/docs)


# Market Aggregates

### What are Market Aggregates for?

Market aggregates, especially used with weighting such as capacity weighting, are useful proxies to estimate how differences in forecasts - either between models or between different forecasts of the same model - impact energy production & consumption.

Imagine you are comparing the latest 12PM forecast of EPT against the 6 AM forecast. In Deckenpfronn, Germany, there is a huge difference in prediction for 100m wind speed. But since there is no wind park in Deckenpfronn this difference in wind speed will have no impact at the energy production at all. However, differences in wind speed at for example Reussenkoge Wind Farm, with a production capacity of over 250 MW, will have significant impacts on the energy output.

This is why we offer to compute capacity weighted averages for both solar and wind parameters. The averages are computed as

$$V\_{avg, weighted} =\sum\_i \dfrac{C\_i}{C\_{tot}} \cdot V\_i$$

Where $$V\_{i}$$ is the value of the variable (e.g. wind speed) at a specific location (e.g. a wind farm), $$C\_i$$ is the production capacity at that location and $$C\_{tot} = \sum\_i C\_i$$ is the total production capacity of the selected region.

### Output MW Mode

By adding `unit=mw` to the `GET /v1/forecast/market-aggregate` endpoint, the query engine applies generic power curves to weather forecasts and returns predicted **megawatts (MW)** instead of raw weather values. This is useful for comparing different models and quick MW estimates across many European zones.

{% hint style="info" %}
**Looking for actual production forecasts?** MW output here provides a model-specific forecast of **potential production** via power curves. For a forecast of **actual production**, use the [Power Forecast](/models-and-products/power-forecast) — an end-to-end model trained on real generation data, significantly more accurate. Currently available for Germany, France, United Kingdom, Belgium, and Netherlands (Solar, Wind).
{% endhint %}

MW mode is available on both endpoints:

* `GET /v1/forecast/market-aggregate?unit=mw&...`
* `POST /v1/forecast/data` with `weighting.unit=mw` in the body

MW mode:

* Activated by setting `unit=mw` (GET query parameter) or `weighting.unit="mw"` (POST body)
* Three weighting types are supported. In MW mode the `variables` field does not change the result — each weighting always produces the same MW columns:
  * `weighting=wind_capacity` → returns `wind_onshore_mw`, `wind_offshore_mw` (or `wind_total_mw` for combined-only zones such as GB)
  * `weighting=solar_capacity` → returns `solar_mw`
  * `weighting=population` → returns `load_mw` (electricity-demand forecast)
* To retrieve weather values at a specific height (e.g. 10m wind), use weather mode instead (omit `unit=mw`)
* Restricts geo to `market_zone` or `country_key` (no polygon or bounding box)
* Only available for zones listed under MW-Capable Zones below
* Weighting is auto-derived from the requested variable on the GET endpoint (wind speed → `wind_capacity`, shortwave flux → `solar_capacity`, 2m temperature → `population`)
* Wind and solar can be selected simultaneously on the GET endpoint; the backend issues separate queries per variable and merges
* When `merge_zones_or_countries` is enabled, MW values are summed across zones

#### Example: Wind MW Forecast

{% tabs %}
{% tab title="Curl" %}

```bash
curl -X GET "https://query.jua.ai/v1/forecast/market-aggregate\
?models=ept2\
&init_time=2025-10-22T00:00:00Z\
&weighting=wind_capacity\
&market_zones=DE\
&variables=wind_speed_at_height_level_100m\
&max_prediction_timedelta=72\
&unit=mw\
&include_time=true\
&format=json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Accept: application/json"
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://query.jua.ai/v1/forecast/market-aggregate"
headers = {
    "X-API-Key": "YOUR_API_KEY",
    "Accept": "application/json"
}
params = {
    "models": "ept2",
    "init_time": "2025-10-22T00:00:00Z",
    "weighting": "wind_capacity",
    "market_zones": ["DE"],
    "variables": ["wind_speed_at_height_level_100m"],
    "max_prediction_timedelta": 72,
    "unit": "mw",
    "include_time": True,
    "format": "json",
}

response = requests.get(url, headers=headers, params=params)
data = response.json()
```

{% endtab %}

{% tab title="Response" %}

```json
{
    "model": ["ept2", "ept2", ...],
    "init_time": ["2025-10-22T00:00:00+00:00", ...],
    "prediction_timedelta": [0.0, 1.0, ...],
    "time": ["2025-10-22T00:00:00+00:00", ...],
    "market_zone": ["DE", "DE", ...],
    "wind_onshore_mw": [20109.78, 18485.41, ...],
    "wind_offshore_mw": [4933.67, 4880.13, ...]
}
```

{% endtab %}
{% endtabs %}

#### Example: Load (Demand) Forecast

A population-weighted electricity-demand forecast in MW, produced by applying a temperature-driven load curve to 2m air temperature.

{% tabs %}
{% tab title="Curl" %}

```bash
curl -X GET "https://query.jua.ai/v1/forecast/market-aggregate?models=ept2&init_time=latest&weighting=population&market_zones=DE&max_prediction_timedelta=72&unit=mw&include_time=true&format=json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Accept: application/json"
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://query.jua.ai/v1/forecast/market-aggregate"
headers = {
    "X-API-Key": "YOUR_API_KEY",
    "Accept": "application/json",
}
params = {
    "models": "ept2",
    "init_time": "latest",
    "weighting": "population",
    "market_zones": ["DE"],
    "max_prediction_timedelta": 72,
    "unit": "mw",
    "include_time": True,
    "format": "json",
}

response = requests.get(url, headers=headers, params=params)
data = response.json()
```

{% endtab %}

{% tab title="Response" %}

```json
{
    "model": ["ept2", "ept2", ...],
    "init_time": ["2026-05-28T06:00:00+00:00", ...],
    "prediction_timedelta": [0.0, 1.0, ...],
    "time": ["2026-05-28T06:00:00+00:00", ...],
    "market_zone": ["DE", "DE", ...],
    "load_mw": [58525.5, 60100.2, ...]
}
```

{% endtab %}
{% endtabs %}

The same query expressed against `POST /v1/forecast/data`:

```python
payload = {
    "models": ["ept2"],
    "geo": {"type": "market_zone", "value": ["DE"]},
    "init_time": "latest",
    "variables": ["air_temperature_at_height_level_2m"],
    "prediction_timedelta": {"start": 0, "end": 72},
    "weighting": {"type": "population", "unit": "mw"},
    "group_by": ["model", "init_time", "prediction_timedelta", "time"],
    "aggregation": ["avg"],
    "include_time": True,
}
```

Load forecasts are available for \~48 zones today. Query `GET /v1/forecast/market-aggregate/mw-zones` and read the `load` key for the current list.

#### Example: Get Available MW Zones

```bash
curl -X GET "https://query.jua.ai/v1/forecast/market-aggregate/mw-zones" \
  -H "X-API-Key: YOUR_API_KEY"
```

```json
{
    "wind": ["AT", "BA", "BE", "BG", "CH", "CY", "CZ", "DE", ...],
    "wind_combined": ["GB"],
    "wind_onshore_only": ["AT", "BA", "BG", "CH", "CY", "CZ", ...],
    "solar": ["AT", "BA", "BE", "BG", "CH", "CY", "CZ", "DE", ...],
    "load": ["AL", "AT", "BA", "BE", "BG", "CH", "CY", "CZ", "DE", ...]
}
```

The keys break down as:

* `wind` — zones that support `wind_capacity` weighting; output may include `wind_onshore_mw` and/or `wind_offshore_mw`.
* `wind_combined` — zones (today: `GB` only) that store wind capacity as a single combined value rather than split into onshore/offshore; output is `wind_total_mw`.
* `wind_onshore_only` — subset of `wind` zones that only have onshore capacity data fitted; output is `wind_onshore_mw` only.
* `solar` — zones that support `solar_capacity` weighting; output is `solar_mw`.
* `load` — zones that have a fitted population-weighted load curve; output is `load_mw` when `weighting=population` and `unit=mw`.

#### MW-Capable Zones

The list is dynamic and grows over time as new zones are onboarded. Always query the `mw-zones` endpoint for the current set rather than hard-coding a list.

#### MW Column Names

When MW mode is enabled, output columns are renamed:

| Raw Column Name    | Display Name     | Unit | Weighting                            |
| ------------------ | ---------------- | ---- | ------------------------------------ |
| `wind_onshore_mw`  | Wind Onshore MW  | MW   | wind\_capacity                       |
| `wind_offshore_mw` | Wind Offshore MW | MW   | wind\_capacity                       |
| `wind_total_mw`    | Wind Total MW    | MW   | wind\_capacity (combined-only zones) |
| `solar_mw`         | Solar MW         | MW   | solar\_capacity                      |
| `load_mw`          | Load MW          | MW   | population                           |

### Variable-to-Weighting Mapping

When not using MW mode, the `weighting` field is applied based on the variable:

| Variable                                    | Weighting        |
| ------------------------------------------- | ---------------- |
| `wind_speed_at_height_level_100m`           | `wind_capacity`  |
| `wind_speed_at_height_level_10m`            | `wind_capacity`  |
| `surface_downwelling_shortwave_flux_sum_1h` | `solar_capacity` |
| `air_temperature_at_height_level_2m`        | `population`     |

### Aggregation Periods and Column Naming

Daily and weekly aggregation is requested as a `group_by` entry on `POST /v1/forecast/data` — for example `time__to_start_of(day)` or `time__to_start_of(week)`. The `GET /v1/forecast/market-aggregate` endpoint has no aggregation-period parameter (`temporal_resolution` resamples; it is not the same as daily/weekly bucketing).

Market aggregate responses use an `avg__` prefix on variable columns. The response time column stays named `time` in every case — only the row count and the snapped timestamps change:

* Hourly (`group_by` includes `time`): `avg__wind_speed_at_height_level_100m`, time column `time`
* Daily (`group_by` includes `time__to_start_of(day)`): `avg__wind_speed_at_height_level_100m`, time column still `time` (timestamps snapped to day start)
* Weekly (`group_by` includes `time__to_start_of(week)`): `avg__wind_speed_at_height_level_100m`, time column still `time` (timestamps snapped to week start)

In MW mode, columns use entirely different names (see MW Column Names above).

## Accessing Market Aggregates

There are two ways to access market aggregates:

* Making a request to `GET https://query.jua.ai/v1/forecast/market-aggregate`
* Using `POST https://query.jua.ai/v1/forecast/data` which allows selecting custom regions such as polygons and bounding boxes

### Using the \`market-aggregate\` endpoint

A convenient `GET` endpoint that allows fast and easy access to one or multiple market zones.

{% hint style="info" %}
The [Query Engine OpenAPI docs](https://query.jua.ai/docs) provide an interactive description of all endpoints
{% endhint %}

{% tabs %}
{% tab title="Curl" %}

```bash
curl -X GET "https://query.jua.ai/v1/forecast/market-aggregate\
?models=ept2\
&init_time=2025-10-22T00:00:00Z\
&weighting=wind_capacity\
&market_zones=DE\
&variables=wind_speed_at_height_level_100m\
&max_prediction_timedelta=72\
&include_time=true \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Accept: application/json"
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://query.jua.ai/v1/forecast/market-aggregate"
headers = {
    "X-API-Key": "YOUR_API_KEY",
    "Accept": "application/json"
}
params = {
    "models": "ept2",
    "init_time": "2025-10-22T00:00:00Z",
    "weighting": "wind_capacity",
    "market_zones": ["DE"],  # Germany
    "variables": ["wind_speed_at_height_level_100m"],
    "max_prediction_timedelta": 72, # hours
    "include_time": True,
}

response = requests.get(url, headers=headers, params=params)
data = response.json()
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
const url = new URL("https://query.jua.ai/v1/forecast/market-aggregate");
url.searchParams.append("models", "ept2");
url.searchParams.append("init_time", "2025-10-22T00:00:00Z");
url.searchParams.append("weighting", "wind_capacity");
url.searchParams.append("market_zones", "DE");
url.searchParams.append("variables", "wind_speed_at_height_level_100m");
url.searchParams.append("max_prediction_timedelta", "2880");
url.searchParams.append("include_time", "true");

const response = await fetch(url, {
  method: "GET",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    Accept: "application/json",
  },
});

const data = await response.json();
```

{% endtab %}

{% tab title="Response" %}

```json
{
    "model": [
        "ept2",
        "ept2",
        71 more entries...
    ],
    "init_time": ["2025-10-22T00:00:00Z", ...],
    "prediction_timedelta": [0, 1, ...., 72],
    "time": ["2025-10-22T00:00:00Z", "2025-10-22T01:00:00Z", ...],
    "avg__wind_speed_at_height_level_100m": [0.23, 0.51, ...]
}    
```

{% endtab %}
{% endtabs %}

### Using the generic \`data\` endpoint

While adding slightly more overhead to the query, the `data` endpoint provides more flexibility such as defining custom regions using polygons and bounding boxes. The example below is equivalent to the request to the `market-aggregate` endpoint above.

{% hint style="info" %}
Checkout the [examples](/api-v2/query-engine/examples) on how to use market aggregates with polygons
{% endhint %}

{% tabs %}
{% tab title="Python" %}

```python
import requests

url = "https://query.jua.ai/v1/forecast/data"
headers = {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
    "Accept": "application/json"
}
params = {
    "format": "json"
}
payload = {
    "models": ["ept2"],
    "geo": {
        "type": "market_zone",
        "value": ["DE"]
    },
    "variables": ["wind_speed_at_height_level_100m"],
    "init_time": "2025-10-22T00:00:00Z",
    "prediction_timedelta": {
        "start": 0,
        "end": 72
    },
    "weighting": {
        "type": "wind_capacity"
    },
    "group_by": ["model", "init_time", "prediction_timedelta", "time"],
}

response = requests.post(url, headers=headers, params=params, json=payload)
data = response.json()
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
const url = "https://query.jua.ai/v1/forecast/data?format=json";

const payload = {
  models: ["ept2"],
  geo: {
    type: "market_zone",
    value: ["DE"],
  },
  variables: ["wind_speed_at_height_level_100m"],
  init_time: "2025-10-22T00:00:00Z",
  prediction_timedelta: {
    start: 0,
    end: 72,
  },
  weighting: {
    type: "wind_capacity",
  },
  group_by: ["model", "init_time", "prediction_timedelta", "time"],
};

const response = await fetch(url, {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
    Accept: "application/json",
  },
  body: JSON.stringify(payload),
});

const data = await response.json();
```

{% endtab %}

{% tab title="Response" %}

```json
{
    "model": [
        "ept2",
        "ept2",
        71 more entries...
    ],
    "init_time": ["2025-10-08T00:00:00Z", ...],
    "prediction_timedelta": [0, 1, ...., 72],
    "avg__wind_speed_at_height_level_100m": [285.34, 285.91, ...],
}
```

{% endtab %}
{% endtabs %}

### Countries with Regional Zones

Some countries don't have a single zone code — use their regional zones instead:

| Country | Zone Codes                                                            |
| ------- | --------------------------------------------------------------------- |
| Italy   | IT-CNO, IT-CSO, IT-NO, IT-SAR, IT-SIC, IT-SO                          |
| Norway  | NO-NO1, NO-NO2, NO-NO3, NO-NO4, NO-NO5                                |
| Sweden  | SE-SE1, SE-SE2, SE-SE3, SE-SE4                                        |
| Denmark | DK-BHM, DK-DK1, DK-DK2                                                |
| Japan   | JP-CB, JP-CG, JP-HKD, JP-HR, JP-KN, JP-KY, JP-ON, JP-SK, JP-TH, JP-TK |

Countries with single zone codes: DE, FR, GB, NL, PL, ES, BE, AT, CH, CZ, PT, GR, IE

{% hint style="info" %}
`DK-BHM` (Bornholm) supports unweighted and population-weighted weather queries. Wind-capacity weighting and MW mode are not available for this zone.
{% endhint %}


# Examples

This section provides ready-to-use query examples for common use cases with the Jua Query Engine.

* [Point Queries](/api-v2/query-engine/examples/point-queries) - Query forecast data for specific locations
* [Regional Queries](/api-v2/query-engine/examples/regional-queries) - Query data for geographic regions
* [Aggregated Queries](/api-v2/query-engine/examples/aggregated-queries) - Apply spatial and temporal aggregations


# Point Queries

### Single Point & Init Time

Check the weather for Zurich.

{% tabs %}
{% tab title="Example (Python)" %}

```python
query = {
    "models": ["ept2"],
    "geo": {
        "type": "point",
        "value": [47.3784, 8.5387],  # [latitude, longitude] - Zurich
        "method": "nearest",
    },
    "variables": [
        "air_temperature_at_height_level_2m",
        "wind_speed_at_height_level_100m",
    ],
    "init_time": "latest",
    "prediction_timedelta": {"start": 0, "end": 72},  # 0-72 hours ahead
}

response = requests.post(url, headers=headers, json=query)
response.raise_for_status()

data = response.json()
df = pd.DataFrame(data)
print(f"✅ Retrieved {len(df)} rows")
print(df.head())
```

{% endtab %}

{% tab title="Output" %}

```
✅ Retrieved 73 rows
  model             init_time  ...  air_temperature_at_height_level_2m  wind_speed_at_height_level_100m
0  ept2  2025-10-23T06:00:00Z  ...                          284.600006                              4.7
1  ept2  2025-10-23T06:00:00Z  ...                          285.399994                              5.0
2  ept2  2025-10-23T06:00:00Z  ...                          286.399994                              4.8
3  ept2  2025-10-23T06:00:00Z  ...                          286.500000                              9.3
4  ept2  2025-10-23T06:00:00Z  ...                          284.800018                             10.8

[5 rows x 7 columns]
```

{% endtab %}
{% endtabs %}

### Multiple Points, Single Init Time

Get the latest forecast for three points of interest.

{% tabs %}
{% tab title="Python (Example)" %}

```python
points = [
    [47.3784, 8.5387],  # Zurich
    [46.2044, 6.1432],  # Geneva
    [45.4642, 9.1900],  # Milan
]

query = {
    "models": ["ept2"],
    "geo": {
        "type": "point",
        "value": points,
        "method": "bilinear",  # Use bilinear interpolation
    },
    "variables": [
        "air_temperature_at_height_level_2m",
        "air_pressure_at_mean_sea_level",
    ],
    "init_time": "latest",
    "prediction_timedelta": [
        0,
        1,
        2,
        3,
        24,
        48,
        72,
    ],  # Specific timesteps: 0, 1h, 2h, 3h
}

response = requests.post(url, headers=headers, json=query)
response.raise_for_status()

data = response.json()
df = pd.DataFrame(data)
print(f"✅ Retrieved {len(df)} rows")
print(df.head(12))
```

{% endtab %}

{% tab title="Output" %}

```
✅ Retrieved 21 rows
   model             init_time  ...  air_temperature_at_height_level_2m  air_pressure_at_mean_sea_level
0   ept2  2025-10-23T06:00:00Z  ...                          285.353058                    99202.460938
1   ept2  2025-10-23T06:00:00Z  ...                          286.886932                   100174.296875
2   ept2  2025-10-23T06:00:00Z  ...                          278.207947                   101294.437500
3   ept2  2025-10-23T06:00:00Z  ...                          286.374359                    99177.875000
4   ept2  2025-10-23T06:00:00Z  ...                          286.428955                    99310.710938
5   ept2  2025-10-23T06:00:00Z  ...                          285.010590                    99835.976562
6   ept2  2025-10-23T06:00:00Z  ...                          285.821747                    99690.070312
7   ept2  2025-10-23T06:00:00Z  ...                          279.756836                   100894.539062
8   ept2  2025-10-23T06:00:00Z  ...                          280.985046                   100497.390625
9   ept2  2025-10-23T06:00:00Z  ...                          280.339874                   100916.289062
10  ept2  2025-10-23T06:00:00Z  ...                          287.028015                   100000.000000
11  ept2  2025-10-23T06:00:00Z  ...                          286.628876                   100383.093750

[12 rows x 7 columns]
```

{% endtab %}
{% endtabs %}

### Multiple Models & Points

Request data for mulitple models and locations to compare them.

{% tabs %}
{% tab title="Python (Example)" %}

```python
 query = {
    "models": ["ept2", "aifs"],  # Multiple models
    "geo": {
        "type": "point",
        "value": [
            [47.3784, 8.5387],  # Zurich
            [46.9479, 7.4474],  # Bern
        ],
        "method": "nearest",
    },
    "variables": [
        "air_temperature_at_height_level_2m",
        "wind_speed_at_height_level_10m",
    ],
    "init_time": "latest",
    "prediction_timedelta": {"start": 0, "end": 4},  # 0-4 hours
    "order_by": ["model", "latitude", "longitude", "prediction_timedelta"],
}

response = requests.post(url, headers=headers, json=query)
response.raise_for_status()

data = response.json()
df = pd.DataFrame(data)
print(f"✅ Retrieved {len(df)} rows")
print(df.head(10))

# Show comparison between models
if len(df) > 0:
    print("\nModel comparison at first timestep:")
    print(
        df[df["prediction_timedelta"] == df["prediction_timedelta"].min()][
            ["model", "latitude", "longitude", "air_temperature_at_height_level_2m"]
        ]
    )
```

{% endtab %}

{% tab title="Output" %}

```
✅ Retrieved 12 rows
  model             init_time  ...  air_temperature_at_height_level_2m  wind_speed_at_height_level_10m
0  aifs  2025-10-23T06:00:00Z  ...                          286.800018                              0.0
1  aifs  2025-10-23T06:00:00Z  ...                          286.000000                              0.0
2  ept2  2025-10-23T06:00:00Z  ...                          284.600006                              5.1
3  ept2  2025-10-23T06:00:00Z  ...                          285.399994                              5.9
4  ept2  2025-10-23T06:00:00Z  ...                          285.700012                              6.8
5  ept2  2025-10-23T06:00:00Z  ...                          284.500000                             10.1
6  ept2  2025-10-23T06:00:00Z  ...                          283.100006                             10.0
7  ept2  2025-10-23T06:00:00Z  ...                          284.600006                              4.7
8  ept2  2025-10-23T06:00:00Z  ...                          285.399994                              5.0
9  ept2  2025-10-23T06:00:00Z  ...                          286.399994                              4.8

[10 rows x 7 columns]

Model comparison at first timestep:
  model   latitude  longitude  air_temperature_at_height_level_2m
0  aifs  47.000000   7.500000                          286.800018
1  aifs  47.500000   8.500000                          286.000000
2  ept2  46.916668   7.416667                          284.600006
7  ept2  47.416668   8.500000                          284.600006
```

{% endtab %}
{% endtabs %}

### Historical Data for Single Point

Query two months of 3-day forecasts for Zurich

{% tabs %}
{% tab title="Python (Example)" %}

```python
# Query forecasts from March to April 2025
start_time = datetime(2025, 3, 1, 0, 0, 0)
end_time = datetime(2025, 4, 30, 23, 59, 59)

query = {
    "models": ["ept2"],
    "geo": {
        "type": "point",
        "value": [47.3784, 8.5387],  # Zurich
        "method": "nearest",
    },
    "variables": [
        "air_temperature_at_height_level_2m",
        "precipitation_amount_sum_1h",
    ],
    "init_time": {
        "start": start_time.strftime("%Y-%m-%dT%H:%M:%S"),
        "end": end_time.strftime("%Y-%m-%dT%H:%M:%S"),
    },
    "prediction_timedelta": {"start": 0, "end": 72},
    "order_by": ["init_time", "prediction_timedelta"],
}

response = requests.post(url, headers=headers, json=query)
response.raise_for_status()

data = response.json()
df = pd.DataFrame(data)
print(f"✅ Retrieved {len(df)} rows")
print(df.head(10))

if len(df) > 0:
    print(f"\nInit times range: {df['init_time'].min()} to {df['init_time'].max()}")
```

{% endtab %}

{% tab title="Output" %}

```
✅ Retrieved 17812 rows
  model             init_time  prediction_timedelta   latitude  longitude  air_temperature_at_height_level_2m  precipitation_amount_sum_1h
0  ept2  2025-03-01T00:00:00Z                     0  47.416668        8.5                          273.700012                          NaN
1  ept2  2025-03-01T00:00:00Z                     1  47.416668        8.5                          273.600006                         0.00
2  ept2  2025-03-01T00:00:00Z                     2  47.416668        8.5                          273.700012                         0.00
3  ept2  2025-03-01T00:00:00Z                     3  47.416668        8.5                          273.800018                         0.00
4  ept2  2025-03-01T00:00:00Z                     4  47.416668        8.5                          273.899994                         0.00
5  ept2  2025-03-01T00:00:00Z                     5  47.416668        8.5                          273.899994                         0.00
6  ept2  2025-03-01T00:00:00Z                     6  47.416668        8.5                          273.899994                         0.00
7  ept2  2025-03-01T00:00:00Z                     7  47.416668        8.5                          274.200012                         0.00
8  ept2  2025-03-01T00:00:00Z                     8  47.416668        8.5                          274.899994                         0.01
9  ept2  2025-03-01T00:00:00Z                     9  47.416668        8.5                          275.700012                         0.01

Init times range: 2025-03-01T00:00:00Z to 2025-04-30T18:00:00Z
```

{% endtab %}
{% endtabs %}


# Regional Queries

{% hint style="warning" %}
Regional queries without aggregation can end-up consuming a lot of credits. The `request_credit_limit` was increased for all of the example queries.

Use with care!
{% endhint %}

### Countries & Market Zones

#### Country

{% tabs %}
{% tab title="Example (Python)" %}

```python
query = {
    "models": ["ept2"],
    "geo": {
        "type": "country_key",
        "value": "CH",  # Switzerland
    },
    "variables": ["air_temperature_at_height_level_2m"],
    "init_time": "latest",
    "prediction_timedelta": [0, 24, 48],  # 0, 1 day, 2 days
    "order_by": [
        "model",
        "init_time",
        "prediction_timedelta",
        "latitude",
        "longitude",
    ],
}

# Query parameters for arrow format and credit limit
params = {"format": "arrow", "request_credit_limit": 100}
response = requests.post(url, headers=headers, json=query, params=params)
response.raise_for_status()

# Read arrow format response
arrow_buffer = pa.py_buffer(response.content)
with pa_ipc.open_stream(arrow_buffer) as reader:
    table = reader.read_all()
df = table.to_pandas()
print(f"✅ Retrieved {len(df)} rows for Switzerland")
print(df.head())
```

{% endtab %}

{% tab title="Output" %}

```
✅ Retrieved 2106 rows for Switzerland
  model           init_time  ... longitude  air_temperature_at_height_level_2m
0  ept2 2025-10-23 06:00:00  ...  8.916667                          284.200012
1  ept2 2025-10-23 06:00:00  ...  7.083333                          273.100006
2  ept2 2025-10-23 06:00:00  ...  7.166667                          273.300018
3  ept2 2025-10-23 06:00:00  ...  7.250000                          273.100006
4  ept2 2025-10-23 06:00:00  ...  8.916667                          283.899994

[5 rows x 6 columns]
```

{% endtab %}
{% endtabs %}

#### Market Zone

{% tabs %}
{% tab title="Example (Python)" %}

```python
query = {
    "models": ["ept2"],
    "geo": {
        "type": "market_zone",
        "value": ["GB-NIR"],  # Northern Ireland
    },
    "variables": ["wind_speed_at_height_level_100m"],
    "init_time": "latest",
    "prediction_timedelta": [0, 24],  # 0 and 1 day ahead
    "order_by": [
        "model",
        "init_time",
        "prediction_timedelta",
        "latitude",
        "longitude",
    ],
}

# Query parameters for arrow format and credit limit
params = {"format": "arrow", "request_credit_limit": 100}
response = requests.post(url, headers=headers, json=query, params=params)
response.raise_for_status()

# Read arrow format response
arrow_buffer = pa.py_buffer(response.content)
with pa_ipc.open_stream(arrow_buffer) as reader:
    table = reader.read_all()
df = table.to_pandas()
print(f"✅ Retrieved {len(df)} rows for Northern Ireland")
print(df.head())
return df
```

{% endtab %}

{% tab title="Output" %}

```
✅ Retrieved 572 rows for Northern Ireland
  model           init_time  ... longitude  wind_speed_at_height_level_100m
0  ept2 2025-10-23 06:00:00  ... -6.666667                        10.300000
1  ept2 2025-10-23 06:00:00  ... -6.583333                        10.200000
2  ept2 2025-10-23 06:00:00  ... -6.500000                         9.900001
3  ept2 2025-10-23 06:00:00  ... -6.416667                         9.900001
4  ept2 2025-10-23 06:00:00  ... -6.166667                         9.900001

[5 rows x 6 columns]
```

{% endtab %}
{% endtabs %}

### Bounding Boxes

{% tabs %}
{% tab title="Example (Python)" %}

```python
query = {
    "models": ["ept2"],
    "geo": {
        "type": "bounding_box",
        "value": [
            [45.8, 5.9],  # [lat_min, lon_min] - Southwest corner
            [47.8, 10.5],  # [lat_max, lon_max] - Northeast corner
        ],  # Switzerland region
    },
    "variables": ["air_temperature_at_height_level_2m"],
    "init_time": "latest",
    "prediction_timedelta": [0],  # IC only
    "order_by": [
        "model",
        "init_time",
        "prediction_timedelta",
        "latitude",
        "longitude",
    ],
}

# Query parameters for arrow format and credit limit
params = {"format": "arrow", "request_credit_limit": 150}
response = requests.post(url, headers=headers, json=query, params=params)
response.raise_for_status()

# Read arrow format response
arrow_buffer = pa.py_buffer(response.content)
with pa_ipc.open_stream(arrow_buffer) as reader:
    table = reader.read_all()
df = table.to_pandas()
print(f"✅ Retrieved {len(df)} rows for bounding box")
print(df.head())
return df
```

{% endtab %}

{% tab title="Output" %}

```
✅ Retrieved 1344 rows for bounding box
  model           init_time  ... longitude  air_temperature_at_height_level_2m
0  ept2 2025-10-23 06:00:00  ...  5.916667                          287.000000
1  ept2 2025-10-23 06:00:00  ...  6.000000                          286.700012
2  ept2 2025-10-23 06:00:00  ...  6.083333                          286.200012
3  ept2 2025-10-23 06:00:00  ...  6.166667                          285.399994
4  ept2 2025-10-23 06:00:00  ...  6.250000                          284.200012

[5 rows x 6 columns]
```

{% endtab %}
{% endtabs %}

### Polygons

{% tabs %}
{% tab title="Example (Python)" %}

```python
query = {
    "models": ["ept2"],
    "geo": {
        "type": "polygon",
        "value": [
            [47.3, 8.0],  # Southwest corner
            [47.6, 8.0],  # Northwest corner
            [47.6, 8.8],  # Northeast corner
            [47.3, 8.8],  # Southeast corner
            [47.3, 8.0],  # Close the polygon (same as first point)
        ],  # Polygon around Zurich region
    },
    "variables": [
        "air_temperature_at_height_level_2m",
    ],
    "init_time": "latest",
    "prediction_timedelta": [0],  # IC only
    "order_by": [
        "model",
        "init_time",
        "prediction_timedelta",
        "latitude",
        "longitude",
    ],
}

# Query parameters for arrow format and credit limit
params = {"format": "arrow", "request_credit_limit": 100}
response = requests.post(url, headers=headers, json=query, params=params)
response.raise_for_status()

# Read arrow format response
arrow_buffer = pa.py_buffer(response.content)
with pa_ipc.open_stream(arrow_buffer) as reader:
    table = reader.read_all()
df = table.to_pandas()
print(f"✅ Retrieved {len(df)} rows for polygon")
print(df.head())
return df
```

{% endtab %}

{% tab title="Output" %}

```
✅ Retrieved 40 rows for polygon
  model           init_time  ... longitude  air_temperature_at_height_level_2m
0  ept2 2025-10-23 06:00:00  ...  8.000000                          285.100006
1  ept2 2025-10-23 06:00:00  ...  8.083333                          284.600006
2  ept2 2025-10-23 06:00:00  ...  8.166667                          284.200012
3  ept2 2025-10-23 06:00:00  ...  8.250000                          283.899994
4  ept2 2025-10-23 06:00:00  ...  8.333333                          283.800018

[5 rows x 6 columns]
```

{% endtab %}
{% endtabs %}


# Aggregated Queries

### Daily Min & Max for a location

{% tabs %}
{% tab title="Example (Python)" %}

```python
query = {
    "models": ["ept2"],
    "geo": {
        "type": "point",
        "value": [47.3784, 8.5387],  # [latitude, longitude] - Zurich
        "method": "nearest",
    },
    "variables": [
        "air_temperature_at_height_level_2m",
        "wind_speed_at_height_level_100m",
    ],
    "init_time": "latest",
    "prediction_timedelta": {"start": 0, "end": 72},  # 0-72 hours ahead
}

response = requests.post(url, headers=headers, json=query)
response.raise_for_status()

data = response.json()
df = pd.DataFrame(data)
print(f"✅ Retrieved {len(df)} rows")
print(df.head())
```

{% endtab %}

{% tab title="Output" %}

```
✅ Retrieved 73 rows
  model             init_time  ...  air_temperature_at_height_level_2m  wind_speed_at_height_level_100m
0  ept2  2025-10-23T06:00:00Z  ...                          284.600006                              4.7
1  ept2  2025-10-23T06:00:00Z  ...                          285.399994                              5.0
2  ept2  2025-10-23T06:00:00Z  ...                          286.399994                              4.8
3  ept2  2025-10-23T06:00:00Z  ...                          286.500000                              9.3
4  ept2  2025-10-23T06:00:00Z  ...                          284.800018                             10.8

[5 rows x 7 columns]
```

{% endtab %}
{% endtabs %}

### Hourly Wind Statistics in Germany

{% tabs %}
{% tab title="Example (Python)" %}

```python
query = {
    "models": ["ept2"],
    "geo": {
        "type": "market_zone",
        "value": "DE",  # Germany
    },
    "variables": ["wind_speed_at_height_level_100m"],
    "init_time": "latest",
    "prediction_timedelta": {"start": 0, "end": 72},  # 3 days
    "group_by": [
        {
            # Explicit use of the "to_start_of" transformation
            "field": "time",
            "transformation": "to_start_of",
            "parameters_list": ["hour"],
        }
    ],
    "aggregation": [
        {"aggregation": "max"},
        "min",
        "avg",
        "std",
        "quantile_(0.05)",
        "quantile_(0.95)",
    ],
    "include_time": True,
    "order_by": ["time"],
}

response = requests.post(url, headers=headers, json=query)
response.raise_for_status()

data = response.json()
df = pd.DataFrame(data)
print(f"Retrieved {len(df)} rows")
print(df.head(20))

return df
```

{% endtab %}

{% tab title="Output" %}

```
Retrieved 73 rows
                    time  max__wind_speed_at_height_level_100m  min__wind_speed_at_height_level_100m  ...  std__wind_speed_at_height_level_100m  quantile_(0.05)__wind_speed_at_height_level_100m  quantile_(0.95)__wind_speed_at_height_level_100m
0   2025-10-23T06:00:00Z                             16.500000                                   2.2  ...                              1.972303                                          6.400000                                         13.000000
1   2025-10-23T07:00:00Z                             14.400001                                   4.3  ...                              1.616050                                          6.800000                                         12.300000
2   2025-10-23T08:00:00Z                             14.200000                                   4.4  ...                              1.601147                                          6.600000                                         12.100000
3   2025-10-23T09:00:00Z                             14.300000                                   3.5  ...                              1.763546                                          5.900000                                         12.100000
4   2025-10-23T10:00:00Z                             14.800000                                   2.5  ...                              1.986278                                          4.800000                                         12.100000
5   2025-10-23T11:00:00Z                             16.900000                                   0.8  ...                              2.325559                                          4.300000                                         13.200000
6   2025-10-23T12:00:00Z                             18.500000                                   0.3  ...                              2.384850                                          7.200000                                         14.200000
7   2025-10-23T13:00:00Z                             18.400000                                   3.0  ...                              2.306951                                          7.400000                                         15.000000
8   2025-10-23T14:00:00Z                             18.700001                                   2.8  ...                              2.426426                                          7.300000                                         15.200000
9   2025-10-23T15:00:00Z                             18.700001                                   2.0  ...                              2.556340                                          7.100000                                         15.200000
10  2025-10-23T16:00:00Z                             18.900000                                   2.0  ...                              2.614214                                          7.100000                                         15.300000
11  2025-10-23T17:00:00Z                             18.200001                                   2.1  ...                              2.600091                                          7.500000                                         15.400001
12  2025-10-23T18:00:00Z                             17.100000                                   2.4  ...                              2.495059                                          7.600000                                         15.500000
13  2025-10-23T19:00:00Z                             16.600000                                   3.0  ...                              2.329726                                          7.900000                                         15.500000
14  2025-10-23T20:00:00Z                             16.500000                                   3.0  ...                              2.047417                                          8.500000                                         15.000000
15  2025-10-23T21:00:00Z                             15.800000                                   3.4  ...                              1.769095                                          8.700000                                         14.700000
16  2025-10-23T22:00:00Z                             15.900001                                   3.8  ...                              1.552549                                          8.800000                                         14.100000
17  2025-10-23T23:00:00Z                             17.100000                                   4.1  ...                              1.521312                                          8.900001                                         13.900001
18  2025-10-24T00:00:00Z                             17.900000                                   4.1  ...                              1.475617                                          9.000000                                         13.600000
19  2025-10-24T01:00:00Z                             18.200001                                   4.4  ...                              1.409908                                          9.200000                                         13.500000

[20 rows x 7 columns]
```

{% endtab %}
{% endtabs %}

### Capacity Weighted Average Wind Speed in Germany

{% tabs %}
{% tab title="Example (Python)" %}

```python
 query = {
    "models": ["ept2"],
    "geo": {
        "type": "market_zone",
        "value": "DE",  # Germany
    },
    "variables": ["wind_speed_at_height_level_100m"],
    "init_time": "latest",
    "prediction_timedelta": {"start": 0, "end": 72},  # 3 days
    "weighting": {"type": "wind_capacity"},
    "group_by": [
        {
            "field": "time",
            "transformation": "to_start_of",
            "parameters_list": ["hour"],
        }
    ],
    "aggregation": [{"aggregation": "avg"}],
    "include_time": True,
    "order_by": ["time"],
}

response = requests.post(url, headers=headers, json=query)
response.raise_for_status()

data = response.json()
df = pd.DataFrame(data)
print(f"Retrieved {len(df)} rows")
print(df.head(20))
```

{% endtab %}

{% tab title="Output" %}

```
Retrieved 73 rows
                    time  avg__wind_speed_at_height_level_100m
0   2025-10-23T06:00:00Z                             10.473292
1   2025-10-23T07:00:00Z                             10.559825
2   2025-10-23T08:00:00Z                             10.471903
3   2025-10-23T09:00:00Z                             10.234161
4   2025-10-23T10:00:00Z                              9.740825
5   2025-10-23T11:00:00Z                              9.817058
6   2025-10-23T12:00:00Z                              9.906179
7   2025-10-23T13:00:00Z                             10.051497
8   2025-10-23T14:00:00Z                             10.096489
9   2025-10-23T15:00:00Z                             10.191436
10  2025-10-23T16:00:00Z                             10.326234
11  2025-10-23T17:00:00Z                             10.489385
12  2025-10-23T18:00:00Z                             10.661165
13  2025-10-23T19:00:00Z                             10.938301
14  2025-10-23T20:00:00Z                             11.160419
15  2025-10-23T21:00:00Z                             11.237437
16  2025-10-23T22:00:00Z                             11.150809
17  2025-10-23T23:00:00Z                             11.313920
18  2025-10-24T00:00:00Z                             11.484743
19  2025-10-24T01:00:00Z                             11.695437
```

{% endtab %}
{% endtabs %}

### Capacity Weighted Average in a Polygon

{% tabs %}
{% tab title="Example (Python)" %}

```python
query = {
    "models": ["ept2"],
    "geo": {
        "type": "polygon",
        "value": [
            [
                [53.0, 8.0],
                [53.0, 12.0],
                [55.0, 12.0],
                [55.0, 8.0],
                [53.0, 8.0],
            ]
        ],
    },
    "variables": ["wind_speed_at_height_level_100m"],
    "init_time": "latest",
    "prediction_timedelta": {"start": 0, "end": 48},  # 2 days
    "weighting": {"type": "wind_capacity"},
    "group_by": [
        {
            "field": "time",
            "transformation": "to_start_of",
            "parameters_list": ["hour"],
        }
    ],
    "aggregation": [{"aggregation": "avg"}],
    "include_time": True,
    "order_by": ["time"],
}

response = requests.post(url, headers=headers, json=query)
response.raise_for_status()

data = response.json()
df = pd.DataFrame(data)
print(f"Retrieved {len(df)} rows")
print(df.head(20))
```

{% endtab %}

{% tab title="Output" %}

```
Retrieved 49 rows
                    time  avg__wind_speed_at_height_level_100m
0   2025-10-23T06:00:00Z                             11.385012
1   2025-10-23T07:00:00Z                             11.701327
2   2025-10-23T08:00:00Z                             11.644365
3   2025-10-23T09:00:00Z                             11.242075
4   2025-10-23T10:00:00Z                             10.356984
5   2025-10-23T11:00:00Z                              9.627563
6   2025-10-23T12:00:00Z                              8.863163
7   2025-10-23T13:00:00Z                              8.323935
8   2025-10-23T14:00:00Z                              7.914524
9   2025-10-23T15:00:00Z                              7.662574
10  2025-10-23T16:00:00Z                              7.734694
11  2025-10-23T17:00:00Z                              8.140329
12  2025-10-23T18:00:00Z                              8.584207
13  2025-10-23T19:00:00Z                              8.879365
14  2025-10-23T20:00:00Z                              9.181939
15  2025-10-23T21:00:00Z                              9.383254
16  2025-10-23T22:00:00Z                              9.735419
17  2025-10-23T23:00:00Z                             10.298345
18  2025-10-24T00:00:00Z                             10.977109
19  2025-10-24T01:00:00Z                             11.730488
```

{% endtab %}
{% endtabs %}


# Open API Reference


# Jua Query Engine API

Access to Jua's weather forecast and energy market data.


# Features

* Query forecast data for specific locations, regions, or market zones
* Access multiple forecast models with various resolutions and update frequencies
* Query ENTSOE energy market data including prices, load, and generation
* Retrieve data in JSON or Apache Arrow format for efficient processing
* Stream large datasets with optional streaming response
* Advanced aggregation and grouping capabilities
* Estimate credit consumption before executing queries


# Authentication

Include your API key in the `X-API-Key` header:

```
X-API-Key: your_api_key_id:your_api_key_secret
```


# Documentation

For detailed guides, tutorials, and examples, visit our documentation at [docs.jua.ai](https://docs.jua.ai).


# Rate Limiting

API requests are subject to rate limiting based on your subscription plan. Rate limit information is included in response headers.


# Forecast

Query and retrieve weather forecast data from Jua's platform.

## Get forecast models metadata

> Retrieve metadata for available forecast models including:\
> \- Available weather variables for each model\
> \- Spatial grid resolution information\
> \- Model identifiers\
> \
> Use this endpoint to discover which models and variables are available before making data queries.\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For detailed model specifications and variable descriptions, visit \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform."}],"security":[{"HTTPBearer":[]}],"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","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"}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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"},"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."},"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"},"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"},"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"],"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³"},"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"},"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,"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``."},"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"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available forecasts

> List all available forecast initialization times for specified models with optional time filtering.\
> \
> Returns forecast init times and maximum available lead times, useful for:\
> \- Discovering historical forecast availability\
> \- Finding specific forecast runs\
> \- Monitoring forecast data updates\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> Results are paginated. Use \`limit\` and \`offset\` parameters to navigate through large result sets.\
> \
> For forecast schedules and update frequencies, see \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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)","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)","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"}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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"},"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."},"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."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Count available forecasts

> Get the total count of available forecasts per model with optional time filtering.\
> \
> Useful for:\
> \- Checking data availability before querying\
> \- Monitoring forecast archive growth\
> \- Validating expected data coverage\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For more information on forecast availability, see \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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)","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)","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"}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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"},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Get latest forecast initialization time

> Retrieve the most recent forecast initialization time available for each model.\
> \
> Returns:\
> \- Latest init\_time for each model\
> \- Maximum available lead time for that forecast\
> \
> Useful for:\
> \- Getting real-time forecast data with \`init\_time='latest'\`\
> \- Monitoring forecast update status\
> \- Validating forecast freshness\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For forecast update schedules, see \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform."}],"security":[{"HTTPBearer":[]}],"paths":{"/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\nUseful for:\n- Getting real-time forecast data with `init_time='latest'`\n- Monitoring forecast update status\n- Validating forecast freshness\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","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","default":0,"title":"Min Prediction Timedelta"},"description":"Minimum required lead time in minutes"}],"responses":{"200":{"description":"Successfully retrieved latest forecast info","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestForecastInfoQueryResult"}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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"},"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Get forecast dissemination status

> Retrieve dissemination status and delay statistics for forecasts.\
> \
> Returns for each model:\
> \- Status for individual forecasts (init\_time, delay, whether missing)\
> \- Aggregated delay statistics (min, max, mean, median, std, percentiles)\
> \- Missing forecast percentage\
> \
> Useful for:\
> \- Monitoring forecast delivery timeliness\
> \- Identifying delayed or missing forecasts\
> \- Analyzing dissemination performance over time\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> Results are paginated. Use \`limit\` and \`offset\` parameters to navigate through large result sets.\
> \
> For forecast schedules and SLA information, see \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform."}],"security":[{"HTTPBearer":[]}],"paths":{"/v1/forecast/dissemination-status":{"get":{"tags":["forecast"],"summary":"Get forecast dissemination status","description":"Retrieve dissemination status and delay statistics for forecasts.\n\nReturns for each model:\n- Status for individual forecasts (init_time, delay, whether missing)\n- Aggregated delay statistics (min, max, mean, median, std, percentiles)\n- Missing forecast percentage\n\nUseful for:\n- Monitoring forecast delivery timeliness\n- Identifying delayed or missing forecasts\n- Analyzing dissemination performance over time\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 SLA information, see [docs.jua.ai](https://docs.jua.ai).","operationId":"get_forecast_dissemination_status_v1_forecast_dissemination_status_get","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 analyze forecasts initialized on or after this datetime (optional)","title":"Since"},"description":"Only analyze 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 analyze forecasts initialized before this datetime (optional)","title":"Before"},"description":"Only analyze forecasts initialized before this datetime (optional)"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Maximum number of forecasts to analyze per model","default":100,"title":"Limit"},"description":"Maximum number of forecasts to analyze per model"},{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Number of forecasts to skip for pagination","default":0,"title":"Offset"},"description":"Number of forecasts to skip for pagination"},{"name":"only_stats","in":"query","required":false,"schema":{"type":"boolean","description":"Only return delay statistics per init time (without forecast status)","default":false,"title":"Only Stats"},"description":"Only return delay statistics per init time (without forecast status)"}],"responses":{"200":{"description":"Successfully retrieved dissemination status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisseminationStatus"}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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"},"DisseminationStatus":{"properties":{"status_per_model":{"additionalProperties":{"$ref":"#/components/schemas/ModelDisseminationStatus"},"propertyNames":{"$ref":"#/components/schemas/Model"},"type":"object","title":"Status Per Model","description":"Status per model"}},"type":"object","required":["status_per_model"],"title":"DisseminationStatus"},"ModelDisseminationStatus":{"properties":{"status":{"items":{"$ref":"#/components/schemas/ForecastDisseminationStatus"},"type":"array","title":"Status","description":"Status for the model"},"delay_stats_per_init_time":{"additionalProperties":{"$ref":"#/components/schemas/DisseminationStats"},"type":"object","title":"Delay Stats Per Init Time","description":"Delay statistics per init time (without date, e.g., '00:00', '06:00')"}},"type":"object","required":["status","delay_stats_per_init_time"],"title":"ModelDisseminationStatus"},"ForecastDisseminationStatus":{"properties":{"init_time":{"type":"string","title":"Init Time","description":"Forecast initialization time"},"delay":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delay","description":"Delay in minutes"},"is_missing":{"type":"boolean","title":"Is Missing","description":"Whether the forecast is missing","default":false},"dissemination_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dissemination Time","description":"Forecast dissemination time"},"expected_dissemination_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Expected Dissemination Time","description":"Expected dissemination time"},"max_prediction_timedelta":{"type":"integer","title":"Max Prediction Timedelta","description":"Maximum prediction timedelta for the forecast"},"expected_max_prediction_timedelta":{"type":"integer","title":"Expected Max Prediction Timedelta","description":"Expected maximum prediction timedelta for the forecast"},"is_delayed":{"type":"boolean","title":"Is Delayed","description":"Whether the forecast is delayed","readOnly":true}},"type":"object","required":["init_time","max_prediction_timedelta","expected_max_prediction_timedelta","is_delayed"],"title":"ForecastDisseminationStatus"},"DisseminationStats":{"properties":{"number_of_data_points":{"type":"integer","title":"Number Of Data Points","description":"Number of data points.Tracking started on '2025-10-29"},"min":{"type":"number","title":"Min","description":"Minimum delay in minutes"},"max":{"type":"number","title":"Max","description":"Maximum delay in minutes"},"mean":{"type":"number","title":"Mean","description":"Mean delay in minutes"},"median":{"type":"number","title":"Median","description":"Median delay in minutes"},"std":{"type":"number","title":"Std","description":"Standard deviation of delay in minutes"},"q90":{"type":"number","title":"Q90","description":"90th percentile of delay in minutes"},"q99":{"type":"number","title":"Q99","description":"99th percentile of delay in minutes"},"in_time_percentage":{"type":"number","title":"In Time Percentage","description":"Percentage of forecasts in time"},"missing_percentage":{"type":"number","title":"Missing Percentage","description":"Percentage of missing forecasts"},"expected_dissemination_time":{"type":"string","format":"time","title":"Expected Dissemination Time","description":"Expected dissemination time (time of day) as reference"},"dissemination_time_min":{"type":"string","format":"time","title":"Dissemination Time Min","description":"Minimum dissemination time (time of day)"},"dissemination_time_max":{"type":"string","format":"time","title":"Dissemination Time Max","description":"Maximum dissemination time (time of day)"},"dissemination_time_mean":{"type":"string","format":"time","title":"Dissemination Time Mean","description":"Mean dissemination time (time of day)"},"dissemination_time_median":{"type":"string","format":"time","title":"Dissemination Time Median","description":"Median dissemination time (time of day)"},"dissemination_time_q90":{"type":"string","format":"time","title":"Dissemination Time Q90","description":"90th percentile of dissemination time (time of day)"},"dissemination_time_q99":{"type":"string","format":"time","title":"Dissemination Time Q99","description":"99th percentile of dissemination time (time of day)"}},"type":"object","required":["number_of_data_points","min","max","mean","median","std","q90","q99","in_time_percentage","missing_percentage","expected_dissemination_time","dissemination_time_min","dissemination_time_max","dissemination_time_mean","dissemination_time_median","dissemination_time_q90","dissemination_time_q99"],"title":"DisseminationStats"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Query forecast data

> Main endpoint for querying weather forecast data with full flexibility.\
> \
> \## Features\
> \- Query by location (point, area, market zone) and time\
> \- Select specific models and weather variables\
> \- Support for aggregation and grouping\
> \- Multiple response formats (JSON, Apache Arrow)\
> \- Optional streaming for large datasets\
> \
> \## Response Formats\
> \- \*\*JSON\*\* (\`format=json\`): Returns columnar JSON \`{column: \[values], ...}\` suitable for small to medium datasets\
> \- \*\*Arrow\*\* (\`format=arrow\`): Returns Apache Arrow IPC stream for efficient large dataset handling\
> \
> \## Streaming\
> Set \`stream=true\` for streaming responses with Arrow format. Recommended for queries returning >100k rows.\
> \
> \## Cost Management\
> Queries are billed based on data volume, models, and variables. Use:\
> \- \`request\_credit\_limit\`: Set maximum credits to prevent unexpectedly large charges\
> \- \`/cost\` endpoint: Estimate costs before executing\
> \
> For more details on how the costs are computed, visit \[docs.jua.ai/pricing]\(<https://docs.jua.ai/pricing).\\>
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For detailed query examples and best practices, visit \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform."}],"security":[{"HTTPBearer":[]}],"paths":{"/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## 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","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":"X-Request-Source","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Source"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForecastQuery"}}}},"responses":{"200":{"description":"Successfully retrieved forecast data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"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."},"geo":{"$ref":"#/components/schemas/GeoFilter","description":"Geographic filter specifying the query location(s) or region(s)"},"init_time":{"anyOf":[{"type":"integer","minimum":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,"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."},"model_runs":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"integer","minimum":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,"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."},"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"},"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"},"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. "},"latest_min_prediction_timedelta":{"anyOf":[{"type":"integer","minimum":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","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"},"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"},"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'}"},"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)"},"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"},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters for limiting result size. Requires 'order_by' to be specified"},"were_variables_explicitly_requested":{"type":"boolean","title":"Were Variables Explicitly Requested","description":"Whether the user passed the variables explicitly. If True, the variables will be used to filter the results. If False, all variables will be returned.","default":true},"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},"value_filters":{"anyOf":[{"items":{"$ref":"#/components/schemas/ValueFilter"},"type":"array"},{"type":"null"}],"title":"Value Filters","description":"Post-aggregation value filters applied as an outermost SQL wrapper. Used by alert evaluation to push threshold conditions into ClickHouse."},"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, return calibratable Jua ensemble models using the calibrated spread delivered in Jua's forecast product. Non-calibratable models pass through unchanged. Set to False to return the raw ensemble spread.","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."},"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"},"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."},"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."},"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."},"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."},"TimeSlice":{"properties":{"start":{"type":"string","format":"date-time","title":"Start","description":"Start datetime (inclusive)"},"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."},"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,"minimum":0,"title":"Hour","description":"UTC hour (0-23)"},"minute":{"anyOf":[{"type":"integer","maximum":59,"minimum":0},{"type":"null"}],"title":"Minute","description":"Optional UTC minute (0-59). Omit for the legacy hour-only behavior."},"offset":{"type":"integer","minimum":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."},"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"],"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³"},"PredictionTimedeltaSlice":{"properties":{"start":{"type":"integer","minimum":0,"title":"Start","description":"Start lead time in minutes from init_time (inclusive)","default":0},"end":{"anyOf":[{"type":"integer","minimum":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."},"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"},"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]]"},"Coordinates":{"type":"string","enum":["model","init_time","time","prediction_timedelta","latitude","longitude","point","market_zone","country_key"],"title":"Coordinates"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Aggregation":{"properties":{"aggregation":{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"],"title":"Aggregation","description":"Aggregation function name."},"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."},"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."},"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"},"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"}},"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."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"ValueFilter":{"properties":{"variable":{"type":"string","title":"Variable"},"operator":{"type":"string","title":"Operator"},"value":{"type":"number","title":"Value"}},"type":"object","required":["variable","operator","value"],"title":"ValueFilter","description":"Post-aggregation value filter applied as outermost SQL wrapper."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Query forecast data index

> Endpoint to obtain the index for weather forecasts.\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For detailed query examples and best practices, visit \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"responses":{"200":{"description":"Successfully retrieved forecast data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"ForecastIndexQuery":{"properties":{"model":{"$ref":"#/components/schemas/Model","description":"Model identifiers to query (e.g. 'ept2')"},"init_time":{"anyOf":[{"type":"integer","minimum":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,"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."},"latitude":{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2,"title":"Latitude","description":"The range of latitudes to return."},"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)"},"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"},"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. "},"latest_min_prediction_timedelta":{"anyOf":[{"type":"integer","minimum":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","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"}},"type":"object","required":["model","init_time","latitude","longitude"],"title":"ForecastIndexQuery","description":"Main query object for retrieving the index for forecast data."},"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"},"TimeSlice":{"properties":{"start":{"type":"string","format":"date-time","title":"Start","description":"Start datetime (inclusive)"},"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."},"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,"minimum":0,"title":"Hour","description":"UTC hour (0-23)"},"minute":{"anyOf":[{"type":"integer","maximum":59,"minimum":0},{"type":"null"}],"title":"Minute","description":"Optional UTC minute (0-59). Omit for the legacy hour-only behavior."},"offset":{"type":"integer","minimum":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."},"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"],"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³"},"PredictionTimedeltaSlice":{"properties":{"start":{"type":"integer","minimum":0,"title":"Start","description":"Start lead time in minutes from init_time (inclusive)","default":0},"end":{"anyOf":[{"type":"integer","minimum":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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Query forecast data (simple)

> Simplified GET endpoint for querying forecast data at a single point location.\
> \
> This endpoint provides a simpler interface compared to POST \`/data\` for basic point queries.\
> Use this for quick lookups at specific coordinates.\
> \
> \*\*Limitations\*\*:\
> \- Point queries only (no areas or market zones)\
> \- JSON response format only (no Arrow or streaming)\
> \- No grouping or aggregation support\
> \
> For advanced queries with aggregation, multiple locations, or Arrow format, use POST \`/data\`.\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> See \[docs.jua.ai]\(<https://docs.jua.ai/>) for examples.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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","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":{}}}},"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"}}}}}}}},"components":{"schemas":{"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"},"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"],"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³"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Query market-aggregated forecast data

> Simplified GET endpoint for querying weighted-average forecasts over market zones or countries.\
> \
> Automatically applies weighted aggregation based on capacity (wind/solar) or population distribution.\
> Useful for energy market analysis and regional forecasting.\
> \
> \*\*Common Use Cases\*\*:\
> \- Wind power generation forecasts for market zones (weighted by wind capacity)\
> \- Solar power generation forecasts (weighted by solar capacity)\
> \- Population-weighted temperature averages for countries\
> \
> \*\*Weighting Options\*\*:\
> \- \`wind\_capacity\`: Weight by installed wind power capacity\
> \- \`solar\_capacity\`: Weight by installed solar power capacity  \
> \- \`population\`: Weight by population density\
> \
> \*\*Limitations\*\*:\
> \- JSON response format only (no Arrow or streaming)\
> \- Must specify either \`market\_zones\` OR \`country\_keys\` (not both)\
> \
> For advanced aggregation queries, use POST \`/data\` with \`group\_by\` and \`weighting\` parameters.\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> See \[docs.jua.ai]\(<https://docs.jua.ai/>) for examples.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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","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":"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":{}}}},"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"}}}}}}}},"components":{"schemas":{"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"},"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"],"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³"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List market zones capable of MW output

> Return market zones that have both facility data and fitted power curves.\
> \
> This is a metadata endpoint and does not require authentication.\
> \
> A zone is MW-capable for wind if it has operating wind facilities\
> \*and\* corresponding entries in the wind power-curve tables.\
> Same logic applies for solar.\
> \
> Results are cached in-memory for 5 minutes.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"forecast","description":"Query and retrieve weather forecast data from Jua's platform."}],"paths":{"/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 and does not require authentication.\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"}}}}}}}},"components":{"schemas":{"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Benchmarks

Query station benchmark metrics for model evaluation and comparison.

## Query station benchmark metrics

> Query benchmark metrics (RMSE, MAE, bias, CRPS, quantiles) for forecast models evaluated against weather station observations.\
> \
> CRPS (Continuous Ranked Probability Score) is derived from the per-ensemble-member forecast errors; for deterministic models it equals MAE.\
> \
> For calibratable Jua ensemble models, CRPS reflects the delivered-product spread calibration by default. Set \`calibrate=false\` to evaluate the raw ensemble spread instead.\
> \
> \*\*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.\
> \
> Useful for:\
> \- Comparing forecast model performance\
> \- Evaluating model accuracy by region\
> \- Analyzing forecast errors over time\
> \
> \*\*Multi-Model Support\*\*:\
> \- Query multiple models in a single request to compare performance\
> \- Results include model name in each row for easy comparison\
> \
> \*\*Geographic Filtering\*\*:\
> \- \`market\_zone\`: Filter by energy market zone (e.g., "DE", "FR")\
> \- \`country\_key\`: Filter by country code (e.g., "DE", "US")\
> \
> \*\*Note\*\*: Either \`station\_ids\` or \`geo\` must be provided (mutually exclusive).\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For more information on benchmark metrics, see \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"benchmarks","description":"Query station benchmark metrics for model evaluation and comparison."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"responses":{"200":{"description":"Successfully retrieved benchmark metrics","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"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."},"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."},"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."},"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."},"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."},"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"},"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"],"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³"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Get available benchmark dates

> Retrieve available dates for station benchmark data with optional filtering.\
> \
> Useful for:\
> \- Discovering available benchmark data\
> \- Finding recent benchmark dates\
> \- Planning benchmark queries\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For more information, see \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"benchmarks","description":"Query station benchmark metrics for model evaluation and comparison."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}}},"components":{"schemas":{"AvailableDatesResponse":{"properties":{"dates":{"items":{"type":"string"},"type":"array","title":"Dates"}},"type":"object","required":["dates"],"title":"AvailableDatesResponse","description":"Response containing available benchmark dates."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Get solar-benchmark geographic coverage

> List the country and market-zone codes that have at least one audited solar\
> radiation station.\
> \
> The surface-solar-radiation benchmark is scored only over stations that passed\
> the offline radiation quality audit (a much smaller set than the synoptic\
> network). This endpoint returns the regions where a solar country / market-zone\
> benchmark can actually be computed, so the dashboard can restrict the\
> solar-benchmark region pickers to non-empty selections.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"benchmarks","description":"Query station benchmark metrics for model evaluation and comparison."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Entsoe

Query ENTSOE energy market data including prices, load, and generation.

## Query ENTSOE timeseries data

> Query ENTSOE energy market timeseries data including:\
> \- Day-ahead and imbalance prices\
> \- Load and generation actuals and forecasts\
> \- Cross-border flows and scheduled exchanges\
> \- Wind and solar forecasts\
> \
> \*\*Supported Variables:\*\*\
> \- \`day\_ahead\_prices\`: Day-ahead electricity market prices\
> \- \`imbalance\_prices\`: Imbalance settlement prices\
> \- \`load\_actual\`: Actual total load\
> \- \`load\_forecast\_da\`: Day-ahead load forecast\
> \- \`generation\_actual\`: Actual power generation by source type\
> \- \`generation\_forecast\_da\`: Day-ahead generation forecast\
> \- \`crossborder\_flows\`: Physical cross-border power flows\
> \- \`wind\_solar\_forecast\_da\`: Day-ahead wind/solar forecast\
> \- And more...\
> \
> \*\*Response Formats:\*\*\
> \- \`json\`: Columnar JSON format \`{column: \[values], ...}\`\
> \- \`arrow\`: Apache Arrow IPC stream for efficient processing\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For more information, see \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"entsoe","description":"Query ENTSOE energy market data including prices, load, and generation."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"responses":{"200":{"description":"Successfully retrieved ENTSOE data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"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."},"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'])"},"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)"},"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)"},"psr_types":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoePsrType"},"type":"array"},{"type":"null"}],"title":"Psr Types","description":"List of PSR types to filter generation data"},"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)"},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)"},"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)"},"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"},"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'}"},"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."},"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."},"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."},"EntsoeOtherType":{"type":"string","enum":["Long","Short"],"title":"EntsoeOtherType","description":"ENTSOE Other Type (for imbalance data)."},"jua_query_v2__entsoe__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for ENTSOE queries."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Query ENTSOE data in pivoted wide-column format

> 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.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"entsoe","description":"Query ENTSOE energy market data including prices, load, and generation."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}}}}}},"components":{"schemas":{"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."},"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."},"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Query ENTSOE outages data

> Query ENTSOE infrastructure outages (generation units and transmission lines).\
> \
> \*\*Features:\*\*\
> \- \*\*Source Types:\*\* Generation units (power plants) or Transmission lines\
> \- \*\*Time Filtering:\*\* Real-time snapshots (active\_at) or schedule ranges (start\_from/to)\
> \- \*\*Filtering:\*\* Filter by zone, plant type, business type (planned/forced)\
> \- \*\*Aggregation:\*\* Optional capacity aggregation summaries\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"entsoe","description":"Query ENTSOE energy market data including prices, load, and generation."}],"security":[{"HTTPBearer":[]}],"paths":{"/v1/entsoe/outages":{"post":{"tags":["entsoe"],"summary":"Query ENTSOE outages data","description":"Query ENTSOE infrastructure outages (generation units and transmission lines).\n\n**Features:**\n- **Source Types:** Generation units (power plants) or Transmission lines\n- **Time Filtering:** Real-time snapshots (active_at) or schedule ranges (start_from/to)\n- **Filtering:** Filter by zone, plant type, business type (planned/forced)\n- **Aggregation:** Optional capacity aggregation summaries\n\n**Authentication**: Requires API key.","operationId":"post_entsoe_outages_v1_entsoe_outages_post","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"}}}},"responses":{"200":{"description":"Successfully retrieved outages data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"EntsoeOutagesQuery":{"properties":{"source_type":{"anyOf":[{"$ref":"#/components/schemas/EntsoeOutageSourceType"},{"type":"null"}],"description":"Filter by source type (generation_unit or transmission)"},"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)"},"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":"Exclude cancelled outages (docstatus in ['A09', 'Cancelled'])","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"}},"type":"object","title":"EntsoeOutagesQuery","description":"Query parameters for ENTSOE outages data.\n\nSupports filtering by:\n- source_type: Generation vs Transmission\n- zones: biddingzone_domain (gen) or in_domain/out_domain (trans)\n- time: active_at, or start_from/start_to\n- attributes: plant_type, business_type, status"},"EntsoeOutageSourceType":{"type":"string","enum":["generation_unit","transmission"],"title":"EntsoeOutageSourceType","description":"Outage source type discriminator."},"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."},"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."},"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)."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available ENTSOE variables

> Get a list of available ENTSOE variable types with metadata including:\
> \- Variable name\
> \- Description\
> \- Unit of measurement\
> \- Whether variable uses zone\_key, zone\_from/zone\_to, or psr\_type filters\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"entsoe","description":"Query ENTSOE energy market data including prices, load, and generation."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available ENTSOE zones

> Get a list of available zone codes (bidding zones, countries).\
> \
> Optionally filter by variable to see which zones have data for a specific variable.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"entsoe","description":"Query ENTSOE energy market data including prices, load, and generation."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"AvailableZonesResult":{"properties":{"zones":{"items":{"type":"string"},"type":"array","title":"Zones"}},"type":"object","required":["zones"],"title":"AvailableZonesResult","description":"Result for available zones query."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available PSR types

> Get a list of available PSR (Production Source Type) codes for generation data.\
> \
> PSR types include:\
> \- Solar, Wind Onshore, Wind Offshore\
> \- Nuclear, Hydro (various types)\
> \- Fossil fuels (Gas, Coal, Oil, etc.)\
> \- Biomass, Geothermal, etc.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"entsoe","description":"Query ENTSOE energy market data including prices, load, and generation."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Netztransparenz

Query German TSO transparency data (netztransparenz.de) including NRV balance, balancing prices, reserve activation, and renewable forecasts.

## Query Netztransparenz timeseries data

> Query German TSO transparency data (netztransparenz.de) including:\
> \- NRV balance (grid control cooperation)\
> \- Balancing energy prices (reBAP, ID-AEP, AEP estimator)\
> \- Reserve power activation (aFRR, mFRR, FCR)\
> \- Renewable energy marketing and forecasts\
> \- Emergency measures (additional measures, emergency assistance, interruptible loads)\
> \
> \*\*TSOs (Transmission System Operators):\*\*\
> \- 50Hertz (Eastern Germany)\
> \- Amprion (Western Germany)\
> \- TenneT TSO (Northern Germany)\
> \- TransnetBW (Southern Germany)\
> \- gesamt (Germany-wide aggregate)\
> \
> \*\*Variables with Per-TSO Data:\*\*\
> Reserve activation (aktivierte\_srl\_\*, aktivierte\_mrl\_\*, srl\_optimierung\_\*, mrl\_optimierung\_\*,\
> difference\_\*, prl\_\*, zusatzmassnahmen\_\*, nothilfe\_\*), interruptible loads (abschaltbare\_lasten\_\*),\
> and control area balance (rz\_saldo\_\*) have data for all 4 individual TSOs plus the gesamt aggregate.\
> \
> \*\*Response Formats:\*\*\
> \- \`json\`: Columnar JSON format \`{column: \[values], ...}\`\
> \- \`arrow\`: Apache Arrow IPC stream for efficient processing\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"netztransparenz","description":"Query German TSO transparency data (netztransparenz.de) including NRV balance, balancing prices, reserve activation, and renewable forecasts."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"responses":{"200":{"description":"Successfully retrieved Netztransparenz data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"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."},"tsos":{"anyOf":[{"items":{"$ref":"#/components/schemas/NetztransparenzTso"},"type":"array"},{"type":"null"}],"title":"Tsos","description":"List of TSOs to filter by (e.g., ['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)"},"directions":{"anyOf":[{"items":{"$ref":"#/components/schemas/NetztransparenzDirection"},"type":"array"},{"type":"null"}],"title":"Directions","description":"List of directions (e.g., ['positive', 'negative'])"},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)"},"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)"},"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"},"order_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by"},"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."},"NetztransparenzVariable":{"type":"string","enum":["vermarktung_epex","vermarktung_exaa","vermarktung_solar","vermarktung_wind","vermarktung_sonstige","untertaegige_strommengen","differenz_einspeiseprognose","hochrechnung_solar","hochrechnung_wind","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."},"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."},"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"},"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."},"jua_query_v2__netztransparenz__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for Netztransparenz queries."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available Netztransparenz variables

> Get a list of available Netztransparenz variable types with metadata including:\
> \- Variable name\
> \- Description\
> \- Unit of measurement\
> \- Whether variable uses TSO or subcategory filters\
> \
> \*\*Variable Categories:\*\*\
> \- Renewable Marketing (vermarktung\_\*)\
> \- Day-Ahead Forecast (hochrechnung\_\*)\
> \- NRV Balance (nrv\_saldo\_\*, rz\_saldo\_\*)\
> \- Balancing Prices (rebap\_qualitaetsgesichert, idaep, aep\_schaetzer\_\*)\
> \- Reserve Activation (aktivierte\_srl\_\*, aktivierte\_mrl\_\*, prl\_\*)\
> \- Emergency Measures (zusatzmassnahmen\_\*, nothilfe\_\*, abschaltbare\_lasten\_\*)\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"netztransparenz","description":"Query German TSO transparency data (netztransparenz.de) including NRV balance, balancing prices, reserve activation, and renewable forecasts."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available TSOs

> Get a list of available German Transmission System Operators (TSOs).\
> \
> The four TSOs operating the German high-voltage grid, plus the aggregate:\
> \- \*\*50Hertz\*\* - Eastern Germany\
> \- \*\*Amprion\*\* - Western Germany\
> \- \*\*TenneT TSO\*\* - Northern Germany\
> \- \*\*TransnetBW\*\* - Southern Germany\
> \- \*\*gesamt\*\* - Germany-wide aggregate (sum of all TSOs)\
> \
> Optionally filter by variable to see which TSOs have data for a specific variable.\
> Many reserve activation variables now have per-TSO data in addition to the aggregate.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"netztransparenz","description":"Query German TSO transparency data (netztransparenz.de) including NRV balance, balancing prices, reserve activation, and renewable forecasts."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"NetztransparenzVariable":{"type":"string","enum":["vermarktung_epex","vermarktung_exaa","vermarktung_solar","vermarktung_wind","vermarktung_sonstige","untertaegige_strommengen","differenz_einspeiseprognose","hochrechnung_solar","hochrechnung_wind","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."},"AvailableTsosResult":{"properties":{"tsos":{"items":{"type":"string"},"type":"array","title":"Tsos"}},"type":"object","required":["tsos"],"title":"AvailableTsosResult","description":"Result for available TSOs query."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available subcategories

> Get a list of available subcategories (technology types) for data that is\
> broken down by energy source.\
> \
> Subcategories include:\
> \- \*\*solar\*\* - Solar photovoltaic\
> \- \*\*wind\_onshore\*\* - Onshore wind\
> \- \*\*wind\_offshore\*\* - Offshore wind\
> \- \*\*wind\*\* - Combined wind (used in some endpoints)\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"netztransparenz","description":"Query German TSO transparency data (netztransparenz.de) including NRV balance, balancing prices, reserve activation, and renewable forecasts."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"NetztransparenzVariable":{"type":"string","enum":["vermarktung_epex","vermarktung_exaa","vermarktung_solar","vermarktung_wind","vermarktung_sonstige","untertaegige_strommengen","differenz_einspeiseprognose","hochrechnung_solar","hochrechnung_wind","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."},"AvailableSubcategoriesResult":{"properties":{"subcategories":{"items":{"type":"string"},"type":"array","title":"Subcategories"}},"type":"object","required":["subcategories"],"title":"AvailableSubcategoriesResult","description":"Result for available subcategories query."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Climatology

Query ERA5 WMO 30-year climatology data (1991-2020) for historical baselines.

## Query climatology data over a time range

> Query ERA5 WMO climatology data (smoothed 30-year daily averages from 1991-2020) over a specified time range.\
> \
> Climatology provides historical baseline values for each (day\_of\_year, hour, latitude, longitude)\
> combination, useful for:\
> \- Comparing forecasts against historical norms\
> \- Detecting anomalies in weather patterns\
> \- Energy market baseline calculations\
> \
> \*\*Time Range Query:\*\*\
> Specify \`start\_time\` and \`end\_time\` to get climatology data for each hour in the range.\
> The climatology values are matched by day of year and hour, then combined with the full\
> datetime from your time range. This allows you to get a "typical" weather pattern\
> for any date range based on historical averages.\
> \
> \*\*Response Format:\*\*\
> Use \`format=json\` or \`format=arrow\` to select the response explicitly. When\
> \`format\` is omitted, \`Accept: application/vnd.apache.arrow\.stream\` selects Arrow\
> and all other requests retain the JSON default.\
> \
> \*\*Query Dimensions:\*\*\
> \- \`geo\`: Location filter (point, bounding\_box, polygon, market\_zone, country\_key)\
> \- \`start\_time\`: Start of the time range (inclusive)\
> \- \`end\_time\`: End of the time range (exclusive)\
> \- \`variables\`: Weather variables to retrieve\
> \
> \*\*Time Aggregation:\*\*\
> Use \`group\_by\` to control time aggregation:\
> \- \`hourly\`: Hourly resolution (default)\
> \- \`daily\`: Daily averages\
> \- \`weekly\`: Weekly averages\
> \
> For daily/weekly aggregations, use \`timezone\` to specify the timezone for day/week boundaries\
> (e.g., "Europe/Berlin"). Defaults to UTC if not specified.\
> \
> \*\*Spatial Aggregation:\*\*\
> Add \`market\_zone\`, \`country\_key\`, or \`point\` to \`group\_by\` to preserve geographic dimensions.\
> Use \`aggregation\` to specify the aggregation function (e.g., \`\["avg"]\`).\
> \
> \*\*Response Formats:\*\*\
> \- \`json\`: Columnar JSON format \`{column: \[values], ...}\`\
> \- \`arrow\`: Apache Arrow IPC stream for efficient processing\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> \*\*Billing\*\*: Free - no credit charges.\
> \
> For more information, see \[docs.jua.ai]\(<https://docs.jua.ai>).

````json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"climatology","description":"Query ERA5 WMO 30-year climatology data (1991-2020) for historical baselines."}],"security":[{"HTTPBearer":[]}],"paths":{"/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 geographic dimensions.\nUse `aggregation` to specify 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","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"}}}},"responses":{"200":{"description":"Successfully retrieved climatology data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"TimeRangeClimatologyQuery":{"properties":{"geo":{"$ref":"#/components/schemas/GeoFilter","description":"Geographic filter specifying the query location(s) or region(s)"},"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."},"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'."},"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'."},"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."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters for limiting result size."},"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)."}},"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    ```"},"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."},"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."},"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."},"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."},"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"],"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³"},"Aggregation":{"properties":{"aggregation":{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"],"title":"Aggregation","description":"Aggregation function name."},"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."},"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."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"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"},"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"}},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
````

## List available climatology variables

> Get a list of weather variables available in the ERA5 climatology dataset.\
> \
> These variables represent 30-year averages (1991-2020) computed from ERA5 reanalysis data.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"climatology","description":"Query ERA5 WMO 30-year climatology data (1991-2020) for historical baselines."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Get climatology dataset metadata

> Get metadata about the ERA5 WMO climatology dataset including:\
> \- Grid resolution and dimensions\
> \- Available days of year and hours\
> \- List of variables\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"climatology","description":"Query ERA5 WMO 30-year climatology data (1991-2020) for historical baselines."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Station Data

Query weather station observation data including temperature, wind, precipitation, and more.

## Query station observation data

> Query weather station observation data including:\
> \- Temperature, dew point, wind speed/direction\
> \- Atmospheric pressure (surface and MSL)\
> \- Precipitation accumulations (1h, 3h, 6h, 12h, 24h)\
> \- Solar radiation and cloud cover\
> \
> \*\*Filtering Options:\*\*\
> \- \`station\_ids\`: List of specific station IDs\
> \- \`bounding\_box\`: Geographic bounds (min/max lat/lon)\
> \- \`variables\`: Subset of observation variables\
> \
> \*\*Temporal Aggregation:\*\*\
> \- \`none\`: Raw observations (default)\
> \- \`hourly\`: Hourly averages\
> \- \`daily\`: Daily averages\
> \
> \*\*Response Formats:\*\*\
> \- \`json\`: Columnar JSON format \`{column: \[values], ...}\`\
> \- \`arrow\`: Apache Arrow IPC stream for efficient processing\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For more information, see \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"station-data","description":"Query weather station observation data including temperature, wind, precipitation, and more."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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 station data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"StationDataQuery":{"properties":{"station_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Station Ids","description":"List of ICAO station codes to query. Mutually exclusive with geo."},"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."},"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/StationVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"List of observation variables to return. If not set, returns all."},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)"},"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."},"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."},"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'}"},"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)"},"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."},"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."},"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."},"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."},"BoundingBox":{"properties":{"min_lat":{"type":"number","maximum":90,"minimum":-90,"title":"Min Lat","description":"Minimum latitude"},"max_lat":{"type":"number","maximum":90,"minimum":-90,"title":"Max Lat","description":"Maximum latitude"},"min_lon":{"type":"number","maximum":180,"minimum":-180,"title":"Min Lon","description":"Minimum longitude"},"max_lon":{"type":"number","maximum":180,"minimum":-180,"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."},"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 either — it comes from a separate\nsolar-station network, served by the dedicated solar read path\n(``build_solar_query`` / ``query_solar_data``, exposed at\n``POST /v1/station-data/solar-data``), not this enum."},"jua_query_v2__station_data__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for station data queries."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Query solar station observation data

> Query solar radiation station observations\
> (\`surface\_downwelling\_shortwave\_flux\_sum\_1h\`, hourly-accumulated GHI in J/m²).\
> \
> Solar stations are a distinct, quality-audited network from the synoptic\
> stations and are served from a separate table. Pass namespaced station ids\
> (\`solar:\<station\_id>\`) via \`station\_ids\` alongside a time range.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"station-data","description":"Query weather station observation data including temperature, wind, precipitation, and more."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}}}}}},"components":{"schemas":{"StationDataQuery":{"properties":{"station_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Station Ids","description":"List of ICAO station codes to query. Mutually exclusive with geo."},"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."},"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/StationVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"List of observation variables to return. If not set, returns all."},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)"},"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."},"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."},"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'}"},"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)"},"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."},"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."},"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."},"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."},"BoundingBox":{"properties":{"min_lat":{"type":"number","maximum":90,"minimum":-90,"title":"Min Lat","description":"Minimum latitude"},"max_lat":{"type":"number","maximum":90,"minimum":-90,"title":"Max Lat","description":"Maximum latitude"},"min_lon":{"type":"number","maximum":180,"minimum":-180,"title":"Min Lon","description":"Minimum longitude"},"max_lon":{"type":"number","maximum":180,"minimum":-180,"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."},"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 either — it comes from a separate\nsolar-station network, served by the dedicated solar read path\n(``build_solar_query`` / ``query_solar_data``, exposed at\n``POST /v1/station-data/solar-data``), not this enum."},"jua_query_v2__station_data__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for station data queries."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available stations

> Get a list of available weather stations with their metadata.\
> \
> Optionally filter by geographic bounding box.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"station-data","description":"Query weather station observation data including temperature, wind, precipitation, and more."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available solar-radiation stations

> Get a list of audited (clean) solar-radiation benchmark stations with their\
> metadata. Solar stations are a distinct, quality-audited network from the\
> synoptic stations and are served from a separate table (\`solar\_station\_meta\`,\
> filtered to \`is\_clean = 1\`). Ids are namespaced \`solar:\<station\_id>\` to match\
> the solar observation and benchmark read paths.\
> \
> Optionally filter by geographic bounding box.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"station-data","description":"Query weather station observation data including temperature, wind, precipitation, and more."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available variables

> Get a list of available observation variables with metadata including:\
> \- Variable name\
> \- Description\
> \- Unit of measurement\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"station-data","description":"Query weather station observation data including temperature, wind, precipitation, and more."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Reanalysis

Query reanalysis data from models like ARCO ERA5 for historical weather analysis.

## Query reanalysis data

> Query reanalysis data from models like ARCO ERA5.\
> \
> Reanalysis data provides historical weather analysis at a specific time (unlike forecasts\
> which have init\_time + prediction\_timedelta dimensions). This is useful for:\
> \- Historical weather analysis\
> \- Training and validating machine learning models\
> \- Comparing forecasts against actuals\
> \
> \*\*Query Dimensions:\*\*\
> \- \`models\`: Reanalysis model(s) to query (e.g., \["arco\_era5"])\
> \- \`geo\`: Location filter (point, bounding\_box, polygon, market\_zone, country\_key)\
> \- \`time\`: Time(s) to query - "latest", single datetime, list of datetimes, or time range\
> \- \`variables\`: Weather variables to retrieve\
> \
> \*\*Response Formats:\*\*\
> \- \`json\`: Columnar JSON format \`{column: \[values], ...}\`\
> \- \`arrow\`: Apache Arrow IPC stream for efficient processing\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For more information, see \[docs.jua.ai]\(<https://docs.jua.ai>).

````json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"reanalysis","description":"Query reanalysis data from models like ARCO ERA5 for historical weather analysis."}],"security":[{"HTTPBearer":[]}],"paths":{"/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`: Time(s) to query - \"latest\", single datetime, list of datetimes, or time range\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","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"}}}},"responses":{"200":{"description":"Successfully retrieved reanalysis data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"ReanalysisQuery":{"properties":{"models":{"items":{"$ref":"#/components/schemas/ReanalysisModel"},"type":"array","title":"Models","description":"List of reanalysis model identifiers to query"},"geo":{"$ref":"#/components/schemas/GeoFilter","description":"Geographic filter specifying the query location(s) or region(s)"},"time":{"anyOf":[{"type":"integer","minimum":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,"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":"Time","description":"Time(s) to query. Can be 'latest' (or integer offset 0), a single datetime, a list of datetimes, or a TimeSlice range."},"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"},"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'}"},"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)"},"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"},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters for limiting result size. Requires 'order_by' to be specified"},"were_variables_explicitly_requested":{"type":"boolean","title":"Were Variables Explicitly Requested","description":"Whether the user passed the variables explicitly. If True, the variables will be used to filter the results. If False, all variables will be returned.","default":true}},"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    ```"},"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."},"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."},"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."},"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."},"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."},"TimeSlice":{"properties":{"start":{"type":"string","format":"date-time","title":"Start","description":"Start datetime (inclusive)"},"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."},"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,"minimum":0,"title":"Hour","description":"UTC hour (0-23)"},"minute":{"anyOf":[{"type":"integer","maximum":59,"minimum":0},{"type":"null"}],"title":"Minute","description":"Optional UTC minute (0-59). Omit for the legacy hour-only behavior."},"offset":{"type":"integer","minimum":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."},"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"],"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³"},"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"},"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]]"},"ReanalysisCoordinates":{"type":"string","enum":["model","time","latitude","longitude","point","market_zone","country_key"],"title":"ReanalysisCoordinates","description":"Coordinate dimensions available for reanalysis queries."},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Aggregation":{"properties":{"aggregation":{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"],"title":"Aggregation","description":"Aggregation function name."},"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."},"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."},"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"},"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"}},"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."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
````

## Get reanalysis dataset metadata

> Get metadata about available reanalysis models including:\
> \- Model names and display names\
> \- Grid resolution and temporal resolution\
> \- Available variables\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"reanalysis","description":"Query reanalysis data from models like ARCO ERA5 for historical weather analysis."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ReanalysisMetaResult":{"properties":{"models":{"items":{"$ref":"#/components/schemas/ReanalysisModelInfo"},"type":"array","title":"Models"}},"type":"object","required":["models"],"title":"ReanalysisMetaResult","description":"Metadata about available reanalysis models."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Get latest available timestamp

> Get the latest available timestamp for each specified reanalysis model.\
> \
> This is useful for knowing what data is currently available without making a full query.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"reanalysis","description":"Query reanalysis data from models like ARCO ERA5 for historical weather analysis."}],"security":[{"HTTPBearer":[]}],"paths":{"/v1/reanalysis/latest-timestamp":{"get":{"tags":["reanalysis"],"summary":"Get latest available timestamp","description":"Get the latest available timestamp for each specified reanalysis model.\n\nThis is useful for knowing what data is currently available without making a full query.\n\n**Authentication**: Requires API key.","operationId":"get_latest_timestamp_v1_reanalysis_latest_timestamp_get","parameters":[{"name":"models","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"List of reanalysis models to check","default":["arco_era5"],"title":"Models"},"description":"List of reanalysis models to check"}],"responses":{"200":{"description":"Successfully retrieved latest timestamps","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestTimestampResult"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"LatestTimestampResult":{"properties":{"timestamps":{"additionalProperties":{"type":"string","format":"date-time"},"type":"object","title":"Timestamps"}},"type":"object","required":["timestamps"],"title":"LatestTimestampResult","description":"Result containing latest timestamps per model."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Get available timestamps

> Get a list of available timestamps for each specified reanalysis model within an optional\
> time range.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"reanalysis","description":"Query reanalysis data from models like ARCO ERA5 for historical weather analysis."}],"security":[{"HTTPBearer":[]}],"paths":{"/v1/reanalysis/available-timestamps":{"get":{"tags":["reanalysis"],"summary":"Get available timestamps","description":"Get a list of available timestamps for each specified reanalysis model within an optional\ntime range.\n\n**Authentication**: Requires API key.","operationId":"get_available_timestamps_v1_reanalysis_available_timestamps_get","parameters":[{"name":"models","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"List of reanalysis models to check","default":["arco_era5"],"title":"Models"},"description":"List of reanalysis models to check"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only return timestamps >= this time (inclusive)","title":"Since"},"description":"Only return timestamps >= this time (inclusive)"},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only return timestamps < this time (exclusive)","title":"Before"},"description":"Only return timestamps < this time (exclusive)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of timestamps to return","default":100,"title":"Limit"},"description":"Maximum number of timestamps to return"}],"responses":{"200":{"description":"Successfully retrieved available timestamps","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableTimestampsResult"}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AvailableTimestampsResult":{"properties":{"timestamps":{"additionalProperties":{"items":{"type":"string","format":"date-time"},"type":"array"},"type":"object","title":"Timestamps"}},"type":"object","required":["timestamps"],"title":"AvailableTimestampsResult","description":"Result containing available timestamps per model."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Power Forecast

Query power generation forecast data for renewable energy sources (Solar, Wind, etc.).

## Query power forecast data

> Query power forecast prediction data for renewable energy generation (Solar, Wind, etc.)\
> and electricity demand (Load).\
> \
> \*\*Dimensions:\*\*\
> \- \`zone\_key\`: Country/region code (e.g. "DE")\
> \- \`psr\_type\`: Generation source type (e.g. "Solar", "Wind Onshore") or "Load" for\
> &#x20; electricity demand. Load is currently available for Germany ("DE") only.\
> \
> \*\*Query Modes (mutually exclusive):\*\*\
> \
> 1\. \*\*Horizon mode\*\* (init\_time-centric):\
> &#x20;  \- \`init\_time\`: Specific init time(s) or relative tokens (\`latest\`, \`latest-N\`)\
> &#x20;  \- \`max\_prediction\_timedelta\`: Limit forecast horizon (minutes)\
> \
> 2\. \*\*Time range mode\*\* (time-centric):\
> &#x20;  \- \`start\_time\` / \`end\_time\`: Filter by computed forecast time\
> \
> \*\*Model version:\*\*\
> \- Omit \`\`version\`\` (or \`\`version: "stable"\`\`) to follow the packaged stable pointer —\
> &#x20; this \*\*moves\*\* when Jua promotes a new checkpoint.\
> \- To \*\*freeze\*\* today's stable (safe across promotes): call\
> &#x20; \`\`GET /versions\`\`, take the row with \`\`is\_stable: true\`\`, then pass that\
> &#x20; run id as \`\`version\`\` (or in \`\`version\_pins\`\`). You stay on that\
> &#x20; checkpoint until you change the pin yourself.\
> \- \`\`version: "latest"\`\` follows the packaged latest pointer.\
> \- \`\`version\_pins\`\` overrides specific (zone, psr) cells in one request.\
> \
> \*\*Response Formats:\*\*\
> \- \`json\`: Columnar JSON format \`{column: \[values], ...}\`\
> \- \`arrow\`: Apache Arrow IPC stream for efficient processing\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"power-forecast","description":"Query power generation forecast data for renewable energy sources (Solar, Wind, etc.)."}],"security":[{"HTTPBearer":[]}],"paths":{"/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:**\n- Omit ``version`` (or ``version: \"stable\"``) to follow the packaged stable pointer —\n  this **moves** when Jua promotes a new checkpoint.\n- To **freeze** today's stable (safe across promotes): call\n  ``GET /versions``, take the row with ``is_stable: true``, then pass that\n  run id as ``version`` (or in ``version_pins``). You stay on that\n  checkpoint until you change the pin yourself.\n- ``version: \"latest\"`` follows the packaged latest pointer.\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","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"}}}},"responses":{"200":{"description":"Successfully retrieved power forecast data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"PowerForecastQuery":{"properties":{"zone_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Zone Keys","description":"List of zone codes (e.g. ['DE', 'FR'])"},"psr_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Psr Types","description":"List of PSR types (e.g. ['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."},"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."},"init_time":{"anyOf":[{"type":"integer","minimum":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,"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'."},"max_prediction_timedelta":{"anyOf":[{"type":"integer","maximum":18446744073709552000,"minimum":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)"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End of time range (exclusive, time range mode)"},"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."},"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)."},"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."},"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    - ``version_pins`` overrides specific cells so one request can mix\n      e.g. DE Solar pinned + FR Wind on stable"},"VersionPin":{"properties":{"zone_key":{"type":"string","title":"Zone Key","description":"Zone code (e.g. 'DE')"},"psr_type":{"type":"string","title":"Psr Type","description":"PSR type (e.g. 'Solar')"},"version":{"type":"string","minLength":1,"title":"Version","description":"stable | latest | run id"}},"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``."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available power forecast zones

> Get a list of available zone codes that have power forecast data.\
> \
> This is a metadata endpoint and does not require authentication.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"power-forecast","description":"Query power generation forecast data for renewable energy sources (Solar, Wind, etc.)."}],"paths":{"/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 and does not require authentication.","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"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AvailableZonesResult":{"properties":{"zones":{"items":{"type":"string"},"type":"array","title":"Zones"}},"type":"object","required":["zones"],"title":"AvailableZonesResult","description":"Result for available zones query."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available PSR types

> Get a list of available PSR (Production Source) types for power forecasts.\
> \
> This is a metadata endpoint and does not require authentication.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"power-forecast","description":"Query power generation forecast data for renewable energy sources (Solar, Wind, etc.)."}],"paths":{"/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 and does not require authentication.","operationId":"get_power_forecast_psr_types_v1_power_forecast_psr_types_get","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"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available model versions

> Catalog of pin-able run ids per zone/PSR.\
> \
> \`\`description\`\` is packaged metadata for a known run id. Historical versions\
> without retained metadata return \`\`null\`\`.\
> \
> \*\*Freeze today's stable (recommended for promote-safety):\*\*\
> 1\. Call this endpoint (optionally filter with \`\`zone\_key\`\` / \`\`psr\_type\`\`).\
> 2\. For each cell you care about, take \`\`model\_version\`\` where \`\`is\_stable\`\`\
> &#x20;  is true.\
> 3\. Pass that run id as \`\`version\`\` on \`\`POST /power-forecast/data\`\` (whole\
> &#x20;  request) or in \`\`version\_pins\`\` (per cell).\
> \
> \`\`version: "stable"\`\` follows live promotes. A concrete run id does \*\*not\*\*.\
> \
> \`\`is\_latest\`\` marks the preview alias (\`\`version=latest\`\`).\
> \
> Requires power-forecast model entitlement (same as \`\`POST /data\`\`): the\
> catalog exposes internal checkpoint / WandB run ids used for pinning.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"power-forecast","description":"Query power generation forecast data for renewable energy sources (Solar, Wind, etc.)."}],"security":[{"HTTPBearer":[]}],"paths":{"/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 preview alias (``version=latest``).\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","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"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"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},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Check if latest forecast uses fallback initial conditions

> Check whether the most recent power forecast was generated using fallback\
> initial conditions (i.e. ENTSO-E source data was unavailable).\
> \
> Returns \`{"is\_fallback": true}\` when the latest forecast used synthetic\
> history, and \`{"is\_fallback": false}\` otherwise.\
> \
> This is a metadata endpoint and does not require authentication.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"power-forecast","description":"Query power generation forecast data for renewable energy sources (Solar, Wind, etc.)."}],"paths":{"/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 and does not require authentication.","operationId":"get_fallback_status_v1_power_forecast_fallback_status_get","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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List init times that used fallback initial conditions

> Return init times whose forecasts were generated with fallback (estimated)\
> initial conditions.  The frontend uses this to flag specific model runs\
> in the chart legend as potentially degraded.\
> \
> This is a metadata endpoint and does not require authentication.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"power-forecast","description":"Query power generation forecast data for renewable energy sources (Solar, Wind, etc.)."}],"paths":{"/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 and does not require authentication.","operationId":"get_fallback_init_times_v1_power_forecast_fallback_init_times_get","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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available init times

> Get available forecast init times with their max prediction horizon.\
> \
> Used by the dashboard to populate the init\_time dropdown when creating a\
> power forecast data source.  Results are ordered newest-first.\
> \
> When \`include\_availability=true\` is passed along with zone\_key and psr\_type\
> filters, the response includes an \`availability\_by\_init\_time\` field that\
> maps each init\_time to the list of (zone\_key, psr\_type) combinations that\
> are available for it. This allows determining which specific combinations\
> are missing for excluded init times without additional API calls.\
> \
> This is a metadata endpoint and does not require authentication.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"power-forecast","description":"Query power generation forecast data for renewable energy sources (Solar, Wind, etc.)."}],"paths":{"/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\nThis is a metadata endpoint and does not require authentication.","operationId":"get_power_forecast_init_times_v1_power_forecast_init_times_get","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."}],"responses":{"200":{"description":"Successfully retrieved init times","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableInitTimesResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Power forecast dissemination delay metrics

> Per-(zone, psr\_type, init\_time) dissemination delay relative to ZONE\_SCHEDULES publication time (completed\_at - (init\_time + entsoe\_lag + inference\_overhead)). Used by admin-panel monitoring.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"power-forecast","description":"Query power generation forecast data for renewable energy sources (Solar, Wind, etc.)."}],"security":[{"HTTPBearer":[]}],"paths":{"/v1/power-forecast/dissemination-metrics":{"get":{"tags":["power-forecast"],"summary":"Power forecast dissemination delay metrics","description":"Per-(zone, psr_type, init_time) dissemination delay relative to ZONE_SCHEDULES publication time (completed_at - (init_time + entsoe_lag + inference_overhead)). Used by admin-panel monitoring.","operationId":"get_power_forecast_dissemination_metrics_v1_power_forecast_dissemination_metrics_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only include init_times on/after this datetime","title":"Since"},"description":"Only include init_times on/after this datetime"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only include init_times before this datetime","title":"Until"},"description":"Only include init_times before this datetime"},{"name":"zone_keys","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Optional zone filter (defaults to ZONE_SCHEDULES)","title":"Zone Keys"},"description":"Optional zone filter (defaults to ZONE_SCHEDULES)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PowerDisseminationMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"PowerDisseminationMetricsResponse":{"properties":{"since":{"type":"string","format":"date-time","title":"Since"},"until":{"type":"string","format":"date-time","title":"Until"},"metrics_per_zone":{"items":{"$ref":"#/components/schemas/PowerZoneMetrics"},"type":"array","title":"Metrics Per Zone"},"fleet_on_time_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fleet On Time Pct"},"worst_zone_p95_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Worst Zone P95 Min"},"worst_zone_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worst Zone Key"},"missing_runs":{"type":"integer","title":"Missing Runs","description":"Sum of ``missing_count`` across all zone/psr pairs","default":0},"fallback_runs":{"type":"integer","title":"Fallback Runs","description":"Sum of ``fallback_count`` across all zone/psr pairs","default":0}},"type":"object","required":["since","until","metrics_per_zone"],"title":"PowerDisseminationMetricsResponse"},"PowerZoneMetrics":{"properties":{"zone_key":{"type":"string","title":"Zone Key"},"psr_type":{"type":"string","title":"Psr Type"},"sample_count":{"type":"integer","title":"Sample Count"},"on_time_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"On Time Pct"},"mean_delay_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mean Delay Min"},"p95_delay_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Delay Min"},"missing_count":{"type":"integer","title":"Missing Count","description":"Init_time slots expected from the inferred cadence but never run. Zero when the window holds fewer than three runs (cadence is not inferable).","default":0},"cadence_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cadence Minutes","description":"Modal gap between consecutive init_times, i.e. the cadence the missing slots were derived from. Null when not inferable."},"missing_init_times":{"items":{"type":"string","format":"date-time"},"type":"array","title":"Missing Init Times","description":"The expected-but-absent init_times behind ``missing_count``, ascending, truncated to the most recent 200."},"fallback_count":{"type":"integer","title":"Fallback Count","description":"Runs whose latest write used forecast-IC fallback initial conditions (``step_status.forecast_ic``), i.e. TSO actuals were not available in time. Provisional: overwritten once real actuals arrive.","default":0},"fallback_init_times":{"items":{"type":"string","format":"date-time"},"type":"array","title":"Fallback Init Times","description":"The init_times behind ``fallback_count``, ascending, truncated to the most recent 200."},"daily_delay_buckets":{"items":{"$ref":"#/components/schemas/PowerZoneDelayBucket"},"type":"array","title":"Daily Delay Buckets"}},"type":"object","required":["zone_key","psr_type","sample_count"],"title":"PowerZoneMetrics"},"PowerZoneDelayBucket":{"properties":{"date":{"type":"string","title":"Date","description":"UTC date (YYYY-MM-DD) of the init_time"},"count":{"type":"integer","title":"Count"},"mean":{"type":"number","title":"Mean"},"p50":{"type":"number","title":"P50"},"p95":{"type":"number","title":"P95"},"on_time":{"type":"integer","title":"On Time"},"yellow":{"type":"integer","title":"Yellow"},"red":{"type":"integer","title":"Red"},"missing":{"type":"integer","title":"Missing","description":"Expected-but-absent init_time slots on this date","default":0}},"type":"object","required":["date","count","mean","p50","p95","on_time","yellow","red"],"title":"PowerZoneDelayBucket"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Uk Power

Query UK power generation actuals and NESO day-ahead forecasts (wind, solar).

## Query UK power generation data

> Query UK (GB) power generation timeseries data including:\
> \- Wind and solar generation actuals (transmission + embedded)\
> \- Transmission system demand (load)\
> \- Day-ahead wind and solar forecasts (NESO)\
> \
> All variables cover \*\*Great Britain\*\* (England, Scotland, Wales). Northern\
> Ireland is not included — it runs on the separate all-island I-SEM market.\
> All values are in MW, on the half-hourly settlement-period grid (UTC).\
> \
> \*\*Actuals:\*\*\
> \- \`wind\`: Total wind generation, transmission + embedded (Elexon FUELHH + NESO Gen Mix)\
> \- \`wind\_transmission\`: Transmission-connected wind generation (Elexon FUELHH)\
> \- \`wind\_embedded\`: Distribution-embedded wind generation (NESO Gen Mix)\
> \- \`solar\`: Total solar generation (Sheffield Solar PV\_Live)\
> \- \`load\`: Transmission system demand / TSD (NESO Demand)\
> \
> \*\*Day-ahead forecasts (NESO):\*\*\
> \- \`wind\_forecast\`: Day-ahead total wind forecast, transmission + embedded (NESO Day Ahead Wind + NESO Embedded Forecast)\
> \- \`wind\_transmission\_forecast\`: Day-ahead transmission wind forecast (NESO Day Ahead Wind)\
> \- \`wind\_embedded\_forecast\`: Day-ahead embedded wind forecast (NESO Embedded Forecast)\
> \- \`solar\_forecast\`: Day-ahead embedded solar forecast (NESO Embedded Forecast)\
> \
> \*\*Response Formats:\*\*\
> \- \`json\`: Columnar JSON format \`{column: \[values], ...}\`\
> \- \`arrow\`: Apache Arrow IPC stream for efficient processing\
> \
> \*\*Authentication\*\*: Requires API key.\
> \
> For more information, see \[docs.jua.ai]\(<https://docs.jua.ai>).

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"uk-power","description":"Query UK power generation actuals and NESO day-ahead forecasts (wind, solar)."}],"security":[{"HTTPBearer":[]}],"paths":{"/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**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","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"}}}},"responses":{"200":{"description":"Successfully retrieved UK power data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"UkPowerTimeseriesQuery":{"properties":{"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/UkPowerVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"Variables to query. If not set, returns all."},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)"},"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."},"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')."},"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')."},"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"},"UkPowerVariable":{"type":"string","enum":["wind","wind_transmission","wind_embedded","solar","load","wind_forecast","wind_transmission_forecast","wind_embedded_forecast","solar_forecast"],"title":"UkPowerVariable","description":"UK power generation variable types (aggregated)."},"jua_query_v2__uk_power__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for UK power queries."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available UK power variables

> Get a list of available UK power generation variables with metadata.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"uk-power","description":"Query UK power generation actuals and NESO day-ahead forecasts (wind, solar)."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}}}}}},"components":{"schemas":{"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available UK power data sources

> Get a list of available data sources for UK power generation.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"uk-power","description":"Query UK power generation actuals and NESO day-ahead forecasts (wind, solar)."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}}}}}},"components":{"schemas":{"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Climate Indices

Query climate oscillation indices (ENSO, NAO, AO, PDO, QBO, sunspots, etc.).

## Query climate indices data

> Query climate oscillation indices timeseries data.\
> \
> \*\*Available indices\*\* (46 series):\
> \- Atmospheric oscillations: NAO, AO, AAO, PNA, PDO, QBO, AMO, SOI, WPO, EPO, GBI\
> \- Teleconnections: EA, SCAND, EAWR, TNH, POL, EPNP\
> \- ENSO: ENSO\_NINO12, ENSO\_NINO3, ENSO\_NINO4, ENSO\_NINO34 (and their \_ANOM variants), MEI, ONI\
> \- Atlantic SST: TNA, TSA, AMM\
> \- Indian Ocean: IOD\
> \- MJO (Wheeler-Hendon RMM, daily): MJO\_RMM1, MJO\_RMM2, MJO\_PHASE, MJO\_AMPLITUDE\
> \- MJO (CPC velocity-potential, pentad): MJO\_20E..MJO\_10W (10 longitude series)\
> \- Solar: SUNSPOT\
> \
> \*\*Sources\*\*: noaa\_psl, noaa\_cpc, noaa\_ncei, bom, sidc, wisc\_aos\
> \
> \*\*Temporal resolution\*\*: monthly for most indices; daily for BOM RMM MJO; pentad (5-day) for CPC VP-MJO.\
> \
> \*\*Response Formats:\*\*\
> \- \`json\`: Columnar JSON format \`{column: \[values], ...}\`\
> \- \`arrow\`: Apache Arrow IPC stream for efficient processing\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"climate-indices","description":"Query climate oscillation indices (ENSO, NAO, AO, PDO, QBO, sunspots, etc.)."}],"security":[{"HTTPBearer":[]}],"paths":{"/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","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"}}}},"responses":{"200":{"description":"Successfully retrieved climate indices data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"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."},"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)"},"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."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for time formatting (e.g. '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')."},"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."},"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."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available climate indices

> Get a list of available climate oscillation indices with metadata.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"climate-indices","description":"Query climate oscillation indices (ENSO, NAO, AO, PDO, QBO, sunspots, etc.)."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}}}}}},"components":{"schemas":{"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."},"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available climate indices data sources

> Get a list of available data sources for climate indices.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"climate-indices","description":"Query climate oscillation indices (ENSO, NAO, AO, PDO, QBO, sunspots, etc.)."}],"security":[{"HTTPBearer":[]}],"paths":{"/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"}}}}}}}},"components":{"schemas":{"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."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Eex Power

Query EEX Group power derivatives market data including EOD settlement prices and individual exchange trades across 33 European market areas.

## Query EEX power settlement prices

> Query EEX Group power derivatives end-of-day settlement prices.\
> \
> Data covers \*\*33 European market areas\*\* (DE, FR, AT, BE, NL, CH, CZ, SK, PL, RO, HU,\
> HR, RS, SI, BG, IT, GR, ES, IE, GB, SE1-SE4, DK1, DK2, FI, NO1-NO5, Phelix, Nordic).\
> \
> Settlements are published daily at \~18:30 UTC on weekdays. Historical data available\
> from November 2020. Includes futures and options (use \`exclude\_options=true\` for\
> futures only).\
> \
> \*\*Response Formats:\*\*\
> \- \`json\`: Columnar JSON \`{column: \[values], ...}\`\
> \- \`arrow\`: Apache Arrow IPC stream for efficient processing\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"eex-power","description":"Query EEX Group power derivatives market data including EOD settlement prices and individual exchange trades across 33 European market areas."}],"security":[{"HTTPBearer":[]}],"paths":{"/v1/eex-power/settlements":{"post":{"tags":["eex-power"],"summary":"Query EEX power settlement prices","description":"Query EEX Group power derivatives end-of-day settlement prices.\n\nData covers **33 European market areas** (DE, FR, AT, BE, NL, CH, CZ, SK, PL, RO, HU,\nHR, RS, SI, BG, IT, GR, ES, IE, GB, SE1-SE4, DK1, DK2, FI, NO1-NO5, Phelix, Nordic).\n\nSettlements are published daily at ~18:30 UTC on weekdays. Historical data available\nfrom November 2020. Includes futures and options (use `exclude_options=true` for\nfutures only).\n\n**Response Formats:**\n- `json`: Columnar JSON `{column: [values], ...}`\n- `arrow`: Apache Arrow IPC stream for efficient processing\n\n**Authentication**: Requires API key.","operationId":"post_eex_settlements_v1_eex_power_settlements_post","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/EexSettlementsQuery"}}}},"responses":{"200":{"description":"Successfully retrieved EEX settlement data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"EexSettlementsQuery":{"properties":{"areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Areas","description":"Market area codes to filter by (e.g. ['DE', 'FR']). If not set, returns all areas."},"short_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Short Codes","description":"EEX ShortCodes to filter by (e.g. ['DEBM', 'DEBQ']). If not set, returns all ShortCodes."},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date","description":"Start trading date (inclusive)."},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date","description":"End trading date (inclusive)."},"exclude_options":{"type":"boolean","title":"Exclude Options","description":"When true, excludes option records (option_type != '').","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for datetime output (e.g. '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. 'trd_date__desc')."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."}},"type":"object","title":"EexSettlementsQuery","description":"Query parameters for EEX power settlement prices.\n\nFetches from eex_power_settlements. Filtered by trading date, area,\nand ShortCode. Deleted records (updt_act='Delete') are excluded by default."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## Query EEX power individual trades

> Query individual exchange trades for EEX Group power derivatives.\
> \
> Trades are polled every 5 minutes during trading hours. The \`from\_broken\_spread\`\
> and \`volume\_only\` flags identify spread/cascade legs (no independent price).\
> Use \`exclude\_spread\_legs=true\` for outright trades only.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"eex-power","description":"Query EEX Group power derivatives market data including EOD settlement prices and individual exchange trades across 33 European market areas."}],"security":[{"HTTPBearer":[]}],"paths":{"/v1/eex-power/trades":{"post":{"tags":["eex-power"],"summary":"Query EEX power individual trades","description":"Query individual exchange trades for EEX Group power derivatives.\n\nTrades are polled every 5 minutes during trading hours. The `from_broken_spread`\nand `volume_only` flags identify spread/cascade legs (no independent price).\nUse `exclude_spread_legs=true` for outright trades only.\n\n**Authentication**: Requires API key.","operationId":"post_eex_trades_v1_eex_power_trades_post","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/EexTradesQuery"}}}},"responses":{"200":{"description":"Successfully retrieved EEX trade data","content":{"application/json":{"schema":{}},"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"}}}}}}}},"components":{"schemas":{"EexTradesQuery":{"properties":{"areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Areas","description":"Market area codes to filter by (e.g. ['DE', 'FR'])."},"short_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Short Codes","description":"EEX ShortCodes to filter by (e.g. ['DEBM'])."},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start trade timestamp (inclusive, filters on tm column)."},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End trade timestamp (exclusive, filters on tm column)."},"trd_date_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Trd Date Start","description":"Start trading date (inclusive, filters on trd_date column)."},"trd_date_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Trd Date End","description":"End trading date (inclusive, filters on trd_date column)."},"exclude_spread_legs":{"type":"boolean","title":"Exclude Spread Legs","description":"When true, excludes spread/cascade legs (volume_only = false).","default":false},"exclude_cancellations":{"type":"boolean","title":"Exclude Cancellations","description":"When true, excludes cancelled trades (updt_act != 'Delete').","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for datetime output."},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by (e.g. 'tm__desc')."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."}},"type":"object","title":"EexTradesQuery","description":"Query parameters for EEX power individual trades.\n\nFetches from eex_power_trades. Supports filtering by area, ShortCode,\ntrade timestamp, and trading date. Optional flags to exclude spread legs\nand cancellations."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available EEX market areas

> Get a list of market area codes with data in ClickHouse.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"eex-power","description":"Query EEX Group power derivatives market data including EOD settlement prices and individual exchange trades across 33 European market areas."}],"security":[{"HTTPBearer":[]}],"paths":{"/v1/eex-power/areas":{"get":{"tags":["eex-power"],"summary":"List available EEX market areas","description":"Get a list of market area codes with data in ClickHouse.\n\n**Authentication**: Requires API key.","operationId":"get_eex_areas_v1_eex_power_areas_get","parameters":[{"name":"table","in":"query","required":false,"schema":{"enum":["settlements","trades"],"type":"string","description":"Which table to query for areas ('settlements' or 'trades')","default":"settlements","title":"Table"},"description":"Which table to query for areas ('settlements' or 'trades')"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jua_query_v2__eex_power__types__AvailableAreasResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"jua_query_v2__eex_power__types__AvailableAreasResult":{"properties":{"areas":{"items":{"type":"string"},"type":"array","title":"Areas"}},"type":"object","required":["areas"],"title":"AvailableAreasResult","description":"Result type for available EEX market areas."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## List available EEX ShortCodes

> Get a list of EEX product ShortCodes (e.g. DEBM, DEBQ, DEBY) with data in ClickHouse.\
> \
> \*\*Authentication\*\*: Requires API key.

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"tags":[{"name":"eex-power","description":"Query EEX Group power derivatives market data including EOD settlement prices and individual exchange trades across 33 European market areas."}],"security":[{"HTTPBearer":[]}],"paths":{"/v1/eex-power/short-codes":{"get":{"tags":["eex-power"],"summary":"List available EEX ShortCodes","description":"Get a list of EEX product ShortCodes (e.g. DEBM, DEBQ, DEBY) with data in ClickHouse.\n\n**Authentication**: Requires API key.","operationId":"get_eex_short_codes_v1_eex_power_short_codes_get","parameters":[{"name":"table","in":"query","required":false,"schema":{"enum":["settlements","trades"],"type":"string","description":"Which table to query for ShortCodes ('settlements' or 'trades')","default":"settlements","title":"Table"},"description":"Which table to query for ShortCodes ('settlements' or 'trades')"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jua_query_v2__eex_power__types__AvailableShortCodesResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"jua_query_v2__eex_power__types__AvailableShortCodesResult":{"properties":{"short_codes":{"items":{"type":"string"},"type":"array","title":"Short Codes"}},"type":"object","required":["short_codes"],"title":"AvailableShortCodesResult","description":"Result type for available EEX product ShortCodes."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```


# Models

## The Aggregation object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"Aggregation":{"properties":{"aggregation":{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"],"title":"Aggregation","description":"Aggregation function name."},"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."},"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."},"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"],"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³"}}}}
```

## The AuctionBlockBidsResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```

## The AuctionCurvesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```

## The AvailableDatesResponse object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"AvailableDatesResponse":{"properties":{"dates":{"items":{"type":"string"},"type":"array","title":"Dates"}},"type":"object","required":["dates"],"title":"AvailableDatesResponse","description":"Response containing available benchmark dates."}}}}
```

## The AvailableForecastsQueryResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."},"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"},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The AvailableIndicesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```

## The AvailableInitTimesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```

## The AvailablePsrTypesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The AvailableStationsResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```

## The AvailableSubcategoriesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"AvailableSubcategoriesResult":{"properties":{"subcategories":{"items":{"type":"string"},"type":"array","title":"Subcategories"}},"type":"object","required":["subcategories"],"title":"AvailableSubcategoriesResult","description":"Result for available subcategories query."}}}}
```

## The AvailableTimestampsResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"AvailableTimestampsResult":{"properties":{"timestamps":{"additionalProperties":{"items":{"type":"string","format":"date-time"},"type":"array"},"type":"object","title":"Timestamps"}},"type":"object","required":["timestamps"],"title":"AvailableTimestampsResult","description":"Result containing available timestamps per model."}}}}
```

## The AvailableTsosResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"AvailableTsosResult":{"properties":{"tsos":{"items":{"type":"string"},"type":"array","title":"Tsos"}},"type":"object","required":["tsos"],"title":"AvailableTsosResult","description":"Result for available TSOs query."}}}}
```

## The AvailableVersionsResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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},"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."}}}}
```

## The AvailableZonesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"AvailableZonesResult":{"properties":{"zones":{"items":{"type":"string"},"type":"array","title":"Zones"}},"type":"object","required":["zones"],"title":"AvailableZonesResult","description":"Result for available zones query."}}}}
```

## The BlockBid object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The BoundingBox object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"BoundingBox":{"properties":{"min_lat":{"type":"number","maximum":90,"minimum":-90,"title":"Min Lat","description":"Minimum latitude"},"max_lat":{"type":"number","maximum":90,"minimum":-90,"title":"Max Lat","description":"Maximum latitude"},"min_lon":{"type":"number","maximum":180,"minimum":-180,"title":"Min Lon","description":"Minimum longitude"},"max_lon":{"type":"number","maximum":180,"minimum":-180,"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."}}}}
```

## The ClimateIndex object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The ClimateIndexInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The ClimateIndicesTimeseriesQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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)"},"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."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for time formatting (e.g. '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')."},"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."},"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."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The ClimatologyMetaResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The ClimatologyVariableInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The ContinuousVwapSurfaceRequest object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The ContinuousVwapSurfaceResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The Coordinates object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"Coordinates":{"type":"string","enum":["model","init_time","time","prediction_timedelta","latitude","longitude","point","market_zone","country_key"],"title":"Coordinates"}}}}
```

## The CurvePoint object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The CustomerVariable object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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"],"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³"}}}}
```

## The DataSource object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"DataSource":{"type":"string","enum":["clickhouse","open_meteo"],"title":"DataSource"}}}}
```

## The DisseminationStats object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"DisseminationStats":{"properties":{"number_of_data_points":{"type":"integer","title":"Number Of Data Points","description":"Number of data points.Tracking started on '2025-10-29"},"min":{"type":"number","title":"Min","description":"Minimum delay in minutes"},"max":{"type":"number","title":"Max","description":"Maximum delay in minutes"},"mean":{"type":"number","title":"Mean","description":"Mean delay in minutes"},"median":{"type":"number","title":"Median","description":"Median delay in minutes"},"std":{"type":"number","title":"Std","description":"Standard deviation of delay in minutes"},"q90":{"type":"number","title":"Q90","description":"90th percentile of delay in minutes"},"q99":{"type":"number","title":"Q99","description":"99th percentile of delay in minutes"},"in_time_percentage":{"type":"number","title":"In Time Percentage","description":"Percentage of forecasts in time"},"missing_percentage":{"type":"number","title":"Missing Percentage","description":"Percentage of missing forecasts"},"expected_dissemination_time":{"type":"string","format":"time","title":"Expected Dissemination Time","description":"Expected dissemination time (time of day) as reference"},"dissemination_time_min":{"type":"string","format":"time","title":"Dissemination Time Min","description":"Minimum dissemination time (time of day)"},"dissemination_time_max":{"type":"string","format":"time","title":"Dissemination Time Max","description":"Maximum dissemination time (time of day)"},"dissemination_time_mean":{"type":"string","format":"time","title":"Dissemination Time Mean","description":"Mean dissemination time (time of day)"},"dissemination_time_median":{"type":"string","format":"time","title":"Dissemination Time Median","description":"Median dissemination time (time of day)"},"dissemination_time_q90":{"type":"string","format":"time","title":"Dissemination Time Q90","description":"90th percentile of dissemination time (time of day)"},"dissemination_time_q99":{"type":"string","format":"time","title":"Dissemination Time Q99","description":"99th percentile of dissemination time (time of day)"}},"type":"object","required":["number_of_data_points","min","max","mean","median","std","q90","q99","in_time_percentage","missing_percentage","expected_dissemination_time","dissemination_time_min","dissemination_time_max","dissemination_time_mean","dissemination_time_median","dissemination_time_q90","dissemination_time_q99"],"title":"DisseminationStats"}}}}
```

## The DisseminationStatus object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"DisseminationStatus":{"properties":{"status_per_model":{"additionalProperties":{"$ref":"#/components/schemas/ModelDisseminationStatus"},"propertyNames":{"$ref":"#/components/schemas/Model"},"type":"object","title":"Status Per Model","description":"Status per model"}},"type":"object","required":["status_per_model"],"title":"DisseminationStatus"},"ModelDisseminationStatus":{"properties":{"status":{"items":{"$ref":"#/components/schemas/ForecastDisseminationStatus"},"type":"array","title":"Status","description":"Status for the model"},"delay_stats_per_init_time":{"additionalProperties":{"$ref":"#/components/schemas/DisseminationStats"},"type":"object","title":"Delay Stats Per Init Time","description":"Delay statistics per init time (without date, e.g., '00:00', '06:00')"}},"type":"object","required":["status","delay_stats_per_init_time"],"title":"ModelDisseminationStatus"},"ForecastDisseminationStatus":{"properties":{"init_time":{"type":"string","title":"Init Time","description":"Forecast initialization time"},"delay":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delay","description":"Delay in minutes"},"is_missing":{"type":"boolean","title":"Is Missing","description":"Whether the forecast is missing","default":false},"dissemination_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dissemination Time","description":"Forecast dissemination time"},"expected_dissemination_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Expected Dissemination Time","description":"Expected dissemination time"},"max_prediction_timedelta":{"type":"integer","title":"Max Prediction Timedelta","description":"Maximum prediction timedelta for the forecast"},"expected_max_prediction_timedelta":{"type":"integer","title":"Expected Max Prediction Timedelta","description":"Expected maximum prediction timedelta for the forecast"},"is_delayed":{"type":"boolean","title":"Is Delayed","description":"Whether the forecast is delayed","readOnly":true}},"type":"object","required":["init_time","max_prediction_timedelta","expected_max_prediction_timedelta","is_delayed"],"title":"ForecastDisseminationStatus"},"DisseminationStats":{"properties":{"number_of_data_points":{"type":"integer","title":"Number Of Data Points","description":"Number of data points.Tracking started on '2025-10-29"},"min":{"type":"number","title":"Min","description":"Minimum delay in minutes"},"max":{"type":"number","title":"Max","description":"Maximum delay in minutes"},"mean":{"type":"number","title":"Mean","description":"Mean delay in minutes"},"median":{"type":"number","title":"Median","description":"Median delay in minutes"},"std":{"type":"number","title":"Std","description":"Standard deviation of delay in minutes"},"q90":{"type":"number","title":"Q90","description":"90th percentile of delay in minutes"},"q99":{"type":"number","title":"Q99","description":"99th percentile of delay in minutes"},"in_time_percentage":{"type":"number","title":"In Time Percentage","description":"Percentage of forecasts in time"},"missing_percentage":{"type":"number","title":"Missing Percentage","description":"Percentage of missing forecasts"},"expected_dissemination_time":{"type":"string","format":"time","title":"Expected Dissemination Time","description":"Expected dissemination time (time of day) as reference"},"dissemination_time_min":{"type":"string","format":"time","title":"Dissemination Time Min","description":"Minimum dissemination time (time of day)"},"dissemination_time_max":{"type":"string","format":"time","title":"Dissemination Time Max","description":"Maximum dissemination time (time of day)"},"dissemination_time_mean":{"type":"string","format":"time","title":"Dissemination Time Mean","description":"Mean dissemination time (time of day)"},"dissemination_time_median":{"type":"string","format":"time","title":"Dissemination Time Median","description":"Median dissemination time (time of day)"},"dissemination_time_q90":{"type":"string","format":"time","title":"Dissemination Time Q90","description":"90th percentile of dissemination time (time of day)"},"dissemination_time_q99":{"type":"string","format":"time","title":"Dissemination Time Q99","description":"99th percentile of dissemination time (time of day)"}},"type":"object","required":["number_of_data_points","min","max","mean","median","std","q90","q99","in_time_percentage","missing_percentage","expected_dissemination_time","dissemination_time_min","dissemination_time_max","dissemination_time_mean","dissemination_time_median","dissemination_time_q90","dissemination_time_q99"],"title":"DisseminationStats"},"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"}}}}
```

## The EexGasDerivativesSettlementsQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EexGasDerivativesSettlementsQuery":{"properties":{"areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Areas","description":"Gas hub codes (e.g. ['TTF', 'THE']). None = all."},"short_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Short Codes","description":"EEX ShortCodes (e.g. ['G3BM', 'G0BM']). None = all."},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date","description":"Start trading date (inclusive)."},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date","description":"End trading date (inclusive)."},"exclude_options":{"type":"boolean","title":"Exclude Options","description":"When true, excludes option records (option_type != '').","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for datetime output."},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."}},"type":"object","title":"EexGasDerivativesSettlementsQuery","description":"Query parameters for EEX gas derivatives settlement prices.\n\nSchema identical to eex_power_settlements. Fetches from\neex_gas_derivatives_settlements."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The EexGasDerivativesTradesQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EexGasDerivativesTradesQuery":{"properties":{"areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Areas","description":"Gas hub codes (e.g. ['TTF'])."},"short_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Short Codes","description":"EEX ShortCodes (e.g. ['G3BM'])."},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start trade timestamp (inclusive, filters on tm column)."},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End trade timestamp (exclusive, filters on tm column)."},"trd_date_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Trd Date Start","description":"Start trading date (inclusive)."},"trd_date_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Trd Date End","description":"End trading date (inclusive)."},"exclude_spread_legs":{"type":"boolean","title":"Exclude Spread Legs","description":"When true, excludes spread/cascade legs.","default":false},"exclude_cancellations":{"type":"boolean","title":"Exclude Cancellations","description":"When true, excludes cancelled trades.","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for datetime output."},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."}},"type":"object","title":"EexGasDerivativesTradesQuery","description":"Query parameters for EEX gas derivatives individual trades.\n\nSchema identical to eex_power_trades. Fetches from\neex_gas_derivatives_trades."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The EexGasSpotSettlementsQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EexGasSpotSettlementsQuery":{"properties":{"areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Areas","description":"Gas hub codes (e.g. ['TTF', 'THE']). None = all."},"short_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Short Codes","description":"Spot ShortCodes (e.g. ['TTFDA', 'THEDA']). None = all."},"delivery_day_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delivery Day Start","description":"Start delivery day (inclusive)."},"delivery_day_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delivery Day End","description":"End delivery day (inclusive)."},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date","description":"Start trading date (inclusive)."},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date","description":"End trading date (inclusive)."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for datetime output."},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."}},"type":"object","title":"EexGasSpotSettlementsQuery","description":"Query parameters for EEX gas spot settlement prices.\n\nFetches from eex_gas_spot_settlements. Typically 1 settlement per area\nper day (DayAhead contract)."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The EexGasSpotTradesQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EexGasSpotTradesQuery":{"properties":{"areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Areas","description":"Gas hub codes (e.g. ['TTF'])."},"short_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Short Codes","description":"Spot ShortCodes (e.g. ['TTFDA', 'TTFWD'])."},"delivery_day_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delivery Day Start","description":"Start delivery day (inclusive)."},"delivery_day_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delivery Day End","description":"End delivery day (inclusive)."},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start trade timestamp (inclusive, filters on tm column)."},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End trade timestamp (exclusive, filters on tm column)."},"trd_date_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Trd Date Start","description":"Start trading date (inclusive)."},"trd_date_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Trd Date End","description":"End trading date (inclusive)."},"exclude_spread_legs":{"type":"boolean","title":"Exclude Spread Legs","description":"When true, excludes spread legs.","default":false},"exclude_cancellations":{"type":"boolean","title":"Exclude Cancellations","description":"When true, excludes cancelled trades.","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for datetime output."},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."}},"type":"object","title":"EexGasSpotTradesQuery","description":"Query parameters for EEX gas spot individual trades.\n\nFetches from eex_gas_spot_trades. Gas spot trades have delivery_day,\nstart/end times, and group_id/trd_version for trade history tracking."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The EexSettlementsQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EexSettlementsQuery":{"properties":{"areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Areas","description":"Market area codes to filter by (e.g. ['DE', 'FR']). If not set, returns all areas."},"short_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Short Codes","description":"EEX ShortCodes to filter by (e.g. ['DEBM', 'DEBQ']). If not set, returns all ShortCodes."},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date","description":"Start trading date (inclusive)."},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date","description":"End trading date (inclusive)."},"exclude_options":{"type":"boolean","title":"Exclude Options","description":"When true, excludes option records (option_type != '').","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for datetime output (e.g. '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. 'trd_date__desc')."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."}},"type":"object","title":"EexSettlementsQuery","description":"Query parameters for EEX power settlement prices.\n\nFetches from eex_power_settlements. Filtered by trading date, area,\nand ShortCode. Deleted records (updt_act='Delete') are excluded by default."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The EexTradesQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EexTradesQuery":{"properties":{"areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Areas","description":"Market area codes to filter by (e.g. ['DE', 'FR'])."},"short_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Short Codes","description":"EEX ShortCodes to filter by (e.g. ['DEBM'])."},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start trade timestamp (inclusive, filters on tm column)."},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End trade timestamp (exclusive, filters on tm column)."},"trd_date_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Trd Date Start","description":"Start trading date (inclusive, filters on trd_date column)."},"trd_date_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Trd Date End","description":"End trading date (inclusive, filters on trd_date column)."},"exclude_spread_legs":{"type":"boolean","title":"Exclude Spread Legs","description":"When true, excludes spread/cascade legs (volume_only = false).","default":false},"exclude_cancellations":{"type":"boolean","title":"Exclude Cancellations","description":"When true, excludes cancelled trades (updt_act != 'Delete').","default":false},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for datetime output."},"order_by":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrderByItem_str_"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by (e.g. 'tm__desc')."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."}},"type":"object","title":"EexTradesQuery","description":"Query parameters for EEX power individual trades.\n\nFetches from eex_power_trades. Supports filtering by area, ShortCode,\ntrade timestamp, and trading date. Optional flags to exclude spread legs\nand cancellations."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The EntsoeBusinessType object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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)."}}}}
```

## The EntsoeOtherType object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EntsoeOtherType":{"type":"string","enum":["Long","Short"],"title":"EntsoeOtherType","description":"ENTSOE Other Type (for imbalance data)."}}}}
```

## The EntsoeOutageSourceType object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EntsoeOutageSourceType":{"type":"string","enum":["generation_unit","transmission"],"title":"EntsoeOutageSourceType","description":"Outage source type discriminator."}}}}
```

## The EntsoeOutagesQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EntsoeOutagesQuery":{"properties":{"source_type":{"anyOf":[{"$ref":"#/components/schemas/EntsoeOutageSourceType"},{"type":"null"}],"description":"Filter by source type (generation_unit or transmission)"},"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)"},"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":"Exclude cancelled outages (docstatus in ['A09', 'Cancelled'])","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"}},"type":"object","title":"EntsoeOutagesQuery","description":"Query parameters for ENTSOE outages data.\n\nSupports filtering by:\n- source_type: Generation vs Transmission\n- zones: biddingzone_domain (gen) or in_domain/out_domain (trans)\n- time: active_at, or start_from/start_to\n- attributes: plant_type, business_type, status"},"EntsoeOutageSourceType":{"type":"string","enum":["generation_unit","transmission"],"title":"EntsoeOutageSourceType","description":"Outage source type discriminator."},"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."},"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."},"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)."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The EntsoePivotedQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."},"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."},"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."}}}}
```

## The EntsoePsrType object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The EntsoeTimeseriesQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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'])"},"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)"},"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)"},"psr_types":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntsoePsrType"},"type":"array"},{"type":"null"}],"title":"Psr Types","description":"List of PSR types to filter generation data"},"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)"},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)"},"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)"},"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"},"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'}"},"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."},"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."},"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."},"EntsoeOtherType":{"type":"string","enum":["Long","Short"],"title":"EntsoeOtherType","description":"ENTSOE Other Type (for imbalance data)."},"jua_query_v2__entsoe__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for ENTSOE queries."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The EntsoeVariable object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The EntsoeVariableInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```

## The EntsoeZone object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The EntsoeZoneKind object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The EpexSpotBlockBidQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EpexSpotBlockBidQuery":{"properties":{"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time (inclusive, filters on delivery_start)."},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time (exclusive). If None, no upper bound."},"market_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Area","description":"Market area filter (e.g. 'DE')."},"auction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auction","description":"Auction filter (e.g. 'DA')."},"resolution":{"anyOf":[{"type":"string","enum":["PT15M","PT60M"]},{"type":"null"}],"title":"Resolution","description":"Resolution filter: PT15M or PT60M."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for delivery_start/_end formatting."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."},"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."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."}}}}
```

## The EpexSpotCurveQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EpexSpotCurveQuery":{"properties":{"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time (inclusive, filters on delivery_start)."},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time (exclusive). If None, no upper bound."},"market_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Area","description":"Market area filter (e.g. 'DE')."},"auction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auction","description":"Auction filter (e.g. 'DA')."},"resolution":{"anyOf":[{"type":"string","enum":["PT15M","PT60M"]},{"type":"null"}],"title":"Resolution","description":"Resolution filter: PT15M or PT60M."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for delivery_start/_end formatting."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters (requires order_by)."},"side":{"anyOf":[{"type":"string","enum":["Sell","Purchase"]},{"type":"null"}],"title":"Side","description":"Curve side filter: Sell (supply) or Purchase (demand)."},"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."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."}}}}
```

## The EpexSpotTimeseriesQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EpexSpotTimeseriesQuery":{"properties":{"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/EpexSpotVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"Variables to query. If not set, returns all."},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive, filters on delivery_start)"},"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."},"market_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Area","description":"Market area filter (e.g. 'DE'). If None, returns all."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for time formatting (e.g. '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."},"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."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The EpexSpotTradesQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"EpexSpotTradesQuery":{"properties":{"market_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Area","description":"Market area filter (e.g. 'DE'). If None, returns all."},"delivery_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Delivery Areas","description":"Delivery area codes to filter by (e.g. ['DE1', 'DE4'])."},"sides":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sides","description":"Trade sides to filter by ('BUY' and/or 'SELL')."},"products":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Products","description":"Product codes to filter by (e.g. ['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'])."},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start execution time (inclusive, filters on execution_time)."},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End execution time (exclusive, filters on execution_time)."},"delivery_date_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delivery Date Start","description":"Start delivery date (inclusive, filters on delivery_date)."},"delivery_date_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delivery Date End","description":"End delivery date (inclusive, filters on delivery_date)."},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","description":"IANA time zone for datetime output (e.g. '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)."}},"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."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The EpexSpotVariable object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The EpexSpotVariableInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The ForecastDisseminationStatus object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"ForecastDisseminationStatus":{"properties":{"init_time":{"type":"string","title":"Init Time","description":"Forecast initialization time"},"delay":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delay","description":"Delay in minutes"},"is_missing":{"type":"boolean","title":"Is Missing","description":"Whether the forecast is missing","default":false},"dissemination_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dissemination Time","description":"Forecast dissemination time"},"expected_dissemination_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Expected Dissemination Time","description":"Expected dissemination time"},"max_prediction_timedelta":{"type":"integer","title":"Max Prediction Timedelta","description":"Maximum prediction timedelta for the forecast"},"expected_max_prediction_timedelta":{"type":"integer","title":"Expected Max Prediction Timedelta","description":"Expected maximum prediction timedelta for the forecast"},"is_delayed":{"type":"boolean","title":"Is Delayed","description":"Whether the forecast is delayed","readOnly":true}},"type":"object","required":["init_time","max_prediction_timedelta","expected_max_prediction_timedelta","is_delayed"],"title":"ForecastDisseminationStatus"}}}}
```

## The ForecastIndexQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"ForecastIndexQuery":{"properties":{"model":{"$ref":"#/components/schemas/Model","description":"Model identifiers to query (e.g. 'ept2')"},"init_time":{"anyOf":[{"type":"integer","minimum":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,"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."},"latitude":{"prefixItems":[{"type":"number"},{"type":"number"}],"type":"array","maxItems":2,"minItems":2,"title":"Latitude","description":"The range of latitudes to return."},"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)"},"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"},"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. "},"latest_min_prediction_timedelta":{"anyOf":[{"type":"integer","minimum":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","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"}},"type":"object","required":["model","init_time","latitude","longitude"],"title":"ForecastIndexQuery","description":"Main query object for retrieving the index for forecast data."},"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"},"TimeSlice":{"properties":{"start":{"type":"string","format":"date-time","title":"Start","description":"Start datetime (inclusive)"},"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."},"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,"minimum":0,"title":"Hour","description":"UTC hour (0-23)"},"minute":{"anyOf":[{"type":"integer","maximum":59,"minimum":0},{"type":"null"}],"title":"Minute","description":"Optional UTC minute (0-59). Omit for the legacy hour-only behavior."},"offset":{"type":"integer","minimum":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."},"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"],"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³"},"PredictionTimedeltaSlice":{"properties":{"start":{"type":"integer","minimum":0,"title":"Start","description":"Start lead time in minutes from init_time (inclusive)","default":0},"end":{"anyOf":[{"type":"integer","minimum":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."}}}}
```

## The ForecastInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The ForecastQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"geo":{"$ref":"#/components/schemas/GeoFilter","description":"Geographic filter specifying the query location(s) or region(s)"},"init_time":{"anyOf":[{"type":"integer","minimum":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,"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."},"model_runs":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"integer","minimum":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,"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."},"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"},"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"},"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. "},"latest_min_prediction_timedelta":{"anyOf":[{"type":"integer","minimum":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","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"},"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"},"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'}"},"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)"},"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"},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters for limiting result size. Requires 'order_by' to be specified"},"were_variables_explicitly_requested":{"type":"boolean","title":"Were Variables Explicitly Requested","description":"Whether the user passed the variables explicitly. If True, the variables will be used to filter the results. If False, all variables will be returned.","default":true},"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},"value_filters":{"anyOf":[{"items":{"$ref":"#/components/schemas/ValueFilter"},"type":"array"},{"type":"null"}],"title":"Value Filters","description":"Post-aggregation value filters applied as an outermost SQL wrapper. Used by alert evaluation to push threshold conditions into ClickHouse."},"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, return calibratable Jua ensemble models using the calibrated spread delivered in Jua's forecast product. Non-calibratable models pass through unchanged. Set to False to return the raw ensemble spread.","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."},"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"},"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."},"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."},"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."},"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."},"TimeSlice":{"properties":{"start":{"type":"string","format":"date-time","title":"Start","description":"Start datetime (inclusive)"},"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."},"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,"minimum":0,"title":"Hour","description":"UTC hour (0-23)"},"minute":{"anyOf":[{"type":"integer","maximum":59,"minimum":0},{"type":"null"}],"title":"Minute","description":"Optional UTC minute (0-59). Omit for the legacy hour-only behavior."},"offset":{"type":"integer","minimum":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."},"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"],"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³"},"PredictionTimedeltaSlice":{"properties":{"start":{"type":"integer","minimum":0,"title":"Start","description":"Start lead time in minutes from init_time (inclusive)","default":0},"end":{"anyOf":[{"type":"integer","minimum":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."},"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"},"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]]"},"Coordinates":{"type":"string","enum":["model","init_time","time","prediction_timedelta","latitude","longitude","point","market_zone","country_key"],"title":"Coordinates"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Aggregation":{"properties":{"aggregation":{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"],"title":"Aggregation","description":"Aggregation function name."},"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."},"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."},"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"},"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"}},"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."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"ValueFilter":{"properties":{"variable":{"type":"string","title":"Variable"},"operator":{"type":"string","title":"Operator"},"value":{"type":"number","title":"Value"}},"type":"object","required":["variable","operator","value"],"title":"ValueFilter","description":"Post-aggregation value filter applied as outermost SQL wrapper."}}}}
```

## The GeoConstraints object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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"}}}}
```

## The GeoFilter object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."},"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."},"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."}}}}
```

## The Grid object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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"}}}}
```

## The GridBounds object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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"}}}}
```

## The GroupByKey object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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"}}}}
```

## The HTTPValidationError object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## The InitTimeInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The LatestForecastInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The LatestForecastInfoQueryResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."},"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"}}}}
```

## The LatestTimestampResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"LatestTimestampResult":{"properties":{"timestamps":{"additionalProperties":{"type":"string","format":"date-time"},"type":"object","title":"Timestamps"}},"type":"object","required":["timestamps"],"title":"LatestTimestampResult","description":"Result containing latest timestamps per model."}}}}
```

## The MWZonesResponse object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The MetaQueryResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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"},"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"},"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"],"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³"},"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"},"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,"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``."},"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"}}}}
```

## The Model object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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"}}}}
```

## The ModelDisseminationStatus object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"ModelDisseminationStatus":{"properties":{"status":{"items":{"$ref":"#/components/schemas/ForecastDisseminationStatus"},"type":"array","title":"Status","description":"Status for the model"},"delay_stats_per_init_time":{"additionalProperties":{"$ref":"#/components/schemas/DisseminationStats"},"type":"object","title":"Delay Stats Per Init Time","description":"Delay statistics per init time (without date, e.g., '00:00', '06:00')"}},"type":"object","required":["status","delay_stats_per_init_time"],"title":"ModelDisseminationStatus"},"ForecastDisseminationStatus":{"properties":{"init_time":{"type":"string","title":"Init Time","description":"Forecast initialization time"},"delay":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delay","description":"Delay in minutes"},"is_missing":{"type":"boolean","title":"Is Missing","description":"Whether the forecast is missing","default":false},"dissemination_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dissemination Time","description":"Forecast dissemination time"},"expected_dissemination_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Expected Dissemination Time","description":"Expected dissemination time"},"max_prediction_timedelta":{"type":"integer","title":"Max Prediction Timedelta","description":"Maximum prediction timedelta for the forecast"},"expected_max_prediction_timedelta":{"type":"integer","title":"Expected Max Prediction Timedelta","description":"Expected maximum prediction timedelta for the forecast"},"is_delayed":{"type":"boolean","title":"Is Delayed","description":"Whether the forecast is delayed","readOnly":true}},"type":"object","required":["init_time","max_prediction_timedelta","expected_max_prediction_timedelta","is_delayed"],"title":"ForecastDisseminationStatus"},"DisseminationStats":{"properties":{"number_of_data_points":{"type":"integer","title":"Number Of Data Points","description":"Number of data points.Tracking started on '2025-10-29"},"min":{"type":"number","title":"Min","description":"Minimum delay in minutes"},"max":{"type":"number","title":"Max","description":"Maximum delay in minutes"},"mean":{"type":"number","title":"Mean","description":"Mean delay in minutes"},"median":{"type":"number","title":"Median","description":"Median delay in minutes"},"std":{"type":"number","title":"Std","description":"Standard deviation of delay in minutes"},"q90":{"type":"number","title":"Q90","description":"90th percentile of delay in minutes"},"q99":{"type":"number","title":"Q99","description":"99th percentile of delay in minutes"},"in_time_percentage":{"type":"number","title":"In Time Percentage","description":"Percentage of forecasts in time"},"missing_percentage":{"type":"number","title":"Missing Percentage","description":"Percentage of missing forecasts"},"expected_dissemination_time":{"type":"string","format":"time","title":"Expected Dissemination Time","description":"Expected dissemination time (time of day) as reference"},"dissemination_time_min":{"type":"string","format":"time","title":"Dissemination Time Min","description":"Minimum dissemination time (time of day)"},"dissemination_time_max":{"type":"string","format":"time","title":"Dissemination Time Max","description":"Maximum dissemination time (time of day)"},"dissemination_time_mean":{"type":"string","format":"time","title":"Dissemination Time Mean","description":"Mean dissemination time (time of day)"},"dissemination_time_median":{"type":"string","format":"time","title":"Dissemination Time Median","description":"Median dissemination time (time of day)"},"dissemination_time_q90":{"type":"string","format":"time","title":"Dissemination Time Q90","description":"90th percentile of dissemination time (time of day)"},"dissemination_time_q99":{"type":"string","format":"time","title":"Dissemination Time Q99","description":"99th percentile of dissemination time (time of day)"}},"type":"object","required":["number_of_data_points","min","max","mean","median","std","q90","q99","in_time_percentage","missing_percentage","expected_dissemination_time","dissemination_time_min","dissemination_time_max","dissemination_time_mean","dissemination_time_median","dissemination_time_q90","dissemination_time_q99"],"title":"DisseminationStats"}}}}
```

## The ModelInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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"},"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"},"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"],"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³"},"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"},"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,"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``."},"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"}}}}
```

## The NetztransparenzDirection object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The NetztransparenzSubcategory object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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"}}}}
```

## The NetztransparenzTimeseriesQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"tsos":{"anyOf":[{"items":{"$ref":"#/components/schemas/NetztransparenzTso"},"type":"array"},{"type":"null"}],"title":"Tsos","description":"List of TSOs to filter by (e.g., ['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)"},"directions":{"anyOf":[{"items":{"$ref":"#/components/schemas/NetztransparenzDirection"},"type":"array"},{"type":"null"}],"title":"Directions","description":"List of directions (e.g., ['positive', 'negative'])"},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)"},"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)"},"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"},"order_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Order By","description":"Columns to order by"},"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."},"NetztransparenzVariable":{"type":"string","enum":["vermarktung_epex","vermarktung_exaa","vermarktung_solar","vermarktung_wind","vermarktung_sonstige","untertaegige_strommengen","differenz_einspeiseprognose","hochrechnung_solar","hochrechnung_wind","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."},"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."},"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"},"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."},"jua_query_v2__netztransparenz__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for Netztransparenz queries."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The NetztransparenzTso object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The NetztransparenzVariable object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"NetztransparenzVariable":{"type":"string","enum":["vermarktung_epex","vermarktung_exaa","vermarktung_solar","vermarktung_wind","vermarktung_sonstige","untertaegige_strommengen","differenz_einspeiseprognose","hochrechnung_solar","hochrechnung_wind","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."}}}}
```

## The NetztransparenzVariableInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The OrderByItem\_Union\_Coordinates\_\_CustomerVariable\_\_ object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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]]"},"Coordinates":{"type":"string","enum":["model","init_time","time","prediction_timedelta","latitude","longitude","point","market_zone","country_key"],"title":"Coordinates"},"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"],"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³"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."}}}}
```

## The OrderByItem\_Union\_ReanalysisCoordinates\_\_CustomerVariable\_\_ object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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]]"},"ReanalysisCoordinates":{"type":"string","enum":["model","time","latitude","longitude","point","market_zone","country_key"],"title":"ReanalysisCoordinates","description":"Coordinate dimensions available for reanalysis queries."},"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"],"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³"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."}}}}
```

## The OrderByItem\_str\_ object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."}}}}
```

## The POIReference object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The Pagination object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The PowerDisseminationMetricsResponse object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"PowerDisseminationMetricsResponse":{"properties":{"since":{"type":"string","format":"date-time","title":"Since"},"until":{"type":"string","format":"date-time","title":"Until"},"metrics_per_zone":{"items":{"$ref":"#/components/schemas/PowerZoneMetrics"},"type":"array","title":"Metrics Per Zone"},"fleet_on_time_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fleet On Time Pct"},"worst_zone_p95_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Worst Zone P95 Min"},"worst_zone_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Worst Zone Key"},"missing_runs":{"type":"integer","title":"Missing Runs","description":"Sum of ``missing_count`` across all zone/psr pairs","default":0},"fallback_runs":{"type":"integer","title":"Fallback Runs","description":"Sum of ``fallback_count`` across all zone/psr pairs","default":0}},"type":"object","required":["since","until","metrics_per_zone"],"title":"PowerDisseminationMetricsResponse"},"PowerZoneMetrics":{"properties":{"zone_key":{"type":"string","title":"Zone Key"},"psr_type":{"type":"string","title":"Psr Type"},"sample_count":{"type":"integer","title":"Sample Count"},"on_time_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"On Time Pct"},"mean_delay_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mean Delay Min"},"p95_delay_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Delay Min"},"missing_count":{"type":"integer","title":"Missing Count","description":"Init_time slots expected from the inferred cadence but never run. Zero when the window holds fewer than three runs (cadence is not inferable).","default":0},"cadence_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cadence Minutes","description":"Modal gap between consecutive init_times, i.e. the cadence the missing slots were derived from. Null when not inferable."},"missing_init_times":{"items":{"type":"string","format":"date-time"},"type":"array","title":"Missing Init Times","description":"The expected-but-absent init_times behind ``missing_count``, ascending, truncated to the most recent 200."},"fallback_count":{"type":"integer","title":"Fallback Count","description":"Runs whose latest write used forecast-IC fallback initial conditions (``step_status.forecast_ic``), i.e. TSO actuals were not available in time. Provisional: overwritten once real actuals arrive.","default":0},"fallback_init_times":{"items":{"type":"string","format":"date-time"},"type":"array","title":"Fallback Init Times","description":"The init_times behind ``fallback_count``, ascending, truncated to the most recent 200."},"daily_delay_buckets":{"items":{"$ref":"#/components/schemas/PowerZoneDelayBucket"},"type":"array","title":"Daily Delay Buckets"}},"type":"object","required":["zone_key","psr_type","sample_count"],"title":"PowerZoneMetrics"},"PowerZoneDelayBucket":{"properties":{"date":{"type":"string","title":"Date","description":"UTC date (YYYY-MM-DD) of the init_time"},"count":{"type":"integer","title":"Count"},"mean":{"type":"number","title":"Mean"},"p50":{"type":"number","title":"P50"},"p95":{"type":"number","title":"P95"},"on_time":{"type":"integer","title":"On Time"},"yellow":{"type":"integer","title":"Yellow"},"red":{"type":"integer","title":"Red"},"missing":{"type":"integer","title":"Missing","description":"Expected-but-absent init_time slots on this date","default":0}},"type":"object","required":["date","count","mean","p50","p95","on_time","yellow","red"],"title":"PowerZoneDelayBucket"}}}}
```

## The PowerForecastQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"PowerForecastQuery":{"properties":{"zone_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Zone Keys","description":"List of zone codes (e.g. ['DE', 'FR'])"},"psr_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Psr Types","description":"List of PSR types (e.g. ['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."},"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."},"init_time":{"anyOf":[{"type":"integer","minimum":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,"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'."},"max_prediction_timedelta":{"anyOf":[{"type":"integer","maximum":18446744073709552000,"minimum":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)"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End of time range (exclusive, time range mode)"},"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."},"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)."},"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."},"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    - ``version_pins`` overrides specific cells so one request can mix\n      e.g. DE Solar pinned + FR Wind on stable"},"VersionPin":{"properties":{"zone_key":{"type":"string","title":"Zone Key","description":"Zone code (e.g. 'DE')"},"psr_type":{"type":"string","title":"Psr Type","description":"PSR type (e.g. 'Solar')"},"version":{"type":"string","minLength":1,"title":"Version","description":"stable | latest | run id"}},"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``."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The PowerZoneDelayBucket object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"PowerZoneDelayBucket":{"properties":{"date":{"type":"string","title":"Date","description":"UTC date (YYYY-MM-DD) of the init_time"},"count":{"type":"integer","title":"Count"},"mean":{"type":"number","title":"Mean"},"p50":{"type":"number","title":"P50"},"p95":{"type":"number","title":"P95"},"on_time":{"type":"integer","title":"On Time"},"yellow":{"type":"integer","title":"Yellow"},"red":{"type":"integer","title":"Red"},"missing":{"type":"integer","title":"Missing","description":"Expected-but-absent init_time slots on this date","default":0}},"type":"object","required":["date","count","mean","p50","p95","on_time","yellow","red"],"title":"PowerZoneDelayBucket"}}}}
```

## The PowerZoneMetrics object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"PowerZoneMetrics":{"properties":{"zone_key":{"type":"string","title":"Zone Key"},"psr_type":{"type":"string","title":"Psr Type"},"sample_count":{"type":"integer","title":"Sample Count"},"on_time_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"On Time Pct"},"mean_delay_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mean Delay Min"},"p95_delay_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Delay Min"},"missing_count":{"type":"integer","title":"Missing Count","description":"Init_time slots expected from the inferred cadence but never run. Zero when the window holds fewer than three runs (cadence is not inferable).","default":0},"cadence_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cadence Minutes","description":"Modal gap between consecutive init_times, i.e. the cadence the missing slots were derived from. Null when not inferable."},"missing_init_times":{"items":{"type":"string","format":"date-time"},"type":"array","title":"Missing Init Times","description":"The expected-but-absent init_times behind ``missing_count``, ascending, truncated to the most recent 200."},"fallback_count":{"type":"integer","title":"Fallback Count","description":"Runs whose latest write used forecast-IC fallback initial conditions (``step_status.forecast_ic``), i.e. TSO actuals were not available in time. Provisional: overwritten once real actuals arrive.","default":0},"fallback_init_times":{"items":{"type":"string","format":"date-time"},"type":"array","title":"Fallback Init Times","description":"The init_times behind ``fallback_count``, ascending, truncated to the most recent 200."},"daily_delay_buckets":{"items":{"$ref":"#/components/schemas/PowerZoneDelayBucket"},"type":"array","title":"Daily Delay Buckets"}},"type":"object","required":["zone_key","psr_type","sample_count"],"title":"PowerZoneMetrics"},"PowerZoneDelayBucket":{"properties":{"date":{"type":"string","title":"Date","description":"UTC date (YYYY-MM-DD) of the init_time"},"count":{"type":"integer","title":"Count"},"mean":{"type":"number","title":"Mean"},"p50":{"type":"number","title":"P50"},"p95":{"type":"number","title":"P95"},"on_time":{"type":"integer","title":"On Time"},"yellow":{"type":"integer","title":"Yellow"},"red":{"type":"integer","title":"Red"},"missing":{"type":"integer","title":"Missing","description":"Expected-but-absent init_time slots on this date","default":0}},"type":"object","required":["date","count","mean","p50","p95","on_time","yellow","red"],"title":"PowerZoneDelayBucket"}}}}
```

## The PredictionTimedeltaSlice object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"PredictionTimedeltaSlice":{"properties":{"start":{"type":"integer","minimum":0,"title":"Start","description":"Start lead time in minutes from init_time (inclusive)","default":0},"end":{"anyOf":[{"type":"integer","minimum":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."}}}}
```

## The PreferredHours object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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,"minimum":0,"title":"Hour","description":"UTC hour (0-23)"},"minute":{"anyOf":[{"type":"integer","maximum":59,"minimum":0},{"type":"null"}],"title":"Minute","description":"Optional UTC minute (0-59). Omit for the legacy hour-only behavior."},"offset":{"type":"integer","minimum":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."}}}}
```

## The PreferredHoursSelection object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"PreferredHoursSelection":{"properties":{"hour":{"type":"integer","maximum":23,"minimum":0,"title":"Hour","description":"UTC hour (0-23)"},"minute":{"anyOf":[{"type":"integer","maximum":59,"minimum":0},{"type":"null"}],"title":"Minute","description":"Optional UTC minute (0-59). Omit for the legacy hour-only behavior."},"offset":{"type":"integer","minimum":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."}}}}
```

## The ReanalysisCoordinates object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"ReanalysisCoordinates":{"type":"string","enum":["model","time","latitude","longitude","point","market_zone","country_key"],"title":"ReanalysisCoordinates","description":"Coordinate dimensions available for reanalysis queries."}}}}
```

## The ReanalysisMetaResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"ReanalysisMetaResult":{"properties":{"models":{"items":{"$ref":"#/components/schemas/ReanalysisModelInfo"},"type":"array","title":"Models"}},"type":"object","required":["models"],"title":"ReanalysisMetaResult","description":"Metadata about available reanalysis models."},"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."}}}}
```

## The ReanalysisModel object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The ReanalysisModelInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The ReanalysisQuery object

````json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"ReanalysisQuery":{"properties":{"models":{"items":{"$ref":"#/components/schemas/ReanalysisModel"},"type":"array","title":"Models","description":"List of reanalysis model identifiers to query"},"geo":{"$ref":"#/components/schemas/GeoFilter","description":"Geographic filter specifying the query location(s) or region(s)"},"time":{"anyOf":[{"type":"integer","minimum":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,"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":"Time","description":"Time(s) to query. Can be 'latest' (or integer offset 0), a single datetime, a list of datetimes, or a TimeSlice range."},"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"},"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'}"},"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)"},"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"},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters for limiting result size. Requires 'order_by' to be specified"},"were_variables_explicitly_requested":{"type":"boolean","title":"Were Variables Explicitly Requested","description":"Whether the user passed the variables explicitly. If True, the variables will be used to filter the results. If False, all variables will be returned.","default":true}},"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    ```"},"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."},"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."},"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."},"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."},"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."},"TimeSlice":{"properties":{"start":{"type":"string","format":"date-time","title":"Start","description":"Start datetime (inclusive)"},"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."},"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,"minimum":0,"title":"Hour","description":"UTC hour (0-23)"},"minute":{"anyOf":[{"type":"integer","maximum":59,"minimum":0},{"type":"null"}],"title":"Minute","description":"Optional UTC minute (0-59). Omit for the legacy hour-only behavior."},"offset":{"type":"integer","minimum":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."},"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"],"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³"},"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"},"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]]"},"ReanalysisCoordinates":{"type":"string","enum":["model","time","latitude","longitude","point","market_zone","country_key"],"title":"ReanalysisCoordinates","description":"Coordinate dimensions available for reanalysis queries."},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Aggregation":{"properties":{"aggregation":{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"],"title":"Aggregation","description":"Aggregation function name."},"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."},"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."},"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"},"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"}},"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."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
````

## The RollingSumDerivation object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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,"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``."},"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"],"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³"}}}}
```

## The RunDefinition object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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"}}}}
```

## The SolarStationCoverageResponse object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The SortDirection object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."}}}}
```

## The StationBenchmarkQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."},"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."},"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."},"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."},"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"},"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"],"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³"}}}}
```

## The StationDataQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"StationDataQuery":{"properties":{"station_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Station Ids","description":"List of ICAO station codes to query. Mutually exclusive with geo."},"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."},"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/StationVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"List of observation variables to return. If not set, returns all."},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)"},"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."},"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."},"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'}"},"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)"},"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."},"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."},"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."},"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."},"BoundingBox":{"properties":{"min_lat":{"type":"number","maximum":90,"minimum":-90,"title":"Min Lat","description":"Minimum latitude"},"max_lat":{"type":"number","maximum":90,"minimum":-90,"title":"Max Lat","description":"Maximum latitude"},"min_lon":{"type":"number","maximum":180,"minimum":-180,"title":"Min Lon","description":"Minimum longitude"},"max_lon":{"type":"number","maximum":180,"minimum":-180,"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."},"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 either — it comes from a separate\nsolar-station network, served by the dedicated solar read path\n(``build_solar_query`` / ``query_solar_data``, exposed at\n``POST /v1/station-data/solar-data``), not this enum."},"jua_query_v2__station_data__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for station data queries."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The StationInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The StationVariable object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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 either — it comes from a separate\nsolar-station network, served by the dedicated solar read path\n(``build_solar_query`` / ``query_solar_data``, exposed at\n``POST /v1/station-data/solar-data``), not this enum."}}}}
```

## The StationVariableInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The TimeRangeClimatologyQuery object

````json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"TimeRangeClimatologyQuery":{"properties":{"geo":{"$ref":"#/components/schemas/GeoFilter","description":"Geographic filter specifying the query location(s) or region(s)"},"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."},"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'."},"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'."},"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."},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}],"description":"Pagination parameters for limiting result size."},"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)."}},"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    ```"},"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."},"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."},"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."},"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."},"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"],"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³"},"Aggregation":{"properties":{"aggregation":{"type":"string","enum":["avg","std","min","max","sum","count","median","quantile","argmin","argmax"],"title":"Aggregation","description":"Aggregation function name."},"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."},"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."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"},"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"},"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"}},"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."}}}}
````

## The TimeSlice object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"TimeSlice":{"properties":{"start":{"type":"string","format":"date-time","title":"Start","description":"Start datetime (inclusive)"},"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."}}}}
```

## The TotalNumberOfForecastsQueryResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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"}}}}
```

## The UkPowerTimeseriesQuery object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"UkPowerTimeseriesQuery":{"properties":{"variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/UkPowerVariable"},"type":"array"},{"type":"null"}],"title":"Variables","description":"Variables to query. If not set, returns all."},"start_time":{"type":"string","format":"date-time","title":"Start Time","description":"Start time for the query (inclusive)"},"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."},"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')."},"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')."},"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"},"UkPowerVariable":{"type":"string","enum":["wind","wind_transmission","wind_embedded","solar","load","wind_forecast","wind_transmission_forecast","wind_embedded_forecast","solar_forecast"],"title":"UkPowerVariable","description":"UK power generation variable types (aggregated)."},"jua_query_v2__uk_power__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for UK power queries."},"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]"},"SortDirection":{"type":"string","enum":["asc","desc"],"title":"SortDirection","description":"Sort direction for ORDER BY clauses."},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit","default":100},"offset":{"type":"integer","title":"Offset","default":0}},"type":"object","title":"Pagination"}}}}
```

## The UkPowerVariable object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"UkPowerVariable":{"type":"string","enum":["wind","wind_transmission","wind_embedded","solar","load","wind_forecast","wind_transmission_forecast","wind_embedded_forecast","solar_forecast"],"title":"UkPowerVariable","description":"UK power generation variable types (aggregated)."}}}}
```

## The UkPowerVariableInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The ValidationError object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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"}}}}
```

## The ValueFilter object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"ValueFilter":{"properties":{"variable":{"type":"string","title":"Variable"},"operator":{"type":"string","title":"Operator"},"value":{"type":"number","title":"Value"}},"type":"object","required":["variable","operator","value"],"title":"ValueFilter","description":"Post-aggregation value filter applied as outermost SQL wrapper."}}}}
```

## The VersionInfo object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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},"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."}}}}
```

## The VersionPin object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"VersionPin":{"properties":{"zone_key":{"type":"string","title":"Zone Key","description":"Zone code (e.g. 'DE')"},"psr_type":{"type":"string","title":"Psr Type","description":"PSR type (e.g. 'Solar')"},"version":{"type":"string","minLength":1,"title":"Version","description":"stable | latest | run id"}},"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``."}}}}
```

## The Weighting object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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"},"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"}},"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."}}}}
```

## The jua\_query\_v2\_\_climate\_indices\_\_types\_\_AvailableSourcesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The jua\_query\_v2\_\_eex\_gas\_\_types\_\_AvailableAreasResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"jua_query_v2__eex_gas__types__AvailableAreasResult":{"properties":{"areas":{"items":{"type":"string"},"type":"array","title":"Areas"}},"type":"object","required":["areas"],"title":"AvailableAreasResult","description":"Result type for available EEX gas market areas / hubs."}}}}
```

## The jua\_query\_v2\_\_eex\_gas\_\_types\_\_AvailableShortCodesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"jua_query_v2__eex_gas__types__AvailableShortCodesResult":{"properties":{"short_codes":{"items":{"type":"string"},"type":"array","title":"Short Codes"}},"type":"object","required":["short_codes"],"title":"AvailableShortCodesResult","description":"Result type for available EEX gas product ShortCodes."}}}}
```

## The jua\_query\_v2\_\_eex\_power\_\_types\_\_AvailableAreasResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"jua_query_v2__eex_power__types__AvailableAreasResult":{"properties":{"areas":{"items":{"type":"string"},"type":"array","title":"Areas"}},"type":"object","required":["areas"],"title":"AvailableAreasResult","description":"Result type for available EEX market areas."}}}}
```

## The jua\_query\_v2\_\_eex\_power\_\_types\_\_AvailableShortCodesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"jua_query_v2__eex_power__types__AvailableShortCodesResult":{"properties":{"short_codes":{"items":{"type":"string"},"type":"array","title":"Short Codes"}},"type":"object","required":["short_codes"],"title":"AvailableShortCodesResult","description":"Result type for available EEX product ShortCodes."}}}}
```

## The jua\_query\_v2\_\_entsoe\_\_query\_\_TemporalAggregation object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"jua_query_v2__entsoe__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for ENTSOE queries."}}}}
```

## The jua\_query\_v2\_\_entsoe\_\_types\_\_AvailableVariablesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."},"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."}}}}
```

## The jua\_query\_v2\_\_epex\_spot\_\_types\_\_AvailableVariablesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```

## The jua\_query\_v2\_\_netztransparenz\_\_query\_\_TemporalAggregation object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"jua_query_v2__netztransparenz__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for Netztransparenz queries."}}}}
```

## The jua\_query\_v2\_\_netztransparenz\_\_types\_\_AvailableVariablesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```

## The jua\_query\_v2\_\_station\_data\_\_query\_\_TemporalAggregation object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"jua_query_v2__station_data__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for station data queries."}}}}
```

## The jua\_query\_v2\_\_station\_data\_\_types\_\_AvailableVariablesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```

## The jua\_query\_v2\_\_uk\_power\_\_query\_\_TemporalAggregation object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"jua_query_v2__uk_power__query__TemporalAggregation":{"type":"string","enum":["none","hourly","daily"],"title":"TemporalAggregation","description":"Temporal aggregation options for UK power queries."}}}}
```

## The jua\_query\_v2\_\_uk\_power\_\_types\_\_AvailableSourcesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."}}}}
```

## The jua\_query\_v2\_\_uk\_power\_\_types\_\_AvailableVariablesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```

## The query\_engine\_\_climatology\_\_router\_\_AvailableVariablesResult object

```json
{"openapi":"3.1.0","info":{"title":"Jua Query Engine API","version":"0.1.0"},"components":{"schemas":{"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."},"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."}}}}
```


