curl --request GET \
--url https://{host}/v1/mobile/summary \
--header 'X-API-Key: <api-key>'import requests
url = "https://{host}/v1/mobile/summary"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://{host}/v1/mobile/summary', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{host}/v1/mobile/summary",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{host}/v1/mobile/summary"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{host}/v1/mobile/summary")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/v1/mobile/summary")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"contract_version": "1.0",
"min_app_version": "0.1.0",
"generated_at": "2023-11-07T05:31:56Z",
"generated_at_local": "14:30",
"caller": "<string>",
"scopes": [
"mobile"
],
"version": "<string>",
"service_state": "running",
"engrate_environment": "staging",
"last_event_id": 123,
"epoch": "2023-11-07T05:31:56Z",
"last_orchestrate_at": "2023-11-07T05:31:56Z",
"heartbeat_stale": true,
"milestones": [
{
"key": "forecast_expected",
"at": "2023-11-07T05:31:56Z",
"at_local": "14:30"
}
],
"t_plus_1": {
"delivery_day": "2023-12-25",
"source": "customer",
"aggregated": "done",
"published": "done",
"submitted": "done",
"interval_count": 123,
"accepted": true,
"balanced": true,
"imbalance_count": 123,
"previous_accepted": true,
"published_at": "2023-11-07T05:31:56Z",
"published_at_local": "14:30",
"gate_closure_at": "2023-11-07T05:31:56Z",
"gate_closure_local": "14:30",
"warn_from": "2023-11-07T05:31:56Z",
"warn_from_local": "14:30",
"gate_warning_fired": true
},
"badge": {
"color": "neutral",
"code": "no_input",
"label_de": "<string>",
"label_en": "<string>",
"countdown_to": "2023-11-07T05:31:56Z",
"next_gate_at": "2023-11-07T05:31:56Z"
},
"badge_timeline": [
{
"color": "neutral",
"code": "no_input",
"label_de": "<string>",
"label_en": "<string>",
"countdown_to": "2023-11-07T05:31:56Z",
"next_gate_at": "2023-11-07T05:31:56Z",
"at": "2023-11-07T05:31:56Z",
"at_local": "14:30",
"delivery_day": "2023-12-25"
}
],
"timeline_end": "2023-11-07T05:31:56Z",
"stale_after_s": 123,
"expire_after_s": 123,
"overlays": {
"environment": "live",
"environment_label": "LIVE",
"stopped": true,
"heartbeat_stale": true
},
"days": [
{
"delivery_day": "2023-12-25",
"offset_days": 123,
"source": "customer",
"aggregated": "done",
"published": "done",
"submitted": "done",
"interval_count": 123,
"customers_total": 123,
"backup_weak": true,
"deviation_pct": 123
}
],
"events_24h": {
"error": 123,
"warning": 123
},
"wiedervorlagen_count": 123,
"alert_channels": {
"pushover": true,
"slack": true,
"teams": true,
"sms": true
},
"snapshot": {
"contract_version": "<string>",
"generated_at": "2023-11-07T05:31:56Z",
"stale_after_s": 123,
"expire_after_s": 123,
"timeline_end": "2023-11-07T05:31:56Z",
"badge": {
"color": "neutral",
"code": "no_input",
"label_de": "<string>",
"label_en": "<string>",
"countdown_to": "2023-11-07T05:31:56Z",
"next_gate_at": "2023-11-07T05:31:56Z"
},
"badge_timeline": [
{
"color": "neutral",
"code": "no_input",
"label_de": "<string>",
"label_en": "<string>",
"countdown_to": "2023-11-07T05:31:56Z",
"next_gate_at": "2023-11-07T05:31:56Z",
"at": "2023-11-07T05:31:56Z",
"at_local": "14:30",
"delivery_day": "2023-12-25"
}
],
"overlays": {
"environment": "live",
"environment_label": "LIVE",
"stopped": true,
"heartbeat_stale": true
},
"t_plus_1": {
"delivery_day": "2023-12-25",
"aggregated": "done",
"published": "done",
"submitted": "done",
"gate_closure_at": "2023-11-07T05:31:56Z",
"warn_from": "2023-11-07T05:31:56Z"
},
"events_24h": {
"error": 123,
"warning": 123
},
"wiedervorlagen_count": 123
}
}{
"error": "unauthorized"
}{
"error": "unauthorized"
}{
"error": "unauthorized"
}{
"error": "unauthorized"
}The operational state at a glance
Service state, the day ahead (T+1) with its stages, Engrate’s verdict and the gate, the day-ahead milestones, and the days from yesterday to the end of the forecast horizon. Shared between callers for 15 seconds.
curl --request GET \
--url https://{host}/v1/mobile/summary \
--header 'X-API-Key: <api-key>'import requests
url = "https://{host}/v1/mobile/summary"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://{host}/v1/mobile/summary', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{host}/v1/mobile/summary",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{host}/v1/mobile/summary"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{host}/v1/mobile/summary")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/v1/mobile/summary")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"contract_version": "1.0",
"min_app_version": "0.1.0",
"generated_at": "2023-11-07T05:31:56Z",
"generated_at_local": "14:30",
"caller": "<string>",
"scopes": [
"mobile"
],
"version": "<string>",
"service_state": "running",
"engrate_environment": "staging",
"last_event_id": 123,
"epoch": "2023-11-07T05:31:56Z",
"last_orchestrate_at": "2023-11-07T05:31:56Z",
"heartbeat_stale": true,
"milestones": [
{
"key": "forecast_expected",
"at": "2023-11-07T05:31:56Z",
"at_local": "14:30"
}
],
"t_plus_1": {
"delivery_day": "2023-12-25",
"source": "customer",
"aggregated": "done",
"published": "done",
"submitted": "done",
"interval_count": 123,
"accepted": true,
"balanced": true,
"imbalance_count": 123,
"previous_accepted": true,
"published_at": "2023-11-07T05:31:56Z",
"published_at_local": "14:30",
"gate_closure_at": "2023-11-07T05:31:56Z",
"gate_closure_local": "14:30",
"warn_from": "2023-11-07T05:31:56Z",
"warn_from_local": "14:30",
"gate_warning_fired": true
},
"badge": {
"color": "neutral",
"code": "no_input",
"label_de": "<string>",
"label_en": "<string>",
"countdown_to": "2023-11-07T05:31:56Z",
"next_gate_at": "2023-11-07T05:31:56Z"
},
"badge_timeline": [
{
"color": "neutral",
"code": "no_input",
"label_de": "<string>",
"label_en": "<string>",
"countdown_to": "2023-11-07T05:31:56Z",
"next_gate_at": "2023-11-07T05:31:56Z",
"at": "2023-11-07T05:31:56Z",
"at_local": "14:30",
"delivery_day": "2023-12-25"
}
],
"timeline_end": "2023-11-07T05:31:56Z",
"stale_after_s": 123,
"expire_after_s": 123,
"overlays": {
"environment": "live",
"environment_label": "LIVE",
"stopped": true,
"heartbeat_stale": true
},
"days": [
{
"delivery_day": "2023-12-25",
"offset_days": 123,
"source": "customer",
"aggregated": "done",
"published": "done",
"submitted": "done",
"interval_count": 123,
"customers_total": 123,
"backup_weak": true,
"deviation_pct": 123
}
],
"events_24h": {
"error": 123,
"warning": 123
},
"wiedervorlagen_count": 123,
"alert_channels": {
"pushover": true,
"slack": true,
"teams": true,
"sms": true
},
"snapshot": {
"contract_version": "<string>",
"generated_at": "2023-11-07T05:31:56Z",
"stale_after_s": 123,
"expire_after_s": 123,
"timeline_end": "2023-11-07T05:31:56Z",
"badge": {
"color": "neutral",
"code": "no_input",
"label_de": "<string>",
"label_en": "<string>",
"countdown_to": "2023-11-07T05:31:56Z",
"next_gate_at": "2023-11-07T05:31:56Z"
},
"badge_timeline": [
{
"color": "neutral",
"code": "no_input",
"label_de": "<string>",
"label_en": "<string>",
"countdown_to": "2023-11-07T05:31:56Z",
"next_gate_at": "2023-11-07T05:31:56Z",
"at": "2023-11-07T05:31:56Z",
"at_local": "14:30",
"delivery_day": "2023-12-25"
}
],
"overlays": {
"environment": "live",
"environment_label": "LIVE",
"stopped": true,
"heartbeat_stale": true
},
"t_plus_1": {
"delivery_day": "2023-12-25",
"aggregated": "done",
"published": "done",
"submitted": "done",
"gate_closure_at": "2023-11-07T05:31:56Z",
"warn_from": "2023-11-07T05:31:56Z"
},
"events_24h": {
"error": 123,
"warning": 123
},
"wiedervorlagen_count": 123
}
}{
"error": "unauthorized"
}{
"error": "unauthorized"
}{
"error": "unauthorized"
}{
"error": "unauthorized"
}Authorizations
Response
Successful Response
"1.0"
"0.1.0"
^\d{2}:\d{2}$"14:30"
"mobile"running, stopped staging, production timestamp of the first event; a change means the event log was replaced and event ids restarted
the orchestrator's last call; null until it has run once since this was recorded
Show child attributes
Show child attributes
The day ahead (T+1, Berlin) - the one the gate closes for today.
Show child attributes
Show child attributes
How the day ahead stands, decided by the server's rules. Clients render it as given; grey is theirs alone, for data too old to trust.
Show child attributes
Show child attributes
strictly ascending; the first entry is at generated_at
Show child attributes
Show child attributes
beyond this instant the timeline says nothing - clients render grey from here or from generated_at + expire_after_s, whichever comes first
from generated_at + this, clients add 'Stand HH:MM'
from generated_at + this, clients render grey
Show child attributes
Show child attributes
T-1 to T+horizon, oldest first
Show child attributes
Show child attributes
warnings and errors of the last 24 hours on the feed
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Exactly what native surfaces (widgets, watch, Live Activity) may store: no energy, no names, no event text, no caller, no configuration beyond the staleness thresholds it needs offline - LIVE/TEST and stopped are in the overlays. Stored verbatim, so they are covered by this contract and its fixtures.
Show child attributes
Show child attributes