Get site details
curl --request GET \
--url https://cloud.heat-solutions.com/api/v1/public/sites/{siteId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://cloud.heat-solutions.com/api/v1/public/sites/{siteId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://cloud.heat-solutions.com/api/v1/public/sites/{siteId}', 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://cloud.heat-solutions.com/api/v1/public/sites/{siteId}",
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://cloud.heat-solutions.com/api/v1/public/sites/{siteId}"
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://cloud.heat-solutions.com/api/v1/public/sites/{siteId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://cloud.heat-solutions.com/api/v1/public/sites/{siteId}")
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{
"siteId": "123e4567-e89b-12d3-a456-426614174000",
"siteName": "Site 1",
"isOnline": true,
"reportedAt": "2025-06-01T08:00:00Z",
"schedules": [
{
"asset": "grid",
"type": "upperLimitkW",
"entries": [
{
"startAt": "2026-06-01T08:00:00Z",
"endAt": "2026-06-01T10:00:00Z",
"value": 50
}
]
},
{
"asset": "grid",
"type": "lowerLimitkW",
"entries": [
{
"startAt": "2026-06-01T08:00:00Z",
"endAt": "2026-06-01T10:00:00Z",
"value": -20
}
]
},
{
"asset": "grid",
"type": "activePowerkW",
"entries": [
{
"startAt": "2026-06-01T10:00:00Z",
"endAt": "2026-06-01T12:00:00Z",
"value": 30
}
]
},
{
"asset": "bess",
"type": "activePowerkW",
"entries": [
{
"startAt": "2026-06-01T08:00:00Z",
"endAt": "2026-06-01T10:00:00Z",
"value": -50
}
]
},
{
"asset": "bess",
"type": "optimalSocPcnt",
"entries": [
{
"startAt": "2026-06-01T10:00:00Z",
"endAt": "2026-06-01T12:00:00Z",
"value": 80
}
]
},
{
"asset": "solar",
"type": "solarCurtailmentPcnt",
"entries": [
{
"startAt": "2026-06-01T08:00:00Z",
"endAt": "2026-06-01T12:00:00Z",
"value": 10
}
]
}
],
"assets": {
"grid": {
"id": "0-grid",
"type": "grid",
"ratedPowerUpperLimitkW": 500,
"ratedPowerLowerLimitkW": -500,
"activePowerkW": 120
},
"solar": {
"id": "0-solar",
"type": "solar",
"ratedPowerUpperLimitkW": 200,
"ratedPowerLowerLimitkW": 0,
"activePowerkW": 150
},
"bess": {
"id": "0-bess",
"type": "bess",
"ratedPowerUpperLimitkW": 100,
"ratedPowerLowerLimitkW": -100,
"activePowerkW": 30,
"availableStorageCapacitykWh": 500,
"soc": 75
},
"ev": {
"id": "0-ev",
"type": "ev",
"ratedPowerUpperLimitkW": 50,
"ratedPowerLowerLimitkW": 0,
"activePowerkW": 22
},
"heatpump": {
"id": "0-heatpump",
"type": "heatpump",
"ratedPowerUpperLimitkW": 20,
"ratedPowerLowerLimitkW": 0,
"activePowerkW": 10
},
"genset": {
"id": "0-genset",
"type": "genset",
"ratedPowerUpperLimitkW": 300,
"ratedPowerLowerLimitkW": 0,
"activePowerkW": 0
},
"load": {
"id": "0-load",
"type": "load",
"ratedPowerUpperLimitkW": 400,
"ratedPowerLowerLimitkW": 0,
"activePowerkW": 250
}
}
}{
"error": "not_found",
"message": "Site not found"
}{
"error": "internal_server_error",
"message": "An unexpected error occurred"
}Get all availabe details for a given site.
GET
/
api
/
v1
/
public
/
sites
/
{siteId}
Get site details
curl --request GET \
--url https://cloud.heat-solutions.com/api/v1/public/sites/{siteId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://cloud.heat-solutions.com/api/v1/public/sites/{siteId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://cloud.heat-solutions.com/api/v1/public/sites/{siteId}', 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://cloud.heat-solutions.com/api/v1/public/sites/{siteId}",
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://cloud.heat-solutions.com/api/v1/public/sites/{siteId}"
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://cloud.heat-solutions.com/api/v1/public/sites/{siteId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://cloud.heat-solutions.com/api/v1/public/sites/{siteId}")
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{
"siteId": "123e4567-e89b-12d3-a456-426614174000",
"siteName": "Site 1",
"isOnline": true,
"reportedAt": "2025-06-01T08:00:00Z",
"schedules": [
{
"asset": "grid",
"type": "upperLimitkW",
"entries": [
{
"startAt": "2026-06-01T08:00:00Z",
"endAt": "2026-06-01T10:00:00Z",
"value": 50
}
]
},
{
"asset": "grid",
"type": "lowerLimitkW",
"entries": [
{
"startAt": "2026-06-01T08:00:00Z",
"endAt": "2026-06-01T10:00:00Z",
"value": -20
}
]
},
{
"asset": "grid",
"type": "activePowerkW",
"entries": [
{
"startAt": "2026-06-01T10:00:00Z",
"endAt": "2026-06-01T12:00:00Z",
"value": 30
}
]
},
{
"asset": "bess",
"type": "activePowerkW",
"entries": [
{
"startAt": "2026-06-01T08:00:00Z",
"endAt": "2026-06-01T10:00:00Z",
"value": -50
}
]
},
{
"asset": "bess",
"type": "optimalSocPcnt",
"entries": [
{
"startAt": "2026-06-01T10:00:00Z",
"endAt": "2026-06-01T12:00:00Z",
"value": 80
}
]
},
{
"asset": "solar",
"type": "solarCurtailmentPcnt",
"entries": [
{
"startAt": "2026-06-01T08:00:00Z",
"endAt": "2026-06-01T12:00:00Z",
"value": 10
}
]
}
],
"assets": {
"grid": {
"id": "0-grid",
"type": "grid",
"ratedPowerUpperLimitkW": 500,
"ratedPowerLowerLimitkW": -500,
"activePowerkW": 120
},
"solar": {
"id": "0-solar",
"type": "solar",
"ratedPowerUpperLimitkW": 200,
"ratedPowerLowerLimitkW": 0,
"activePowerkW": 150
},
"bess": {
"id": "0-bess",
"type": "bess",
"ratedPowerUpperLimitkW": 100,
"ratedPowerLowerLimitkW": -100,
"activePowerkW": 30,
"availableStorageCapacitykWh": 500,
"soc": 75
},
"ev": {
"id": "0-ev",
"type": "ev",
"ratedPowerUpperLimitkW": 50,
"ratedPowerLowerLimitkW": 0,
"activePowerkW": 22
},
"heatpump": {
"id": "0-heatpump",
"type": "heatpump",
"ratedPowerUpperLimitkW": 20,
"ratedPowerLowerLimitkW": 0,
"activePowerkW": 10
},
"genset": {
"id": "0-genset",
"type": "genset",
"ratedPowerUpperLimitkW": 300,
"ratedPowerLowerLimitkW": 0,
"activePowerkW": 0
},
"load": {
"id": "0-load",
"type": "load",
"ratedPowerUpperLimitkW": 400,
"ratedPowerLowerLimitkW": 0,
"activePowerkW": 250
}
}
}{
"error": "not_found",
"message": "Site not found"
}{
"error": "internal_server_error",
"message": "An unexpected error occurred"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
UUID of the site to retrieve
Response
Default Response
Unique site identifier in UUID format
Human-readable name of the site
Connectivity status
List of schedules currently active on site
Show child attributes
Show child attributes
Timestamp of the last healthcheck received from the controller, or null if it has never reported
Show child attributes
Show child attributes