BESS
BESS endpoints of the DynVolt Open API.
Battery energy storage: full telemetry (units, clusters, PCS, envelope, protection, alarms, dispatch/control logs) and the dispatch-proposal workflow — optimize, review, approve/reject, edit-hour. See the BESS guide. Raw hardware control (power on/off, breaker, grid-mode, fault-reset) is not exposed by the API.
GET /v1/sites/{site_id}/bess
Battery-storage units.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/fleet/summary
BESS fleet aggregate.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/fleet/summary" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}
One BESS unit.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/current
Live BESS telemetry.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/current" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/history
BESS telemetry history (?start&end&limit).
Scope: bess:read · Module: bess
| Query parameter | Type | Required | Description |
|---|---|---|---|
start | string | no | Window start — RFC3339 UTC, e.g. 2026-08-01T00:00:00Z. Naive (offset-less) timestamps are rejected. |
end | string | no | Window end — RFC3339 UTC. Must be after start. |
limit | integer | no | Maximum rows to return (capped at 10000). |
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/history" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/dashboard
BESS unit dashboard (telemetry + schedule + deviations).
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/dashboard" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/deviations
Schedule-vs-actual deviations (?target_date).
Scope: bess:read · Module: bess
| Query parameter | Type | Required | Description |
|---|---|---|---|
target_date | string | no | Day to return, YYYY-MM-DD (UTC). Defaults to today. |
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/deviations" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/clusters
Per-cluster summaries.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/clusters" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/clusters/{cluster_idx}
Live cluster cell arrays.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/clusters/0" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/pcs/current
PCS live telemetry.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/pcs/current" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/pcs/history
PCS history (?start&end&limit).
Scope: bess:read · Module: bess
| Query parameter | Type | Required | Description |
|---|---|---|---|
start | string | no | Window start — RFC3339 UTC, e.g. 2026-08-01T00:00:00Z. Naive (offset-less) timestamps are rejected. |
end | string | no | Window end — RFC3339 UTC. Must be after start. |
limit | integer | no | Maximum rows to return (capped at 10000). |
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/pcs/history" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/pcs/faults
Live PCS fault words.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/pcs/faults" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/alarms/states
BESS alarm states (?only_set&severity).
Scope: bess:read · Module: bess
| Query parameter | Type | Required | Description |
|---|---|---|---|
only_set | boolean | no | Return only alarms currently asserted. |
severity | string | no | Filter by severity (e.g. warning, critical). |
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/alarms/states" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/alarms/history
BESS alarm history (?code&limit).
Scope: bess:read · Module: bess
| Query parameter | Type | Required | Description |
|---|---|---|---|
code | string | no | Filter to one alarm code. |
limit | integer | no | Maximum rows to return (capped at 10000). |
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/alarms/history" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/alarms/counts
Alarm counts by severity.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/alarms/counts" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/dispatch-log
Dispatch log (?start&end&limit).
Scope: bess:read · Module: bess
| Query parameter | Type | Required | Description |
|---|---|---|---|
start | string | no | Window start — RFC3339 UTC, e.g. 2026-08-01T00:00:00Z. Naive (offset-less) timestamps are rejected. |
end | string | no | Window end — RFC3339 UTC. Must be after start. |
limit | integer | no | Maximum rows to return (capped at 10000). |
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/dispatch-log" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/control-log
Control-write log (?tier&limit).
Scope: bess:read · Module: bess
| Query parameter | Type | Required | Description |
|---|---|---|---|
tier | string | no | Filter by control tier. |
limit | integer | no | Maximum rows to return (capped at 10000). |
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/control-log" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/envelope
Charge/discharge envelope + SOC.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/envelope" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/protection
Protection thresholds.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/protection" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/setup
Device setup values.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/setup" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/{bess_id}/schedules
Dispatch schedules for a unit (?target_date).
Scope: bess:read · Module: bess
| Query parameter | Type | Required | Description |
|---|---|---|---|
target_date | string | no | Day to return, YYYY-MM-DD (UTC). Defaults to today. |
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/schedules" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"GET /v1/sites/{site_id}/bess/schedules/{schedule_id}
One dispatch schedule with hours.
Scope: bess:read · Module: bess
curl "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/schedules/77" \
-H "Authorization: Bearer $DYNVOLT_API_KEY"POST /v1/sites/{site_id}/bess/{bess_id}/optimize
Ask the AI to optimize this unit's dispatch.
Scope: bess:write · Module: bess · Control write — commands the plant
- Runs the AI dispatch optimizer and returns a proposed schedule for review — nothing is dispatched until you approve it. See the BESS guide.
- Control write — reduces plant output. It can never raise output above the grid-connection permit; every apply and restore is clamped to that permit by the edge. See the Curtailment guide.
- Supports the
Idempotency-Keyheader for safe retries (24-hour replay). Returns409 conflict_safe_modewhile the site is in commissioning safe mode.
curl -X POST "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/1/optimize" \
-H "Authorization: Bearer $DYNVOLT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ ... }'POST /v1/sites/{site_id}/bess/optimize-all
Optimize all units.
Scope: bess:write · Module: bess · Control write — commands the plant
- Optimizes every unit at the site, each returning a proposed schedule awaiting approval.
- Control write — reduces plant output. It can never raise output above the grid-connection permit; every apply and restore is clamped to that permit by the edge. See the Curtailment guide.
- Supports the
Idempotency-Keyheader for safe retries (24-hour replay). Returns409 conflict_safe_modewhile the site is in commissioning safe mode.
curl -X POST "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/optimize-all" \
-H "Authorization: Bearer $DYNVOLT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ ... }'POST /v1/sites/{site_id}/bess/schedules/{schedule_id}/approve
Approve a proposed dispatch schedule.
Scope: bess:write · Module: bess · Control write — commands the plant
- Control write — reduces plant output. It can never raise output above the grid-connection permit; every apply and restore is clamped to that permit by the edge. See the Curtailment guide.
- Supports the
Idempotency-Keyheader for safe retries (24-hour replay). Returns409 conflict_safe_modewhile the site is in commissioning safe mode.
curl -X POST "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/schedules/77/approve" \
-H "Authorization: Bearer $DYNVOLT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ ... }'POST /v1/sites/{site_id}/bess/schedules/{schedule_id}/reject
Reject a proposed dispatch schedule.
Scope: bess:write · Module: bess · Control write — commands the plant
- Control write — reduces plant output. It can never raise output above the grid-connection permit; every apply and restore is clamped to that permit by the edge. See the Curtailment guide.
- Supports the
Idempotency-Keyheader for safe retries (24-hour replay). Returns409 conflict_safe_modewhile the site is in commissioning safe mode.
curl -X POST "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/schedules/77/reject" \
-H "Authorization: Bearer $DYNVOLT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ ... }'POST /v1/sites/{site_id}/bess/schedules/approve-all
Approve all proposed schedules (?target_date).
Scope: bess:write · Module: bess · Control write — commands the plant
| Query parameter | Type | Required | Description |
|---|---|---|---|
target_date | string | no | Day to return, YYYY-MM-DD (UTC). Defaults to today. |
- Approves every proposed (pending) schedule for the target day.
- Control write — reduces plant output. It can never raise output above the grid-connection permit; every apply and restore is clamped to that permit by the edge. See the Curtailment guide.
- Supports the
Idempotency-Keyheader for safe retries (24-hour replay). Returns409 conflict_safe_modewhile the site is in commissioning safe mode.
curl -X POST "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/schedules/approve-all" \
-H "Authorization: Bearer $DYNVOLT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ ... }'PUT /v1/sites/{site_id}/bess/schedules/{schedule_id}/hours/{hour}
Edit one hour of a proposed schedule.
Scope: bess:write · Module: bess · Control write — commands the plant
- Edits a single hour of a proposed (not-yet-approved) schedule before approval. Body carries the revised hour’s dispatch target.
- Control write — reduces plant output. It can never raise output above the grid-connection permit; every apply and restore is clamped to that permit by the edge. See the Curtailment guide.
- Supports the
Idempotency-Keyheader for safe retries (24-hour replay). Returns409 conflict_safe_modewhile the site is in commissioning safe mode.
curl -X PUT "https://api.owner.dynvolt.com/v1/sites/pv-ljubas/bess/schedules/77/hours/13" \
-H "Authorization: Bearer $DYNVOLT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ ... }'
