Customer API - Cloud Access
With the Customer API you retrieve the values of your systems via the internet, without access to your home network. You log in with the same credentials as in the portal and receive current values or historical data in JSON format.
This page is intended for developers and technically experienced users. You do not need the API for normal use of your SOLIO.
What do I need this for?
- Your own analyses: collect historical data regularly and evaluate it in Excel, a database or a dashboard.
- Connecting other services: use current values such as the state of charge or grid purchase in your own applications.
- Several systems: query the values of all systems your account has access to.
The Customer API is read-only. Your system cannot be controlled through it. For access within your own network there are also the local interfaces REST/JSON and Modbus/TCP.
At a glance
| Base address | https://api.soltegra.io |
| Login | HTTP Basic Authentication with your portal credentials (e-mail address and password) |
| Method | GET only |
| Response format | JSON |
Access via the Customer API is enabled per system. If a system is missing from the list or you receive error 403, please contact SOLTEGRA.
Quick start
curl https://api.soltegra.io/health responds with OK. No login is required for this.
curl -u "you@example.com:password" https://api.soltegra.io/edges returns all systems you have access to, with their identifier (id).
Use the identifier to query current values, for example /edges/YOUR-SYSTEM/live?channels=_sum/EssSoc,_sum/GridActivePower.
The endpoints
| Endpoint | Returns |
|---|---|
GET / | Overview of the endpoints and the limits currently in force |
GET /edges | All systems you have access to |
GET /edges/{id}/channels | All values available for a system |
GET /edges/{id}/live?channels=… | Current values |
GET /edges/{id}/history?channels=…&from=…&to=… | Historical data for a period |
GET /health | Availability of the API, without login |
Querying your systems
GET /edges returns all systems you have access to.
curl -u "you@example.com:password" https://api.soltegra.io/edges
{
"count": 1,
"edges": [
{
"id": "edge0",
"comment": "My home",
"producttype": "SOLTEGRA SEMS",
"version": "2026.10.1",
"online": true,
"role": "OWNER"
}
]
}
| Field | Meaning |
|---|---|
id | Identifier of the system, needed for all further queries |
comment | Name of the system |
producttype | Product type |
version | Installed software version |
online | true if the system is currently connected |
role | Your role for this system, e.g. OWNER or GUEST |
Available values
GET /edges/{id}/channels returns the addresses of all values the system last transmitted. The system must be online for this.
{
"edgeId": "edge0",
"online": true,
"count": 156,
"channels": ["_sum/EssActivePower", "_sum/EssSoc", "_sum/GridActivePower"]
}
Current values
GET /edges/{id}/live with the parameter channels: a comma-separated list of values.
curl -u "you@example.com:password" \
"https://api.soltegra.io/edges/edge0/live?channels=_sum/EssSoc,_sum/GridActivePower,_sum/ProductionActivePower"
{
"edgeId": "edge0",
"online": true,
"timestamp": "2026-10-15T14:30:00+02:00",
"data": {
"_sum/EssSoc": 75,
"_sum/GridActivePower": -1500,
"_sum/ProductionActivePower": 3200
}
}
Historical data
GET /edges/{id}/history with these parameters:
| Parameter | Meaning |
|---|---|
channels | Comma-separated list of values (required) |
from | Start in ISO 8601 format, e.g. 2026-10-14T00:00:00+02:00 (required) |
to | End in ISO 8601 format, not in the future (required) |
resolution | Interval between values in seconds, 60 to 86400 (optional) |
curl -u "you@example.com:password" \
"https://api.soltegra.io/edges/edge0/history?channels=_sum/EssSoc,_sum/GridActivePower&from=2026-10-14T00:00:00%2B02:00&to=2026-10-14T23:59:59%2B02:00"
The + in the time zone must be written as %2B in the address.
{
"edgeId": "edge0",
"from": "2026-10-14T00:00:00+02:00",
"to": "2026-10-14T23:59:59+02:00",
"resolution": 900,
"dataPoints": 96,
"data": [
{ "timestamp": "2026-10-14T00:00:00+02:00", "_sum/EssSoc": 80, "_sum/GridActivePower": 500 },
{ "timestamp": "2026-10-14T00:15:00+02:00", "_sum/EssSoc": 78, "_sum/GridActivePower": 450 }
]
}
If you do not specify a resolution, the API chooses the interval itself:
| Period | Interval between values |
|---|---|
| up to 1 hour | 1 minute |
| up to 6 hours | 5 minutes |
| up to 1 day | 15 minutes |
| up to 1 week | 1 hour |
| longer | 4 hours |
Important values
| Address | Description | Unit |
|---|---|---|
_sum/EssSoc | Battery state of charge | % |
_sum/EssActivePower | Battery power, positive = discharging, negative = charging | W |
_sum/GridActivePower | Grid power, positive = purchase, negative = feed-in | W |
_sum/ProductionActivePower | Generation | W |
_sum/ConsumptionActivePower | Consumption | W |
_sum/EssActiveChargeEnergy | Meter reading battery charge | Wh |
_sum/EssActiveDischargeEnergy | Meter reading battery discharge | Wh |
_sum/GridBuyActiveEnergy | Meter reading grid purchase | Wh |
_sum/GridSellActiveEnergy | Meter reading grid feed-in | Wh |
_sum/ProductionActiveEnergy | Meter reading generation | Wh |
_sum/ConsumptionActiveEnergy | Meter reading consumption | Wh |
All other available values are returned by /edges/{id}/channels.
Limits and security
The API protects itself against overload with limits. GET / returns the values currently in force. By default:
| Limit | Default |
|---|---|
| Requests per minute and user | 30 |
| Values per request | 50 |
| Longest period for historical data | 31 days |
| Data points per response | 10,000 |
After several failed logins in a row (five by default), the requesting IP address is blocked for a few minutes.
The API uses your portal credentials. Do not store your password in plain text in scripts; use an environment variable instead, for example, and do not share scripts that contain credentials.
Error messages
Errors are also returned as JSON:
{ "error": true, "status": 401, "message": "Authentication failed" }
| Code | Meaning |
|---|---|
400 | Invalid request, for example missing parameters or a period that is too long |
401 | Login failed |
403 | No access to this system, system not enabled or IP temporarily blocked |
404 | Endpoint not found |
405 | Only GET is allowed |
429 | Too many requests, wait a moment |
500 | Internal error |
503 | Service temporarily unavailable, try again later |
Example with Python
import os
import requests
API = "https://api.soltegra.io"
AUTH = (os.environ["SOLTEGRA_USER"], os.environ["SOLTEGRA_PASSWORD"])
edges = requests.get(f"{API}/edges", auth=AUTH, timeout=30).json()
for edge in edges["edges"]:
if not edge["online"]:
print(edge["comment"], "is offline")
continue
live = requests.get(
f"{API}/edges/{edge['id']}/live",
params={"channels": "_sum/EssSoc,_sum/GridActivePower"},
auth=AUTH,
timeout=30,
).json()
soc = live["data"].get("_sum/EssSoc")
grid = live["data"].get("_sum/GridActivePower", 0)
print(f"{edge['comment']}: state of charge {soc} %, grid {grid} W")
The requests library encodes the parameters automatically, including the + in time values.
Frequently asked questions
I do not receive any values for a channel.
Check the spelling; upper and lower case matter. /edges/{id}/channels shows which values exist. If the system is offline, there are no current values.
How do I get data for more than 31 days? Split the period into several queries and combine the results.
Can I open the data in Excel?
Yes. Convert the JSON response into a CSV file, for example with Python and pandas, and open it in Excel.