DynVoltDYNVOLT · developers

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 parameterTypeRequiredDescription
startstringnoWindow start — RFC3339 UTC, e.g. 2026-08-01T00:00:00Z. Naive (offset-less) timestamps are rejected.
endstringnoWindow end — RFC3339 UTC. Must be after start.
limitintegernoMaximum 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 parameterTypeRequiredDescription
target_datestringnoDay 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 parameterTypeRequiredDescription
startstringnoWindow start — RFC3339 UTC, e.g. 2026-08-01T00:00:00Z. Naive (offset-less) timestamps are rejected.
endstringnoWindow end — RFC3339 UTC. Must be after start.
limitintegernoMaximum 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 parameterTypeRequiredDescription
only_setbooleannoReturn only alarms currently asserted.
severitystringnoFilter 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 parameterTypeRequiredDescription
codestringnoFilter to one alarm code.
limitintegernoMaximum 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 parameterTypeRequiredDescription
startstringnoWindow start — RFC3339 UTC, e.g. 2026-08-01T00:00:00Z. Naive (offset-less) timestamps are rejected.
endstringnoWindow end — RFC3339 UTC. Must be after start.
limitintegernoMaximum 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 parameterTypeRequiredDescription
tierstringnoFilter by control tier.
limitintegernoMaximum 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 parameterTypeRequiredDescription
target_datestringnoDay 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-Key header for safe retries (24-hour replay). Returns 409 conflict_safe_mode while 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-Key header for safe retries (24-hour replay). Returns 409 conflict_safe_mode while 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-Key header for safe retries (24-hour replay). Returns 409 conflict_safe_mode while 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-Key header for safe retries (24-hour replay). Returns 409 conflict_safe_mode while 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 parameterTypeRequiredDescription
target_datestringnoDay 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-Key header for safe retries (24-hour replay). Returns 409 conflict_safe_mode while 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-Key header for safe retries (24-hour replay). Returns 409 conflict_safe_mode while 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 '{ ... }'