Skip to main content
Every device read tells you exactly what that device accepts. Read it once, then build a push that will validate.

Where capabilities live

There’s no separate endpoint. commands, conflictStrategies, and settings come back on the device read.
The read mirrors the push. commands.charge.parameters.target on the read becomes action.parameters.target on the push, sent as { "value": 80, "unit": "percent" }.

Present means supported

If a key is present, the device supports it. If it’s absent, the request is refused with 422 DEVICE_NOT_CAPABLE. There is no supported: false. parameters: {} means the command is supported and takes no parameters.

When a device can’t do something

There are two different answers. Handle them differently. An immediate DEVICE_NOT_CAPABLE can carry details naming the refused value and what the device offers, such as deviceCapabilities.supportedModes, supportedExecution, or supportedStrategies. A failed action carries only errorCode and errorMessage. See Error codes.

Units and bounds

Each parameter declares a unit, and optional min, max, and step. A missing bound is open-ended on that side. step is the increment a value must land on, counted from min. Bounds are per device, not per type. Two batteries from different manufacturers can declare different ranges for the same parameter, so always read them from the device.

Execution

execution lists the timings each command accepts. Details are in Scheduling. Timings are per command. A battery can accept charge as windowed while auto.balance is immediate or scheduled only. auto.* commands are never windowed.

Conflict strategies

conflictStrategies lists the onConflict values the device accepts when a new push collides with an active action. See Conflicts.

Commands by device type

This is the full set per type. Each device declares the subset it supports.

Read-only device types

Solar inverters and vehicles report state only. Their reads have no commands, conflictStrategies, or settings. A POST to /solar-inverter/{deviceId} or /vehicle/{deviceId} returns 405 METHOD_NOT_ALLOWED, with the allowed methods in the Allow header.

Live access and maturity

Which brands your end users can link in live depends on your account and each integration’s maturity: experimental, beta, or general. General integrations are open to accounts enabled for live; earlier stages need early-access approval. Sandbox includes every brand. None of this appears on the device read, which shows only what the linked device offers.
Coming soon. Live control of thermostats. Sandbox supports every thermostat command.

Next steps

Push

Turn a capability into a command.

Settings

Read and change persistent device configuration.

Scheduling

Run a command later or across a window.

Pull

Everything else on the device read.