Solprognose
Solinnstråling (GHI) og PV-produksjon time for time, 60 timer frem, for ethvert punkt eller anlegg i Norge. Bulk for inntil 50 anlegg, utvidet prognose til 10 døgn, satellittbasert nowcast og metadata om siste syklus.
- GET /api/forecast
- POST /api/forecast
- POST /api/forecast/bulk
- GET /api/forecast/extended
- GET /api/forecast/nowcast
- GET /api/forecast/latest
- GET /api/sites
Hva du får
Prognosen er EnergiSmarts egen modell for solinnstråling (V2.3b): modellen regnes i 1 km, API-et serverer verdier fra et rutenett på 0,03° (om lag 3 km × 1,7 km) for hele fastlands-Norge, ny syklus hver time, om lag 60 timer frem (59 til 67 tidssteg). Sender du inn anleggets takflater, regner API-et også ut produksjonen per time (DISC-dekomponering og Klucher-transposisjon, temperaturkorreksjon og systemvirkningsgrad; med precise=true brukes pvlib med Perez-modellen). Det samme datagrunnlaget driver sanntidskartet på forsiden.
Nøkkel er valgfri: uten nøkkel får du 24 forespørsler og ett anlegg per døgn fra din IP-adresse. Se autentisering og kvoter.
GET /api/forecast: innstråling for et punkt
curl "https://api.solkart.no/api/forecast?lat=59.19&lon=10.90" \
-H "X-API-Key: $SOLKART_API_KEY"
| Parameter | Type | Påkrevd | Standard | Beskrivelse |
|---|---|---|---|---|
lat, lon |
tall | ja | WGS84, 57 til 72° N, 4 til 32° Ø | |
daily |
true |
nei | av | Serie fra midnatt UTC i stedet for fra siste syklus. Basic eller høyere. |
snow |
1 |
nei | av | Legg snøtapsfaktorer fra seNorge på produksjonen (bare med arrays). |
precise |
true |
nei | av | Produksjon regnet i pvlib med PVGIS-horisont. Tregere, brukes til validering. |
model |
v23b | v1 |
nei | v23b |
v1 velger den utgående V1.5-modellen. Fases ut 19. november 2026. |
extended |
true |
nei | av | Videresender til /api/forecast/extended. |
site |
jegerveien |
nei | Forhåndsdefinert anlegg med takflater (se GET /api/sites). |
Svar 200:
{
"site": "59.19,10.90",
"latitude": 59.19,
"longitude": 10.9,
"grid_index": { "i_lat": 220, "i_lon": 538 },
"cycle_time": "2026-09-15T16:00:00Z",
"model": "production_v2_3b",
"data_mode": "v23b",
"peak_ghi_wm2": 449.1,
"daily_ghi_kwh_m2": 2.71,
"ghi_timeseries": [
{ "hour": 0, "timestamp": "2026-09-15T15:00:00Z", "ghi_wm2": 183.4 },
{ "hour": 1, "timestamp": "2026-09-15T16:00:00Z", "ghi_wm2": 96.2 },
{ "hour": 2, "timestamp": "2026-09-15T17:00:00Z", "ghi_wm2": 21.0 }
]
}
| Felt | Enhet | Beskrivelse |
|---|---|---|
cycle_time |
ISO 8601 UTC | Når prognosen ble kjørt. Ny hver time. |
model, data_mode |
Faktisk brukt modell og datamodus etter eventuell fall tilbake. Se versjonering. | |
grid_index |
Cellen i 1 km-rutenettet som ble brukt. | |
peak_ghi_wm2 |
W/m² | Høyeste timeverdi i serien. |
daily_ghi_kwh_m2 |
kWh/m² | Sum av GHI over hele serien (ikke bare første døgn). |
ghi_timeseries[].hour |
Indeks fra 0, ikke klokkeslett. | |
ghi_timeseries[].timestamp |
ISO 8601 UTC | Starten på timen verdien gjelder. |
ghi_timeseries[].ghi_wm2 |
W/m² | Middel global horisontal innstråling over timen. |
Tidsstempel
10:00:00Z betyr middelet over 10:00 til 11:00 UTC. Plott punktet midt i timen. Konvensjonen ble endret 7. september 2026; se konvensjoner.
POST /api/forecast: produksjon for ditt anlegg
Samme endepunkt med JSON-kropp. Legg til takflatene, så får du produksjon per flate og totalt.
curl -X POST https://api.solkart.no/api/forecast \
-H "Content-Type: application/json" \
-H "X-API-Key: $SOLKART_API_KEY" \
-d '{
"latitude": 59.19,
"longitude": 10.90,
"daily": true,
"performance_ratio": 0.9,
"arrays": [
{ "name": "Tak sør", "kwp": 8.0, "tilt_deg": 25, "azimuth_deg": 180 },
{ "name": "Tak øst", "kwp": 4.5, "tilt_deg": 10, "azimuth_deg": 90 }
]
}'
| Felt | Type | Påkrevd | Standard | Beskrivelse |
|---|---|---|---|---|
latitude, longitude |
tall | ja | Anleggets posisjon | |
arrays[] |
liste | for produksjon | Én oppføring per takflate eller streng | |
arrays[].name |
streng | ja | Brukes som feltnavn i svaret (<name>_W) |
|
arrays[].kwp |
tall | ja | Installert effekt. Summen per anlegg er begrenset av planen (25 kWp gratis, 150 Basic, 1 000 Pro). | |
arrays[].tilt_deg |
0 til 90 | ja | 0 = flatt, 90 = vegg | |
arrays[].azimuth_deg |
0 til 360 | ja | Kompass: 0 nord, 90 øst, 180 sør, 270 vest | |
performance_ratio |
0 til 1 | nei | 0,85 | Systemvirkningsgrad: inverter, kabling, smuss, tilgjengelighet |
temp_coeff_pmax |
tall | nei | −0,004 | Temperaturkoeffisient per °C |
altitude_m |
tall | nei | Høyde over havet; brukes bare med precise=true |
|
daily, snow, precise, model |
nei | Som for GET |
Svar 200 (utdrag):
{
"site": "59.19,10.90",
"cycle_time": "2026-09-15T16:00:00Z",
"model": "production_v2_3b",
"data_mode": "v23b_daily",
"peak_ghi_wm2": 449.1,
"daily_ghi_kwh_m2": 2.71,
"pv_system": {
"total_kwp": 12.5,
"arrays": [ { "name": "Tak sør", "kwp": 8.0, "tilt_deg": 25, "azimuth_deg": 180 }, { "name": "Tak øst", "kwp": 4.5, "tilt_deg": 10, "azimuth_deg": 90 } ],
"performance_ratio": 0.9,
"peak_power_w": 7412.5,
"total_production_kwh": 61.3,
"engine": "simplified (JS approximation)",
"horizon_applied": false
},
"pv_timeseries": [
{ "hour": 9, "timestamp": "2026-09-16T09:00:00Z", "ghi_wm2": 402.6,
"Tak sør_W": 4102.3, "Tak øst_W": 1811.9, "total_W": 5914.2, "total_kWh": 5.9142 }
]
}
| Felt | Enhet | Beskrivelse |
|---|---|---|
pv_system.peak_power_w |
W | Høyeste timeeffekt i serien |
pv_system.total_production_kwh |
kWh | Sum over hele serien (fra midnatt med daily) |
pv_system.engine |
simplified (JS approximation) som standard; pvlib (Perez transposition, …) med precise=true |
|
pv_timeseries[].<name>_W |
W | Effekt per takflate |
pv_timeseries[].total_W, total_kWh |
W, kWh | Sum for timen |
snow |
Med snow=1: snow_applied, reason (når ikke brukt), source, issued_utc, age_hours, kommune, kommune_distance_km, dates, geometry_note, arrays[].reference_geometry |
Med daily=true starter serien ved midnatt UTC, så du kan summere «hittil i dag» direkte. Snøfaktorer settes bare når snødata er ferske (snow_applied: false med reason ellers).
POST /api/forecast/bulk: mange anlegg i ett kall
Henter inntil 50 anlegg i én forespørsel. Antall per kall og kWp per anlegg begrenses av planen. Solkart bruker dette selv for alle 15 fylker.
curl -X POST https://api.solkart.no/api/forecast/bulk \
-H "Content-Type: application/json" \
-H "X-API-Key: $SOLKART_API_KEY" \
-d '{
"daily": true,
"performance_ratio": 0.9,
"systems": [
{ "id": "skole_a", "latitude": 59.91, "longitude": 10.75,
"arrays": [ { "name": "Tak", "kwp": 75, "tilt_deg": 15, "azimuth_deg": 180 } ] },
{ "id": "lager_b", "latitude": 60.39, "longitude": 5.32,
"arrays": [ { "name": "Tak", "kwp": 220, "tilt_deg": 5, "azimuth_deg": 180 } ] }
]
}'
systems[] tar id, latitude, longitude, arrays, og valgfritt performance_ratio og temp_coeff_pmax per anlegg. daily, snow, model og felles performance_ratio settes på toppnivå.
Svar 200:
{
"cycle_time": "2026-09-15T16:00:00Z",
"data_mode": "v23b_daily",
"snow": { "snow_applied": false, "reason": "snow_blob_unavailable" },
"results": {
"skole_a": { "latitude": 59.91, "longitude": 10.75,
"ghi_timeseries": [ "…" ], "pv_timeseries": [ "…" ],
"pv_system": { "total_kwp": 75, "peak_power_w": 41250.0, "total_production_kwh": 310.2 } },
"lager_b": { "error": "Location outside coverage" }
}
}
Anlegg utenfor dekning får error i sitt eget objekt; resten leveres. Svaret caches hos oss til neste syklus (Cache-Control: public, max-age=…, X-Solkart-Cache: HIT|MISS); kvoten trekkes likevel.
Feil: 400 ved manglende systems eller flere enn 50; 403 ved flere anlegg eller kWp enn planen tillater; 429 når anleggskvoten ikke rekker til alle nye koordinater. Da avvises hele kallet; quota viser hvor mange som ville fått plass, og rejected_coords hvilke. Del opp kallet, eller send bare koordinater du allerede har spurt om i dag.
GET /api/forecast/extended: ut til 10 døgn
Krever Basic eller høyere. De første om lag 60 timene kommer fra prognosemodellens V1.5-rutenett (model: production_v1); resten fra MET Locationforecast med skydekke og temperatur. Tar lat/lon eller samme JSON-kropp med anlegg som /api/forecast; daily, model og precise gjelder ikke her.
curl "https://api.solkart.no/api/forecast/extended?lat=59.19&lon=10.90" -H "X-API-Key: $SOLKART_API_KEY"
Svar 200 (utdrag):
{
"mode": "extended",
"total_hours": 232,
"met_nordic_hours": 58,
"locationforecast_hours": 174,
"peak_ghi_wm2": 512.3,
"total_ghi_kwh_m2": 24.6,
"timeseries": [
{ "timestamp": "2026-09-15T15:00:00Z", "ghi_wm2": 183.4, "source": "met_nordic_model" },
{ "timestamp": "2026-09-18T06:00:00Z", "ghi_wm2": 41.0, "cloud_fraction": 0.82, "temperature_c": 9.1, "source": "locationforecast" }
]
}
Timer med source: "locationforecast" bærer MET sine tidspunkt; behandle dem som timen som starter da. 502 når MET ikke svarer.
GET /api/forecast/nowcast: neste 0 til 3 timer
Satellittbasert nowcast fra EUMETSAT-bilder når de er ferske, ellers V2.3b for de samme timene.
curl "https://api.solkart.no/api/forecast/nowcast?lat=59.19&lon=10.90" -H "X-API-Key: $SOLKART_API_KEY"
| Felt | Beskrivelse |
|---|---|
source |
v7_eumetsat_nowcast eller v23b_fallback |
satellite_time, satellite_lag_min, sat_covered |
Bare ved satellitt: bildetidspunkt, alder i minutter, om punktet er dekket |
hours[] |
4 timer fra inneværende time: time (bin-start), ghi_wm2, v23b_ghi_wm2, og ved satellitt kt (klarhetsindeks) og clearsky_wm2 |
Cache-Control: public, max-age=120. 503 når ingen kilde er tilgjengelig.
GET /api/forecast/latest: metadata om siste syklus
Uten nøkkel og uten kvote. Bruk den til å vise «Prognose fra …» og til å oppdage nye sykluser før du henter for mange anlegg.
{
"cycle_time": "2026-09-15T16:00:00Z",
"model": "production_v1",
"n_times": 58,
"n_lat": 501,
"n_lon": 934,
"ghi_max": 449.07,
"timestamps": [ "2026-09-15T15:00:00.000Z", "2026-09-15T16:00:00.000Z", "…" ]
}
Metadataene gjelder V1.5-rutenettet (model: production_v1), så cycle_time kan avvike fra V2.3b-syklusen /api/forecast bruker; bruk cycle_time i selve prognosesvaret som fasit. n_lat og n_lon er rutenettets størrelse (501 × 934 celler). 503 hvis ingen prognose finnes.
GET /api/sites
Forhåndsdefinerte anlegg som kan brukes med ?site=. I dag ett: jegerveien (Fredrikstad) med sine takflater.
Eksempler i kode
const resp = await fetch("https://api.solkart.no/api/forecast", {
method: "POST",
headers: { "Content-Type": "application/json", "X-API-Key": process.env.SOLKART_API_KEY },
body: JSON.stringify({
latitude: 59.19, longitude: 10.90, daily: true,
arrays: [{ name: "Tak", kwp: 10, tilt_deg: 25, azimuth_deg: 180 }],
}),
});
if (!resp.ok) throw new Error((await resp.json()).error);
const data = await resp.json();
const kWhToday = data.pv_timeseries.reduce((s, e) => s + (e.total_kWh || 0), 0);
console.log(`Prognose fra ${data.cycle_time}: ${kWhToday.toFixed(1)} kWh i dag`);
import os, requests
resp = requests.post(
"https://api.solkart.no/api/forecast",
headers={"X-API-Key": os.environ["SOLKART_API_KEY"]},
json={"latitude": 59.19, "longitude": 10.90, "daily": True,
"arrays": [{"name": "Tak", "kwp": 10, "tilt_deg": 25, "azimuth_deg": 180}]},
timeout=15,
)
if resp.status_code != 200:
raise SystemExit(resp.json()["error"])
data = resp.json()
kwh_today = sum(e.get("total_kWh", 0) for e in data["pv_timeseries"])
print(f"Prognose fra {data['cycle_time']}: {kwh_today:.1f} kWh i dag")
Feil
| Status | error |
Årsak |
|---|---|---|
400 |
Location outside Norway coverage (57-72N, 4-32E) |
Koordinat utenfor dekning |
400 |
Invalid JSON body |
Kroppen kunne ikke tolkes; svaret inneholder example |
400 |
GET: provide ?lat=&lon= or ?site=jegerveien. … |
Manglende koordinat |
401 |
Invalid API key / Daglig forespørsels-grense … brukt opp |
Nøkkel eller kallkvote |
403 |
Extended forecast requires Basic tier or higher / Daily stitched forecast requires Basic tier or higher |
Plan |
403 |
Tier "free" tillater maks 25 kWp per anlegg … |
kWp over planens grense |
429 |
Daglig anlegg-kvote brukt opp. |
Anleggskvote; se quota |
503 |
No forecast data available … |
Prognosen mangler; prøv igjen om noen minutter |
Modellen bak
V2.3b er trent på 30 år med MET-kvalitetssikrede soldata (1991 til 2020) kombinert med MET Nordic-varselet og maskinlæring, og valideres daglig mot målestasjoner over hele landet. Prognosen er et estimat, ikke en måling. Se om oss.