API reference
Assets
The assets your token can see. Assets with an active virtual segmentation are followed by their virtual assets.
GET/v1/assets
List Assets
asset.read
List assets visible to the caller.
ebx admins get all assets across all organisations; other users are scoped to their own organisation(s). Assets with an active virtual segmentation are followed by their synthesized virtual assets.
This endpoint takes no parameters.
curl "https://api.ebx.energy/v1/assets" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/assets",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"assets": [
{
"asset_id": "<string>",
"asset_name": "<string>",
"asset_type": "standalone",
"description": "<string>",
"location": "<string>",
"organisation_id": "<string>",
"optimizer_org_id": "<string>",
"optimizer_org_name": "<string>",
"charge_efficiency": 0,
"discharge_efficiency": 0,
"country": "<string>",
"tso": "<string>",
"max_pos_ramp_rate_mw_per_sec": 0,
"min_neg_ramp_rate_mw_per_sec": 0,
"usable_energy_capacity_mwh": 0,
"usable_power_capacity_mw": 0,
"afrr_prequalified_capacity_pos_mw": 0,
"afrr_prequalified_capacity_neg_mw": 0,
"fcr_prequalified_capacity_mw": 0,
"tso_pool_id": 0,
"ioa_middle": 0,
"latitude": 0,
"longitude": 0,
"disable_pq_capacity_check": false,
"strict_validation": false,
"tso_connected": true,
"fcr_enabled": false,
"afrr_enabled": false,
"wholesale_enabled": false,
"control_enabled": false,
"pv_active": false,
"grid_connection_power_mw": 0,
"bess_priority": false,
"poc_export_limit_mw": 0,
"grid_import_zero": false,
"grid_import_allowed": true,
"bess_control_enabled": false,
"pv_control_enabled": false,
"asset_operational_status": "onboarding",
"operational_status_reason": "<string>",
"maintenance_until": "2026-09-10T13:30:00Z",
"asset_integration_type": "full_control",
"production_critical": false,
"is_virtual": false,
"parent_asset_id": "<string>"
}
]
}POST/v1/assets
Create Asset
asset.write
Create a new asset (organisation_id required in request body).
Request body · required
- asset_idREQUIRED
- stringUnique identifier for the asset
- asset_nameREQUIRED
- stringName of the asset
- asset_typeREQUIRED
- enum
standalonegreen_colocationgrey_colocation - description
- stringDescription of the asset
- locationREQUIRED
- stringLocation of the asset
- organisation_id
- stringOrganisation ID the asset belongs to
- optimizer_org_id
- stringOrganization that optimizes/trades this asset; must be a registered organization
- charge_efficiency
- numberCharge efficiency of the asset
- discharge_efficiency
- numberDischarge efficiency of the asset
- country
- stringCountry where the asset is located
- tso
- stringTransmission System Operator for the asset
- max_pos_ramp_rate_mw_per_sec
- numberMaximum positive ramp rate in MW/s
- min_neg_ramp_rate_mw_per_sec
- numberMinimum negative ramp rate in MW/s (positive value representing the magnitude)
- usable_energy_capacity_mwh
- numberUsable energy capacity in MWh
- usable_power_capacity_mw
- numberUsable power capacity in MW
- afrr_prequalified_capacity_pos_mw
- numberdefault 0Prequalified positive aFRR capacity magnitude in MW
- afrr_prequalified_capacity_neg_mw
- numberdefault 0Prequalified negative aFRR capacity magnitude in MW
- fcr_prequalified_capacity_mw
- numberdefault 0Prequalified symmetric FCR capacity magnitude in MW
- tso_pool_id
- integerExternally assigned TSO pool ID for the asset
- ioa_middle
- integerIEC-104 IOA middle octet identifying the asset within its TSO pool
- latitude
- numberLatitude of the asset location
- longitude
- numberLongitude of the asset location
- disable_pq_capacity_check
- booleandefault falseWhen true, PTU capacity exceeded rejections are ignored for this asset
- strict_validation
- booleandefault falseWhen true, plausibility violations are rejected with 409; when false they are returned in
warnings - tso_connected
- booleandefault trueWhether the asset is connected to the TSO control link
- fcr_enabled
- booleandefault falseWhether the asset is enabled for FCR market participation
- afrr_enabled
- booleandefault falseWhether the asset is enabled for aFRR market participation
- wholesale_enabled
- booleandefault falseWhether the asset is enabled for wholesale market participation
- control_enabled
- booleandefault falseWhether the asset-adapter is allowed to send Modbus write commands
- pv_active
- booleandefault falseWhether the asset has PV (solar) datapoints to read
- grid_connection_power_mw
- numberGrid connection point power limit in MW
- bess_priority
- booleanWhether the BESS has priority over the co-located producer at the grid connection
- poc_export_limit_mw
- numberExport limit at the point of connection in MW; when null, grid_connection_power_mw applies. Not yet active — accepted but not persisted.
- grid_import_zero
- booleanDeprecated: use grid_import_allowed (this is its inverse). Forbids grid import at the point of connection.
- grid_import_allowed
- booleanWhether importing at the point of connection is permitted. False for green co-location. Null leaves it unset (treated as permitted).
- bess_control_enabled
- booleanWhether EBX may command the battery. Null falls back to control_enabled.
- pv_control_enabled
- booleanWhether EBX may command the PV plane. Null is treated as not permitted.
- asset_integration_type
- enum
full_controlmonitoring_only - asset_operational_status
- enum
onboardingonboarding_testinglivemaintenanceoffboarded - operational_status_reason
- stringReason for the current operational lifecycle status
- maintenance_until
- string<date-time>Expected end timestamp for maintenance status
curl -X POST "https://api.ebx.energy/v1/assets" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"asset_id":"<string>","asset_name":"<string>","asset_type":"standalone","description":"<string>","location":"<string>","organisation_id":"<string>","optimizer_org_id":"<string>","charge_efficiency":0,"discharge_efficiency":0,"country":"<string>","tso":"<string>","max_pos_ramp_rate_mw_per_sec":0,"min_neg_ramp_rate_mw_per_sec":0,"usable_energy_capacity_mwh":0,"usable_power_capacity_mw":0,"afrr_prequalified_capacity_pos_mw":0,"afrr_prequalified_capacity_neg_mw":0,"fcr_prequalified_capacity_mw":0,"tso_pool_id":0,"ioa_middle":0,"latitude":0,"longitude":0,"disable_pq_capacity_check":false,"strict_validation":false,"tso_connected":true,"fcr_enabled":false,"afrr_enabled":false,"wholesale_enabled":false,"control_enabled":false,"pv_active":false,"grid_connection_power_mw":0,"bess_priority":false,"poc_export_limit_mw":0,"grid_import_zero":false,"grid_import_allowed":false,"bess_control_enabled":false,"pv_control_enabled":false,"asset_integration_type":"full_control","asset_operational_status":"onboarding","operational_status_reason":"<string>","maintenance_until":"2026-09-10T13:30:00Z"}'import httpx
r = httpx.post(
"https://api.ebx.energy/v1/assets",
headers={"Authorization": f"Bearer {token}"},
json={
"asset_id": "<string>",
"asset_name": "<string>",
"asset_type": "standalone",
"description": "<string>",
"location": "<string>",
"organisation_id": "<string>",
"optimizer_org_id": "<string>",
"charge_efficiency": 0,
"discharge_efficiency": 0,
"country": "<string>",
"tso": "<string>",
"max_pos_ramp_rate_mw_per_sec": 0,
"min_neg_ramp_rate_mw_per_sec": 0,
"usable_energy_capacity_mwh": 0,
"usable_power_capacity_mw": 0,
"afrr_prequalified_capacity_pos_mw": 0,
"afrr_prequalified_capacity_neg_mw": 0,
"fcr_prequalified_capacity_mw": 0,
"tso_pool_id": 0,
"ioa_middle": 0,
"latitude": 0,
"longitude": 0,
"disable_pq_capacity_check": False,
"strict_validation": False,
"tso_connected": True,
"fcr_enabled": False,
"afrr_enabled": False,
"wholesale_enabled": False,
"control_enabled": False,
"pv_active": False,
"grid_connection_power_mw": 0,
"bess_priority": False,
"poc_export_limit_mw": 0,
"grid_import_zero": False,
"grid_import_allowed": False,
"bess_control_enabled": False,
"pv_control_enabled": False,
"asset_integration_type": "full_control",
"asset_operational_status": "onboarding",
"operational_status_reason": "<string>",
"maintenance_until": "2026-09-10T13:30:00Z",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"asset_id":"<string>","asset_name":"<string>","asset_type":"standalone","description":"<string>","location":"<string>","organisation_id":"<string>","optimizer_org_id":"<string>","charge_efficiency":0,"discharge_efficiency":0,"country":"<string>","tso":"<string>","max_pos_ramp_rate_mw_per_sec":0,"min_neg_ramp_rate_mw_per_sec":0,"usable_energy_capacity_mwh":0,"usable_power_capacity_mw":0,"afrr_prequalified_capacity_pos_mw":0,"afrr_prequalified_capacity_neg_mw":0,"fcr_prequalified_capacity_mw":0,"tso_pool_id":0,"ioa_middle":0,"latitude":0,"longitude":0,"disable_pq_capacity_check":false,"strict_validation":false,"tso_connected":true,"fcr_enabled":false,"afrr_enabled":false,"wholesale_enabled":false,"control_enabled":false,"pv_active":false,"grid_connection_power_mw":0,"bess_priority":false,"poc_export_limit_mw":0,"grid_import_zero":false,"grid_import_allowed":false,"bess_control_enabled":false,"pv_control_enabled":false,"asset_integration_type":"full_control","asset_operational_status":"onboarding","operational_status_reason":"<string>","maintenance_until":"2026-09-10T13:30:00Z"}),
});
const data = await res.json();{
"asset_id": "<string>",
"asset_name": "<string>",
"asset_type": "standalone",
"description": "<string>",
"location": "<string>",
"organisation_id": "<string>",
"optimizer_org_id": "<string>",
"optimizer_org_name": "<string>",
"charge_efficiency": 0,
"discharge_efficiency": 0,
"country": "<string>",
"tso": "<string>",
"max_pos_ramp_rate_mw_per_sec": 0,
"min_neg_ramp_rate_mw_per_sec": 0,
"usable_energy_capacity_mwh": 0,
"usable_power_capacity_mw": 0,
"afrr_prequalified_capacity_pos_mw": 0,
"afrr_prequalified_capacity_neg_mw": 0,
"fcr_prequalified_capacity_mw": 0,
"tso_pool_id": 0,
"ioa_middle": 0,
"latitude": 0,
"longitude": 0,
"disable_pq_capacity_check": false,
"strict_validation": false,
"tso_connected": true,
"fcr_enabled": false,
"afrr_enabled": false,
"wholesale_enabled": false,
"control_enabled": false,
"pv_active": false,
"grid_connection_power_mw": 0,
"bess_priority": false,
"poc_export_limit_mw": 0,
"grid_import_zero": false,
"grid_import_allowed": true,
"bess_control_enabled": false,
"pv_control_enabled": false,
"asset_operational_status": "onboarding",
"operational_status_reason": "<string>",
"maintenance_until": "2026-09-10T13:30:00Z",
"asset_integration_type": "full_control",
"production_critical": false,
"is_virtual": false,
"parent_asset_id": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 409state conflict
- 422validation failed
- 429rate limited
GET/v1/assets/{asset_id}
Get Asset
asset.read
Get a specific asset by ID, verifying org access.
Virtual asset ids resolve against their parent's active segmentation.
Path parameters
- asset_idREQUIRED
- string
curl "https://api.ebx.energy/v1/assets/DE_BESS_01" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.get(
"https://api.ebx.energy/v1/assets/DE_BESS_01",
headers={"Authorization": f"Bearer {token}"},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
const data = await res.json();{
"asset_id": "<string>",
"asset_name": "<string>",
"asset_type": "standalone",
"description": "<string>",
"location": "<string>",
"organisation_id": "<string>",
"optimizer_org_id": "<string>",
"optimizer_org_name": "<string>",
"charge_efficiency": 0,
"discharge_efficiency": 0,
"country": "<string>",
"tso": "<string>",
"max_pos_ramp_rate_mw_per_sec": 0,
"min_neg_ramp_rate_mw_per_sec": 0,
"usable_energy_capacity_mwh": 0,
"usable_power_capacity_mw": 0,
"afrr_prequalified_capacity_pos_mw": 0,
"afrr_prequalified_capacity_neg_mw": 0,
"fcr_prequalified_capacity_mw": 0,
"tso_pool_id": 0,
"ioa_middle": 0,
"latitude": 0,
"longitude": 0,
"disable_pq_capacity_check": false,
"strict_validation": false,
"tso_connected": true,
"fcr_enabled": false,
"afrr_enabled": false,
"wholesale_enabled": false,
"control_enabled": false,
"pv_active": false,
"grid_connection_power_mw": 0,
"bess_priority": false,
"poc_export_limit_mw": 0,
"grid_import_zero": false,
"grid_import_allowed": true,
"bess_control_enabled": false,
"pv_control_enabled": false,
"asset_operational_status": "onboarding",
"operational_status_reason": "<string>",
"maintenance_until": "2026-09-10T13:30:00Z",
"asset_integration_type": "full_control",
"production_critical": false,
"is_virtual": false,
"parent_asset_id": "<string>"
}PUT/v1/assets/{asset_id}
Update Asset
asset.write
Partially update an asset.
Only fields present in the request body are changed; omitted fields keep their current values. An explicit null clears nullable fields and is rejected (422) for non-nullable ones.
Path parameters
- asset_idREQUIRED
- string
Request body · required
- asset_name
- stringName of the asset
- asset_type
- enum
standalonegreen_colocationgrey_colocation - description
- stringDescription of the asset
- location
- stringLocation of the asset
- organisation_id
- stringOrganisation ID the asset belongs to (must match the existing value; cannot be cleared)
- optimizer_org_id
- stringOrganization that optimizes/trades this asset; explicit null clears it
- charge_efficiency
- numberCharge efficiency of the asset
- discharge_efficiency
- numberDischarge efficiency of the asset
- country
- stringCountry where the asset is located
- tso
- stringTransmission System Operator for the asset
- max_pos_ramp_rate_mw_per_sec
- numberMaximum positive ramp rate in MW/s
- min_neg_ramp_rate_mw_per_sec
- numberMinimum negative ramp rate in MW/s (positive value representing the magnitude)
- usable_energy_capacity_mwh
- numberUsable energy capacity in MWh
- usable_power_capacity_mw
- numberUsable power capacity in MW
- afrr_prequalified_capacity_pos_mw
- numberPrequalified positive aFRR capacity magnitude in MW
- afrr_prequalified_capacity_neg_mw
- numberPrequalified negative aFRR capacity magnitude in MW
- fcr_prequalified_capacity_mw
- numberPrequalified symmetric FCR capacity magnitude in MW
- tso_pool_id
- integerExternally assigned TSO pool ID for the asset
- ioa_middle
- integerIEC-104 IOA middle octet identifying the asset within its TSO pool
- latitude
- numberLatitude of the asset location
- longitude
- numberLongitude of the asset location
- disable_pq_capacity_check
- booleanWhen true, PTU capacity exceeded rejections are ignored for this asset
- strict_validation
- booleanWhen true, plausibility violations are rejected with 409; when false they are returned in
warnings - tso_connected
- booleanWhether the asset is connected to the TSO control link
- fcr_enabled
- booleanWhether the asset is enabled for FCR market participation
- afrr_enabled
- booleanWhether the asset is enabled for aFRR market participation
- wholesale_enabled
- booleanWhether the asset is enabled for wholesale market participation
- control_enabled
- booleanWhether the asset-adapter is allowed to send Modbus write commands
- pv_active
- booleanWhether the asset has PV (solar) datapoints to read
- grid_connection_power_mw
- numberGrid connection point power limit in MW
- bess_priority
- booleanWhether the BESS has priority over the co-located producer at the grid connection
- poc_export_limit_mw
- numberExport limit at the point of connection in MW; when null, grid_connection_power_mw applies. Not yet active — accepted but not persisted.
- grid_import_zero
- booleanDeprecated: use grid_import_allowed (this is its inverse). Forbids grid import at the point of connection.
- grid_import_allowed
- booleanWhether importing at the point of connection is permitted. False for green co-location.
- bess_control_enabled
- booleanWhether EBX may command the battery. Null falls back to control_enabled.
- pv_control_enabled
- booleanWhether EBX may command the PV plane. Null is treated as not permitted.
- asset_integration_type
- enum
full_controlmonitoring_only - asset_operational_status
- enum
onboardingonboarding_testinglivemaintenanceoffboarded - operational_status_reason
- stringReason for the current operational lifecycle status
- maintenance_until
- string<date-time>Expected end timestamp for maintenance status
curl -X PUT "https://api.ebx.energy/v1/assets/DE_BESS_01" \
-H "Authorization: Bearer $EBX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"asset_name":"<string>","asset_type":"standalone","description":"<string>","location":"<string>","organisation_id":"<string>","optimizer_org_id":"<string>","charge_efficiency":0,"discharge_efficiency":0,"country":"<string>","tso":"<string>","max_pos_ramp_rate_mw_per_sec":0,"min_neg_ramp_rate_mw_per_sec":0,"usable_energy_capacity_mwh":0,"usable_power_capacity_mw":0,"afrr_prequalified_capacity_pos_mw":0,"afrr_prequalified_capacity_neg_mw":0,"fcr_prequalified_capacity_mw":0,"tso_pool_id":0,"ioa_middle":0,"latitude":0,"longitude":0,"disable_pq_capacity_check":false,"strict_validation":false,"tso_connected":false,"fcr_enabled":false,"afrr_enabled":false,"wholesale_enabled":false,"control_enabled":false,"pv_active":false,"grid_connection_power_mw":0,"bess_priority":false,"poc_export_limit_mw":0,"grid_import_zero":false,"grid_import_allowed":false,"bess_control_enabled":false,"pv_control_enabled":false,"asset_integration_type":"full_control","asset_operational_status":"onboarding","operational_status_reason":"<string>","maintenance_until":"2026-09-10T13:30:00Z"}'import httpx
r = httpx.put(
"https://api.ebx.energy/v1/assets/DE_BESS_01",
headers={"Authorization": f"Bearer {token}"},
json={
"asset_name": "<string>",
"asset_type": "standalone",
"description": "<string>",
"location": "<string>",
"organisation_id": "<string>",
"optimizer_org_id": "<string>",
"charge_efficiency": 0,
"discharge_efficiency": 0,
"country": "<string>",
"tso": "<string>",
"max_pos_ramp_rate_mw_per_sec": 0,
"min_neg_ramp_rate_mw_per_sec": 0,
"usable_energy_capacity_mwh": 0,
"usable_power_capacity_mw": 0,
"afrr_prequalified_capacity_pos_mw": 0,
"afrr_prequalified_capacity_neg_mw": 0,
"fcr_prequalified_capacity_mw": 0,
"tso_pool_id": 0,
"ioa_middle": 0,
"latitude": 0,
"longitude": 0,
"disable_pq_capacity_check": False,
"strict_validation": False,
"tso_connected": False,
"fcr_enabled": False,
"afrr_enabled": False,
"wholesale_enabled": False,
"control_enabled": False,
"pv_active": False,
"grid_connection_power_mw": 0,
"bess_priority": False,
"poc_export_limit_mw": 0,
"grid_import_zero": False,
"grid_import_allowed": False,
"bess_control_enabled": False,
"pv_control_enabled": False,
"asset_integration_type": "full_control",
"asset_operational_status": "onboarding",
"operational_status_reason": "<string>",
"maintenance_until": "2026-09-10T13:30:00Z",
},
)
print(r.json())const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01", {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({"asset_name":"<string>","asset_type":"standalone","description":"<string>","location":"<string>","organisation_id":"<string>","optimizer_org_id":"<string>","charge_efficiency":0,"discharge_efficiency":0,"country":"<string>","tso":"<string>","max_pos_ramp_rate_mw_per_sec":0,"min_neg_ramp_rate_mw_per_sec":0,"usable_energy_capacity_mwh":0,"usable_power_capacity_mw":0,"afrr_prequalified_capacity_pos_mw":0,"afrr_prequalified_capacity_neg_mw":0,"fcr_prequalified_capacity_mw":0,"tso_pool_id":0,"ioa_middle":0,"latitude":0,"longitude":0,"disable_pq_capacity_check":false,"strict_validation":false,"tso_connected":false,"fcr_enabled":false,"afrr_enabled":false,"wholesale_enabled":false,"control_enabled":false,"pv_active":false,"grid_connection_power_mw":0,"bess_priority":false,"poc_export_limit_mw":0,"grid_import_zero":false,"grid_import_allowed":false,"bess_control_enabled":false,"pv_control_enabled":false,"asset_integration_type":"full_control","asset_operational_status":"onboarding","operational_status_reason":"<string>","maintenance_until":"2026-09-10T13:30:00Z"}),
});
const data = await res.json();{
"asset_id": "<string>",
"asset_name": "<string>",
"asset_type": "standalone",
"description": "<string>",
"location": "<string>",
"organisation_id": "<string>",
"optimizer_org_id": "<string>",
"optimizer_org_name": "<string>",
"charge_efficiency": 0,
"discharge_efficiency": 0,
"country": "<string>",
"tso": "<string>",
"max_pos_ramp_rate_mw_per_sec": 0,
"min_neg_ramp_rate_mw_per_sec": 0,
"usable_energy_capacity_mwh": 0,
"usable_power_capacity_mw": 0,
"afrr_prequalified_capacity_pos_mw": 0,
"afrr_prequalified_capacity_neg_mw": 0,
"fcr_prequalified_capacity_mw": 0,
"tso_pool_id": 0,
"ioa_middle": 0,
"latitude": 0,
"longitude": 0,
"disable_pq_capacity_check": false,
"strict_validation": false,
"tso_connected": true,
"fcr_enabled": false,
"afrr_enabled": false,
"wholesale_enabled": false,
"control_enabled": false,
"pv_active": false,
"grid_connection_power_mw": 0,
"bess_priority": false,
"poc_export_limit_mw": 0,
"grid_import_zero": false,
"grid_import_allowed": true,
"bess_control_enabled": false,
"pv_control_enabled": false,
"asset_operational_status": "onboarding",
"operational_status_reason": "<string>",
"maintenance_until": "2026-09-10T13:30:00Z",
"asset_integration_type": "full_control",
"production_critical": false,
"is_virtual": false,
"parent_asset_id": "<string>"
}- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 422validation failed
- 429rate limited
DELETE/v1/assets/{asset_id}
Delete Asset
asset.write
Delete an asset.
Path parameters
- asset_idREQUIRED
- string
curl -X DELETE "https://api.ebx.energy/v1/assets/DE_BESS_01" \
-H "Authorization: Bearer $EBX_TOKEN"import httpx
r = httpx.delete(
"https://api.ebx.energy/v1/assets/DE_BESS_01",
headers={"Authorization": f"Bearer {token}"},
)
print(r.status_code)const res = await fetch("https://api.ebx.energy/v1/assets/DE_BESS_01", {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
},
});Returns 204 with no body.
- 400malformed request
- 401no valid token
- 403scope missing
- 404unknown or not visible
- 409state conflict
- 429rate limited