'. Gyldige: …` / `confidence må være tmy\|mean\|p50\|p75\|p90\|p95` / `Ugyldig source/period/product. …` |
| `401` | `Daglig forespørsels-grense (2000/dag) brukt opp. …` |
| `404` | `Ingen TMY-celle innen ~6 km av punktet (utenfor fastlands-Norge-masken).` / `Produkt '' finnes ikke for denne cellen.` |
| `503` | `TMY-data ikke tilgjengelig (tile mangler i R2).` / `Langtidsmiddelet er ikke tilgjengelig for denne cellen.` (ved `confidence=mean`) |
## Datagrunnlag og metode
- **NORA3:** MET Norways reanalyse i 3 km, 1991 til 2025.
- **SunPoint:** EnergiSmarts solmodell i 1 km, 1991 til 2020, trent på MET-kvalitetssikrede stasjoner.
- **Ensemble** (`ens_tmy30`): vektet 40/60 per celle, deretter månedlig biaskorreksjon mot nærmeste pyranometerstasjoner.
- **Månedsvalg:** Finkelstein-Schafer-statistikk som i NREL TMY3, vekter GHI 0,5, DNI 0,25, lufttemperatur 0,15, duggpunkt 0,05, vind 0,05. DNI og DHI fra DIRINT.
Samme data i nettleseren: [solkart.no/tmy](/tmy).
---
# Snøtap for solceller
> Stedlige snø- og smusstap per måned for et solcelleanlegg, samme modell som NS 3031:2025-tabellene bygger på, kjørt med lokale seNorge-data for din helning og montasje. Pluss snødekning på panelet neste 10 døgn.
Kilde: https://solkart.no/api/dokumentasjon/snotap · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json
## Hva du får
NS 3031:2025 gir snøtap i tabell for 16 byer, bare for sørvendte tak, rundet opp til nærmeste 5 %. Dette endepunktet kjører den samme modellen (Marion/NREL snødekningsmodell med Øgaards norske koeffisienter, IFE/E-2024/005) på NVEs seNorge-serie for cellen din, med faktisk helning, orientering og montasje, og gir middel, median, P10 og P90 per måned. Modellen er validert mot IFE på månedsnivå (middelavvik 4,3 prosentpoeng).
Ingen nøkkel, ingen kvote.
## GET /api/snowsoiling/calc: tap per måned
```bash
curl "https://api.solkart.no/api/snowsoiling/calc?lat=59.91&lon=10.75&angle=30&aspect=0&mounting=roof"
```
| Parameter | Type | Standard | Beskrivelse |
|---|---|---|---|
| `lat`, `lon` | tall | påkrevd | 57 til 71,5° N, 4 til 31,5° Ø |
| `angle` | 0 til 90° | 30 | Helning |
| `aspect` | −180 til 180° | 0 | Asimut, 0 = sør, −90 = øst, +90 = vest |
| `mounting` | `roof` \| `rack` \| `flat` | `roof` | Skråtak, frittstående stativ, eller flatt tak med lav vinkel |
| `height_mm` | 0 til 5000 | 300 | Underkant modul over underlaget, brukes bare for `flat` |
| `strings` | 1 til 6 | 3 | Antall strenger i høyden; med `lossmode=strings` er en delvis dekket streng tapt |
| `lossmode` | `linear` \| `strings` | `linear` | Lineært tap med dekningsgrad, eller strengvis |
| `start` | 1957 til 2015 | 1991 | Første år i snøserien |
| `soiling` | 0 til 5 % | 1 | Smussgulv i snøfrie måneder |
| `format` | `json` \| `csv` | `json` | |
Svar `200` (ekte svar, Oslo sentrum, 30°, sør, skråtak; utdrag):
```json
{
"method": {
"model": "Marion/NREL snødekningsmodell med Øgaards norske koeffisienter (…)",
"reference": "IFE/E-2024/005 (Øgaard & Seiffert 2024) — samme metodikk som NS 3031:2025-tabellene, kjørt stedsspesifikt; …",
"data": "seNorge/NVE døgnserier (nysnødybde, snødybde, temperatur) 1991–nå for 1 km-cellen; POA fra SunPoint V6 TMY (ens_tmy30) for faktisk helning/asimut",
"note": "NS 3031:2025-tabellene gjelder kun sørvendte tak, i 5 %-trinn rundet OPP, for 16 byer; …"
},
"inputs": { "lat": 59.91, "lon": 10.75, "cell": { "id": "y0578x614", "altitude_m": 6, "snow_cell_offset_m": 0 },
"angle_deg": 30, "aspect_deg": 0, "mounting": "roof", "system_height_mm": null, "n_strings": 3,
"loss_mode": "linear", "series_start": 1991, "soiling_floor_pct": 1 },
"monthly": [
{ "month": 1, "n_years": 36, "snow_loss_pct_mean": 48.2, "snow_loss_pct_median": 50.5, "snow_loss_pct_p10": 6.3, "snow_loss_pct_p90": 94.5,
"loss_pct_incl_soiling": 48.2, "ns3031_style_pct": 50, "covered_days_mean": 15.8, "poa_month_kwh_m2": 18.6 },
{ "month": 3, "n_years": 36, "snow_loss_pct_mean": 27.6, "snow_loss_pct_median": 12.3, "snow_loss_pct_p10": 0, "snow_loss_pct_p90": 81,
"loss_pct_incl_soiling": 27.6, "ns3031_style_pct": 30, "covered_days_mean": 10.1, "poa_month_kwh_m2": 100.5 },
{ "month": 6, "n_years": 36, "snow_loss_pct_mean": 0, "snow_loss_pct_median": 0, "snow_loss_pct_p10": 0, "snow_loss_pct_p90": 0,
"loss_pct_incl_soiling": 1, "ns3031_style_pct": 1, "covered_days_mean": 0, "poa_month_kwh_m2": 182.7 },
{ "month": 12, "n_years": 35, "snow_loss_pct_mean": 33.9, "snow_loss_pct_median": 26.2, "snow_loss_pct_p10": 0, "snow_loss_pct_p90": 71.4,
"loss_pct_incl_soiling": 33.9, "ns3031_style_pct": 35, "covered_days_mean": 10, "poa_month_kwh_m2": 16.4 }
],
"annual": { "loss_pct_incl_soiling": 6.26, "lost_kwh_m2": 74.6, "poa_kwh_m2": 1192.6 },
"warnings": [ "Modellen dekker ikke snøfangere, skygge, varmelekkasje fra bygget eller fasade/vertikalmontasje — ingeniørmessig skjønn kreves (IFE/E-2024/005 kap. 5)." ]
}
```
| Felt | Enhet | Beskrivelse |
|---|---|---|
| `monthly[].snow_loss_pct_mean`, `_median`, `_p10`, `_p90` | % | Fordeling over årene i serien. P90 = tapet som overskrides i 10 % av årene (verste). |
| `monthly[].loss_pct_incl_soiling` | % | Snøtap med smussgulv lagt til i snøfrie måneder. Bruk denne i produksjonsberegningen. |
| `monthly[].ns3031_style_pct` | % | Samme verdi rundet opp til 5 %-trinn slik standardens tabeller er, for direkte sammenligning |
| `monthly[].covered_days_mean` | døgn | Middel antall døgn med snø på modulene |
| `monthly[].poa_month_kwh_m2` | kWh/m² | Innstråling i modulplanet, vekten tapet regnes mot |
| `annual.loss_pct_incl_soiling` | % | Årstap vektet med innstrålingen |
| `annual.lost_kwh_m2`, `poa_kwh_m2` | kWh/m² | Tapt og total innstråling per år |
`format=csv` gir månedstabellen som `sunpoint_snotap___deg.csv`. `Cache-Control: public, max-age=86400`; `X-Snowsoil-Cache: HIT` ved treff i vår 7-døgns cache.
## GET /api/snow/outlook: snø på panelet neste 10 døgn
Dag for dag: dekningsgrad og tap fra seNorge-observasjoner til i dag og seNorge-prognose 9 døgn frem. Ingen produksjonstall, fordi innstrålingsprognosen bare rekker 67 timer.
```bash
curl "https://api.solkart.no/api/snow/outlook?lat=59.91&lon=10.75&angle=30&mounting=roof"
```
| Parameter | Type | Standard | Beskrivelse |
|---|---|---|---|
| `lat`, `lon`, `angle`, `aspect`, `mounting`, `height_mm`, `lossmode` | | som over | |
| `burial_mm` | 0 til 10 000 | | Høyde på modulens overkant; snødybde over dette gir full dekning |
| `days` | 1 til 10 | 10 | Antall døgn fra i dag |
Svar `200` (utdrag):
```json
{
"cell_id": "y0578x614", "lat": 59.9105, "lon": 10.7687, "elevation_m": 61.3,
"query": { "lat": 59.91, "lon": 10.75, "cell_distance_km": 1.05 },
"system": { "angle_deg": 30, "aspect_deg": 0, "mounting": "roof", "height_mm": 300, "burial_mm": null, "loss_mode": "linear" },
"issued_utc": "2026-09-15T18:37:33.601Z",
"snow_year_start": "2026-09-01", "spinup_days": 14, "forecast_days_available": 9,
"days": [
{ "date": "2026-09-15", "is_forecast": false, "coverage": 0, "loss_pct": 0, "snow_depth_mm": 0, "new_snow_mm": 0, "temp_c": 14, "data_missing": false },
{ "date": "2026-09-16", "is_forecast": true, "coverage": 0, "loss_pct": 0, "snow_depth_mm": 0, "new_snow_mm": 0, "temp_c": 15, "data_missing": false }
],
"summary": { "snow_on_panel_today": false, "days_with_snow": 0, "max_loss_pct": 0, "clears_on": null },
"method": { "model": "…", "data": "…", "horizon": "seNorge gir 9 døgn prognose. …", "caveat": "Modellen er validert … på MÅNEDSNIVÅ (MAD 4,3 pp). Et enkelt døgn er nesten binært …" },
"warnings": []
}
```
`coverage` er 0 til 1, `loss_pct` prosent av dagens mulige produksjon. `summary.clears_on` er første dato modellen venter tomt panel, eller `null`. `Cache-Control: public, max-age=3600`; `X-Snow-Outlook-Cache: HIT|MISS`.
## Feil
| Status | `error` |
|---|---|
| `400` | `Ugyldige tall: angle 0-90, aspect -180..180, height_mm 0-5000, strings 1-6, start 1957-2015, soiling 0-5.` |
| `400` | `mounting må være roof\|rack\|flat` / `lossmode må være strings\|linear` / `format må være json\|csv` |
| `400` | Snøutsikt: `Ugyldige tall: angle 0-90, aspect -180..180, height_mm 0-5000, burial_mm 0-10000, days 1-10.` |
| `404` | `Ingen TMY-celle innen ~6 km av punktet (utenfor fastlands-Norge).` |
| `502` | `Kunne ikke hente seNorge-snødata (NVE): …` / snøutsikt: `Kunne ikke hente seNorge-snøprognose (NVE): …` |
| `503` | `TMY-data ikke tilgjengelig.` |
## Bruk i produksjonsberegning
[PV-kalkulatoren](/api/dokumentasjon/pv) tar `snowloss=1` og henter disse tapene selv. Regner du med [TMY](/api/dokumentasjon/tmy) og egen modell, multipliser månedens produksjon med `1 − loss_pct_incl_soiling/100`.
Samme beregning i nettleseren: [solkart.no/snotap](/snotap).
---
# Sol og horisont
> Horisontprofil i 720 retninger for et punkt i Norge, i tre nivåer: terreng fra DTM10 (gratis, uten nøkkel), fra takhøyde med nærfelt fra DOM 1 m, og presis analyse med skyggetap, PDF og CSV. Eksport til PVsyst, PV*SOL, SAM, HelioScope og Meteonorm.
Kilde: https://solkart.no/api/dokumentasjon/horisont · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json
## Tre nivåer
| Nivå | Endepunkt | Grunnlag | Bruk | Tilgang |
|---|---|---|---|---|
| 1 Terreng | `GET /api/horizon/terrain` | Kartverket DTM10, forhåndsberegnet for hele landet | Fjell og åser; input til PVGIS-lignende beregninger | Åpent, ingen kvote |
| 2 Tak | `POST /api/horizon/rooftop` | DOM 1 m (bygninger og trær) i nærfeltet, DTM10 utenfor | Horisont sett fra et tak, med nabobygg | Åpent i pilot, 5/s og 300/time per IP |
| 3 Presis | `POST /api/horizon/precise` | Som nivå 2, pluss skyggetap for en panelflate, PDF og CSV | Dokumentasjon i prosjektering | Åpent i pilot, 1/s og 30/time per IP |
Alle svarer med 720 asimutpunkter (0 til 359,5° med 0,5° oppløsning, 0 = nord, med klokka) og horisonthøyde i grader over horisontalplanet.
## GET /api/horizon/terrain
```bash
curl "https://api.solkart.no/api/horizon/terrain?lat=59.91&lon=10.75"
```
| Parameter | Standard | Beskrivelse |
|---|---|---|
| `lat`, `lon` | påkrevd | 57 til 72° N, 4 til 32° Ø |
| `format` | `json` | `json`, `binary`, `csv`, `pvsyst`, `pvsol`, `sam`, `helioscope`, `meteonorm`, `geojson` |
Svar `200` (ekte svar, Oslo sentrum; forkortet):
```json
{
"lat": 59.91, "lon": 10.75,
"tile_key": "599_107", "dtm_year": "2026",
"api_tier": "terrain", "version": "v3.1",
"n_azimuth": 720,
"azimuth_deg": [0, 0.5, 1, 1.5, "…"],
"elevation_deg": [1.99, 2.03, 1.97, 2.04, "…"],
"dtm_ground_z_m": null
}
```
`format=binary` gir 1440 byte: 720 verdier som little-endian float16, for innbygging i egne verktøy. Eksportformatene leveres som fil (`Content-Disposition: inline; filename="tier1_horizon___."`) i formatet verktøyet importerer direkte: PVsyst «Horizon file», PV*SOL, SAM «shading file», HelioScope, Meteonorm.
Hoder: `Cache-Control: public, max-age=86400`, `X-Horizon-Tile-Key`, `X-DTM-Year`, `X-Api-Tier: terrain`, `X-Api-Version: v3.1`.
Feil: `400` `lat og lon må være tall (grader, WGS84).` / `(lat, lon) er utenfor Norge-bbox [57, 72] × [4, 32].` / `format må være én av: …`; `404` `Ingen terrain-tile for …` (punktet er innenfor boksen, men utenfor rutenettet, typisk hav).
## POST /api/horizon/rooftop
Horisont fra et punkt over bakken, med bygninger og vegetasjon fra DOM 1 m i nærfeltet.
```bash
curl -X POST https://api.solkart.no/api/horizon/rooftop \
-H "Content-Type: application/json" \
-d '{"lat": 59.2185, "lon": 10.9298, "observer_height_m": 6.5}'
```
| Felt | Type | Standard | Beskrivelse |
|---|---|---|---|
| `lat`, `lon` | tall | påkrevd | 57 til 72 / 4 til 32 |
| `observer_height_m` | 0 til 50 | 3,0 | Observatørens høyde over terrenget (DTM), typisk takhøyde pluss 1 m |
| `observer_z_masl` | −50 til 3000 | | Absolutt høyde over havet; overstyrer `observer_height_m` |
| `include_tier1` | boolean | `true` | Fyll inn fjernhorisont fra nivå 1 utenfor DOM-dekningen |
`?format=` som nivå 1, unntatt `binary`.
Svar `200`:
```json
{
"azimuth_deg": ["…720"], "elevation_deg": ["…720"],
"tier1_used": true,
"near_horizon_only": ["…720 grader"],
"dtm_ground_z_m": 12.4,
"observer_height_above_dtm_m": 6.5,
"observer_z_masl": 18.9,
"dom_year": "2023", "dtm_year": "2026",
"api_tier": "rooftop", "version": "v3.1",
"compute_ms": 2140
}
```
`near_horizon_only[i]` er horisonthøyden i grader fra nærfeltet alene (DOM, uten fjernhorisont fra nivå 1), så du kan se hvor mye nabobygg og vegetasjon bidrar i hver retning. Hoder: `X-Worker-Request-Id`, `X-API-Tier: rooftop`, `X-Quota-Remaining`.
Feil (`code`): `400 INVALID_INPUT` med presis melding (`Felt 'lat' må være et tall.`, `observer_height_m= er utenfor [0, 50] m.`, `format=binary er kun støttet på Tier 1 …`); `405 METHOD_NOT_ALLOWED`; `429 RATE_LIMITED` med `Retry-After`; `502 BACKEND_ERROR`; `504 BACKEND_TIMEOUT` (10 s).
## POST /api/horizon/precise
Synkron, 3 til 15 s. Gir i tillegg skyggetap for en panelflate og lenker til PDF og CSV som er gyldige en begrenset tid.
```bash
curl -X POST https://api.solkart.no/api/horizon/precise \
-H "Content-Type: application/json" \
-d '{"lat": 59.2185, "lon": 10.9298, "observer_height_m": 6.5, "panel_az_deg": 180, "panel_tilt_deg": 25}'
```
| Felt | Type | Standard | Beskrivelse |
|---|---|---|---|
| `lat`, `lon`, `observer_height_m`, `observer_z_masl` | | som nivå 2 | |
| `panel_az_deg` | 0 til 360 | | Panelets asimut, 0 = nord |
| `panel_tilt_deg` | 0 til 90 | | Panelets helning |
| `email` | streng | | Mottaker av rapporten (valgfritt) |
Svar `200` (utdrag):
```json
{
"job_id": "9c1e…",
"azimuth_deg": ["…720"], "elevation_deg": ["…720"], "n_azimuth": 720,
"dtm_ground_z_m": 12.4, "observer_height_above_dtm_m": 6.5, "observer_z_masl": 18.9,
"annual_yield_reduction_pct": 3.8,
"shaded_daylight_hours_pct": 9.1,
"annual_shade_hours": 412,
"near_field_objects": [ { "azimuth_deg": 214, "elevation_deg": 18.5, "distance_m": 14.2, "height_above_module_m": 4.1, "kind": "building", "shading_impact_score": 0.42 } ],
"pdf_url": "https://…", "csv_url": "https://…", "expires_at": "2026-09-16T18:40:00Z",
"is_stub": false,
"dom_year": "2023", "dtm_year": "2026", "api_tier": "precise", "version": "v3.1", "compute_ms": 8400
}
```
| Felt | Enhet | Beskrivelse |
|---|---|---|
| `annual_yield_reduction_pct` | % | Årlig produksjonstap fra horisontskygge for den oppgitte panelflaten |
| `shaded_daylight_hours_pct` | % | Andel av dagslystimene der sola står under horisonten |
| `annual_shade_hours` | timer/år | Timer med skygge |
| `near_field_objects[]` | | Objekter i nærfeltet som gir skygge, med retning, avstand og påvirkning |
| `pdf_url`, `csv_url`, `expires_at` | | Signerte lenker som varer i 7 døgn; last ned før `expires_at` |
Ved andre formater enn JSON ligger `X-Precise-Pdf-Url`, `X-Precise-Csv-Url` og `X-Precise-Job-Id` i hodene. Feilene er som for nivå 2 (tidsavbrudd 60 s i stedet for 10 s), med i tillegg `Felt 'email' ser ikke ut til å være en gyldig e-postadresse.` og `panel_tilt_deg= er utenfor [0, 90].`.
## Bruk horisonten i egne beregninger
- **PVGIS:** PVGIS tar horisonten som en liste med høyder per asimut; bruk `elevation_deg` direkte (PVGIS forventer 0 = nord, med klokka, som her), eventuelt tynnet til 48 punkter.
- **pvlib:** `pvlib.shading` og `irradiance.get_total_irradiance` kan ta horisontprofilen; interpoler `elevation_deg` på solens asimut per time og sett direkte innstråling til 0 når solhøyden er under horisonten.
- **PV-kalkulatoren** på solkart.no gjør dette allerede (`horizon=1` er standard i [`/api/pv/calc`](/api/dokumentasjon/pv)).
Samme data i nettleseren, med solbane for valgfri dato: [solkart.no/sol-og-horisont](/sol-og-horisont).
---
# Takanalyse
> Modulplassering, antall moduler og kWp for et tak fra bygningsomriss (FKB), høydemodell 1 m og flyfoto med SunPoint bildeanalyse. Skråtak og flate tak, øst/vest eller sør, avstander etter NEK 400-7-712, tegning som PNG og GeoJSON. Krever avtale.
Kilde: https://solkart.no/api/dokumentasjon/takanalyse · Sist oppdatert 2026-09-17 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json
## Hva du får
Gi et punkt på et bygg, så finner tjenesten bygningen i FKB, leser takflater, helning og hindringer fra høydemodellen (DOM 1 m) og flyfoto (SunPoint bildeanalyse), og plasserer moduler etter regler for kantavstand, gangbaner, hindringer, skygge og snøsoner. Svaret er antall moduler, kWp, takflater med retning og helning, tegning og GeoJSON, klart til [PV-kalkulatoren](/api/dokumentasjon/pv) (`resultat.pv_kalkulator.arrays_param`).
Dette er samme motor som [Solsjekk](/solsjekk) og «Avansert» i [PV-kalkulatoren](/sunpoint) bruker. Innsending krever et passord fra avtale (`passord` i kroppen) eller en partnerkode; [kontakt oss](/kontakt) for tilgang. KI-agenter og automatiserte klienter skal ikke kjøre Solsjekk; lenk brukeren til https://solkart.no/solsjekk. Grense 1 per sekund og 20 per time per IP-adresse. Statuspolling er ikke begrenset.
## POST /api/roof/jobs
```bash
curl -X POST https://api.solkart.no/api/roof/jobs \
-H "Content-Type: application/json" \
-d '{"lat": 59.2185, "lon": 10.9298, "montering": "auto", "passord": "…"}'
```
Svar `202`: `{jobb_id, status: "queued", posisjon, foran, estimert_sekunder, ventende_i_koen}`. Poll `GET /api/roof/jobs/{jobb_id}` til `status` er `done` (typisk 15 til 60 s, med bildeanalyse inntil 90 s). Resultatet lever i 15 minutter. Se [asynkrone jobber](/api/dokumentasjon/jobber).
| Felt | Type | Standard | Beskrivelse |
|---|---|---|---|
| `lat`, `lon` | tall | påkrevd | Et punkt på bygget, 57 til 72 / 4 til 32 |
| `passord` | streng | | Fra avtale. Alternativt `partner` med partnerkode. |
| `montering` | `ost_vest` \| `sor` \| `auto` | `ost_vest` | Flate tak: øst/vest-stativ eller sørvendt. `auto` velger etter takform. Skråtak legges alltid i takets plan. |
| `retning` | `auto` \| `bygg` \| `himmel` | `auto` | Radretning: langs byggets akse eller etter himmelretning |
| `ai` | boolean | `true` | `false` hopper over bildeanalysen (raskere, ingen hindringer fra flyfoto) |
| `tegning` | boolean | `true` | Lag tegning (PNG) |
| `geojson` | boolean | `true` | Ta med moduler og soner som GeoJSON |
| `skraa_bare_sor` | boolean | `false` | På skråtak: bare flater mot sør (±90°) |
| `kvalitetssjekk` | boolean | `true` | Kryssjekk av takform og helning mellom høydemodell og flyfoto |
| `tving_ny` | boolean | `false` | Hopp over cache |
| `modul_wp` | 300 til 1000 | 650 | Moduleffekt, Wp |
| `modul_lengde_mm`, `modul_bredde_mm` | 1000 til 3000, 700 til 1500 | 2382, 1134 | Modulmål |
| `radavstand_sor_m` | 1,2 til 4 | | Radavstand for sørvendt stativ |
| `enhetsavstand_ost_vest_m` | 2,2 til 5 | | Enhetsavstand for øst/vest |
| `helning_grader` | 5 til 20 | | Stativhelning på flatt tak |
| `rad_retning_grader` | 0 til 179,99 | | Lås radretningen |
| `regler` | objekt | | Finjustering, se under |
### `regler`
| Felt | Område | Beskrivelse |
|---|---|---|
| `edge_setback_m` | 0 til 5 | Kantavstand flatt tak (1 m på alle kanter; NEK 400-7-712C krever 1 m fra én) |
| `pitched_edge_setback_m` | 0 til 5 | Skråtak: praktisk margin mot raft og gavl, målt på takflaten (0,3 m; ikke et NEK-krav) |
| `ridge_setback_m` | 0 til 5 | Skråtak: avstand fra møne/grat der flaten på andre siden også får moduler (0,6 m, NEK 400-7-712C) |
| `pitched_access_edge_m`, `pitched_access_edge` | 0 til 5, boolean | Skråtak: fri sone langs raften på én flate for brannvesenets tilkomst når alle takflatene brukes (1 m, NEK 400-7-712C); legges på flaten med minst sol |
| `lane_width_m`, `lane_interval_m` | 0 til 3, 10 til 200 | Gangbaner: bredde og avstand |
| `lanes_along_rows`, `lanes_across_rows` | boolean | Gangbaner langs og på tvers av radene |
| `shade_loss_max` | 0 til 1 | Maks akseptert skyggetap for en modulposisjon |
| `protrusion_min_m`, `protrusion_clearance_m` | 0,2 til 3, 0 til 3 | Minste hindring som tas hensyn til, og klaring rundt |
| `obstacle_north_factor`, `obstacle_ew_factor`, `obstacle_south_m` | 0 til 5 | Skyggesoner rundt hindringer (ganger høyden mot nord og øst/vest, fast mot sør) |
| `obstacle_clearance_m`, `obstacle_height_m` | per type | Klaring (0 til 5 m) og standardhøyde (0 til 10 m) per objekttype: `ventilasjon`, `kjoleaggregat`, `takluke`, `overlys`, `roykluke`, `pipe`, `heissjakt`, `takoppbygg`, `antenne`, `sluk`, `kile`, `brannvegg`, `solceller`, `terrasse`, `gront_tak`, `annet` |
| `min_run_modules` | 1 til 10 | Korteste sammenhengende rad |
| `common_row_direction`, `align_columns` | boolean | Felles radretning på alle flater; juster kolonner |
| `pitched_orientation` | `portrait` \| `landscape` \| `auto` | Moduler stående eller liggende på skråtak |
| `pitched_north_max_tilt_deg` | 0 til 90 | Maks helning der nordvendte skråtak fortsatt brukes |
### Svar når `status` er `done`
```json
{
"jobb_id": "3f9a1c2b7d0e", "status": "done",
"tegning_url": "/roof/jobs/3f9a1c2b7d0e/tegning.png",
"resultat": {
"punkt": { "lat": 59.2185, "lon": 10.9298, "x_utm33": 272163, "y_utm33": 6575571 },
"bygning": { "kilde_omriss": "FKB", "areal_m2": 1840, "hoyde_m": 8.2, "takform": "flatt", "takform_profiler": "flatt",
"takform_korrigert": false, "helning_flyfoto_grader": null, "takmateriale": "papp", "eksisterende_solceller": false,
"hovedakse_grader": 35, "omriss": ["…"] },
"resultat": { "moduler": 266, "kwp": 172.9, "modul": { "wp": 650, "lengde_mm": 2382, "bredde_mm": 1134 },
"montering": "ost_vest", "montering_tekst": "Øst/vest-stativ 10°",
"brutto_takareal_m2": 1840, "brukbart_areal_m2": 1210, "modulareal_m2": 743, "dekningsgrad_pst": 40.4,
"kwp_per_m2_tak": 0.094, "takflater": 1,
"pv_kalkulator": { "flater": ["…"], "arrays_param": "86.45:10:-55,86.45:10:125", "mounting": "free" } },
"takflater": [ { "id": 1, "type": "flatt", "areal_m2": 1840, "moduler": 266, "kwp": 172.9, "retning_grader": 35 } ],
"utelukkelser": [ { "type": "ventilasjon", "kilde": "SunPoint bildeanalyse", "areal_m2": 6.1 } ],
"kvalitetssjekk": { "status": "ok", "merknader": [] },
"grunnlag": { "hoydemodell": "DOM 1 m 2023", "ortofoto": "ortofoto 2024", "omriss": "FKB-Bygning", "ai": true, "advarsler": [], "tid_s": 14.8 },
"moduler": { "type": "FeatureCollection", "features": ["…"] },
"meta": { "generator": "solkart takanalyse", "versjon": 1 }
}
}
```
| Felt | Beskrivelse |
|---|---|
| `resultat.resultat.moduler`, `kwp` | Antall moduler og installert effekt |
| `resultat.resultat.pv_kalkulator.arrays_param` | Klar til `arrays=` i [`/api/pv/calc`](/api/dokumentasjon/pv): `kwp:helning:asimut` per flate, asimut 0 = sør |
| `resultat.bygning.takform`, `takform_profiler`, `takform_korrigert` | Takform fra flyfoto, fra høydeprofiler, og om de ble avstemt |
| `resultat.takflater[]` | Flater med retning, helning, areal, moduler og kWp. `fallretning_grader` er fallet modulene fikk; `fallretning_hoydemodell_grader` det høydemodellen målte. `rad_justering` er `takflate` (rader langs raften slik høydemodellen ser den) eller `raft` (lagt langs takflatens egen kant fordi det ga et regelmessig nett; forklart i `rad_merknad`). `nett` teller rader og kolonner (`moduler_per_rad`, `moduler_per_kolonne`, `regelmessig`, `rektangularitet`, `hindringer`, `advarsel`). |
| `resultat.utelukkelser[]` | Hindringer og soner som ble holdt fri, med kilde. På skråtak: `kant_skraa` (praktisk margin), `mone` (NEK 0,6 m når begge sider brukes) og `tilkomst` (NEK 1 m fri raft når alle flatene brukes); alle målt på takflaten og regnet om til planet med cos(helning) |
| `resultat.kvalitetssjekk` | Kryssjekk mellom kildene og merknader du bør lese. `nett_advarsler` lister skråflater der modulnettet er uregelmessig uten hindringer (fallretning eller helning trolig feiltolket); `nettsjekk` er det bildeanalysen fikk å vurdere, og `flater_rettet` fallretning/helning den rettet med sikkerhet ≥ 0,7 før anlegget ble pakket på nytt. |
| `resultat.grunnlag.advarsler[]` | Manglende data, gammel høydemodell, usikker takform |
| `moduler`, `utelukkelser_geojson`, `frie_soner_geojson` | GeoJSON i WGS84 for kart |
`GET /api/roof/jobs/{id}/tegning.png` gir tegningen med flyfoto, moduler og soner (`image/png`, hodene `X-Moduler` og `X-Kwp`, `Cache-Control: private, max-age=900`).
## POST /api/roof/layout
Synkron variant med samme kropp og svar (`resultat` direkte, pluss `tegning.png_base64` når `tegning` er på), inntil 90 s. Gir `503 BACKEND_BUSY` når køen er i bruk, og `504 TIMEOUT` (`Analysen brukte for lang tid (over 90 s). …`, med `Retry-After`) hvis analysen ikke rekker fram; bruk jobbendepunktet for store bygg.
## Feil
| Status | `code` | Betyr |
|---|---|---|
| `400` | `INVALID_INPUT` | Feil i kroppen, med feltnavn i meldingen (`regler.edge_setback_m må ligge mellom 0 og 5.`) |
| `401` | `PASSWORD_REQUIRED` | `Automatisk prosjektering krever passord.` |
| `404` | `NOT_FOUND` | Ukjent eller utløpt jobb |
| `409` | `NOT_READY` | Tegning bedt om før jobben er ferdig |
| `410` | `EXPIRED` | Tegnegrunnlaget er borte; kjør på nytt |
| `422` | `NO_BUILDING` | `Fant ingen bygning ved punktet (FKB/OSM). Klikk på taket i kartet.` Flytt punktet inn på taket. Også når bygget er større enn 400 m i utstrekning. |
| `429` | `RATE_LIMITED` | Over 1/s eller 20/time |
| `503` | `BACKEND_BUSY` | Køen er full (20); `Retry-After` |
| `504` | `TIMEOUT` | Analysen tok for lang tid: over 90 s synkront, over 120 s i kø (da som `feil.status` i jobbstatus) |
## Grenser for metoden
Analysen er et estimat før befaring. Den ser ikke takets bæreevne, tekniske installasjoner under taktekkingen, brannkrav som ikke er synlige fra lufta, eller elektrisk kapasitet. Bruk `kvalitetssjekk` og `grunnlag.advarsler` aktivt, og la prosjekterende kontrollere før tilbud.
---
# Stedlig snølast
> Karakteristisk snølast på mark for en tomt, regnet etter SINTEF-metoden (alternativ metode i NS-EN 1991-1-3 NA.4.1(2)) på NVEs seNorge-serie fra 1957, med sammenligning mot Eurokodens kommunetabell. JSON eller CSV, ingen nøkkel.
Kilde: https://solkart.no/api/dokumentasjon/snolast · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json
## Hva du får
NS-EN 1991-1-3 NA.4.1(2) åpner for å fastsette karakteristisk snølast på mark fra lokale observasjoner når serien er lang nok og metoden dokumentert. Endepunktet gjør det for en tomt: årsmaksima av snøens vannekvivalent (SWE) fra seNorge i 1 km-celler, tre statistiske tilpasninger (empirisk Gringorten, Gumbel og gamma), returverdi ved 50 år, median over 3 × 3 celler, og en variabilitetsfaktor. Metoden er utviklet av SINTEF for Solcellespesialisten (prosjektnotat 102027401 v2, 2022). Svaret sammenligner med tabellverdien for kommunen og høyden.
Verdien er beslutningsstøtte som ansvarlig prosjekterende skal kontrollere: sjekk særlig at cellenes høyde er representativ for tomten. Ingen nøkkel, ingen kvote.
## GET /api/snowload/calc
```bash
curl "https://api.solkart.no/api/snowload/calc?lat=59.91&lon=10.75"
```
| Parameter | Type | Standard | Beskrivelse |
|---|---|---|---|
| `lat`, `lon` | tall | | WGS84, 57 til 72° N, 4 til 32° Ø. Brukes når `x`,`y` ikke er gitt. |
| `x`, `y` | heltall | | UTM 33 (EPSG:25833), som seNorge-rutenettet |
| `grid` | `1` \| `3` \| `5` | 3 | N × N celler á 1 km rundt punktet; median brukes |
| `cells` | `x_y,x_y,…` | | Manuelt valgte cellesentre (UTM 33), maks 36. Overstyrer `grid`. |
| `returnperiod` | `20` \| `50` \| `100` | 50 | Returperiode i år. Eurokoden bruker 50. |
| `variability` | 1 til 3 | 1,5 | Variabilitetsfaktor som multipliseres inn (SINTEF-notatet) |
| `start` | `ÅÅÅÅ-M-D` | 50 år tilbake | Seriens start. Data finnes fra 1957. |
| `elev` | m | cellehøyde | Tomtens høyde til oppslag i Eurokode-tabellen |
| `format` | `json` \| `csv` | `json` | |
Svar `200` (ekte svar, Oslo sentrum; celler forkortet):
```json
{
"method": {
"reference": "SINTEF Prosjektnotat 102027401 v2 (2022-04-06, G. Scilipoti) for Solcellespesialisten AS — alternativ metode iht. NS-EN 1991-1-3 NA.4.1(2)",
"data_source": "seNorge SWE 1×1 km via NVE GridTimeSeries (gts.nve.no), 1976-1-1 → 2026-9-15, døgnverdier",
"statistics": "Årsmaksima → empirisk (Gringorten a=0.44) + Gumbel-MLE + Gamma-MLE → log-trendlinjer → faktor ved T=50 år; karakteristisk SWE = maks × snitt(faktorer); SD = SWE×9.8/1000; median over 3×3 celler; × variabilitetsfaktor 1.5",
"disclaimer": "Krever ingeniørmessig skjønn (SINTEF-notatet §5): kontroller at cellenes høyde er representativ for byggetomten. Verdien er beslutningsstøtte, ikke automatisk godkjent dokumentasjon."
},
"inputs": {
"lat": 59.91, "lon": 10.75, "utm33": { "x": 262410, "y": 6649018 },
"center_cell": { "x": 262500, "y": 6649500, "altitude_m": 6 },
"grid": "3x3", "manual_cells": false, "variability_factor": 1.5, "return_period_yr": 50, "series_start": "1976-1-1"
},
"eurocode_comparison": {
"kommune": "Oslo", "kommunenummer": "0301", "fylke": "Oslo", "site_elevation_m": 6,
"table_entries": [ { "kommune_1990": "Oslo", "sk0": 3.5, "Hg": 150, "dsk": 1, "skmax": 6.5, "sk_at_site": 3.5, "above_hg": false, "note": "…" } ],
"sk_kn_m2": 3.5,
"selected_entry": "Oslo",
"rule": "sk = sk0 for H ≤ Hg; ellers sk0 + ⌈(H−Hg)/100⌉·Δsk, maks sk,maks",
"source": "NS-EN 1991-1-3 NA tabell NA.4.1(901) (verdier fra NS 3491-3, digitalisert fra SINTEF Byggforsk 471.041; kommunenavn før 2020). Kontroller mot gjeldende NA:2018 ved prosjektering."
},
"cells": [
{ "x": 262500, "y": 6649500, "altitude_m": 6, "n_years": 51, "period": "1976-2026", "max_swe_mm": 140.1,
"factor_gamma": 1.215, "factor_gumbel": 0.9291, "factor_empirical": 1.1158, "factor_combined": 1.0939,
"char_swe_mm": 153.3, "char_sd_kn_m2": 1.502 }
],
"cell_errors": [],
"aggregate": {
"n_cells": 9, "median_char_swe_mm": 165.4, "median_char_sd_kn_m2": 1.62,
"sd_cv_pct": 6.5, "altitude_range_m": [0, 31],
"characteristic_snow_load_kn_m2": 2.43
},
"warnings": []
}
```
| Felt | Enhet | Beskrivelse |
|---|---|---|
| `aggregate.characteristic_snow_load_kn_m2` | kN/m² | **Resultatet:** stedlig karakteristisk snølast på mark, sk, etter variabilitetsfaktor |
| `aggregate.median_char_sd_kn_m2` | kN/m² | Median over cellene før variabilitetsfaktoren |
| `aggregate.median_char_swe_mm` | mm | Tilsvarende vannekvivalent |
| `aggregate.sd_cv_pct` | % | Variasjonskoeffisient mellom cellene; høy verdi betyr at tomten bør vurderes nærmere |
| `aggregate.altitude_range_m` | m | Laveste og høyeste celle; kontroller mot tomtens høyde |
| `eurocode_comparison.sk_kn_m2` | kN/m² | Tabellverdien for kommunen ved tomtens høyde |
| `cells[].max_swe_mm` | mm | Høyeste årsmaksimum i serien |
| `cells[].factor_*` | | Forholdet 50-årsverdi/maks for hver tilpasning, og snittet |
| `cells[].char_sd_kn_m2` | kN/m² | Cellens karakteristiske last (SWE × 9,8/1000) |
| `warnings[]` | | Merknader, for eksempel når høydespennet i cellene er stort |
I eksempelet gir metoden 2,43 kN/m² mot tabellens 3,5 kN/m² for Oslo under 150 m.
## CSV
`format=csv` gir én rad per celle og totalene nederst. Fil: `sunpoint_snolast__.csv`. JSON-svaret har `Cache-Control: public, max-age=86400` (CSV sendes uten); cellene fra NVE lagres hos oss i 30 døgn.
## Feil
| Status | `error` |
|---|---|
| `400` | `Oppgi lat&lon (WGS84) eller x&y (UTM33/EPSG:25833).` |
| `400` | `Utenfor Norge (57-72N, 4-32E).` |
| `400` | `grid må være 1, 3 eller 5 (N×N 1-km-celler).` / `variability må være 1..3.` / `returnperiod må være 20, 50 eller 100 år.` / `start må være YYYY-M-D.` / `cells må være liste av x_y-par (UTM33 cellesentre).` |
| `502` | `Ingen celler kunne beregnes.` (med `cell_errors`) |
## Videre til snølast på tak
Endepunktet gir lasten på mark. Formfaktorer, fonning og unntakslaster på taket regnes etter NS-EN 1991-1-3 kapittel 5 og 6 av ansvarlig prosjekterende. Rapporten fra [solkart.no/snolast](/snolast) inneholder metode, celler, tabellsammenligning og skjønnsvurderinger klare til å legges i prosjektdokumentasjonen.
---
# Terrengkategori og terrengform
> Terrengruhetskategori etter NS-EN 1991-1-4:2005/NA:2009 for et punkt, fastsatt retningsvis i 72 sektorer ut til 10 km fra Kartverkets høydemodeller, FKB-bygninger og NIBIO AR5, med overgangssoner, kontrollpunkter, terrengformfaktor c_o etter NA.4.3.3 og RIB-overstyring. JSON, PDF eller HTML. Beta.
Kilde: https://solkart.no/api/dokumentasjon/terrengkategori · Sist oppdatert 2026-09-16 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json
## Hva du får
Vindlastberegningen etter NS-EN 1991-1-4 trenger terrengruhetskategori (0 til IV) per vindretning. Endepunktet leser terrenget rundt punktet: høydemodeller (DOM/DTM 1 m i nærfeltet, 10 m ut til 10 km), arealbruk fra AR5 og bygningsomriss fra FKB, og fastsetter kategori i 72 rullerende 30°-sektorer etter reglene i NA, med overgangssoner (NA.4.3.2(2)), kontrollpunkter der grunnlaget ikke avgjør, og terrengform (NA.4.3.3) med co og kI per sektor. Ansvarlig prosjekterende (RIB) kan bekrefte og overstyre per sektor, og rapporten merker det med navn og dato. Skjønnsvalgene i metoden står på [terrengkategori-siden](/terrengkategori#skjonn).
Betaversjon, gratis i pilot, uten nøkkel, begrenset til 1 per sekund og 30 per time per IP-adresse. Rapporten er et beslutningsgrunnlag som RIB kontrollerer og godkjenner.
## POST /api/terrain/category
Synkront, inntil 60 s. Bruk [jobbendepunktet](/api/dokumentasjon/jobber) i alt som ikke er interaktivt.
```bash
curl -X POST https://api.solkart.no/api/terrain/category \
-H "Content-Type: application/json" \
-d '{"lat": 59.2185, "lon": 10.9298, "sted": "Jegerveien 8, Fredrikstad", "akse_grader": 35}'
```
| Felt | Type | Standard | Beskrivelse |
|---|---|---|---|
| `lat`, `lon` | tall | påkrevd | 57 til 72° N, 4 til 32° Ø |
| `radius_km` | 2 til 10 | 10 | Analyseradius |
| `z_ref_m` | 0 til 200 | | Referansehøyde (byggets høyde) for overgangssoner |
| `z_ref_note` | streng ≤ 60 | | Merknad om hvor høyden kommer fra |
| `akse_grader` | 0 til 179,99 | | Byggets lengderetning; gir kategori per akse i tillegg |
| `sted` | streng ≤ 160 | | Adresse eller navn til rapporten |
| `rapport_id` | streng ≤ 40 | | Din referanse, trykkes i rapporten |
| `kart` | boolean | `false` | Legg kartlagene ved som SVG i JSON-svaret |
| `format` | `json` \| `pdf` \| `html` | `json` | Også som `?format=` |
| `overstyring` | objekt | | RIB-valg, se under |
### `overstyring`
| Felt | Beskrivelse |
|---|---|
| `rib` | Navn og firma, 2 til 120 tegn. Påkrevd når `overstyring` er med. |
| `kommentar`, `dato` | Fri tekst ≤ 1000 og dato ≤ 20 tegn |
| `sektorer[]` (≤ 13) | `{senter_grader 0–359, kategori 0–4, kommentar}`: overstyr kategori i sektoren |
| `bekreftelser[]` (≤ 14) | `{sektor_grader, kode, kommentar}`: bekreft et kontrollpunkt (`kode` er kontrollpunktets kode fra svaret) |
| `terrengform[]` (≤ 13) | `{senter_grader, type, c_o, k_I, kommentar}` med `type` ∈ `flatt`, `aas`, `skraaning`, `aas_i_le`, `le_slak`, `le_bratt`, `manuell`; `c_o` og `k_I` 0,5 til 3 (brukes ved `manuell`) |
### Svar `200` med `format=json`
Ekte svar for punktet over (forkortet: 72 sektorer, 7 kontrollpunkter og 24 regeltreff er kuttet til ett hver):
```json
{
"sted": { "lat": 59.24, "lon": 10.9526, "utm33": [271950, 6573900] },
"norm": "NS-EN1991-1-4:2005+NA:2009",
"resultat": {
"terrengkategori": "II",
"kategori_id": 2,
"styrende_sektor_grader": 0.0,
"per_akse": { "35": 2, "125": 2, "215": 2, "305": 2 },
"konfidens": 0.8,
"krever_kontroll": true,
"kontrollgrunner": [ "…" ],
"fastsatt_av_rib": false,
"c_o_maks": 1.31,
"c_o_styrende_sektor_grader": 100.0,
"k_I_maks": 1.0,
"k_I_sektorer_grader": []
},
"kontrollpunkter": [
{ "kode": "terrengform_aas", "sektor_grader": 60.0, "sektor_label": "sektor 060°",
"kort": "terrengform skråning, c_o = 1,21",
"tekst": "Skråning med H = 77 m, L_H = 360 m, B = 2190 m og x = 550 m gir c_o = 1,21 etter NA.4(901.5). …",
"risiko": "Kan gi høyere vindlast: c_o kan være høyere om en annen topp eller form velges",
"lavere": true, "kategori_valgt": null, "kategori_mulig": null, "bekreftet": null }
],
"overstyring": null,
"sektorer": [
{ "senter_grader": 0.0, "kategori": 2, "overstyrt": null,
"terrengform": { "type": "skraaning", "beskrivelse": "Skråning eller platåkant, stedet i øvre halvdel (NA.4.3.3(901.2), ΔS = 1,8·H/L_H)",
"c_o": 1.007, "k_I": 1.0, "H_m": 45.2, "L_H_m": 570, "B_m": 1410, "x_m": 2140, "phi": 0.079,
"z_sted_moh": 66.6, "z_topp_moh": 79.7, "z_bunn_moh": 34.5, "z_ref_m": 10.0,
"bratt": null, "le_slak_mulig": false, "tvinger_kategori_II": false, "merknader": [], "profil": [[-3000, 34.5], "…"] },
"z0_m": 0.05,
"overgangssone": { "present": true, "x_B_km": 2, "n": 2, "tc_upwind": "IV", "vm_ratio": 0.86, "direction": "avtakende", "flere": [ "…" ] },
"baand": [
{ "km": "0–0,3", "kategori": 2, "z0_m": 0.05, "z0_morfometrisk_m": 1.0, "lambda_p": 0.0, "h_av_m": 0.0,
"arealklasse": "forest_conif", "arealandeler": { "forest_conif": 0.989, "forest_mixed": 0.011 },
"vannandel": 0.0, "stroklengde_vann_km": 0.0, "stroklengde_hav_km": 0.0, "haveksponering": 0.01,
"bygningskilde": "fkb", "hoydedekning": 1.0 }
] }
],
"regeltreff": [
{ "kode": "ung_skog_ii", "punkt": "NA.4.1 (kat. II)", "tekst": "Skog med middelhøyde under 4 m regnes som spredte objekter.",
"grunnlag": { "h_av_m": 0.0, "band_km": "0–0,3", "ndom_dekning": 1.0 }, "sektorer": [ "…" ], "sektor_tekst": "sektorene 145–060° og 100–105°" }
],
"grunnlag": {
"hoydemodell": "Kartverket DOM1/DTM1 i 2,5 m for 0-1 km og DOM10/DTM10 i 30 m for 1-10 km (nDOM = DOM - DTM)",
"arealdekke": "NIBIO AR5 (WMS)", "bygningskilde": "Kartverket FKB Bygning", "bygninger_antall": 1261,
"ar5_datafangst": "28.04.1994", "ar5_alder_aar": 32, "sektorbredde_grader": 30, "sektorsteg_grader": 5,
"referansehoyde_m": 10.0, "referansehoyde_oppgitt": false, "akse_grader": 35.0, "beregnet_sekunder": 3.5, "responstid_ms": 34031
}
}
```
| Felt | Beskrivelse |
|---|---|
| `resultat.terrengkategori`, `kategori_id` | Styrende kategori for punktet som romertall (`0`, `I` til `IV`) og tall (0 til 4): laveste over sektorene etter NA.4.3.2(4) |
| `resultat.per_akse` | Kategori for byggets to akser og deres motsatte retninger (nøkkel = grader), når `akse_grader` er gitt |
| `resultat.konfidens` | 0 til 1, hvor godt grunnlaget avgjør |
| `resultat.krever_kontroll`, `kontrollgrunner[]`, `kontrollpunkter[]` | Punkter der usikkerheten kan gi annen kategori eller c_o og dataene ikke avgjør; hvert kontrollpunkt har `kode`, `sektor_grader`, `tekst`, `risiko` og `bekreftet`. RIB bekrefter via `overstyring.bekreftelser` med samme `kode`. |
| `resultat.c_o_maks`, `c_o_styrende_sektor_grader`, `k_I_maks` | Høyeste terrengformfaktor og turbulensfaktor over sektorene, og hvilken sektor |
| `sektorer[]` | 72 sektorer (hvert 5°, 30° brede) med `kategori` (0 til 4), ruhetslengde `z0_m`, `terrengform` (`type`, `c_o`, `k_I`, `H_m`, `L_H_m`, `B_m`, `x_m`, høyder og profil), `overgangssone` (`x_B_km`, `tc_upwind`, `vm_ratio`, `direction`) og `baand[]` per avstandsbånd med arealklasse, bebygd andel `lambda_p`, middelhøyde `h_av_m`, vannandel og strøklengder |
| `regeltreff[]` | Hvilke regler i NA som slo til, med `punkt`, `grunnlag` og sektorintervaller |
| `grunnlag` | Datakilder, oppløsning, AR5-alder, referansehøyde og beregningstid |
`format=pdf` gir rapporten som `application/pdf` (`Content-Disposition` med filnavn), `html` som HTML; begge med hodene `X-Terrengkategori` og `X-Konfidens` (JSON-svaret har verdiene i `resultat`). Alle svar er `Cache-Control: private, no-store`.
## I kø: POST /api/terrain/jobs
Samme kropp. Svar `202` med `jobb_id`, `status`, `posisjon`, `estimert_sekunder`; status på `GET /api/terrain/jobs/{id}`; fil på `GET /api/terrain/jobs/{id}/fil` når `status` er `done` og formatet er `pdf` eller `html`. Resultatene lever i 15 minutter. Se [asynkrone jobber](/api/dokumentasjon/jobber) for hele flyten med kode.
## Eksempel: RIB bekrefter og overstyrer
```bash
curl -X POST https://api.solkart.no/api/terrain/jobs \
-H "Content-Type: application/json" \
-d '{
"lat": 59.2185, "lon": 10.9298, "sted": "Jegerveien 8, Fredrikstad", "z_ref_m": 9, "format": "pdf",
"overstyring": {
"rib": "Kari Nordmann, Nordmann Bygg AS", "dato": "2026-09-15",
"kommentar": "Befaring 12.09: ny bebyggelse sør for tomta er ikke i FKB ennå.",
"sektorer": [ { "senter_grader": 180, "kategori": 3, "kommentar": "Rekkehus ferdigstilt 2026" } ],
"bekreftelser": [ { "sektor_grader": 240, "kode": "vann_strok_240", "kommentar": "Kontrollert mot kart" } ],
"terrengform": [ { "senter_grader": 120, "type": "aas" } ]
}
}'
```
Rapporten viser overstyringene med RIB-navn, dato og kommentar, og markerer sektorene som fastsatt av RIB.
## Feil
| Status | `code` | `error` |
|---|---|---|
| `400` | `INVALID_INPUT` | `lat må være et tall mellom 57 og 72.`, `radius_km må være mellom 2 og 10.`, `z_ref_m må være mellom 0 og 200.`, `akse_grader må være mellom 0 og 179.`, `overstyring.rib må oppgis (navn og firma).`, `overstyring.sektorer: senter_grader 0–359 og kategori 0–4.`, `format må være én av: json, pdf, html.` |
| `422` | `NO_COVERAGE` | `Ingen datadekning for dette punktet (høydemodell mangler).` |
| `429` | `RATE_LIMITED` | Over 1/s eller 30/time; `Retry-After` |
| `503` | `BACKEND_BUSY` | `Terrengkategori-tjenesten er opptatt. Prøv igjen.` (`Retry-After` = anslått ventetid i sekunder, 30 når anslag mangler) |
| `504` | `BACKEND_TIMEOUT` | `Analysen brukte mer enn 60000 ms.` Bruk jobbendepunktet. |
| `502` | `BACKEND_ERROR` | Beregningstjeneren svarte feil |
## Datagrunnlag
Kartverket DOM og DTM 1 m (nærfelt 0 til 1 km) og DTM 10 m (ut til 10 km), Kartverket FKB-bygninger (omriss og høyde), NIBIO AR5 arealressurskart, og ortofoto til rapportens kart. Metoden og skjønnsvalgene, inkludert strøklengde over vann, kategori IV-kriteriene og terrengform etter NA.4(901.5), er beskrevet på [solkart.no/terrengkategori](/terrengkategori#skjonn).
---
# MCP-server for AI-assistenter
> Koble Claude, ChatGPT eller din egen agent til Solkart med Model Context Protocol. Åtte verktøy på mcp.solkart.no/mcp med adressesøk, PV-produksjon, TMY, snøtap, snølast, terrengkategori, solprognose og sanntidstall.
Kilde: https://solkart.no/api/dokumentasjon/mcp · Sist oppdatert 2026-09-18 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json
!!! note "Ny tjeneste"
MCP-serveren ble satt i drift 18. september 2026. Si fra hvis noe ikke virker som det skal: [ta kontakt](/kontakt).
## Hva det er
Model Context Protocol (MCP) er en åpen standard for hvordan AI-assistenter kobler seg til verktøy. Solkart-serveren pakker de samme beregningene som [API-et](/api/dokumentasjon) inn som verktøy en assistent kan kalle selv: brukeren skriver «hva gir 120 kWp øst/vest på Dikeveien 52 i Fredrikstad, og hvor mye snølast må taket tåle?», og assistenten slår opp adressen, regner produksjonen og henter snølasten uten at du skriver en linje kode.
Serveren er tilstandsløs og bruker Streamable HTTP. Én adresse, alt over POST:
```
https://mcp.solkart.no/mcp
```
Den støtter både protokollversjon `2026-07-28` (uten `initialize`, med `_meta` og `MCP-Protocol-Version`-hodet per forespørsel) og de eldre versjonene `2025-11-25`, `2025-06-18` og `2025-03-26` som de fleste klienter bruker i dag. Vi utsteder ingen sesjons-id-er, og `GET /mcp` svarer `405`: det finnes ingen frittstående hendelsesstrøm.
## Koble til
**Claude Code / Claude Desktop** (hoder støttes, anbefalt):
```bash
claude mcp add --transport http solkart https://mcp.solkart.no/mcp \
--header "X-API-Key: sk_live_…"
```
**claude.ai og andre klienter som bare tar en URL:** legg nøkkelen i spørrestrengen.
```
https://mcp.solkart.no/mcp?api_key=sk_live_…
```
**Egen agent (Python, TypeScript …):** pek MCP-klienten på adressen og send nøkkelen som `Authorization: Bearer sk_live_…` eller `X-API-Key`.
Uten nøkkel virker alle verktøyene som er åpne i API-et fra før, men da deler alle nøkkelløse brukere de samme IP-grensene, og kall uten nøkkel er begrenset til 30 per minutt. Nøkkelen gir deg dine egne kvoter: se [autentisering](/api/dokumentasjon/autentisering) og [kvoter](/api/dokumentasjon/grenser-og-feil). Nøkkelen sendes uendret videre til api.solkart.no; MCP-serveren lagrer den ikke.
## Verktøyene
| Verktøy | Gir | Bak kulissene | Nøkkel |
|---|---|---|---|
| `adressesok` | Adresse eller stedsnavn → koordinater | Kartverket/Geonorge | Nei |
| `pv_produksjon` | Års- og månedsproduksjon, inntil 4 takflater, klipping, P50–P95 | [`/api/pv/calc`](/api/dokumentasjon/pv) | Nei |
| `snolast` | Karakteristisk snølast på mark, med kommunetabellen til sammenligning | [`/api/snowload/calc`](/api/dokumentasjon/snolast) | Nei |
| `snotap` | Snø- og smusstap per måned, eller snø på panelet neste 10 døgn | [`/api/snowsoiling/calc`, `/api/snow/outlook`](/api/dokumentasjon/snotap) | Nei |
| `tmy` | Årssummer, persentiler, valgte år og kilder, pluss nedlastingslenker | [`/api/tmy/stats`, `/api/tmy/sources`](/api/dokumentasjon/tmy) | Valgfri |
| `terrengkategori` | Terrengkategori og c_o per sektor, med kontrollpunkter | [`/api/terrain/jobs`](/api/dokumentasjon/terrengkategori) | Nei (pilot) |
| `solproduksjon_naa` | Solproduksjon i Norge nå, fylke for fylke | Forsidens prognosekall | Nei |
| `solprognose` | Innstråling og produksjon time for time, 60 timer | [`/api/forecast`](/api/dokumentasjon/prognose) | Ja |
Verktøyene returnerer både et kort sammendrag i klartekst og hele svaret som `structuredContent`, med feltnavn på norsk. Store datamengder leveres ikke gjennom MCP: `tmy` gir statistikk og en nedlastingslenke, ikke 8760 timer, og `solprognose` gir timeserien for ett punkt.
`terrengkategori` tar 10 til 60 sekunder. Rekker den ikke ferdig innen ventetiden, svarer verktøyet med en `jobb_id`, og assistenten kaller det samme verktøyet på nytt med `jobb_id` for å hente resultatet (det lever i 15 minutter).
Takanalysen og sol og horisont er ikke med i første versjon.
## Prøv med curl
```bash
curl -sS https://mcp.solkart.no/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2025-06-18' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```
```bash
curl -sS https://mcp.solkart.no/mcp \
-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2025-06-18' -H "X-API-Key: $SOLKART_API_KEY" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"pv_produksjon",
"arguments":{"lat":59.2578,"lon":11.0030,"peakpower":10,"angle":35,"aspect":0}}}'
```
Med den nye protokollversjonen må hodene speile kroppen:
```bash
curl -sS https://mcp.solkart.no/mcp \
-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2026-07-28' -H 'Mcp-Method: tools/call' -H 'Mcp-Name: snolast' \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"snolast",
"arguments":{"lat":59.2578,"lon":11.0030},
"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28",
"io.modelcontextprotocol/clientCapabilities":{}}}}'
```
## Feil
Feil i et verktøykall kommer som et vanlig resultat med `isError: true` og en forklaring på norsk, slik at assistenten kan rette opp selv. Protokollfeil kommer som JSON-RPC-feil:
| Status | Kode | Når |
|---|---|---|
| `400` | `-32700` | Kroppen er ikke gyldig JSON |
| `400` | `-32600` | Ikke gyldig JSON-RPC 2.0, eller en batch (støttes ikke) |
| `400` | `-32020` | Hodene `MCP-Protocol-Version`, `Mcp-Method` eller `Mcp-Name` mangler eller matcher ikke kroppen |
| `400` | `-32022` | Protokollversjonen støttes ikke; `data.supported` viser hvilke som gjør det |
| `403` | `-32600` | `Origin` er ikke tillatt (nettleserklienter) |
| `404` | `-32601` | Ukjent metode |
| `405` | | `GET` eller `DELETE` mot `/mcp` |
## Forbehold
Alle tall er retningsgivende estimater, ikke målte verdier. Snølast og terrengkategori er beslutningsgrunnlag som ansvarlig prosjekterende kontrollerer og godkjenner. Assistenten får beskjed om dette i instruksjonene serveren sender med, men du bør si det videre til dem som leser svaret.
---
# Endringslogg
> Endringer i api.solkart.no i omvendt kronologisk rekkefølge, med dato. Varslede utfasinger står øverst.
Kilde: https://solkart.no/api/dokumentasjon/endringslogg · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json
## Varslet
- **19. november 2026:** `model=v1`, `v23b=false`, `corrected=true` og `fresh=true` i `/api/forecast*` slutter å velge V1.5. Standardmodellen V2.3b er upåvirket. Se [versjonering](/api/dokumentasjon/caching-og-versjonering).
- **30. september 2026:** TMY-lisensversjon `tmy-v1-2026-09-30` løper ut for nye prosjekter. Ny versjon utstedes før datoen.
## 2026
### 15. september
- Takanalyse, skråtak: NEK 400-7-712C-avstandene følger nå standarden i stedet for 0,6 m rundt hele flaten: 0,6 m fra møne/grat bare der flaten på andre siden også får moduler (`mone`), 1 m fri sone langs raften på én flate for brannvesenet når alle takflatene brukes (`tilkomst`, på flaten med minst sol), og ellers bare en praktisk margin på 0,3 m mot raft og gavl (`kant_skraa`). Avstandene måles på takflaten og regnes om til planet. Nye regler: `ridge_setback_m`, `pitched_access_edge_m`, `pitched_access_edge`.
- Takanalyse, skråtak: nettsjekk. Like mange moduler i hver rad og kolonne på en rektangulær flate uten hindringer er kravet; et skjevt nett betyr at fallretning eller helning er feiltolket. Logikken prøver radene langs takflatens egen kant (innenfor 35° av høydemodellens fall) og velger det når det gir et regelmessig nett, og kvalitetssjekken får flaggede flater til vurdering og kan rette fallretning/helning før anlegget pakkes på nytt (`takflater[].nett`, `rad_merknad`, `kvalitetssjekk.nett_advarsler`, `flater_rettet`). Modulens dybde på skråtak er som før krympet med cos(helning) i planet.
- Rettet etter kvalitetskontroll av dokumentasjonen: `"daily": true` i JSON-kroppen til `/api/forecast` og `/api/forecast/bulk` krever nå Basic, slik `?daily=true` alltid har gjort; `/api/forecast/nowcast` teller mot anleggskvoten som de andre prognoseendepunktene; `/api/roof/layout` svarer `504 TIMEOUT` (ikke `502`) når analysen ikke rekker fram innen 90 s.
- Dokumentasjonen er omstrukturert: [Kom i gang](/api), én side per produkt, [OpenAPI 3.1](/openapi.json) og [llms-full.txt](/llms-full.txt). Alle sider finnes som Markdown.
- `/api/forecast*`: solposisjonen i PV-produksjonen regnes nå i sann soltid midt i timen. Før ga feilen null produksjon de første timene etter soloppgang og en for sen topp på sørvendte anlegg. GHI-verdiene er uendret; produksjonstallene per time er endret, mest om morgenen og lengst nord.
- Takanalyse: skråtak leses fra høydeprofiler over bygget i tillegg til flyfoto, og takform og helning korrigeres når kildene er uenige (`bygning.takform_profiler`, `takform_korrigert`).
- Solsjekk (solkart.no/solsjekk) lansert som nettjeneste over de samme endepunktene.
### 14. september
- `/api/terrain/category`: terrengform etter NA.4.3.3 per sektor (`sektorer[].terrengform` med `c_o`, `k_I`, `H_m`, `L_H_m`, `B_m`, `x_m`), `resultat.c_o_maks`, og `overstyring.terrengform[]` for RIB-valg fra liste. Egen side i PDF-rapporten.
### 10. september
- `/api/terrain/category`: rettet strøklengde over vann langs vindretningen (Glomma-tilfellet), side 2 i PDF med kart og sektorvurdering, RIB-overstyring per sektor (`overstyring.sektorer`, `bekreftelser`), kartlag som SVG (`kart: true`).
### 9. september
- Nytt: `POST /api/terrain/category` og `POST /api/terrain/jobs` (beta): terrengruhetskategori etter NS-EN 1991-1-4/NA i 72 sektorer ut til 10 km, med kontrollpunkter og overgangssoner. Gratis i pilot.
### 7. september
- **Tidsstempler i `/api/forecast*` er bin-start.** Tidligere arvet API-et værmodellens konvensjon der etiketten var slutten av timen. Har du kompensert for det i egen integrasjon, må kompensasjonen fjernes. Døgn- og månedssummer er upåvirket.
### 1. september
- Horisont nivå 2 og 3 (`/api/horizon/rooftop`, `/api/horizon/precise`) og terrengkategori er åpne uten nøkkel i pilotperioden, med grenser per IP-adresse.
### 31. august
- `/api/forecast`, `/bulk`: `snow=1` legger seNorge-baserte snøtapsfaktorer på produksjonen; svaret får et `snow`-objekt med kilde, alder og kommune.
- Nytt: `GET /api/snow/outlook`: snødekning og tap på panelet dag for dag i inntil 10 døgn.
### 24. august
- `daily=true` serveres av V2.3b (`data_mode: "v23b_daily"`). `model=v1` gir den utgående V1.5-versjonen.
### August
- Nytt: `GET /api/snowsoiling/calc`: stedlige snø- og smusstap per måned, samme modell som NS 3031:2025-tabellene (IFE/E-2024/005).
- `/api/pv/calc`: `arrays` (flere takflater), `maxpower` (klipping), `snowloss` og `snowmounting`.
### 20. august
- Nytt: `GET /api/tmy`, `/api/tmy/stats`, `/api/tmy/sources`: typisk meteorologisk år for 38 671 celler i 3 km, 15 formater, P50 til P95.
- Nytt: `GET /api/pv/calc`: PVGIS-klasse produksjonsberegning på TMY Norge med terrenghorisont.
- Nytt: `GET /api/snowload/calc`: stedlig karakteristisk snølast etter SINTEF-metoden (NS-EN 1991-1-3 NA.4.1(2)) på seNorge-data.
### 18. august
- V2.3b er standardmodell i `/api/forecast` og `/api/forecast/bulk`. Svaret rapporterer faktisk brukt modell i `model` og `data_mode`.
### Tidligere
- `GET /api/horizon/terrain` v3.1 med 720 asimutpunkter og eksportformater for PVsyst, PV*SOL, SAM, HelioScope og Meteonorm.
- `/api/forecast`, `/bulk`, `/extended`, `/latest`, `/register`, `/verify` og gratisplanen (24 forespørsler, 1 anlegg, 25 kWp per døgn).