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

# Send your first schedule

> Send a schedule for one delivery day, and read what the market did with it.

This guide sends a schedule for one delivery day in Germany and follows it to the market's confirmation. In the Netherlands, you do the same steps with the Dutch identifiers from the [Core API](https://docs.engrate.io/api-reference/core/overview.md). The Dutch market accepts only internal, external and foreign series. Engrate does not send production or consumption series to TenneT.

You need an API key (see [Authentication](https://docs.engrate.io/guides/authentication.md)), and your organization must be connected to the market. Until it is, creating a schedule returns `404 Organization is not configured`.

**1. Build the series**

One series per flow. Each series has one value in MW per quarter-hour of the delivery day, starting at local midnight: 96 values, or 92 and 100 on the days daylight saving time starts and ends.

```json schedule.json theme={null}
{
  "market": "DE",
  "tso": "50HERTZ_DE_TSO",
  "receiver_id": "10XDE-VE-TRANSMK",
  "date": "2026-11-02",
  "series": [
    {
      "type": "internal",
      "ids": {
        "in_area": "10YDE-VE-------2",
        "out_area": "10YDE-VE-------2",
        "in_party": "11XDE-COUNTERP-B",
        "out_party": "11XDE-EXAMPLE--A"
      },
      "data": [
        { "ts": "2026-11-01T23:00:00Z", "amount": 10.5 },
        { "ts": "2026-11-01T23:15:00Z", "amount": 10.5 }
      ]
    }
  ]
}
```

This series sells energy from your party (`11XDE-EXAMPLE--A`) to a counterparty in the 50Hertz area. The [Schedule](https://docs.engrate.io/api-reference/schedule-management/models/schedule.md) model gives the values of `tso`. The [Schedule series](https://docs.engrate.io/api-reference/schedule-management/models/schedule-series.md) model gives the series types. The example shows two of the 96 values. This script writes the whole day to `schedule.json`, with the same 10.5 MW in each quarter-hour, and counts the quarter-hours from local midnight, so it also works on the days daylight saving time starts and ends:

```python make_schedule.py theme={null}
import json
from datetime import date, datetime, timedelta, timezone
from zoneinfo import ZoneInfo

DAY = date(2026, 11, 2)
BERLIN = ZoneInfo("Europe/Berlin")

# The delivery day runs from local midnight to the next local midnight.
start = datetime(DAY.year, DAY.month, DAY.day, tzinfo=BERLIN).astimezone(timezone.utc)
next_day = DAY + timedelta(days=1)
end = datetime(next_day.year, next_day.month, next_day.day, tzinfo=BERLIN).astimezone(timezone.utc)

data = []
ts = start
while ts < end:
    data.append({"ts": ts.strftime("%Y-%m-%dT%H:%M:%SZ"), "amount": 10.5})
    ts += timedelta(minutes=15)

schedule = {
    "market": "DE",
    "tso": "50HERTZ_DE_TSO",
    "receiver_id": "10XDE-VE-TRANSMK",
    "date": DAY.isoformat(),
    "series": [
        {
            "type": "internal",
            "ids": {
                "in_area": "10YDE-VE-------2",
                "out_area": "10YDE-VE-------2",
                "in_party": "11XDE-COUNTERP-B",
                "out_party": "11XDE-EXAMPLE--A",
            },
            "data": data,
        }
    ],
}

with open("schedule.json", "w") as f:
    json.dump(schedule, f, indent=2)
print(f"{len(data)} quarter-hours written to schedule.json")
```

```bash theme={null}
python3 make_schedule.py
```

**2. Send it**

```bash theme={null}
curl --request POST \
  --url "https://api.engrate.io/schedule-management/v1/schedules" \
  --header "authorization: $API_KEY" \
  --header "content-type: application/json" \
  --data @schedule.json
```

The response gives the `schedule_uid`. A `400` or `422` response says what is wrong with the request, such as a missing quarter-hour or two series for the same flow.

Engrate now sends revision 1 to the Scheduling Area Responsible.

**3. Follow the revision**

```bash theme={null}
curl --request GET \
  --url "https://api.engrate.io/schedule-management/v1/schedules/$SCHEDULE_UID/versions" \
  --header "authorization: $API_KEY"
```

The `status` of the revision moves from `created` to `submitted`, then to the market's answer, such as `ack_positive`. The [Schedule version](https://docs.engrate.io/api-reference/schedule-management/models/schedule-version.md) model lists all statuses.

**4. Read the series state**

```bash theme={null}
curl --request GET \
  --url "https://api.engrate.io/schedule-management/v1/schedules/$SCHEDULE_UID/series-state" \
  --header "authorization: $API_KEY"
```

For each series, `match_status` says whether it matches your counterparty's series, and `confirmation` gives the values the Scheduling Area Responsible will use. A series stays `not_checked` until the Scheduling Area Responsible matches it. See [Matching](https://docs.engrate.io/market-communication/schedules/matching-and-confirmation.md).

**5. Change it**

To change the schedule, post the whole day again with the new values. Engrate sends a new revision. If a series does not match, see [Handle a mismatch](https://docs.engrate.io/market-communication/guides/handle-a-mismatch.md).


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