DYNVOLT · developers

API reference

All 108 DynVolt Open API endpoints, grouped by module.

Base URL https://api.owner.dynvolt.com — all paths below are relative to it. Generated from the OpenAPI spec (v1.0.0).

Sites

EndpointSummary
GET /v1/sitesList the sites this API key can access

Plant

EndpointSummary
GET /v1/sites/{site_id}/overviewFull live plant snapshot (loggers, inverters, strings, sensors, weather, predictions)
GET /v1/sites/{site_id}/plant/statusAggregated live plant status
GET /v1/sites/{site_id}/plant/summaryPer-logger daily energy summary (?date=YYYY-MM-DD)
GET /v1/sites/{site_id}/locationsSite locations
GET /v1/sites/{site_id}/locations/{location_id}One location
GET /v1/sites/{site_id}/gapsTelemetry gap records (?logger_id&start&end)
GET /v1/sites/{site_id}/gaps/logger/{logger_id}Telemetry gaps for one logger

Loggers

EndpointSummary
GET /v1/sites/{site_id}/loggersList SmartLoggers (plants)
GET /v1/sites/{site_id}/loggers/{logger_id}/historyLogger telemetry history (?start&end&limit)

Inverters

EndpointSummary
GET /v1/sites/{site_id}/invertersList inverters (?logger_id= to filter)
GET /v1/sites/{site_id}/inverters/{inverter_id}One inverter with live telemetry
GET /v1/sites/{site_id}/inverters/{inverter_id}/historyInverter telemetry history (?start&end&limit)
GET /v1/sites/{site_id}/inverters/alarms/tableManufacturer alarm reference table
GET /v1/sites/{site_id}/inverters/alarms/decodeDecode alarm bitmasks (?alarm_1..alarm_5)

Strings

EndpointSummary
GET /v1/sites/{site_id}/strings/inverter/{inverter_id}PV-string configuration for an inverter
GET /v1/sites/{site_id}/strings/inverter/{inverter_id}/currentLive per-string telemetry
GET /v1/sites/{site_id}/strings/inverter/{inverter_id}/historyPer-string history (?start&end&string_index&limit)
GET /v1/sites/{site_id}/strings/inverter/{inverter_id}/hourlyPer-string hourly energy (?start&end)

Sensors

EndpointSummary
GET /v1/sites/{site_id}/sensorsTransformer-station sensor/fan nodes
GET /v1/sites/{site_id}/sensors/{node_id}/currentLive sensor-node reading (temp/humidity/fan currents)
GET /v1/sites/{site_id}/sensors/{node_id}/historySensor-node history (?start&end&limit)

Weather

EndpointSummary
GET /v1/sites/{site_id}/weatherLatest on-site weather across all loggers (per-instrument under sensors[])
GET /v1/sites/{site_id}/weather/logger/{logger_id}Latest weather for one logger (plot average + per-instrument)
GET /v1/sites/{site_id}/weather/logger/{logger_id}/historyWeather history 5-min buckets (?start&end&limit)

Efficiency & diagnostics

EndpointSummary
GET /v1/sites/{site_id}/efficiency/loggersLogger specific-yield / capacity-factor rankings (?start&end)
GET /v1/sites/{site_id}/efficiency/invertersInverter rankings incl. efficiency (?start&end&logger_id)
GET /v1/sites/{site_id}/efficiency/stringsString rankings by orientation group (?start&end&inverter_ids&orientation)
GET /v1/sites/{site_id}/efficiency/health-matrixPer-string health grid vs peers (?start&end)
GET /v1/sites/{site_id}/efficiency/loss-analysisDC→AC conversion loss per inverter (?start&end)
GET /v1/sites/{site_id}/strings/inverter/{inverter_id}/compareAll strings of an inverter side-by-side (?start&end)

I-V curves

EndpointSummary
GET /v1/sites/{site_id}/iv/modulesPanel-model library
GET /v1/sites/{site_id}/iv/modules/searchSearch the CEC panel database (?q&limit)
GET /v1/sites/{site_id}/iv/modules/{params_id}One panel model
GET /v1/sites/{site_id}/iv/strings/{inverter_id}/{string_index}/expectedExpected-vs-measured I-V series for a string (?start&end&limit)

Energy

EndpointSummary
GET /v1/sites/{site_id}/energy/hourlyDay-by-hour energy matrix (?start&end&logger_ids)
GET /v1/sites/{site_id}/loggers/{logger_id}/hourly-energyHourly production for one logger (?since=UTC ISO)

Curtailment

EndpointSummary
GET /v1/sites/{site_id}/curtailmentActive + scheduled curtailment windows (rows carry group_id, applied, is_active)
GET /v1/sites/{site_id}/curtailment/suggestSuggest a power limit from forecast (?logger_id&date&start_hour&end_hour)
GET /v1/sites/{site_id}/commands/relay-historyRelay/fan command history (?node_id&limit)
POST /v1/sites/{site_id}/curtailment/windowSchedule a curtailment window (site or single plant)
POST /v1/sites/{site_id}/curtailment/immediateCurtail now (applied within ~10s)
DELETE /v1/sites/{site_id}/curtailment/group/{group_id}Release a curtailment group (restores clamped power first)

Markets

EndpointSummary
GET /v1/sites/{site_id}/marketsAvailable markets
GET /v1/sites/{site_id}/markets/{market_code}/pricesDay-ahead prices for a market (?target_date)
GET /v1/sites/{site_id}/markets/compareCross-market price comparison (?target_date)

Earnings

EndpointSummary
GET /v1/sites/{site_id}/earnings/summaryEarnings summary gross→fees→net (?start&end&logger_id)
GET /v1/sites/{site_id}/earnings/hourlyHourly earnings detail (?start&end&logger_id)
GET /v1/sites/{site_id}/earnings/market-assignmentsPer-plant market assignment (?logger_id)
GET /v1/sites/{site_id}/earnings/cross-border-pricesCross-border price series (?base&sold&start&end)

Predictions

EndpointSummary
GET /v1/sites/{site_id}/predictions/forecastProduction forecast, all plants (?date&refresh)
GET /v1/sites/{site_id}/predictions/forecast/logger/{logger_id}Production forecast for one plant (?date)
GET /v1/sites/{site_id}/predictions/productionForecast vs actual production (?start&end&logger_id)
GET /v1/sites/{site_id}/predictions/pricesPrice forecast for the assigned market (?start&end)
GET /v1/sites/{site_id}/predictions/model-statusModel accuracy metrics

BESS

EndpointSummary
GET /v1/sites/{site_id}/bessBattery-storage units
GET /v1/sites/{site_id}/bess/fleet/summaryBESS fleet aggregate
GET /v1/sites/{site_id}/bess/{bess_id}One BESS unit
GET /v1/sites/{site_id}/bess/{bess_id}/currentLive BESS telemetry
GET /v1/sites/{site_id}/bess/{bess_id}/historyBESS telemetry history (?start&end&limit)
GET /v1/sites/{site_id}/bess/{bess_id}/dashboardBESS unit dashboard (telemetry + schedule + deviations)
GET /v1/sites/{site_id}/bess/{bess_id}/deviationsSchedule-vs-actual deviations (?target_date)
GET /v1/sites/{site_id}/bess/{bess_id}/clustersPer-cluster summaries
GET /v1/sites/{site_id}/bess/{bess_id}/clusters/{cluster_idx}Live cluster cell arrays
GET /v1/sites/{site_id}/bess/{bess_id}/pcs/currentPCS live telemetry
GET /v1/sites/{site_id}/bess/{bess_id}/pcs/historyPCS history (?start&end&limit)
GET /v1/sites/{site_id}/bess/{bess_id}/pcs/faultsLive PCS fault words
GET /v1/sites/{site_id}/bess/{bess_id}/alarms/statesBESS alarm states (?only_set&severity)
GET /v1/sites/{site_id}/bess/{bess_id}/alarms/historyBESS alarm history (?code&limit)
GET /v1/sites/{site_id}/bess/{bess_id}/alarms/countsAlarm counts by severity
GET /v1/sites/{site_id}/bess/{bess_id}/dispatch-logDispatch log (?start&end&limit)
GET /v1/sites/{site_id}/bess/{bess_id}/control-logControl-write log (?tier&limit)
GET /v1/sites/{site_id}/bess/{bess_id}/envelopeCharge/discharge envelope + SOC
GET /v1/sites/{site_id}/bess/{bess_id}/protectionProtection thresholds
GET /v1/sites/{site_id}/bess/{bess_id}/setupDevice setup values
GET /v1/sites/{site_id}/bess/{bess_id}/schedulesDispatch schedules for a unit (?target_date)
GET /v1/sites/{site_id}/bess/schedules/{schedule_id}One dispatch schedule with hours
POST /v1/sites/{site_id}/bess/{bess_id}/optimizeAsk the AI to optimize this unit's dispatch
POST /v1/sites/{site_id}/bess/optimize-allOptimize all units
POST /v1/sites/{site_id}/bess/schedules/{schedule_id}/approveApprove a proposed dispatch schedule
POST /v1/sites/{site_id}/bess/schedules/{schedule_id}/rejectReject a proposed dispatch schedule
POST /v1/sites/{site_id}/bess/schedules/approve-allApprove all proposed schedules (?target_date)
PUT /v1/sites/{site_id}/bess/schedules/{schedule_id}/hours/{hour}Edit one hour of a proposed schedule

Alerts

EndpointSummary
GET /v1/sites/{site_id}/alertsAlerts (?status= repeatable; default active,acknowledged)
POST /v1/sites/{site_id}/alerts/{alert_id}/acknowledgeAcknowledge an alert
POST /v1/sites/{site_id}/alerts/{alert_id}/resolveResolve an alert

Work orders

EndpointSummary
GET /v1/sites/{site_id}/work-ordersO&M work orders (filters: location_id, logger_id, status, start, end, offset, limit)
POST /v1/sites/{site_id}/work-ordersCreate a work order
GET /v1/sites/{site_id}/work-orders/{wo_id}One work order
PUT /v1/sites/{site_id}/work-orders/{wo_id}Update a work order
GET /v1/sites/{site_id}/om/categoriesInspection categories
GET /v1/sites/{site_id}/om/notificationsO&M notifications (?unread_only&offset&limit)
GET /v1/sites/{site_id}/om/notifications/unread-countUnread O&M notification count
PUT /v1/sites/{site_id}/work-orders/{wo_id}/items/{item_id}Update a work-order checklist item
POST /v1/sites/{site_id}/work-orders/{wo_id}/approveApprove a completed work order
PUT /v1/sites/{site_id}/om/notifications/{notification_id}/readMark an O&M notification read

Defects

EndpointSummary
GET /v1/sites/{site_id}/defectsO&M defects (?location_id&logger_id&status&severity&offset&limit)
POST /v1/sites/{site_id}/defectsLog a defect
GET /v1/sites/{site_id}/defects/{defect_id}One defect
PUT /v1/sites/{site_id}/defects/{defect_id}Update a defect

Reports

Write endpoints

The endpoints below are the only mutations in the API. They all accept the Idempotency-Key header and are rate-limited at 30 requests/min per token. Two areas are control writes that command the plant — curtailment (schedule / immediate / release) and BESS dispatch approval — and require the curtailment:write / bess:write scopes. Curtailment can only ever reduce output; no write can raise a plant above its grid-connection permit. Raw hardware control (BESS power/breaker/grid-mode, settings, panel-model edits) is not exposed by design.