PVGIS: Photovoltaic Geographic Information System

API Release Notes

History of API changes, newest first.


· Breaking

POST body parameters, global coverage, 2025 data, typical meteorological year, and OpenAPI schemas

On 19 October 2026 the web API moves all POST parameters into the request body, extends spatial coverage to global land (including the Arctic and Antarctic) plus 25 km into the sea, adds 2025 to the available time period, introduces a typical meteorological year endpoint, and refreshes OpenAPI response schemas and examples.

1. POST parameters in the request body (Breaking!)

POST calculation endpoints no longer read input from the query string. Every parameter that used to be a query argument such as location, time window, surface, photovoltaic options and others, must be sent in the request body as form fields (multipart/form-data). A horizon profile file, is also a body part as before.

Query parameters on POST will not be applied! and clients that still call POST …?latitude=…&longitude=… will break. Field names are unchanged and match the GET query parameters; only the location in the HTTP request changes. This applies on all POST endpoints. See the OpenAPI schema for each operation’s requestBody.

GET endpoints are unaffected and still use query parameters. This follows the REST convention: GET keeps parameters on the URI; POST sends them in the request body.

2. Spatial coverage

The previous service envelope was roughly 75°N–60°S. Coverage now includes global land from 90°N to 90°S, plus 25 km into the sea from the coastline (ERA5, ERA5LandPlus, horizon profile etc).

Use the interactive coverage map to see where each irradiance source applies:

2.1 New polar region coverage

The following studies investigated air temperature, wind speed, downward longwave radiation (STRD), and downward shortwave radiation from ERA5 and ERA5-land and a summary is presented:

Average annual PV energy yield at the North Pole, 2014–2025
Image 1: Average annual PV energy yield over the Arctic, 2014–2025 (kWh). Polar stereographic map of the new Arctic coverage, including Greenland. The light-green circle marks the previous northern limit (75°N). Irradiance from ERA5.
Average annual PV energy yield at the South Pole, 2014–2025
Image 2: Average annual PV energy yield over the Antarctic, 2014–2025 (kWh). Polar stereographic map of the new Antarctic coverage, including the continent. The light-green circle marks the previous southern limit (60°S). Irradiance from ERA5.
Average annual global horizontal irradiance at the North Pole, 2014–2025
Image 3: Average annual global horizontal irradiance over the Arctic, 2014–2025 (kWh m⁻²) from ERA5. Polar stereographic map of the new Arctic coverage, including Greenland. The light-green circle marks the previous northern limit (75°N).
Average annual global horizontal irradiance at the South Pole, 2014–2025
Image 4: Average annual global horizontal irradiance over the Antarctic, 2014–2025 (kWh m⁻²) from ERA5. Polar stereographic map of the new Antarctic coverage, including the continent. The light-green circle marks the previous southern limit (60°S).

References

3. Time period 2014–2025

The service window now is 2014–2025 and start_time, end_time now accept timestamps through 31 December 2025.

4. Typical meteorological year (New feature!)

A typical meteorological year is now a first-class meteorological endpoint:

GET /api/v6/meteorological/typical-meteorological-year

The endpoint can return the assembled year in any of these formats:

Format How
JSON Default; typical-year series, source years per month, optional fingerprint and metadata
CSV csv query parameter; downloadable time series
EnergyPlus EPW epw query parameter
Plot ZIP plot_statistic (for example all, tmy, ECDFs)
QR image quick_response_code=Image

The default Finkelstein–Schafer method is ISO-15927-4-ECDF. Its weighting scheme is ISO-TMY (ISO 15927-4:2005). The same method also accepts Sandia (Hall, I. J., Prairie, R. R., Anderson, H. E., & Boes, E. C. (1978). Generation of Typical Meteorological Years for 26 SOLMET Stations. SAND78-1601. Albuquerque, NM: Sandia National Laboratories.) and NSRDB-TMY (Wilcox & Marion, 2008, Table 2-1).

Literature aliases follow Sun et al. (2020), Table 1. Each accepted name is the readable form of a bracket label in that table, for example Pusat2015 ([50]) and Lund1995Pissimanis1988 ([24,32]). The full list is in the OpenAPI schema.

finkelstein_schafer_method=PVGIS-legacy-sorted accepts PVGIS-legacy-ISO or PVGIS-legacy-PV. These follow PVGIS TMY version ≤ 5.3 (Huld et al., 2018).

References

5. OpenAPI schemas and examples

The schema for this API (this deployment) is:

Calculation endpoints now declare Pydantic response_model objects split by theme (performance, power, meteorological, position, surface, topography, coverage). Shared enums live in schemas/common.

200 examples in Swagger / ReDoc are generated from those models, including CSV examples, so the documented payload matches the schema. Error examples (400, 404, 422, 429, 500) are shared.

If you generate clients from OpenAPI, download the JSON above. JSON keys and CSV headers follow the 23 July 2026 snake_case / no-symbol convention; this release does not rename those keys again.

What does not change

What you should do

  1. Send POST inputs in the request body (form fields), not on the query string.
  2. Allow end_time through 2025 where your client validates the calendar.
  3. Point TMY integrations at /meteorological/typical-meteorological-year.
  4. Use polar ERA5 / ERA5-Land irradiance with caution.
  5. Refresh OpenAPI-based clients from the schema.

Effective date: 19 October 2026 (19/10/2026). Questions: JRC-PVGIS@ec.europa.eu.

· Breaking

Response keys and CSV headers

On 23 July 2026 the web API changes JSON keys and CSV column headers. Values and shapes stay the same; only key and header names do.

Old key names will not remain available. From that date, previous JSON keys and CSV headers are dropped with no backwards-compatibility window. Clients that still expect the old names will break.

JSON keys move to standardised consistent lowercase snake_case keys across the API responses. CSV headers keep readable names but drop symbols and emoji (for instance ⌁ Power → Power).

1. Top-level / envelope JSON keys

Before After Where
Metadata metadata Most calculation endpoints
Input query parameters input_query_parameters Inside metadata
QR quick_response_code Power / performance / optimisation
Results results Solar position overview
Statistics statistics Power / performance
Statistics for Surface N statistics_for_surface_n Multi-surface endpoints
Performance for Surface N performance_for_surface_n Multi-surface endpoints
Latitude / Longitude / Elevation latitude / longitude / elevation Topography JSON
Horizon Profile horizon_profile Horizon profile
horizon height horizon_height Nested under horizon profile
Optimal Surface Position optimal_surface_position Surface optimisation
Surface orientation / Surface tilt surface_orientation / surface_tilt Surface optimisation
Irradiance sources irradiance_sources Coverage · available sources
Features features Features endpoint
Conventions conventions Conventions endpoint

And more…

2. Nested payload fields (JSON)

Calculation responses no longer use display-name aliases with symbols (for example "Power ⌁", "Latitude ϕ", "Fingerprint 🆔"). Nested fields use the schema field names in snake_case. Representative renames:

Before (examples) After
Latitude ϕ / Longitude ϑ / Elevation 🏔 latitude / longitude / elevation
Surface Orientation ↻ / Surface Tilt ∡ surface_orientation / surface_tilt
Start time / End time / Frequency start_time / end_time / frequency
Fingerprint / Fingerprint 🆔 fingerprint
Power ⌁ / ⌁ Power photovoltaic_power
Power ⌁ without Loss photovoltaic_power_without_system_loss / power_without_system_loss
Energy 🔌 / 🔌 Energy energy
Temperature ℃ / 🌡 Temperature temperature
Wind Speed ㎧ / 🌬 Wind Speed wind_speed
Efficiency % / % Efficiency efficiency
System Efficiency % system_efficiency
Spectral effect ± / Spectral effect ± % spectral_effect / spectral_effect_percentage
Reflectivity Effect ⬒ % reflectivity_effect_percentage
Global ∡ / Direct ∡ / Diffuse ∡ / Reflected ∡ global_inclined_irradiance, direct_inclined_irradiance, …
Global ∡ ☉ (before reflectivity) and similar …_inclined_irradiance_before_reflectivity
Global ⭍ / Direct ⭍ / … (effective) effective_global_irradiance, effective_direct_irradiance, …
Direct Irradiance ⭳ / Diffuse ⭳ direct_horizontal_irradiance / diffuse_horizontal_irradiance
Incidence ⭸ / Altitude ⦩ / Azimuth + symbol incidence / altitude / azimuth
Shading 🮞 / In-shade 🮞 / Sun-Horizon ⛰ shading_algorithm / in_shade / sun_horizon_position
Peak Power / Technology / Mount type peak_power / technology / mount_type

The same rule applies across verbose levels: if a JSON key used to be an inconsistent label or carried a symbol, expect the snake_case field name from the OpenAPI schema instead.

3. Statistics object (JSON)

Before After
Yearly Average Energy yearly_average_energy
Monthly Energy Summary monthly_energy_summary
Yearly Average Global ∡ ☉ (and similar) yearly_average_global_inclined_irradiance_before_reflectivity
Monthly Global ∡ ☉ Summary monthly_global_inclined_irradiance_before_reflectivity_summary
Start / End / Count start / end / count
Minimum / Mean / Maximum / Sum minimum / mean / maximum / sum
25th Percentile percentile_25th
Median / Mode / Variance median / mode / variance
Standard deviation / std_dev standard_deviation
Time of Minimum / Index of Minimum time_of_minimum / index_of_minimum
Time of Maximum / Index of Maximum time_of_maximum / index_of_maximum
Hourly / grouped means labels means

4. CSV column headers (symbols removed)

CSV exports still use human-readable headers, but leading symbols and emoji are removed. Do not match on glyphs such as ⌁, 🔌, 🆔, ϕ, ∡, ☉, ⬇/⭳, %, 🮞, or 🌡.

Before (with symbol) After (plain name)
⌁ Power Power
⌁ Power without Loss Power without Loss
⌁ Power model Power model
🔌 Energy Energy
🆔 Fingerprint Fingerprint
ϕ Latitude / ϑ Longitude / 🏔 Elevation Latitude / Longitude / Elevation
⦩ Altitude / ⭮ Azimuth / ⭸ Incidence Altitude / Azimuth / Incidence
% Efficiency / % System Efficiency Efficiency / System Efficiency
🌡 Temperature / 🌬 Wind Speed Temperature / Wind Speed
⭳ Direct Horizontal Irradiance (and similar irradiance columns) Direct Horizontal Irradiance, …
∡ Global Inclined Irradiance / ∡ ☉ … Before Reflectivity Global Inclined Irradiance / … Before Reflectivity
⭍ Effective Global Irradiance (and other effective columns) Effective Global Irradiance, …
± Spectral Effect / ± % Spectral Effect Percentage Spectral Effect / Spectral Effect Percentage
🮞 Shading Shading

This affects power, performance, solar-position, surface-optimisation, and related CSV downloads. OpenAPI CSV examples follow the new headers.

For a column-by-column reference (positions, verbosity levels, old and new parameter names, and descriptions), see the explanatory notes to the PVGIS CSV output parameters.

What does not change

What you should do

  1. Update JSON clients to use snake_case keys.
  2. Update CSV parsers to match headers without symbols.

Effective date: 23 July 2026 (23/07/2026). Questions: JRC-PVGIS@ec.europa.eu.