API reference
Power & energy limits
Active and historic power and energy limits for an asset, plus its curtailment data.
GET/v1/assets/{asset_id}/curtailment
Get asset curtailment data
asset.read
Retrieve curtailment data for a specific asset.
Returns curtailment intervals overlapping the requested time window. Time filtering uses half-open window semantics: [start_time, end_time).
Boundary behavior:
- A curtailment ending exactly at
start_timeis excluded. - A curtailment starting exactly at
end_timeis excluded. - Ongoing curtailments with
end_time=nullare included whenever they remain active afterstart_time.
Query Parameters:
start_time: Return intervals whose end_time is absent or strictly after this timestamp (optional)end_time: Return intervals whose start_time is strictly before this timestamp (optional)sort_by: Field to sort by —start_timeorend_time(default:start_time)sort_order:ascordesc(default:asc)
Power values are in MW. The start_time filter can go back up to 30 days.
Path parameters
- asset_idREQUIRED
- stringThe ID of the asset
Query parameters
- sort_by
- enum
start_timeend_timeField to sort the results by - sort_order
- enum
ascdescOrder to sort the results by, either 'asc' or 'desc' - start_time
- string<date-time>Return curtailment intervals whose end_time is absent or strictly after this timestamp. With end_time, the API matches intervals overlapping the half-open window [start_time, end_time).
- end_time
- string<date-time>Return curtailment intervals whose start_time is strictly before this timestamp. With start_time, the API matches intervals overlapping the half-open window [start_time, end_time).
curl "https://api.ebx.energy/v1/assets/DE_BESS_01/curtailment" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/assets/DE_BESS_01/curtailment",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/curtailment", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"curtailments": [
{
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2025-01-02T18:00:00Z",
"max_curtailment": 100,
"min_curtailment": 0
}
]
}- 401no valid token
- 403scope missing
- 404unknown or not visible
- 422validation failed
- 429rate limited
GET/v1/assets/{asset_id}/energy_limits
Get Energy Limits
asset.read
List energy limit intervals for an asset.
Time filtering is overlap-based and uses half-open window semantics. With both start_time and end_time, the endpoint returns intervals that overlap [start_time, end_time).
Boundary behavior:
- a limit ending exactly at
start_timeis excluded - a limit starting exactly at
end_timeis excluded - open-ended limits are included whenever they remain active after
start_time
Path parameters
- asset_idREQUIRED
- string
Query parameters
- sort_by
- enum
start_timeend_timeDeprecated and ignored; results are always ordered by start_time. - sort_order
- enum
ascdescOrder to sort the results by, either 'asc' or 'desc' - start_time
- string<date-time>Return energy limit intervals whose end_time is absent or strictly after this timestamp. With end_time, the API matches intervals overlapping the half-open window [start_time, end_time).
- end_time
- string<date-time>Return energy limit intervals whose start_time is strictly before this timestamp. With start_time, the API matches intervals overlapping the half-open window [start_time, end_time).
curl "https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"limits": [
{
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2026-09-10T13:30:00Z",
"upper_limit_mwh": 0,
"lower_limit_mwh": 0,
"reason": "maintenance",
"reason_description": "<string>"
}
]
}- 401no valid token
- 403scope missing
- 404unknown or not visible
- 422validation failed
- 429rate limited
POST/v1/assets/{asset_id}/energy_limits
Set Energy Limits
asset.writerestrictions.write_direct
Create a new energy limit interval for an asset.
Path parameters
- asset_idREQUIRED
- string
Request body · required
- start_time
- string<date-time>Start time of the energy limit interval in UTC ISO 8601 format
- end_time
- string<date-time>Optional end time of the energy limit interval in UTC ISO 8601 format
- upper_limit_mwh
- numberUpper energy limit in MWh. At least one of upper_limit_mwh or lower_limit_mwh must be provided. If lower_limit_mwh is omitted, zero is used.
- lower_limit_mwh
- numberLower energy limit in MWh. At least one of upper_limit_mwh or lower_limit_mwh must be provided. If upper_limit_mwh is omitted, the asset's usable energy capacity is used.
- reasonREQUIRED
- enum
maintenancefaultgrid_eventcommercialotherReason a restriction (unavailability, power limit, energy limit) is being requested. - reason_description
- stringOptional free-text description of the energy limit reason
curl -X POST "https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"start_time":"2026-09-10T13:30:00Z","end_time":"2026-09-10T13:30:00Z","upper_limit_mwh":250,"lower_limit_mwh":25,"reason":"maintenance","reason_description":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits",
headers={"Authorization": f"Bearer {token}"},
json={
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2026-09-10T13:30:00Z",
"upper_limit_mwh": 250,
"lower_limit_mwh": 25,
"reason": "maintenance",
"reason_description": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"start_time":"2026-09-10T13:30:00Z","end_time":"2026-09-10T13:30:00Z","upper_limit_mwh":250,"lower_limit_mwh":25,"reason":"maintenance","reason_description":"<string>"}),
});
const data = await res.json();{
"limits": [
{
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2026-09-10T13:30:00Z",
"upper_limit_mwh": 0,
"lower_limit_mwh": 0,
"reason": "maintenance",
"reason_description": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/assets/{asset_id}/energy_limits
Shorten Energy Limit
asset.writerestrictions.write_direct
Shorten or immediately end an existing energy limit interval.
Path parameters
- asset_idREQUIRED
- string
Query parameters
- start_timeREQUIRED
- string<date-time>Exact start_time of the interval to modify
- end_time
- string<date-time>Deprecated and ignored; intervals are identified by start_time alone.
Request body · required
- new_end_time
- string<date-time>Scheduled replacement end_time in UTC; mutually exclusive with end_now=true
- end_now
- booleandefault falseEnd a started interval at server time, without the scheduled-shortening lead time. Safe to retry.
curl -X PATCH "https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits?start_time=2025-01-03T10:00:00Z" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"new_end_time":"2025-01-01T18:15:00Z","end_now":false}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits?start_time=2025-01-03T10:00:00Z",
headers={"Authorization": f"Bearer {token}"},
json={
"new_end_time": "2025-01-01T18:15:00Z",
"end_now": False,
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits?start_time=2025-01-03T10:00:00Z", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"new_end_time":"2025-01-01T18:15:00Z","end_now":false}),
});
const data = await res.json();{
"limits": [
{
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2026-09-10T13:30:00Z",
"upper_limit_mwh": 0,
"lower_limit_mwh": 0,
"reason": "maintenance",
"reason_description": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
DELETE/v1/assets/{asset_id}/energy_limits
Delete Energy Limit
asset.writerestrictions.write_direct
Delete an exact future energy limit interval.
Path parameters
- asset_idREQUIRED
- string
Query parameters
- start_timeREQUIRED
- string<date-time>Exact start_time of the interval to modify
- end_time
- string<date-time>Deprecated and ignored; intervals are identified by start_time alone.
curl -X DELETE "https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits?start_time=2025-01-03T10:00:00Z" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.delete(
"https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits?start_time=2025-01-03T10:00:00Z",
headers={"Authorization": f"Bearer {token}"},
)
print(r.status_code)const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits?start_time=2025-01-03T10:00:00Z", {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
},
});Returns 204 with no body.
- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/assets/{asset_id}/energy_limits/active
Get Active Energy Limits
asset.read
Get the active energy limit interval for an asset.
Path parameters
- asset_idREQUIRED
- string
curl "https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits/active" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits/active",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/energy_limits/active", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"limits": [
{
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2026-09-10T13:30:00Z",
"upper_limit_mwh": 0,
"lower_limit_mwh": 0,
"reason": "maintenance",
"reason_description": "<string>"
}
]
}GET/v1/assets/{asset_id}/power_limits
Get Power Limits
asset.read
List power limit intervals for an asset.
Time filtering is overlap-based and uses half-open window semantics. With both start_time and end_time, the endpoint returns intervals that overlap [start_time, end_time).
Boundary behavior:
- a limit ending exactly at
start_timeis excluded - a limit starting exactly at
end_timeis excluded - open-ended limits are included whenever they remain active after
start_time
Path parameters
- asset_idREQUIRED
- string
Query parameters
- sort_by
- enum
start_timeend_timeDeprecated and ignored; results are always ordered by start_time. - sort_order
- enum
ascdescOrder to sort the results by, either 'asc' or 'desc' - start_time
- string<date-time>Return power limit intervals whose end_time is absent or strictly after this timestamp. With end_time, the API matches intervals overlapping the half-open window [start_time, end_time).
- end_time
- string<date-time>Return power limit intervals whose start_time is strictly before this timestamp. With start_time, the API matches intervals overlapping the half-open window [start_time, end_time).
curl "https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"limits": [
{
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2026-09-10T13:30:00Z",
"upper_limit_mw": 0,
"lower_limit_mw": 0,
"reason": "maintenance",
"reason_description": "<string>"
}
]
}- 401no valid token
- 403scope missing
- 404unknown or not visible
- 422validation failed
- 429rate limited
POST/v1/assets/{asset_id}/power_limits
Set Power Limits
asset.writerestrictions.write_direct
Create a new power limit interval for an asset.
Path parameters
- asset_idREQUIRED
- string
Request body · required
- start_time
- string<date-time>Start time of the power limit interval in UTC ISO 8601 format
- end_time
- string<date-time>Optional end time of the power limit interval in UTC ISO 8601 format
- upper_limit_mw
- numberUpper power limit in MW. At least one of upper_limit_mw or lower_limit_mw must be provided. If lower_limit_mw is omitted, the asset's negative usable power capacity is used.
- lower_limit_mw
- numberLower power limit in MW. At least one of upper_limit_mw or lower_limit_mw must be provided. If upper_limit_mw is omitted, the asset's usable power capacity is used.
- reasonREQUIRED
- enum
maintenancefaultgrid_eventcommercialotherReason a restriction (unavailability, power limit, energy limit) is being requested. - reason_description
- stringOptional free-text description of the power limit reason
curl -X POST "https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"start_time":"2026-09-10T13:30:00Z","end_time":"2026-09-10T13:30:00Z","upper_limit_mw":50.5,"lower_limit_mw":-5.7,"reason":"maintenance","reason_description":"<string>"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits",
headers={"Authorization": f"Bearer {token}"},
json={
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2026-09-10T13:30:00Z",
"upper_limit_mw": 50.5,
"lower_limit_mw": -5.7,
"reason": "maintenance",
"reason_description": "<string>",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"start_time":"2026-09-10T13:30:00Z","end_time":"2026-09-10T13:30:00Z","upper_limit_mw":50.5,"lower_limit_mw":-5.7,"reason":"maintenance","reason_description":"<string>"}),
});
const data = await res.json();{
"limits": [
{
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2026-09-10T13:30:00Z",
"upper_limit_mw": 0,
"lower_limit_mw": 0,
"reason": "maintenance",
"reason_description": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
PATCH/v1/assets/{asset_id}/power_limits
Shorten Power Limit
asset.writerestrictions.write_direct
Shorten or immediately end an existing power limit interval.
Path parameters
- asset_idREQUIRED
- string
Query parameters
- start_timeREQUIRED
- string<date-time>Exact start_time of the interval to modify
- end_time
- string<date-time>Deprecated and ignored; intervals are identified by start_time alone.
Request body · required
- new_end_time
- string<date-time>Scheduled replacement end_time in UTC; mutually exclusive with end_now=true
- end_now
- booleandefault falseEnd a started interval at server time, without the scheduled-shortening lead time. Safe to retry.
curl -X PATCH "https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits?start_time=2025-01-03T10:00:00Z" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"new_end_time":"2025-01-01T18:15:00Z","end_now":false}'import httpx
r = httpx.patch(
"https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits?start_time=2025-01-03T10:00:00Z",
headers={"Authorization": f"Bearer {token}"},
json={
"new_end_time": "2025-01-01T18:15:00Z",
"end_now": False,
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits?start_time=2025-01-03T10:00:00Z", {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"new_end_time":"2025-01-01T18:15:00Z","end_now":false}),
});
const data = await res.json();{
"limits": [
{
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2026-09-10T13:30:00Z",
"upper_limit_mw": 0,
"lower_limit_mw": 0,
"reason": "maintenance",
"reason_description": "<string>"
}
]
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
DELETE/v1/assets/{asset_id}/power_limits
Delete Power Limit
asset.writerestrictions.write_direct
Delete an exact future power limit interval.
Path parameters
- asset_idREQUIRED
- string
Query parameters
- start_timeREQUIRED
- string<date-time>Exact start_time of the interval to modify
- end_time
- string<date-time>Deprecated and ignored; intervals are identified by start_time alone.
curl -X DELETE "https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits?start_time=2025-01-03T10:00:00Z" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.delete(
"https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits?start_time=2025-01-03T10:00:00Z",
headers={"Authorization": f"Bearer {token}"},
)
print(r.status_code)const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits?start_time=2025-01-03T10:00:00Z", {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
},
});Returns 204 with no body.
- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/assets/{asset_id}/power_limits/active
Get Active Power Limits
asset.read
Get the active power limit interval for an asset.
Path parameters
- asset_idREQUIRED
- string
curl "https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits/active" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits/active",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01/power_limits/active", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"limits": [
{
"start_time": "2026-09-10T13:30:00Z",
"end_time": "2026-09-10T13:30:00Z",
"upper_limit_mw": 0,
"lower_limit_mw": 0,
"reason": "maintenance",
"reason_description": "<string>"
}
]
}