DynVoltDYNVOLT · developers

Scopes & modules

The 17 API scopes, what each grants, its module gate, and which are control scopes.

Every API key carries a set of scopes. A scope is only usable when two things are true:

  1. The token carries the scope, and
  2. The account has the module that gates it still active.

If the scope is missing you get 403 forbidden_scope; if the module is inactive you get 403 forbidden_module (the message names the missing scope or module — see Errors).

The key-creation screen in the owner platform only offers the scopes your plan includes. A client without the bess module never sees bess:read / bess:write as options; one without earnings never sees earnings:read. So in practice a key can only be minted with scopes your account is entitled to.

Read scopes

ScopeGrants (endpoint areas)Module
plant:readoverview, plant/*, locations, loggers, inverters, strings, sensors, gaps — core live telemetrybasic_scada
weather:readweather (on-site EMI stations, latest + history)basic_scada
diagnostics:readefficiency/* rankings, string compare, iv/* (panel library, CEC search, expected-vs-measured I-V)basic_scada
energy:readenergy/hourly, per-logger hourly-energybasic_scada
curtailment:readcurtailment (active + scheduled rows), curtailment/suggest, commands/relay-historybasic_scada
markets:readmarkets, per-market day-ahead prices, markets/comparebasic_scada
alerts:readalerts listbasic_scada
reports:readreports/* (overview, catalog, runs, subscriptions)basic_scada
earnings:readearnings/* (summary, hourly, market assignments, cross-border prices)earnings
predictions:readpredictions/* (production forecast, forecast-vs-actual, price forecast, model status)ai_predictions
bess:readall bess/* telemetry, clusters, PCS, envelope, protection, alarms, dispatch/control logs, schedulesbess
om:readwork-orders, defects, om/categories, om/notificationsom

Write scopes

ScopeGrantsModuleControl?
alerts:writeAcknowledge / resolve alertsbasic_scada
reports:writeCreate / update / delete / run report subscriptionsbasic_scada
om:writeCreate/update/approve work orders, checklist items, defects, notification readsom
curtailment:writeSchedule a curtailment window, curtail immediately, release a groupbasic_scadaYes — commands the plant
bess:writeOptimize dispatch, approve / reject / approve-all / edit-hour on proposed schedulesbessYes — commands the plant

Control scopes

curtailment:write and bess:write are control scopes — they command physical plant behaviour, not just records. Treat keys that carry them like passwords:

  • Grant them only to integrations that genuinely need to act on the plant.
  • Prefer a dedicated key per control integration so you can revoke it in isolation.
  • Rotate or revoke immediately if a control key is exposed.

Even so, the API is bounded by hard safety rails. Curtailment can only ever reduce output — no call can raise a plant above its grid-connection permit (see Curtailment). BESS writes are dispatch-proposal actions only; raw hardware control (power on/off, breaker, grid-mode, fault-reset, protection/setup) is not exposed by the API (see BESS).

Modules

Each scope maps to a module entitlement on your account. The module must be active for the scope to work, regardless of what the token carries:

ModuleScopes it gates
basic_scadaplant:read, weather:read, diagnostics:read, energy:read, curtailment:read, curtailment:write, markets:read, alerts:read, alerts:write, reports:read, reports:write
earningsearnings:read
ai_predictionspredictions:read
bessbess:read, bess:write
omom:read, om:write

Grant each integration only the scopes it needs — a monitoring dashboard wants plant:read, energy:read and maybe weather:read, not curtailment:write.