> ## Documentation Index
> Fetch the complete documentation index at: https://docs.energy.nlead.ch/llms.txt
> Use this file to discover all available pages before exploring further.

# Fahrplanbestätigung

> What the TSOs finally confirmed of a day's schedules, against what was sent, and what it does to the balancing group

The balancing group is settled on what the TSO confirmed, not on what we
sent. Where a series does not match its counterpart, the TSO changes it:
on 20.10.2026 the trader had not nominated Cloover's purchase in Amprion
(version 3 came after the trader's 09:00 order deadline), so Amprion's CNI
and CNF-DA set the purchase from 39.75 kWh to 0 (`A63`, "Die Wertereihe
wurde geaendert") and kept both transfers out of Amprion - 34.75 kWh to
TenneT, 5 kWh to TransnetBW. Cloover was 39.75 kWh short in Amprion.

The bridge reads every confirmation, compares it per series with what was
sent, and measures Fahrplan/Ist and the Kalkulation against the confirmed
position.

## The confirmations

The TSO answers a schedule message with confirmation reports (ESS
`ConfirmationReport`):

| MessageType | Report | When |
| - | - | - |
| `A07` | intermediate (CNI) | after a matching on the day before, intraday |
| `A09` | day-ahead (CNF-DA) | after the 14:30 day-ahead matching |
| `A08` | final | after the delivery day - what settlement uses |

Per series a `TimeSeriesConfirmation` holds the values the TSO keeps (a
reason `A63`: modified), an `ImposedTimeSeries` one the TSO set without
us, a `TimeSeriesRejection` one not taken into account (counted as 0).

**Governing** per TSO is the newest final report, else the newest report.

## Where they come from

Every 30 minutes the orchestrator reads, for each submitted day from three
days back to tomorrow that is not yet final for every TSO:

1. Engrate's read-back of the day: the schedules, their versions with the
   series as sent, and the TSO's answers;
2. the content of every confirmation not yet held - the XML as Engrate
   received it (`GET /schedule-management/v1/schedules/{uid}/incoming-messages/{message_uid}`);
3. where Engrate serves no content: Engrate's series state (`GET
   /schedule-management/v1/schedules/{uid}/series-state`, alpha) - the
   values with their finality.

A report can also be imported by hand, as the TSO sent it. The XML of
every report stays with the day on the audit share (`cnf_<message>.xml`),
the comparison in `fahrplan_bestaetigung.json`.

## The effect on the balancing group

Only the trade series count - internal (with the trader) and external
(between Regelzonen). The forecast series of production and consumption
are information, not settled. Per Regelzone:

```
change of net inflow = Σ trade series  ± (confirmed − sent)
```

`+` where the series brings energy into our group in that Regelzone, `−`
where it takes it out. Negative means less scheduled in: the group is
short by it where the customers consume as forecast. For Amprion on
20.10: the purchase −39.75 kWh, the transfers unchanged - **−39.75 kWh,
short**.

Fahrplan/Ist adds the change to the Regelzone's Fahrplan (and Germany's
by their sum), so the deviation, the Ausgleichsenergie and the Kalkulation
follow the confirmed position. Each zone says which Fahrplan it used
(`fahrplan_quelle`: `gesendet`, `bestaetigt`, `bestaetigt_final`), the
report, and the change in MWh. Confirmed as sent, nothing moves.

## The alert

A confirmation that changes a trade series raises
`fahrplan_vom_uenb_geaendert` (High):

> Amprion hat den Fahrplan 20.10. geändert (Day-Ahead,
> 20261020\_10XDE-RWENET\_CNF-DA\_89253): Kauf vom Händler 39.75 → 0 kWh
> (A63 Die Wertereihe wurde geaendert) - Bilanzkreis in Amprion 39.75 kWh
> unterdeckt

Once per change: the CNI and the CNF-DA a minute later with the same
values say it once. A later report that holds the schedule as sent again
raises `fahrplan_aenderung_aufgehoben`.

## Endpoints

All under the process scope.

| Call | Purpose |
| - | - |
| `GET /v1/process/delivery-days/{day}/bestaetigungen` | per Regelzone the reports held, the governing one, sent against confirmed per series with the reasons, and the change of the net inflow (kWh, MW per quarter-hour) |
| `POST /v1/process/delivery-days/{day}/bestaetigungen` | import one report: `{"xml": "<ConfirmationReport ...>"}`; what was sent is read back from Engrate |
| `POST /v1/process/delivery-days/{day}/bestaetigungen/abholen` | read the day's confirmations from Engrate now |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.