# SolarEdge Monitoring API reference Local working reference for the SolarEdge Monitoring API. This file summarizes the official March 2026 documentation in a compact, implementation-oriented form. The [official PDF](https://knowledge-center.solaredge.com/sites/kc/files/se_monitoring_api.pdf) remains the authoritative source. ## Base URL and authentication ```text https://monitoringapi.solaredge.com ``` All requests use `GET` over HTTPS and pass the API key as the `api_key` query parameter: ```text GET /site/{siteId}/overview?api_key={apiKey} Accept: application/json ``` Only JSON is supported. CSV and XML support were removed in March 2026. The local server-side configuration is: ```dotenv SOLAREDGE_API_KEY=... SOLAREDGE_SITE_ID=... ``` Never expose the API key in browser code, an `EXPO_PUBLIC_` variable, logs, or a repository. SolarEdge recommends using a site-level key where possible and rotating keys periodically. ## Dates, time zones, encoding, and units - Date: `YYYY-MM-DD` - Date and time: `YYYY-MM-DD hh:mm:ss` - All dates and times use the site's local time zone. - URL query values, including spaces in date-times, must be URL encoded. - Text is UTF-8. - Physical measurements use metric units; temperatures are Celsius. - Common time units are `QUARTER_OF_AN_HOUR`, `HOUR`, `DAY`, `WEEK`, `MONTH`, and `YEAR`. Each endpoint defines which values it accepts. - A time-series value can be `null` or entirely absent when no measurement is available. ## Limits and errors SolarEdge uses standard HTTP status codes. | Status | Meaning | | --- | --- | | `403` | Invalid parameter range, endpoint-specific limit exceeded, or access to a requested site is forbidden. | | `404` | Resource does not exist. | | `429` | Daily request quota or concurrency limit exceeded. | Global limits from the March 2026 documentation: - 300 requests per account token. - 300 requests per specific site ID and source IP. - At most 3 concurrent API calls from the same source IP. - Bulk endpoints accept at most 100 comma-separated site IDs. - A bulk call consumes one quota unit for every site included in the call. The package client automatically limits itself to three concurrent requests. It does not track daily quotas or split date ranges automatically. ## Endpoint index `{siteIds}` means a comma-separated list of at most 100 site IDs. | Area | Endpoint | Typed client method | | --- | --- | --- | | Sites | `GET /sites/list` | `listSites()` | | Sites | `GET /site/{siteId}/details` | `getSiteDetails()` | | Sites | `GET /site/{siteId}/dataPeriod` | `getSiteDataPeriod()` | | Sites | `GET /sites/{siteIds}/dataPeriod` | Use `get()` | | Energy | `GET /site/{siteId}/energy` | `getSiteEnergy()` | | Energy | `GET /sites/{siteIds}/energy` | Use `get()` | | Energy | `GET /site/{siteId}/timeFrameEnergy` | Use `get()` | | Energy | `GET /sites/{siteIds}/timeFrameEnergy` | Use `get()` | | Power | `GET /site/{siteId}/power` | `getSitePower()` | | Power | `GET /sites/{siteIds}/power` | Use `get()` | | Overview | `GET /site/{siteId}/overview` | `getSiteOverview()` | | Overview | `GET /sites/{siteIds}/overview` | Use `get()` | | Meters | `GET /site/{siteId}/powerDetails` | `getSitePowerDetails()` | | Meters | `GET /site/{siteId}/energyDetails` | `getSiteEnergyDetails()` | | Flow | `GET /site/{siteId}/currentPowerFlow` | `getCurrentPowerFlow()` | | Storage | `GET /site/{siteId}/storageData` | Use `get()` | | Environment | `GET /site/{siteId}/envBenefits` | Use `get()` | | Equipment | `GET /equipment/{siteId}/list` | `listSiteEquipment()` | | Equipment | `GET /site/{siteId}/inventory` | `getSiteInventory()` | | Equipment | `GET /equipment/{siteId}/{serialNumber}/data` | Use `get()` | | Meters | `GET /site/{siteId}/meters` | Use `get()` | ## Site endpoints ### List sites ```text GET /sites/list ``` Returns sites available to an account-level key. A site-level key may not be able to use this endpoint meaningfully. | Parameter | Required | Default | Description | | --- | --- | --- | --- | | `size` | No | `100` | Page size, maximum 100. | | `startIndex` | No | `0` | Zero-based first result. | | `searchText` | No | - | Searches name, notes, address, city, zip, and country. Full-address search is no longer supported. | | `sortProperty` | No | - | `name`, `country`, `state`, `city`, `address`, `zip`, `status`, `peakPower`, `installationDate`, `amount`, or `maxSeverity`. | | `sortOrder` | No | `ASC` | `ASC` or `DESC`. | | `Status` | No | `Active,Pending` | `Active`, `Pending`, `Disabled`, or `All`. The parameter name begins with uppercase `S`. | Site objects can contain: - `id`, `accountId`, `name`, `status`, `type`, and `notes` - `peakPower`, `currency`, `installationDate`, and `ptoDate` - `location` with country, state, city, address, address2, zip, and time zone - `alertQuantity` and `alertSeverity` for account-level keys - `publicSettings` with public name and visibility - API-specific `uris` The PDF examples use `Sites.list`, while the live JSON API currently returns `sites.site`. The package follows the live response and exposes `{ count, site }`. ### Site details ```text GET /site/{siteId}/details ``` Returns one site object with the same core metadata as the site list. Response root: `details`. ### Site data period ```text GET /site/{siteId}/dataPeriod GET /sites/{siteIds}/dataPeriod ``` Returns the first and last available production timestamps. For a site that is not transmitting, `startDate` and `endDate` can be `null`. Single-site response root: ```json { "dataPeriod": { "startDate": "YYYY-MM-DD hh:mm:ss", "endDate": "YYYY-MM-DD hh:mm:ss" } } ``` The bulk response adds `count` and a `list` whose entries include `id`. ## Energy endpoints ### Energy time series ```text GET /site/{siteId}/energy GET /sites/{siteIds}/energy ``` | Parameter | Required | Description | | --- | --- | --- | | `startDate` | Yes | Start date in `YYYY-MM-DD`. | | `endDate` | Yes | End date in `YYYY-MM-DD`. | | `timeUnit` | No | Defaults to `DAY`; accepts `QUARTER_OF_AN_HOUR`, `HOUR`, `DAY`, `WEEK`, `MONTH`, or `YEAR`. | Limits: - `DAY`: at most one year. - `QUARTER_OF_AN_HOUR` or `HOUR`: at most one month. - The PDF does not state an additional range limit for week, month, or year. Response root `energy` contains `timeUnit`, `unit`, and `values`. Each value has `date` and a numeric or `null` `value`. The regular energy endpoint matches the Site Dashboard calculation. The bulk response adds `count` and a `list` of `{ id, values }`. ### Total energy for a date range ```text GET /site/{siteId}/timeFrameEnergy GET /sites/{siteIds}/timeFrameEnergy ``` | Parameter | Required | Description | | --- | --- | --- | | `startDate` | Yes | Start date in `YYYY-MM-DD`. | | `endDate` | Yes | End date in `YYYY-MM-DD`. | Maximum range: one year. Response root `timeFrameEnergy` contains `energy` and `unit`. The bulk response contains `unit`, `count`, and `{ id, energy }` entries. This endpoint reports on-grid energy. On storage or backup sites it may differ from the Site Dashboard; use `/energy` when dashboard-equivalent values are required. ### Detailed energy by meter ```text GET /site/{siteId}/energyDetails ``` | Parameter | Required | Description | | --- | --- | --- | | `startTime` | Yes | Start in site-local `YYYY-MM-DD hh:mm:ss`. | | `endTime` | Yes | End in site-local `YYYY-MM-DD hh:mm:ss`. | | `timeUnit` | No | Defaults to `DAY`; accepts all six common time units. | | `meters` | No | Comma-separated `PRODUCTION`, `CONSUMPTION`, `SELFCONSUMPTION`, `FEEDIN`, and/or `PURCHASED`. | Limits: - `QUARTER_OF_AN_HOUR` or `HOUR`: at most one month. - `DAY`: at most one year. - `WEEK`, `MONTH`, or `YEAR`: no documented period limit. Response root `energyDetails` contains `timeUnit`, `unit`, and `meters`. Each meter has `type` and `values`; a missing measurement may omit `value` entirely. ## Power endpoints ### Site power ```text GET /site/{siteId}/power GET /sites/{siteIds}/power ``` | Parameter | Required | Description | | --- | --- | --- | | `startTime` | Yes | Start in site-local `YYYY-MM-DD hh:mm:ss`. | | `endTime` | Yes | End in site-local `YYYY-MM-DD hh:mm:ss`. | Maximum range: one month. Resolution is 15 minutes. Response root `power` contains `timeUnit`, `unit`, and `values`. Missing values can be `null`. The bulk response adds `count` and a list of `{ id, values }`. ### Detailed power by meter ```text GET /site/{siteId}/powerDetails ``` | Parameter | Required | Description | | --- | --- | --- | | `startTime` | Yes | Start in site-local `YYYY-MM-DD hh:mm:ss`. | | `endTime` | Yes | End in site-local `YYYY-MM-DD hh:mm:ss`. | | `meters` | No | Comma-separated `PRODUCTION`, `CONSUMPTION`, `SELFCONSUMPTION`, `FEEDIN`, and/or `PURCHASED`. | Maximum range: one month. Response root `powerDetails` contains a fixed `QUARTER_OF_AN_HOUR` time unit, the measurement unit, and per-meter series. A missing measurement may omit `value` entirely. ## Overview and live power flow ### Site overview ```text GET /site/{siteId}/overview GET /sites/{siteIds}/overview ``` Response root `overview` contains: - `lastUpdateTime` - `currentPower.power` - `lastDayData.energy` - `lastMonthData.energy` - `lastYearData.energy` - `lifeTimeData.energy` and lifetime revenue - Revenue fields can also appear in the period summaries. The bulk response contains `count` and a list with `id` on every overview. ### Current power flow ```text GET /site/{siteId}/currentPowerFlow ``` If unsupported, the API may return an empty power-flow object. Otherwise, `siteCurrentPowerFlow` contains: - `unit` - `connections` entries with `from` and `to` - `GRID` and `LOAD` - Optional `PV` - Optional `STORAGE` Every component provides `status` (`Active`, `Idle`, or `Disabled`) and a positive `currentPower`. Direction comes from `connections`, not the sign. Storage can additionally provide `chargeLevel`, `critical`, and `timeLeft`. ## Storage data ```text GET /site/{siteId}/storageData ``` | Parameter | Required | Description | | --- | --- | --- | | `startTime` | Yes | Start in site-local `YYYY-MM-DD hh:mm:ss`. | | `endTime` | Yes | End in site-local `YYYY-MM-DD hh:mm:ss`. | | `serials` | No | Comma-separated battery serial numbers. Defaults to every battery at the site. | Maximum range: seven days. Response root `storageData` contains `batteryCount` and `batteries`. A battery contains `serialNumber`, `nameplate`, `modelNumber`, `telemetryCount`, and `telemetries`. Telemetry can include: - `timeStamp` - `power` (positive means charging, negative means discharging) - `batteryState`: `0` invalid, `1` standby, `2` thermal management, `3` enabled, `4` fault - Lifetime energy charged and discharged - Full-pack energy available - Internal temperature - AC grid charging energy - State of charge from 0 to 100 percent The documentation warns that some lifetime battery energy values are aggregated and can be incomplete when telemetry is missing. They are not revenue-grade. ## Environmental benefits ```text GET /site/{siteId}/envBenefits ``` | Parameter | Required | Description | | --- | --- | --- | | `systemUnits` | No | Case-sensitive `Metrics` or `Imperial`. | Response root `envBenefits` contains `gasEmissionSaved` (`units`, `co2`, `so2`, and `nox`), `treesPlanted`, and `lightBulbs`. ## Equipment endpoints ### Components list ```text GET /equipment/{siteId}/list ``` Returns inverters and SMIs with `name`, `manufacturer`, `model`, and `serialNumber`. The PDF example shows a top-level `list`; the live API currently wraps the result in `reporters` with `count` and `list`. The package follows the live response. ### Inventory ```text GET /site/{siteId}/inventory ``` Response root `Inventory` can contain arrays for: - `inverters` - `thirdPartyInverters` - `smiList` - `meters` - `sensors` - `gateways` - `batteries` Fields vary by device type. Common fields include names, manufacturer, model, serial number (`SN` or `serialNumber`), firmware versions, communication method, connected device serials, connected optimizer count, and battery nameplate capacity. ### Inverter technical data ```text GET /equipment/{siteId}/{serialNumber}/data ``` | Parameter | Required | Description | | --- | --- | --- | | `startTime` | Yes | Start in site-local `YYYY-MM-DD hh:mm:ss`. | | `endTime` | Yes | End in site-local `YYYY-MM-DD hh:mm:ss`. | Maximum range: seven days. Response root `data` contains `count` and inverter telemetry. Unsupported fields are omitted. Depending on inverter type and firmware, telemetry can contain: - Timestamp, inverter mode, and operation mode - Total active power, DC voltage, power limit, total energy, temperature, and ground-fault resistance - Per-phase current, voltage, frequency, apparent power, active power, reactive power, and power factor - Phase-to-neutral and phase-to-phase voltages where applicable Inverter modes include normal states such as off, sleeping, starting, MPPT, throttled, shutdown, fault, and standby, plus several locked states. Operation mode `0` is on-grid, `1` is off-grid using PV or battery, and `2` is off-grid with a generator present. ## Meter lifetime data ```text GET /site/{siteId}/meters ``` | Parameter | Required | Description | | --- | --- | --- | | `startTime` | Yes | Start in site-local `YYYY-MM-DD hh:mm:ss`. | | `endTime` | Yes | End in site-local `YYYY-MM-DD hh:mm:ss`. | | `timeUnit` | No | Defaults to `DAY`; accepts all six common time units. | | `meters` | No | Comma-separated `Production`, `Consumption`, `FeedIn`, and/or `Purchased`. | Response root `meterEnergyDetails` contains `timeUnit`, `unit`, and `meters`. Each meter includes `meterSerialNumber`, `connectedSolaredgeDeviceSN`, `model`, `meterType`, and lifetime-energy `values` by timestamp. ## Bulk endpoint behavior Bulk endpoints use comma-separated IDs directly in the path: ```text GET /sites/1,4,8/overview ``` - Maximum 100 site IDs. - Responses normally contain `count` and `list` inside the endpoint root. - Each list item includes the site `id`. - If the key lacks permission for any requested site, the entire request can fail with `403`. - Dates are interpreted in each site's own time zone. ## March 2026 removals and changes Do not build new integrations against these removed endpoints or capabilities: - Site Image - Installer Logo Image - Equipment Change Log - Account List - Sensor List and Sensor Data - API Versions: Current and Supported - CSV and XML response formats - `CreationTime` site-list sorting - Full-address matching in `searchText` ## Package usage ```ts import { createSolarEdgeClientFromEnv } from "@solar-dash/solaredgeapi"; const client = createSolarEdgeClientFromEnv(); const [overview, powerFlow] = await Promise.all([ client.getSiteOverview(), client.getCurrentPowerFlow(), ]); ``` For an endpoint without a typed method, use the authenticated generic reader: ```ts type EnvironmentalBenefitsResponse = { envBenefits: { gasEmissionSaved: { units: string; co2: number; so2: number; nox: number; }; treesPlanted: number; lightBulbs: number; }; }; const siteId = process.env.SOLAREDGE_SITE_ID; if (!siteId) { throw new Error("Missing SOLAREDGE_SITE_ID"); } const response = await client.get( `/site/${siteId}/envBenefits`, { systemUnits: "Metrics" }, ); ```