Skip to main content
Technical Preview
Use an access token. VRM sends the token in the X-Authorization header, not in Authorization. Victron deprecated Bearer login tokens from June 1, 2026. Create a personal access token in the VRM Portal and send it as Token <access_token>.

Overview

Victron GX devices (Cerbo GX, Ekrano GX, Venus GX and other Venus OS devices) upload data from inverters/chargers, MPPT solar chargers, battery monitors, meters and EV chargers to the VRM Portal. The VRM API v2 (https://vrmapi.victronenergy.com/v2) gives programmatic access to the same data. Victron publishes it as an OpenAPI 3.1 document on vrm-api-docs.victronenergy.com. The VictronVrmApi connector maps 20 MQTT topics onto that API: 13 read events (12 GET plus one read-only POST lookup) and 7 write events. Typical uses are putting PV yield, battery state of charge and consumption from remote Victron sites (off-grid cabins, telecom shelters, boats, ESS systems) on the broker next to plant data, and turning VRM alarms into broker alarms. Each event publishes the VRM reply on <topic>/response.
Write events change VRM configuration. ClearAlarm, AddAlarmRule, EditAlarmRule, DeleteAlarmRule, AddTag, RemoveTag and UpdateInstallationSettings change portal settings, not the hardware. UpdateInstallationSettings can turn inverterChargerControl on, which lets VRM users switch the inverter/charger remotely. Restrict who can publish to these topics with a rule. This connector does not include the Dynamic ESS write (it changes how the battery charges and discharges). It also leaves out user, invite and access-token management.
For local, low-latency data without the cloud, read the GX device directly: Venus OS runs a local MQTT broker (bridge it with an MQTT bridge connector) and exposes a Modbus TCP register list (use a native Modbus connector). This connector is for VRM cloud data across many sites.

Prerequisites

  • A VRM Portal account (vrm.victronenergy.com) with access to at least one installation. A GX device must upload data to VRM.
  • A personal access token. In VRM, open Preferences > Integrations > Access tokens, create a token, and copy it. VRM shows it only once.
  • Your user id (idUser) for the user-level events. user/get returns it as user.id.
  • The installation id (idSite) of each site. installation/list returns it as records[].idSite. It is a number, such as 219742. It is not the VRM portal ID (identifier, for example c0619ab27f32). site-id/get converts a portal ID to idSite.
  • Full access (admin rights) to the site for the alarm rules, diagnostics, tags and write events. Users with read-only access get 403.
  • Outbound HTTPS from the broker to vrmapi.victronenergy.com.

Authentication

Every event sends X-Authorization: {value.json.authorization}. Store the full header value as a Hub secret, for example VRM_AUTHORIZATION = Token <access_token>, and read it with GET SECRET in the action that publishes to the connector.

Configuration

Query parameters: Maximum GetStats window for each interval: Stats series come back as {"success": true, "records": {"<code>": [[timestamp_ms, value, ...], ...]}, "totals": {"<code>": value}}. The timestamps are in milliseconds. Codes include Pdc (PV DC power), bs (battery SoC), bv (battery voltage), kwh and grid / consumption codes. Other responses use {"success": true, "records": ...}, and errors use {"success": false, "errors", "error_code"}.

Basic Syntax

Examples

Publish directly to a connector topic:
to energy/victron/stats/get, then read energy/victron/stats/get/response for daily energy (Pc, Pb, Pg, Bc, Bg, kwh) for that window. Clear an active alarm (take idAlarm from alarm-log/get):
to energy/victron/alarm/clear. Actions that poll the connector for one site:
Restrict who can publish to energy/victron/# with a rule, because these payloads carry the access token.

Rate limits and polling

VRM rate-limits most endpoints with a rolling window of 200 requests. One request leaves the window every 0.33 seconds, so about 3 requests per second never hit the limit. A 429 with a JSON body has a Retry-After header with the seconds to wait. The GX device logs to VRM every 1 to 15 minutes (its logging interval), so polling stats faster than every 15 minutes rarely returns new data. Use one GetStats call with type=custom and several attributeCodes[] instead of many separate calls.

Notes

  • Demo account: VRM has a public demo account (user 22) with several sample installations, such as ESS System (219742), 35ft Yacht (151734) and Off-grid (209689). The demo is read-only. It answers 403 for alarm rules, diagnostics, tags, the site id lookup and every write.
  • Alarms: alarm/list returns the alarm rules configured on a site. alarm-log/get returns the alarms that fired, with started and cleared timestamps. When a site has no log entries, it returns 200 with {"success": false, "error_code": "no_results_found"}.
  • Alarm rule bodies: float alarms use PascalCase AlarmEnabled and NotifyAfterSeconds; enum alarms use camelCase alarmEnabled and notifyAfterSeconds with enumValues. VRM returns a warning if the case is wrong.
  • DELETE with a body: DeleteAlarmRule and RemoveTag send a JSON body with DELETE, as the VRM spec requires.
  • Support: Victron does not offer direct support for the VRM API. Use the Modifications section of the Victron Community.
  • Reports and CSV / XLSX exports moved to a separate VRM Reports API and are not covered here.

Testing

Static checks compare all 20 events with the official VRM OpenAPI 3.1 document, and a local contract mock covers all of them. Against the real API, 9 read events returned 200 with the public demo account: user, installation list and search, system overview, stats (live feed, kWh, custom SoC, forecast), overall stats, alarm log, Dynamic ESS settings and GPS track. The 4 read events that need full rights (alarm rules, diagnostics, tags, site id lookup) and 5 write probes with no-op payloads returned 403 forbidden on the demo, as expected. The Token access-token format was checked only by its 401 invalid_token response, because the demo gives a Bearer JWT. A run with your own access token is still needed (see the factory TEST.md).

Not covered

Dynamic ESS writes, reset forecasts, custom widgets, data and installation-overview downloads, user, invite, group and access-token management, admin endpoints, the deprecated widgets/* endpoints, and the login call itself.
Last modified on October 21, 2026