> For the complete documentation index, see [llms.txt](https://docs.jua.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.jua.ai/models-and-products/power-forecast.md).

# 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. The default product (`regime=curtailed`) forecasts **actual production**. Where it is available, `regime=uncurtailed` forecasts **potential** (no curtailment). [Market Aggregates with MW output](/api-v2/query-engine/market-aggregates.md) applies generic power curves to weather forecasts and is also a potential-production product. Power Forecast is significantly more accurate for the zones it covers. Both use the same facility datasets.
{% endhint %}

## Availability

### Curtailed (`regime=curtailed`, default)

| 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 |

### Uncurtailed (`regime=uncurtailed`)

| Country            | Solar | Wind Onshore | Wind Offshore | Wind Transmission | Wind Embedded | Load |
| ------------------ | ----- | ------------ | ------------- | ----------------- | ------------- | ---- |
| 🇩🇪 Germany       | ✅     | ✅            | ✅             |                   |               |      |
| 🇬🇧 Great Britain |       |              |               | ✅                 |               |      |

Uncurtailed coverage is limited to the table above. Other zone and generation-type combinations return `400` rather than falling back to the curtailed product.

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.md) 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)                  |

### Update frequency

#### Curtailed (`regime=curtailed`, default)

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

#### Uncurtailed (`regime=uncurtailed`)

| Generation type | Update Frequency |
| --------------- | ---------------- |
| Solar           | 30 min           |
| Wind            | 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.md). 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,
    "debias": true
  }'
```

**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.

### Optional walk-forward debiasing

Power Forecast values are **raw by default** if you omit `debias`. Examples on this page pass `"debias": true` so new integrations get the walk-forward correction. Pass `"debias": false` (or omit the field) only when you need the unadjusted forecast.

**How it works.** For each forecast point — matched by zone, technology, initialization clock, and lead time — the API:

1. Looks back over recent forecast-versus-actual history: **eight weeks for wind**, **four weeks for solar and load**.
2. Estimates the average signed error (forecast minus actual) over that window.
3. Subtracts that bias from the **current** forecast.
4. Moves the window ahead as new actuals arrive, and repeats.

The correction is additive in MW. Historical periods with negative day-ahead prices are left out of the bias estimate, because metered generation can then sit below weather-driven potential for reasons that are not forecast error. Points without enough history are omitted.

Walk-forward `debias` is fitted on metered (curtailed) actuals. Combining `"debias": true` with `"regime": "uncurtailed"` (or an uncurtailed `version_pins[].regime`) is rejected. Uncurtailed queries stay raw.

Omitting `debias`, or setting it to `false`, returns the unadjusted forecast.

| Product                            | `debias=true`                     |
| ---------------------------------- | --------------------------------- |
| Curtailed (`regime=curtailed`)     | Supported                         |
| Uncurtailed (`regime=uncurtailed`) | Not supported (query is rejected) |

```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": ["Wind Onshore"],
    "init_time": "latest",
    "debias": true
  }'
```

The Python SDK exposes the same flag as `client.power_forecast.get_data(..., debias=True)` and `get_day_ahead_timeseries(..., debias=True)`. See the [Power Forecast SDK page](/python-sdk/power-forecast.md).

### Model versioning

`version` and `regime` are independent.

* `version` picks the model: omit it (or use `"stable"`) to follow Jua's stable model, use `"latest"` for the newest model, or pass a version hash to keep using that exact model after Jua updates. `"stable"` and `"latest"` move when Jua updates the model.
* `regime` selects which product `"stable"` and `"latest"` refer to. `"curtailed"` (default) is actual production. `"uncurtailed"` is potential. A version hash ignores `regime`.

Uncurtailed currently covers Germany Solar, Wind Onshore, and Wind Offshore, and Great Britain Wind Transmission. Other zone and generation-type combinations return `400` rather than falling back to the curtailed product.

```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,
    "regime": "uncurtailed"
  }'
```

#### Current versions

| Description                                                                     | Release date | Version hash | Stable | Latest |
| ------------------------------------------------------------------------------- | ------------ | ------------ | :----: | :----: |
| Initial production checkpoint for the Belgium offshore wind forecast            | 2026-06-17   | `p8unxyd8`   |    ✅   |    ✅   |
| Initial production checkpoint for the Belgium onshore wind forecast             | 2026-06-17   | `0ze11rfm`   |    ✅   |    ✅   |
| Adds EPT 2.1 Helios to the Belgium solar forecast                               | 2026-07-09   | `0dc4kiqs`   |    ✅   |    ✅   |
| Initial production checkpoint for the France offshore wind forecast             | 2026-06-17   | `a0mxgzdn`   |    ✅   |    ✅   |
| Initial production checkpoint for the France onshore wind forecast              | 2026-06-12   | `rtoz3nvb`   |    ✅   |    ✅   |
| Adds EPT 2.1 Helios to the France solar forecast                                | 2026-07-09   | `den0y9ln`   |    ✅   |    ✅   |
| Initial production checkpoint for the Germany load forecast                     | 2026-06-04   | `590ieffq`   |    ✅   |    ✅   |
| Initial uncurtailed checkpoint for the Germany offshore wind forecast           | 2026-08-18   | `90d4cfla`   |    ✅   |    ✅   |
| Initial production checkpoint for the Germany offshore wind forecast            | 2026-06-08   | `blcqp8ll`   |    ✅   |    ✅   |
| Initial production checkpoint for the Germany onshore wind forecast             | 2026-06-08   | `8n8rqlpn`   |    ✅   |    ✅   |
| Initial uncurtailed checkpoint for the Germany onshore wind forecast            | 2026-08-18   | `yazswc2b`   |    ✅   |    ✅   |
| Initial uncurtailed checkpoint for the Germany solar forecast                   | 2026-08-18   | `hcrgsy3v`   |    ✅   |    ✅   |
| Adds EPT 2.1 Helios to the Germany solar forecast                               | 2026-07-09   | `rv7orbtm`   |    ✅   |    ✅   |
| Initial production checkpoint for the Great Britain embedded wind forecast      | 2026-05-13   | `uawes0b4`   |    ✅   |    ✅   |
| Adds EPT 2.1 Helios to the Great Britain solar forecast                         | 2026-07-09   | `wc0y235q`   |    ✅   |    ✅   |
| Initial uncurtailed checkpoint for the Great Britain transmission wind forecast | 2026-08-18   | `56uvq04q`   |    ✅   |    ✅   |
| Initial production checkpoint for the Great Britain transmission wind forecast  | 2026-05-13   | `l5xpioly`   |    ✅   |    ✅   |
| Initial production checkpoint for the Great Britain wind forecast               | 2026-04-03   | `pwaazna8`   |    ✅   |    ✅   |
| Initial production checkpoint for the Netherlands offshore wind forecast        | 2026-06-17   | `va5ucy4o`   |    ✅   |    ✅   |
| Initial production checkpoint for the Netherlands onshore wind forecast         | 2026-06-17   | `zh2nppj8`   |    ✅   |    ✅   |
| Adds EPT 2.1 Helios to the Netherlands solar forecast                           | 2026-07-09   | `n21abyr0`   |    ✅   |    ✅   |

Call `GET /v1/power-forecast/versions`, optionally filtered by `zone_key` and `psr_type`, to discover run IDs. The response marks curtailed `"stable"` / `"latest"` with `is_stable` / `is_latest` and uncurtailed `"stable"` / `"latest"` with `is_stable_uncurtailed` / `is_latest_uncurtailed`. Uncurtailed models in the table above are the rows whose description starts with "Initial uncurtailed checkpoint". To freeze today's model, copy the `model_version` from the matching flag 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",
    "debias": true
  }'
```

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",
  "debias": true
}
```

The `version` and `regime` parameters on `/v1/power-forecast/init-times` use the same semantics as `POST /data`, so you can discover runs for the exact product and model version you intend to query. Each pin in `version_pins` may also set `regime`; omit it to inherit the request regime.

### 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,
    debias=True,
)

# Uncurtailed (potential) German Solar — debias is not available
ds = client.power_forecast.get_data(
    zone_keys=["DE"],
    psr_types=["Solar"],
    init_time="latest",
    max_prediction_timedelta=240,
    regime="uncurtailed",
)
```

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

## Hindcast Data

### Curtailed (`regime=curtailed`, default)

| **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            |

### Uncurtailed (`regime=uncurtailed`)

| **Zone** | **Temporal Extent**         | **Forecast Types**                 |
| -------- | --------------------------- | ---------------------------------- |
| DE       | 2025-01-01 00:00:00 - today | Solar, Wind Onshore, Wind Offshore |
| GB       | 2025-01-01 00:00:00 - today | Wind Transmission                  |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.jua.ai/models-and-products/power-forecast.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
