Retrieve a dispatch timeline
curl --request GET \
--url https://fleet-api.flatpeak.com/devices/{device_id}/timeline \
--header 'Authorization: Bearer <token>'import requests
url = "https://fleet-api.flatpeak.com/devices/{device_id}/timeline"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://fleet-api.flatpeak.com/devices/{device_id}/timeline', 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://fleet-api.flatpeak.com/devices/{device_id}/timeline",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://fleet-api.flatpeak.com/devices/{device_id}/timeline"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://fleet-api.flatpeak.com/devices/{device_id}/timeline")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://fleet-api.flatpeak.com/devices/{device_id}/timeline")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "dispatch_timeline",
"device_id": "dev_63a6087272941ef077a8fd3e",
"live_mode": true,
"timezone": "America/Los_Angeles",
"data": [
{
"time_created": null,
"time_fetched": "2026-08-04T19:31:08Z",
"time_confirmed": "2026-08-04T19:31:40Z",
"origin": "OPERATOR",
"energy_source": "BATTERY",
"start_time": "2026-08-04T20:00:00Z",
"end_time": "2026-08-04T20:30:00Z",
"energy_kwh": -2.15,
"confidence": 1
},
{
"time_created": null,
"time_fetched": "2026-08-04T19:31:08Z",
"time_confirmed": "2026-08-04T19:31:40Z",
"origin": "OPERATOR",
"energy_source": "BATTERY",
"start_time": "2026-08-04T20:30:00Z",
"end_time": "2026-08-04T21:00:00Z",
"energy_kwh": -2.15,
"confidence": 1
},
{
"time_created": null,
"time_fetched": null,
"time_confirmed": null,
"origin": "OEM",
"energy_source": "GRID",
"start_time": "2026-08-04T21:00:00Z",
"end_time": "2026-08-04T21:30:00Z",
"energy_kwh": 1.2,
"confidence": 0.8
}
],
"oem_id": "oem_6a3a8dada72cd0a249ff9528"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}Plans
Retrieve a dispatch timeline
Returns the device’s net energy flows over the window, past or future, up to 90 days. Intervals are contiguous and each carries its origin, energy_source, instruction timestamps and confidence (1 where metered).
GET
/
devices
/
{device_id}
/
timeline
Retrieve a dispatch timeline
curl --request GET \
--url https://fleet-api.flatpeak.com/devices/{device_id}/timeline \
--header 'Authorization: Bearer <token>'import requests
url = "https://fleet-api.flatpeak.com/devices/{device_id}/timeline"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://fleet-api.flatpeak.com/devices/{device_id}/timeline', 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://fleet-api.flatpeak.com/devices/{device_id}/timeline",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://fleet-api.flatpeak.com/devices/{device_id}/timeline"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://fleet-api.flatpeak.com/devices/{device_id}/timeline")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://fleet-api.flatpeak.com/devices/{device_id}/timeline")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "dispatch_timeline",
"device_id": "dev_63a6087272941ef077a8fd3e",
"live_mode": true,
"timezone": "America/Los_Angeles",
"data": [
{
"time_created": null,
"time_fetched": "2026-08-04T19:31:08Z",
"time_confirmed": "2026-08-04T19:31:40Z",
"origin": "OPERATOR",
"energy_source": "BATTERY",
"start_time": "2026-08-04T20:00:00Z",
"end_time": "2026-08-04T20:30:00Z",
"energy_kwh": -2.15,
"confidence": 1
},
{
"time_created": null,
"time_fetched": "2026-08-04T19:31:08Z",
"time_confirmed": "2026-08-04T19:31:40Z",
"origin": "OPERATOR",
"energy_source": "BATTERY",
"start_time": "2026-08-04T20:30:00Z",
"end_time": "2026-08-04T21:00:00Z",
"energy_kwh": -2.15,
"confidence": 1
},
{
"time_created": null,
"time_fetched": null,
"time_confirmed": null,
"origin": "OEM",
"energy_source": "GRID",
"start_time": "2026-08-04T21:00:00Z",
"end_time": "2026-08-04T21:30:00Z",
"energy_kwh": 1.2,
"confidence": 0.8
}
],
"oem_id": "oem_6a3a8dada72cd0a249ff9528"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}Authorizations
Authenticate with the bearer_token obtained from the authentication endpoint.
Query Parameters
Response
Dispatch timeline response.
Net flows at the device connection point over the window. Future intervals are forecast from instructions, confirmations and telemetry; past ones derive from meter records, confidence 1 where metered. Intervals are contiguous.
Was this page helpful?

