---
title: "Forecast PV generation potential (Sugra derived)"
method: GET
path: "/api/v2/energy/pv"
tags: ["Energy"]
---

# Forecast PV generation potential (Sugra derived)

`GET /api/v2/energy/pv`

Forecast photovoltaic yield at any coordinate in the Caucasus region, computed by Sugra from the Sugra Earth forecast spine's shortwave radiation (GHI) and 2 m temperature via a clean-room irradiance-to-PV chain: NOAA/Spencer solar position, Erbs GHI->DNI/DHI decomposition, Hay-Davies plane-of-array transposition, Faiman cell temperature and a PVWatts derated DC + inverter-clipped AC model. Returns a 3-hourly per-kWp AC series to 48 h (with absolute kW/kWh when capacity_kwp is given) plus optional cross-check against observed SARAH-3 radiation. Regional (Caucasus) in v1 - worldwide forecast PV is pending dedicated compute. Modelled potential, not metered generation.

## Query parameters

- `lat` number, required — Latitude, decimal degrees (Caucasus box in v1).
- `lon` number, required — Longitude, decimal degrees (Caucasus box in v1).
- `tilt` number, nullable — Panel tilt from horizontal, degrees. Default = latitude tilt.
- `azimuth` number — Panel azimuth clockwise from north (180 = equator-facing/south).
- `capacity_kwp` number, nullable — Installed DC capacity, kWp. Absent -> per-kWp output only; present -> absolute kW/kWh too.
- `system_loss` number — Aggregate PVWatts system loss fraction (soiling/mismatch/wiring/availability).
- `tech` 'c_si' | 'cdte' | 'cigs'
- `temp_coeff` number, nullable — Explicit temperature coefficient of power (per K); overrides the tech default.
- `albedo` number — Ground albedo for the reflected plane-of-array term.
- `dc_ac_ratio` number — DC:AC ratio; AC is clipped at nameplate/dc_ac_ratio.
- `inverter_eff` number — Constant inverter efficiency.
- `lead_hours` integer — Forecast horizon in hours (3-hourly steps); capped at 48.
- `transposition` 'hay_davies' | 'isotropic'
- `cross_check` boolean — Join observed SARAH-3 daily-mean GHI at the node as a directional sanity ratio (adds the SARAH-3 attribution).

## Response `200`

Successful Response

- EnvelopePvFeed
  - `data` PvFeed, required
    - `location` DemandLocation, required
      - `requested` object, required — The requested {lat, lon}.
      - `tile` string, required — Spine tile id serving this coordinate.
    - `cycle` string, nullable — GFS cycle serving this forecast.
    - `series` PvLead[], required
      - `lead_hours` integer, required — Forecast lead time, hours from the model run.
      - `valid_time` string, nullable — Valid time of this 3-hourly forecast step (ISO 8601 UTC).
      - `ghi_wm2` number, nullable — Global horizontal irradiance used (GFS DSWRF de-averaged to a consistent 3-hourly window mean), W m-2. Null if the cell is masked.
      - `dni_wm2` number, nullable — Direct normal irradiance (Erbs), W m-2.
      - `dhi_wm2` number, nullable — Diffuse horizontal irradiance (Erbs), W m-2.
      - `poa_wm2` number, nullable — Plane-of-array irradiance on the panel, W m-2.
      - `cell_temp_c` number, nullable — Modelled cell temperature, Celsius.
      - `ac_w_per_kwp` number, nullable — Specific AC power, W per kWp installed.
      - `ac_kw` number, nullable — Absolute AC power for capacity_kwp, kW (null when capacity not given).
    - `totals` PvTotals, required
      - `kwh_per_kwp` number, required — Energy yield over the forecast horizon, kWh per kWp.
      - `kwh` number, nullable — Absolute energy for capacity_kwp, kWh (null when capacity not given).
      - `horizon_hours` integer, required — Forecast horizon actually served (hours), capped at 48.
    - `config` PvConfig, required
      - `tilt_deg` number, required — Panel tilt from horizontal (default = latitude tilt).
      - `azimuth_deg` number, required — Panel azimuth clockwise from north (180 = south).
      - `albedo` number, required
      - `system_loss` number, required — Aggregate PVWatts system loss fraction.
      - `temp_coeff` number, required — Temperature coefficient of power, per K.
      - `dc_ac_ratio` number, required
      - `inverter_eff` number, required
      - `decomposition` string, required
      - `transposition` string, required
      - `temp_model` string, required
    - `cross_check` PvCrossCheck
      - `observed_ghi_wm2` number, nullable — Observed SARAH-3 daily-mean GHI (SIS) at the node, W m-2.
      - `modelled_mean_ghi_wm2` number, nullable — Mean modelled daytime forecast GHI, W m-2.
      - `ratio` number, nullable — modelled / observed GHI - a directional sanity check, not a correction.
      - `note` string, required
    - `provenance` PvProvenance, required
      - `institution` string, required
      - `model` string, required
      - `grid` string, required
      - `run` string, nullable — Model run (cycle) time, ISO 8601 UTC.
      - `cycle` string, nullable — Compact cycle id YYYYMMDDHH.
    - `attribution` DemandAttribution, required
      - `attribution` DemandAttributionEntry[] — The Sugra-derived entry first (no sovereign shield), then each contributing base model.
        - `registry_key` string, required
        - `source_name` string, required
        - `licence` string, nullable
        - `citation` string, nullable
        - `disclaimer` string, required
      - `effective_reexport` string, required
    - `methodology` string, required
    - `disclaimer` string, required
  - `meta` SugraMeta, required — Metadata attached to every /api/v1/* response envelope.
    - `endpoint` string, required — Requested endpoint path.
    - `data_time` string, required — ISO 8601 UTC timestamp of the source data, not of the request.
    - `response_time` string, required — ISO 8601 UTC timestamp when this response was produced.
    - `provider` string, required — API name and version.
    - `source` string, nullable — Identifier of the primary upstream source used for this response.
    - `attribution` string, nullable — Human-readable attribution mandated by an upstream source (e.g. a securities regulator or self-regulatory organization). Present only on responses whose source requires the owner and source to be clearly identified. Do not remove or alter it when using the response.
    - `fallback_used` boolean, nullable — True when the primary source failed and a fallback produced the data.
    - `fallback_chain` string[], nullable — Ordered list of sources attempted, in the order they were tried.
    - `cached` boolean, nullable — True when this response was served from the internal cache.
    - `stale` boolean, nullable — True when the cached response was returned after the upstream rate-limited or errored. Clients can use this to detect degraded data.

## Other responses

- `401` — Missing or invalid `x-api-key` header. JSON body with a stable `code` distinguishing `missing_api_key` (no header sent) from `invalid_api_key` (header sent, key not accepted); any other 401 source carries the generic `unauthorized` with its detail as `reason`. Plus `hint`. `plan` is always null on 401 - an unauthenticated request has no plan; quota exhaustion is 429, not 401.
- `422` — Validation Error
- `429` — Daily rate limit exceeded. Check `X-RateLimit-Reset` for the next window.
- `503` — Upstream source is temporarily unavailable. Retry after a short delay.

---

[API](https://skmtc.net/sugra/apis/sugra-api.md) · [All operations](https://skmtc.net/sugra/apis/sugra-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/sugra/sugra-api/versions/4c4530760ba1/schema)
