> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreflux.org/llms.txt
> Use this file to discover all available pages before exploring further.

# SolarEdge Monitoring API

> Client-mode REST API connector for the SolarEdge Monitoring API V2: list fleet sites, read site overview, performance, PV power and energy, alerts and device inventory, pull bulk inverter, meter and battery telemetry, and read live power flow on Advanced tiers

Technical Preview

> [!WARNING]
>
> **This connector uses the SolarEdge Monitoring API V2.** SolarEdge plans to switch off the legacy V1 API (`/site/{id}/...` with `?api_key=` in the URL) on **November 3, 2026**. V1 keys do not work on V2. Create a new key in the [SolarEdge developer console](https://developer.solaredge.com).

## Overview

SolarEdge inverters, meters and batteries report to the SolarEdge cloud monitoring platform. The **SolarEdge Monitoring API V2** (`https://monitoringapi.solaredge.com/v2`) gives read access to that data. It is documented on the [SolarEdge developer docs](https://api-docs.solaredge.com), with official OpenAPI specs for the **Basic Monitoring API** (every tier) and the **Advanced Monitoring API** (Business Pro and Enterprise).

The **SolarEdgeMonitoringApi** connector maps 23 MQTT topics onto that API: 17 Basic Monitoring events and 6 Advanced Monitoring events. Typical uses are putting PV production, self-consumption and battery state of charge on the broker next to plant data, feeding energy KPIs (specific yield, performance ratio) to dashboards, and turning SolarEdge alerts into broker alarms. Each event publishes the SolarEdge reply on `<topic>/response`.

| Event | Topic | Request | Use |
| - | - | - | - |
| `ListSites` | `energy/solaredge/site/list` | `GET /v2/sites?{query}` | Sites of your account, sub-accounts and associated accounts (API key only), e.g. query page=1\&sites-in-page=100 or name=Porto |
| `GetSite` | `energy/solaredge/site/get` | `GET /v2/sites/{id}` | Site metadata: name, peak power, installation date, location, time zone, activation status |
| `GetSiteOverview` | `energy/solaredge/site-overview/get` | `GET /v2/sites/{id}/overview?{query}` | Production and consumption for a window, split by destination / source (default: midnight today until now); query from=\&to= or "" |
| `GetSitePerformance` | `energy/solaredge/site-performance/get` | `GET /v2/sites/{id}/overview/performance?{query}` | Specific yield (kWh/kWp) and performance ratio for a window |
| `GetSitePower` | `energy/solaredge/site-power/get` | `GET /v2/sites/{id}/power?{query}` | Site PV power series, resolution QUARTER\_HOUR (max 12 h) or HOUR (max 24 h), unit W/KW/MW |
| `GetSiteEnergy` | `energy/solaredge/site-energy/get` | `GET /v2/sites/{id}/energy?{query}` | Site PV energy series, resolution QUARTER\_HOUR..YEAR or TOTAL (lifetime with from=installation date), unit WH/KWH/MWH |
| `GetSiteEnvironmentalBenefits` | `energy/solaredge/site-environmental-benefits/get` | `GET /v2/sites/{id}/environmental-benefits?{query}` | Lifetime CO2 avoided and EV miles; query unit=METRIC/IMPERIAL or "" |
| `ListFleetAlerts` | `energy/solaredge/fleet-alert/list` | `GET /v2/alerts?{query}` | Alerts across the fleet (API key only), e.g. query only-open=true\&alerts-in-page=100 |
| `ListSiteAlerts` | `energy/solaredge/site-alert/list` | `GET /v2/sites/{id}/alerts?{query}` | Alerts of one site, e.g. query only-open=true |
| `ListSiteDevices` | `energy/solaredge/device/list` | `GET /v2/sites/{id}/devices?{query}` | Device inventory (default INVERTER only), e.g. query types=INVERTER\&types=METER\&types=BATTERY; gives the serials for telemetry |
| `GetDevice` | `energy/solaredge/device/get` | `GET /v2/sites/{id}/devices/{serial}` | One device: manufacturer, model, firmware, communication status |
| `GetSiteInverterTelemetry` | `energy/solaredge/site-inverter-telemetry/get` | `GET /v2/sites/{id}/inverters/telemetry?{query}` | All active inverters: power, energy, consumedAcPower/Energy, voltage, current, frequency |
| `GetInverterTelemetry` | `energy/solaredge/inverter-telemetry/get` | `GET /v2/sites/{id}/inverters/{serial}/telemetry?{query}` | Inverter telemetry for specific serials (comma-separated) |
| `GetSiteMeterTelemetry` | `energy/solaredge/site-meter-telemetry/get` | `GET /v2/sites/{id}/meters/telemetry?{query}` | All active meters: production, consumption, import, export power and energy |
| `GetMeterTelemetry` | `energy/solaredge/meter-telemetry/get` | `GET /v2/sites/{id}/meters/{serial}/telemetry?{query}` | Meter telemetry for specific serials (comma-separated) |
| `GetSiteStorageTelemetry` | `energy/solaredge/site-storage-telemetry/get` | `GET /v2/sites/{id}/storage/telemetry?{query}` | All active batteries: charge/discharge power and energy, stateOfEnergy (%), remainingEnergy |
| `GetStorageTelemetry` | `energy/solaredge/storage-telemetry/get` | `GET /v2/sites/{id}/storage/{serial}/telemetry?{query}` | Battery telemetry for specific serials (comma-separated) |
| `GetPowerPerDestination` | `energy/solaredge/power-per-destination/get` | `GET /v2/sites/{id}/power/per-destination?{query}` | Advanced (Business Pro / Enterprise): PV power split into self-consumption, storage, grid |
| `GetEnergyPerDestination` | `energy/solaredge/energy-per-destination/get` | `GET /v2/sites/{id}/energy/per-destination?{query}` | Advanced (Business Pro / Enterprise): PV energy split into self-consumption, storage, grid |
| `GetPowerFlow` | `energy/solaredge/power-flow/get` | `GET /v2/sites/{id}/power-flow` | Advanced: latest power-flow sample (PV, grid, storage, load and directions); refreshRate 300 when no live session |
| `StartLivePowerFlow` | `energy/solaredge/power-flow/start` | `POST /v2/sites/{id}/power-flow` | Advanced: start a 1-minute live power flow session (no body; docs say OAuth SITE\_DATA may be required) |
| `GetWeatherGuard` | `energy/solaredge/weather-guard/get` | `GET /v2/sites/{id}/weather-guard` | Advanced: whether Weather Guard storm mode is enabled (read-only) |
| `GetBackupReserve` | `energy/solaredge/backup-reserve/get` | `GET /v2/sites/{id}/backup-reserve` | Advanced: battery backup reserve (minimum state of charge kept for outages, read-only) |

The API is **read-only**. `StartLivePowerFlow` is the only `POST`. It starts a one-minute live power flow session and changes no site data. Weather Guard and backup reserve settings can only be read here; SolarEdge says changing them will be part of a separate Fleet Management API.

> [!TIP]
>
> For local, sub-minute inverter data without the cloud, read the inverter over Modbus TCP (SunSpec) with a native Modbus connector instead. This connector is for cloud fleet data.

## Prerequisites

* A **SolarEdge developer account** at [developer.solaredge.com](https://developer.solaredge.com). The Free tier starts automatically (2,000 credits per month, 10 calls per minute). Installer account admins can add developer access to their existing installer account.
* A **Fleet Access** application with its **App API Key**. Choose **My Fleet** for sites in your own installer account, or **External Fleet** to request access to another company's fleet through a consent link. The key is shown only once, and you set its expiry (3, 6 or 12 months, or a custom date).
* The **site id** of each site you want to read (from `site/list`) and, for device telemetry, the device serial numbers (from `device/list`).
* For the Advanced events: a **Business Pro** or **Enterprise** subscription. Lower tiers get `403`.
* Outbound HTTPS from the broker to `monitoringapi.solaredge.com`.

## Authentication

Every event sends `X-API-Key: {value.json.api_key}`. Store the App API Key as a Hub secret, for example `SOLAREDGE_API_KEY`, and read it with `GET SECRET` in the action that publishes to the connector. V2 does not accept the key as a URL parameter.

| Response | Meaning |
| - | - |
| `401` `{"error":"invalid_request","error_description":"The access token is missing"}` | No `X-API-Key` header |
| `401` `{"message":"Unauthorized"}` | The key is unknown, expired, revoked or regenerated |
| `403` | The key has no access to that site, or the event needs a higher tier |
| `429` with `retry-after` | Calls-per-minute limit reached; retry after the next minute starts |
| `429` `"Monthly credit limit reached."` (no `retry-after`) | Monthly credits used up; calls resume at the next billing cycle |

**Homeowner sites (Site Access, OAuth 2.0).** If the system owner, not your installer account, must grant access, SolarEdge uses an OAuth 2.0 authorization code flow (`https://connect.solaredge.com/authorize`, scopes `SITE_DATA` and `DEVICE_DATA`). Access tokens last 2 hours. To use OAuth, fork the connector and replace the `X-API-Key` header with `ADD "Authorization" "{value.json.authorization}"`, then publish `Bearer <access_token>` in the `authorization` field. Refresh tokens on your backend, because the refresh call needs the client secret. `site/list` and `fleet-alert/list` accept only the API key.

## Configuration

| Setting | Value |
| - | - |
| `BASE_ADDRESS` | `https://monitoringapi.solaredge.com` (endpoints carry `/v2`) |
| `USE_SSL` | `"true"` |
| `DEFAULT_CONTENT_TYPE` | `application/json` |
| Payload fields | `api_key`, `id` (SolarEdge site id), `serial` (device serial number; comma-separated serials for the `*-telemetry/get` events), `query` (pre-encoded query string, `""` for none) |

Query parameters:

| Parameter | Example | Notes |
| - | - | - |
| `from`, `to` | `from=2026-10-05T06:00:00Z&to=2026-10-05T18:00:00Z` | ISO 8601 date-times. Encode a `+` offset as `%2B`. Without them, the window is midnight today (site time) until now |
| `resolution` | `resolution=HOUR` | `QUARTER_HOUR` (default), `HOUR`, `DAY`, `WEEK`, `MONTH`, `YEAR`, `TOTAL`. Site power and power per destination accept only `QUARTER_HOUR` and `HOUR` |
| `unit` | `unit=KW`, `unit=KWH`, `unit=IMPERIAL` | Power `W`/`KW`/`MW`, energy `WH`/`KWH`/`MWH`, environmental benefits `METRIC`/`IMPERIAL` |
| `page`, `sites-in-page`, `alerts-in-page` | `page=2&sites-in-page=1000` | Sites: default 50, maximum 1,000. Alerts: default 50, maximum 100 |
| `only-open` | `only-open=true` | Alerts: only open alerts (default `true`) |
| `types` | `types=INVERTER&types=METER&types=BATTERY` | Device list filter. Default is `INVERTER` only. Other values: `BATTERY_MODULE`, `OPTIMIZER`, `EV_CHARGER`, `BUI`, `GATEWAY` |
| `name`, `group`, `state`, `city`, `type` | `name=Porto` | Site and alert filters |

Maximum window between `from` and `to`:

| Resolution | Maximum window |
| - | - |
| `QUARTER_HOUR` | 12 hours |
| `HOUR` | 24 hours |
| `DAY` | 1 month |
| `WEEK` | 1 year |
| `MONTH` | 3 years |
| `YEAR`, `TOTAL` | Unlimited (`TOTAL` returns one value; set `from` to the installation date for a lifetime total) |

A longer window returns `400` with an RFC 7807 problem body (`title`, `status`, `detail`). Time series come back as `{"period": {"from", "to"}, "unit", "resolution", "values": [{"timestamp", "value"}]}`, and each timestamp marks the start of its bucket.

## Basic Syntax

```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
# Coreflux REST_API template — SolarEdge Monitoring API V2 (PV, battery and meter monitoring):
#   list the sites of a fleet, read site metadata, overview, performance (specific yield / performance ratio), PV
#   power and energy time series and environmental benefits, read fleet and site alerts, discover devices (inverters,
#   meters, batteries, gateways, ...), pull bulk inverter / meter / storage telemetry, and (Advanced Monitoring tier)
#   read power / energy per destination, the live power flow (and start a 1-minute live session), Weather Guard and
#   battery backup reserve.
# Hugo catalog #176, Tier 2 (energy). Spec: official SolarEdge Basic Monitoring API + Advanced Monitoring API,
#   OpenAPI 3.0.1 (info.version 2.0.1) from the SolarEdge developer docs (api-docs.solaredge.com, Stoplight export,
#   fetched 2026-10-05; curated slim in openapi-cache/solaredge-monitoring-api.json). Credentials are placeholders
#   only.
# Docs: https://docs.coreflux.org/latest/lot-language/routes/rest-api-apps/solaredge-monitoring-api
#
# V1 vs V2: the legacy V1 Monitoring API (/site/{id}/..., ?api_key= in the URL) is planned to stop responding on
#   2026-11-03 (SolarEdge "Migrating from V1 to V2"). This route targets V2 only: host https://monitoringapi.solaredge.com,
#   every endpoint carries /v2, paths are plural (/sites/{id}/...). V1 keys do not work on V2.
# Auth (Fleet Access): X-API-Key: {value.json.api_key} on every call (App API Key from the developer console at
#   developer.solaredge.com, "My Fleet" or "External Fleet" application). Keep it in Hub secrets (suggested
#   SOLAREDGE_API_KEY) and map it into the payload with GET SECRET. The key is a header, never a URL parameter.
#   Missing key: 401 {"error":"invalid_request","error_description":"The access token is missing"}; unknown key:
#   401 {"message":"Unauthorized"}; no access to the site or tier too low: 403.
# Auth (Site Access, OAuth 2.0 for homeowner-consented sites): fork the route and replace the X-API-Key header with
#   ADD "Authorization" "{value.json.authorization}" ("Bearer <access_token>", 2 h lifetime, refresh server-side).
#   ListSites and ListFleetAlerts accept the API key only.
# Quotas: per developer account, tiered: Free 2,000 credits / month and 10 calls per minute (CPM); Business Starter 25,
#   Growth 50, Pro 100 CPM. Every call costs 1 credit. 429 with retry-after = CPM exceeded; 429 "Monthly credit limit
#   reached." (no retry-after) = credits exhausted. Telemetry arrives about every 5 minutes and the minimum resolution
#   is QUARTER_HOUR, so poll every 15 minutes or slower and prefer the bulk telemetry events.
# Queries: GET events take the pre-encoded query string in "query" ("" for none). Time windows use from= / to= as
#   ISO 8601 date-times (URL-encode "+" offsets as %2B, or use Z), resolution=QUARTER_HOUR|HOUR|DAY|WEEK|MONTH|YEAR|TOTAL
#   (power: QUARTER_HOUR|HOUR only) and unit= (W|KW|MW, WH|KWH|MWH, METRIC|IMPERIAL). Window limits: QUARTER_HOUR 12 h,
#   HOUR 24 h, DAY 1 month, WEEK 1 year, MONTH 3 years, YEAR / TOTAL unlimited; longer windows answer 400.
#   Lists: page= and sites-in-page= (default 50, max 1000) / alerts-in-page= (default 50, max 100), only-open=true|false.
# Writes: none. The Monitoring API is read-only. The only POST (StartLivePowerFlow) starts a 1-minute live power flow
#   session; it changes no data. Weather Guard / backup reserve changes belong to the forthcoming Fleet Management API.
# Advanced Monitoring events (power / energy per destination, power flow, Weather Guard, backup reserve) need the
#   Business Pro or Enterprise tier; lower tiers get 403.
# Responses: JSON. Time series: {"period": {"from", "to"}, "unit", "resolution", "values": [{"timestamp", "value"}]}.
#   Errors: RFC 7807 problem+json {"type", "title", "status", "detail", "traceId"?, "errors"?}.
#
# Payload fields: api_key, id (SolarEdge site id), serial (device serial number; comma-separated for the
#   *-telemetry/get events), query
#     GetSiteEnergy            id = "1148616", query = "from=2026-10-01T00:00:00Z&to=2026-10-05T00:00:00Z&resolution=DAY&unit=KWH"
#     GetSiteInverterTelemetry id = "1148616", query = "from=2026-10-05T06:00:00Z&to=2026-10-05T18:00:00Z&resolution=QUARTER_HOUR"
#     GetMeterTelemetry        id = "1148616", serial = "606001234", query = "resolution=HOUR"
#     ListSiteDevices          id = "1148616", query = "types=INVERTER&types=METER&types=BATTERY"
#     ListFleetAlerts          query = "only-open=true&alerts-in-page=100"

DEFINE ROUTE SolarEdgeMonitoringApi WITH TYPE REST_API
    ADD REST_API_CONFIG
        WITH BASE_ADDRESS "https://monitoringapi.solaredge.com"
        WITH ENABLE_CLIENT "true"
        WITH USE_SSL "true"
        WITH REQUEST_TIMEOUT '30'
        WITH DEFAULT_CONTENT_TYPE "application/json"
        # Smoke: ListSites (sites-in-page=1) -> GetSite -> GetSiteOverview -> GetSiteEnergy (DAY) -> ListSiteDevices -> GetSiteInverterTelemetry -> ListSiteAlerts.
    ADD EVENT ListSites
        WITH SOURCE_TOPIC "energy/solaredge/site/list"
        WITH DESTINATION_TOPIC "energy/solaredge/site/list/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetSite
        WITH SOURCE_TOPIC "energy/solaredge/site/get"
        WITH DESTINATION_TOPIC "energy/solaredge/site/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetSiteOverview
        WITH SOURCE_TOPIC "energy/solaredge/site-overview/get"
        WITH DESTINATION_TOPIC "energy/solaredge/site-overview/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/overview?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetSitePerformance
        WITH SOURCE_TOPIC "energy/solaredge/site-performance/get"
        WITH DESTINATION_TOPIC "energy/solaredge/site-performance/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/overview/performance?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetSitePower
        WITH SOURCE_TOPIC "energy/solaredge/site-power/get"
        WITH DESTINATION_TOPIC "energy/solaredge/site-power/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/power?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetSiteEnergy
        WITH SOURCE_TOPIC "energy/solaredge/site-energy/get"
        WITH DESTINATION_TOPIC "energy/solaredge/site-energy/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/energy?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetSiteEnvironmentalBenefits
        WITH SOURCE_TOPIC "energy/solaredge/site-environmental-benefits/get"
        WITH DESTINATION_TOPIC "energy/solaredge/site-environmental-benefits/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/environmental-benefits?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT ListFleetAlerts
        WITH SOURCE_TOPIC "energy/solaredge/fleet-alert/list"
        WITH DESTINATION_TOPIC "energy/solaredge/fleet-alert/list/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/alerts?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT ListSiteAlerts
        WITH SOURCE_TOPIC "energy/solaredge/site-alert/list"
        WITH DESTINATION_TOPIC "energy/solaredge/site-alert/list/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/alerts?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT ListSiteDevices
        WITH SOURCE_TOPIC "energy/solaredge/device/list"
        WITH DESTINATION_TOPIC "energy/solaredge/device/list/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/devices?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetDevice
        WITH SOURCE_TOPIC "energy/solaredge/device/get"
        WITH DESTINATION_TOPIC "energy/solaredge/device/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/devices/{value.json.serial}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetSiteInverterTelemetry
        WITH SOURCE_TOPIC "energy/solaredge/site-inverter-telemetry/get"
        WITH DESTINATION_TOPIC "energy/solaredge/site-inverter-telemetry/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/inverters/telemetry?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetInverterTelemetry
        WITH SOURCE_TOPIC "energy/solaredge/inverter-telemetry/get"
        WITH DESTINATION_TOPIC "energy/solaredge/inverter-telemetry/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/inverters/{value.json.serial}/telemetry?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetSiteMeterTelemetry
        WITH SOURCE_TOPIC "energy/solaredge/site-meter-telemetry/get"
        WITH DESTINATION_TOPIC "energy/solaredge/site-meter-telemetry/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/meters/telemetry?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetMeterTelemetry
        WITH SOURCE_TOPIC "energy/solaredge/meter-telemetry/get"
        WITH DESTINATION_TOPIC "energy/solaredge/meter-telemetry/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/meters/{value.json.serial}/telemetry?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetSiteStorageTelemetry
        WITH SOURCE_TOPIC "energy/solaredge/site-storage-telemetry/get"
        WITH DESTINATION_TOPIC "energy/solaredge/site-storage-telemetry/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/storage/telemetry?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetStorageTelemetry
        WITH SOURCE_TOPIC "energy/solaredge/storage-telemetry/get"
        WITH DESTINATION_TOPIC "energy/solaredge/storage-telemetry/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/storage/{value.json.serial}/telemetry?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetPowerPerDestination
        WITH SOURCE_TOPIC "energy/solaredge/power-per-destination/get"
        WITH DESTINATION_TOPIC "energy/solaredge/power-per-destination/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/power/per-destination?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetEnergyPerDestination
        WITH SOURCE_TOPIC "energy/solaredge/energy-per-destination/get"
        WITH DESTINATION_TOPIC "energy/solaredge/energy-per-destination/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/energy/per-destination?{value.json.query}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetPowerFlow
        WITH SOURCE_TOPIC "energy/solaredge/power-flow/get"
        WITH DESTINATION_TOPIC "energy/solaredge/power-flow/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/power-flow"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT StartLivePowerFlow
        WITH SOURCE_TOPIC "energy/solaredge/power-flow/start"
        WITH DESTINATION_TOPIC "energy/solaredge/power-flow/start/response"
        WITH METHOD "POST"
        WITH ENDPOINT "/v2/sites/{value.json.id}/power-flow"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
        WITH BODY ""
    ADD EVENT GetWeatherGuard
        WITH SOURCE_TOPIC "energy/solaredge/weather-guard/get"
        WITH DESTINATION_TOPIC "energy/solaredge/weather-guard/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/weather-guard"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
    ADD EVENT GetBackupReserve
        WITH SOURCE_TOPIC "energy/solaredge/backup-reserve/get"
        WITH DESTINATION_TOPIC "energy/solaredge/backup-reserve/get/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/v2/sites/{value.json.id}/backup-reserve"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "X-API-Key" "{value.json.api_key}"
            ADD "User-Agent" "Coreflux-Broker REST_API route (https://www.coreflux.org)"
```

## Examples

Publish directly to a connector topic:

```json theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
{"api_key": "<App API Key>", "id": "1148616", "query": "from=2026-10-01T00:00:00Z&to=2026-10-05T00:00:00Z&resolution=DAY&unit=KWH"}
```

to `energy/solaredge/site-energy/get`, then read `energy/solaredge/site-energy/get/response` for the daily PV energy of the last four days.

Actions that poll the connector on a schedule that fits the Free tier (one site):

```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
# Example actions for the SolarEdgeMonitoringApi route (docs page). Not part of the route template.
# Secret: SOLAREDGE_API_KEY = the Fleet Access App API Key from developer.solaredge.com (shown once; header X-API-Key).
# Site id 1148616 is the example id SolarEdge uses in its V2 docs. Replace it with your own (from site/list).
# Inline JSON object literals are not supported when publishing to a topic, so the request payload is a COLLAPSED
#   model sent with PUBLISH MODEL.
# Credit budget: the Free tier has 2,000 credits / month and 10 calls per minute. These four actions use about
#   744 + 372 + 248 + 124 = 1,488 credits / month for one site. Paid tiers allow faster polling.
# No from / to is sent, so each call covers midnight today (site time) until now. HOUR resolution keeps that window
#   inside the 24 h limit (QUARTER_HOUR is limited to 12 h).

DEFINE MODEL SolarEdgeRequest COLLAPSED
    ADD STRING "api_key"
    ADD STRING "id"
    ADD STRING "query"

DEFINE ACTION SolarEdgeOverviewHourly
ON EVERY 1 HOUR DO
    PUBLISH MODEL SolarEdgeRequest TO "energy/solaredge/site-overview/get" WITH
        api_key = (GET SECRET "SOLAREDGE_API_KEY")
        id = "1148616"
        query = ""

DEFINE ACTION SolarEdgeBatteryEvery2Hours
ON EVERY 2 HOURS DO
    PUBLISH MODEL SolarEdgeRequest TO "energy/solaredge/site-storage-telemetry/get" WITH
        api_key = (GET SECRET "SOLAREDGE_API_KEY")
        id = "1148616"
        query = "resolution=HOUR"

DEFINE ACTION SolarEdgeOpenAlertsEvery3Hours
ON EVERY 3 HOURS DO
    PUBLISH MODEL SolarEdgeRequest TO "energy/solaredge/site-alert/list" WITH
        api_key = (GET SECRET "SOLAREDGE_API_KEY")
        id = "1148616"
        query = "only-open=true&alerts-in-page=100"

DEFINE ACTION SolarEdgeInverterTelemetryEvery6Hours
ON EVERY 6 HOURS DO
    PUBLISH MODEL SolarEdgeRequest TO "energy/solaredge/site-inverter-telemetry/get" WITH
        api_key = (GET SECRET "SOLAREDGE_API_KEY")
        id = "1148616"
        query = "resolution=HOUR"
```

Restrict who can publish to `energy/solaredge/#` with a rule, because these payloads carry the API key.

## Quotas and polling

| Tier | Credits / month | Calls / minute |
| - | - | - |
| Free | 2,000 | 10 |
| Business Starter | 20,000 | 25 |
| Business Growth | 100,000 | 50 |
| Business Pro | 400,000 | 100 |
| Enterprise | Custom | Custom |

Every call costs 1 credit. Credits and the calls-per-minute limit are shared by every application in your developer account. Device telemetry arrives about every 5 minutes, the finest resolution is 15 minutes, and SolarEdge refreshes the site overview about every 15 minutes. Polling faster than every 15 minutes only spends credits. Prefer the bulk `*-telemetry/get` events over many single calls: one call returns a whole window for every device of a type. Pricing is from the SolarEdge tiers page and may change; the developer console has the current values.

## Coming from V1

| V1 (catalog hint) | V2 event |
| - | - |
| `GET /site/{id}/overview?api_key=` | `GetSiteOverview` (new shape; lifetime energy moved to `GetSiteEnergy` with `resolution=TOTAL`) |
| `GET /site/{id}/powerDetails`, `/energyDetails`, `/meters` | `GetSiteMeterTelemetry` / `GetMeterTelemetry` |
| `GET /site/{id}/currentPowerFlow` | `GetPowerFlow` (Advanced tier only) |
| `GET /equipment/{siteId}/{serial}/data` | `GetSiteInverterTelemetry` / `GetInverterTelemetry` |
| `GET /site/{id}/storageData` | `GetSiteStorageTelemetry` / `GetStorageTelemetry` |
| `GET /sites/list`, `/site/{id}/details`, `/site/{id}/inventory` | `ListSites`, `GetSite`, `ListSiteDevices` |

V2 renames `startTime`/`endTime`/`startDate`/`endDate` to `from`/`to`, and `timeUnit` to `resolution`. Bulk multi-site paths (`/sites/1,4/...`) are gone, so call each site separately. V2 inverter telemetry has no per-phase values, DC voltage, temperature or inverter mode, and storage telemetry has no battery temperature or numeric battery state. Use the alert events for fault detection.

## Notes

* **Live power flow:** `GetPowerFlow` returns the last sample (`refreshRate` 300 seconds) unless a live session is active. `StartLivePowerFlow` starts a session that lasts one minute. It needs a supported firmware version and an Ethernet, Wi-Fi or LTE (US only) connection. SolarEdge's reference says this call may need an OAuth token with `SITE_DATA`.
* **Display rules:** SolarEdge's API terms ask apps that display this data to show the SolarEdge logo, linked to solaredge.com.
* **Key rotation:** regenerating an App API Key invalidates the old key at once. Update the Hub secret right after you regenerate it.
* Errors come back on the response topic: `400` invalid parameter or window, `401` missing or bad key, `403` no access or tier too low, `404` unknown site or device, `429` rate or credit limit.

## Testing

The connector passes static checks against the official V2 OpenAPI specs and a local contract mock that covers all 23 events. It was also probed against the real API without a valid key. Every event returns `401 Unauthorized` for a fake `X-API-Key`. The gateway checks the key before it looks at the path, so these probes confirm the host and the auth scheme, not each path. A live run needs a SolarEdge App API Key (see the factory `TEST.md`).

## Not covered

The 21 per-metric endpoints (for example `/inverters/{serial}/voltage` or `/storage/{serial}/state-of-energy`). The bulk telemetry events return the same metrics in one call. Also not covered: the OAuth token exchange (run it on your backend), the legacy V1 API, and the forthcoming Fleet Management API.

## Related

* [REST API Connectors](/latest/lot-language/routes/rest-api-routes)
* [REST API app templates](/latest/lot-language/routes/rest-api-apps/index)
* [ENTSO-E Transparency Platform](/latest/lot-language/routes/rest-api-apps/entso-e-transparency-platform)
* [Open-Meteo](/latest/lot-language/routes/rest-api-apps/open-meteo)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.