curl --request GET \
--url https://api.nox.energy/v1/devices/battery \
--header 'x-api-key: <api-key>'import requests
url = "https://api.nox.energy/v1/devices/battery"
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://api.nox.energy/v1/devices/battery', 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://api.nox.energy/v1/devices/battery",
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://api.nox.energy/v1/devices/battery"
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://api.nox.energy/v1/devices/battery")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nox.energy/v1/devices/battery")
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{
"data": [
{
"device_id": "e4da3b7f-bbce-4a45-9d2b-1c0e8f7a6b5c",
"user_id": "1234",
"brand": "Huawei",
"model": "LUNA2000-10-S0",
"country": "BE",
"capacity_kwh": 10,
"max_charge_power_kw": 5,
"max_discharge_power_kw": 5,
"min_soc_pct": 20,
"steerable_status": {
"steering_enabled": true,
"steerable": true,
"learning_period_ended": true
},
"allowed_modes": [
"auto",
"pause_charge",
"pause_discharge",
"force_charge",
"force_discharge"
],
"needs_reauthentication": false,
"first_connection_at": "2026-09-01T08:12:00Z"
}
],
"meta": {
"energy_supplier": "Energy Supplier A"
}
}{
"detail": "Energy Supplier A is not authorized to access this feature."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "This endpoint is not available yet."
}Get Devices Battery
Preview: not available yet. This endpoint is documented ahead of its release and currently
answers 501 Not Implemented. Its contract may still change before release.
Get information about all NOX-connected batteries associated with your energy supplier account.
-
allowed_modeslists the battery modes the battery accepts in a schedule. They depend on the battery model and on the other devices in its household. -
min_soc_pctis the lower limit forforce_discharge: below it, NOX Energy takes control and puts the battery in the default modeauto. It does not limitautoitself, where the battery may keep covering the house load. It is fixed at 20 % for now. -
The optimization settings of a battery are available with
GET /v1/devices/battery/settings.
The battery modes:
-
auto(default): the battery follows its own logic. Pv surplus charges the battery, the battery covers the house load, the grid covers the rest. The battery returns toautooutside your schedules and whenever NOX Energy takes over. -
pause_charge: the battery does not charge. Pv surplus is exported, the battery can still discharge. -
pause_discharge: the battery does not discharge. The grid covers the house load, pv surplus can still charge the battery. -
force_charge: the battery charges at its fixed charge power, from pv first and from the grid for the rest. -
force_discharge: the battery discharges at its fixed discharge power, to the house first and to the grid for the rest. Only while the state of charge is abovemin_soc_pct: when it reaches that limit, NOX Energy takes control and puts the battery inautofor the rest of the entry.
If you want to know the response structure or possible enum values, like steerable reasons,
you can check it in the response model schema.
curl --request GET \
--url https://api.nox.energy/v1/devices/battery \
--header 'x-api-key: <api-key>'import requests
url = "https://api.nox.energy/v1/devices/battery"
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://api.nox.energy/v1/devices/battery', 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://api.nox.energy/v1/devices/battery",
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://api.nox.energy/v1/devices/battery"
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://api.nox.energy/v1/devices/battery")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nox.energy/v1/devices/battery")
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{
"data": [
{
"device_id": "e4da3b7f-bbce-4a45-9d2b-1c0e8f7a6b5c",
"user_id": "1234",
"brand": "Huawei",
"model": "LUNA2000-10-S0",
"country": "BE",
"capacity_kwh": 10,
"max_charge_power_kw": 5,
"max_discharge_power_kw": 5,
"min_soc_pct": 20,
"steerable_status": {
"steering_enabled": true,
"steerable": true,
"learning_period_ended": true
},
"allowed_modes": [
"auto",
"pause_charge",
"pause_discharge",
"force_charge",
"force_discharge"
],
"needs_reauthentication": false,
"first_connection_at": "2026-09-01T08:12:00Z"
}
],
"meta": {
"energy_supplier": "Energy Supplier A"
}
}{
"detail": "Energy Supplier A is not authorized to access this feature."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "This endpoint is not available yet."
}Authorizations
API Key authentication. Enter your API key in the format: YOUR_API_KEY
Query Parameters
The maximum number of items to return per page of results.
This should be used together with the next_token parameter to paginate through results.
Read the pagination parameter documentation for more details.
1 <= x <= 1000The next_token is a token used to retrieve the next page of results when there are more results
than can fit in a single page(=API response).
By default, the API will return a next_token of the first page if no token was given as a parameter.
If the token is null you have reached the end of the results.
This should be used together with the limit parameter to paginate through results.
To get all results of your call, you can keep calling the same API call with the previously returned next_token until it returns null.
The ID of the device to filter on. If not provided, all devices are returned.
Your own ID of the user to filter on: the ID you use internally for this user, whether you are an energy supplier, an OEM or another partner. If not provided, all users are returned.