# Solkart API — full dokumentasjon > Alt innhold fra https://solkart.no/api/dokumentasjon i én fil, for KI-assistenter og indeksering. Base-URL https://api.solkart.no. OpenAPI: https://solkart.no/openapi.json. Kort oversikt over nettstedet: https://solkart.no/llms.txt. Generert 2026-09-18. Solkart-API-et gir deg de samme beregningene som verktøyene på solkart.no, som JSON, CSV og fagformater over HTTPS. Alle endepunkter tar et punkt i Norge (WGS84 breddegrad og lengdegrad) og svarer med tall du kan bruke direkte i egne systemer. Base-URL er `https://api.solkart.no`. Ny her? Start på [Kom i gang](/api), som tar deg fra nøkkel til første kall på ett minutt. ## Slik er dokumentasjonen bygd opp
1. Grunnlag Nøkler, kvoter, feilformat, tid og enheter, asynkrone jobber, caching og versjonering. Les disse én gang.
2. Ett produkt per side Hver side har parametertabell, eksempel på forespørsel og ekte svar, feil du kan få, og kobling til verktøyet i nettleseren.
3. Maskinlesbart OpenAPI 3.1 for kodegenerering og llms-full.txt for KI-assistenter. Hver side finnes også som Markdown.
## Alle endepunkter | Endepunkt | Gir | Nøkkel | Side | |---|---|---|---| | `GET/POST /api/forecast` | Solinnstråling og PV-produksjon time for time, om lag 60 timer frem | Valgfri (IP-kvote uten) | [Solprognose](/api/dokumentasjon/prognose) | | `POST /api/forecast/bulk` | Samme for inntil 50 anlegg i ett kall | Valgfri | [Solprognose](/api/dokumentasjon/prognose) | | `GET/POST /api/forecast/extended` | Prognose ut til 10 døgn | Basic eller høyere | [Solprognose](/api/dokumentasjon/prognose) | | `GET /api/forecast/nowcast` | Satellittbasert nowcast 0 til 3 timer | Valgfri | [Solprognose](/api/dokumentasjon/prognose) | | `GET /api/forecast/latest` | Metadata om siste prognosesyklus | Nei | [Solprognose](/api/dokumentasjon/prognose) | | `GET /api/pv/calc` | Års- og månedsproduksjon for et anlegg (TMY-basert) | Nei | [PV-produksjonsberegning](/api/dokumentasjon/pv) | | `GET /api/tmy` | Typisk meteorologisk år, 8760 timer, 15 formater | Valgfri (IP-kvote uten) | [TMY Norge](/api/dokumentasjon/tmy) | | `GET /api/tmy/stats`, `/api/tmy/sources` | Årssummer, P-verdier, valgte år og kilder per celle | Valgfri | [TMY Norge](/api/dokumentasjon/tmy) | | `GET /api/snowsoiling/calc` | Snø- og smusstap per måned for et anlegg | Nei | [Snøtap](/api/dokumentasjon/snotap) | | `GET /api/snow/outlook` | Snødekning på panelet neste 10 døgn | Nei | [Snøtap](/api/dokumentasjon/snotap) | | `GET /api/horizon/terrain` | Terrenghorisont, 720 asimutpunkter | Nei | [Sol og horisont](/api/dokumentasjon/horisont) | | `POST /api/horizon/rooftop`, `/api/horizon/precise` | Horisont fra takhøyde med nærfelt (DOM 1 m) | Nei i pilot | [Sol og horisont](/api/dokumentasjon/horisont) | | `GET /api/snowload/calc` | Stedlig karakteristisk snølast (NS-EN 1991-1-3 NA.4.1(2)) | Nei | [Stedlig snølast](/api/dokumentasjon/snolast) | | `POST /api/terrain/category`, `/api/terrain/jobs` | Terrengkategori og terrengform per sektor (NS-EN 1991-1-4 NA) | Nei i pilot | [Terrengkategori](/api/dokumentasjon/terrengkategori) | | `POST /api/roof/jobs`, `/api/roof/layout` | Modulplassering og kWp på et tak fra flyfoto og høydemodell | Avtale (passord) | [Takanalyse](/api/dokumentasjon/takanalyse) | | `POST /api/register` | Opprett gratis API-nøkkel | Nei | [Autentisering](/api/dokumentasjon/autentisering) | | `GET /health` | Helsesjekk | Nei | [Kvoter, grenser og feil](/api/dokumentasjon/grenser-og-feil) | ## Tre ting du bør vite før første kall 1. **Tidsstempler er starten på timen, i UTC.** En verdi merket `10:00:00Z` gjelder perioden 10:00 til 11:00 UTC. Se [konvensjoner](/api/dokumentasjon/konvensjoner). 2. **Kvoten telles i «anlegg», ikke bare i kall.** Ett anlegg er én unik koordinat per døgn. Samme koordinat kan spørres om mange ganger. Se [kvoter, grenser og feil](/api/dokumentasjon/grenser-og-feil). 3. **Feil kommer alltid som JSON** med feltet `error` og en norsk forklaring, og med riktig HTTP-status. Endepunktene for horisont, terreng og tak legger til en maskinlesbar `code`. # Autentisering og API-nøkler > Hvordan du får en API-nøkkel, hvordan du sender den, hvilke endepunkter som krever den, og hvordan du oppbevarer den trygt. Kilde: https://solkart.no/api/dokumentasjon/autentisering · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json ## Trenger jeg nøkkel? Ikke alltid. Endepunktene deler seg i tre grupper: | Gruppe | Endepunkter | Uten nøkkel | Med nøkkel | |---|---|---|---| | Prognose | `/api/forecast`, `/api/forecast/bulk`, `/api/forecast/nowcast` | Gratisnivå per IP-adresse: 24 forespørsler per døgn, 1 anlegg, maks 25 kWp | Kvoter etter plan, se [kvoter](/api/dokumentasjon/grenser-og-feil) | | Prognose, utvidet | `/api/forecast/extended`, `daily=true` | Ikke tilgjengelig | Basic eller høyere | | TMY | `/api/tmy`, `/api/tmy/stats`, `/api/tmy/sources` | Inntil 2000 forespørsler per døgn per IP-adresse i lanseringsperioden | Kvoter etter plan | | Beregninger uten nøkkel | `/api/pv/calc`, `/api/snowload/calc`, `/api/snowsoiling/calc`, `/api/snow/outlook`, `/api/horizon/terrain`, `/api/forecast/latest`, `/api/sites` | Fritt, uten nøkkel | Samme | | Tunge beregninger, pilot | `/api/horizon/rooftop`, `/api/horizon/precise`, `/api/terrain/category`, `/api/terrain/jobs` | Åpent i pilotperioden, begrenset per IP-adresse (per sekund og per time) | Avtale for høyere grenser | | Takanalyse | `/api/roof/jobs`, `/api/roof/layout` | Krever passord fra avtale | Avtale | Nøkkelen gjelder hele produktfamilien. Samme nøkkel i prognose- og TMY-endepunktene. ## Slik får du nøkkel 1. Send e-postadressen din til `POST /api/register`, eller bruk skjemaet på [Kom i gang](/api). 2. Du får en e-post med en bekreftelseslenke (`/api/verify?token=…`). Lenken varer i 24 timer. 3. Bekreftelsessiden viser nøkkelen én gang. Den begynner med `sk_live_` og er 72 tegn lang. Lagre den i et hemmelighetslager, ikke i kildekoden. ```bash curl -X POST https://api.solkart.no/api/register \ -H "Content-Type: application/json" \ -d '{"email": "deg@firma.no"}' ``` Svar `200`: ```json {"ok": true, "message": "Bekreftelseslenke sendt til deg@firma.no. Sjekk innboksen din (og spam-mappen)."} ``` Feil: `400` ugyldig e-postadresse, `409` adressen er allerede registrert (nøkkelen ligger i innboksen din), `500` e-posten kunne ikke sendes. Gratisnøkkelen er for privat, ikke-kommersiell bruk. Betalte planer bestilles via [kontakt oss](/kontakt). ## Slik sender du nøkkelen Tre måter, i denne rekkefølgen hvis flere er satt: ```http X-API-Key: sk_live_… Authorization: Bearer sk_live_… GET /api/forecast?lat=59.91&lon=10.75&api_key=sk_live_… ``` Bruk `X-API-Key`. Spørrestrengen `api_key` fungerer, men nøkkelen havner da i webserverlogger, nettleserhistorikk og `Referer`-hoder. Bruk den bare til rask testing. ## Feil du kan få | Status | `error` | Hva det betyr | |---|---|---| | `401` | `Invalid API key` | Nøkkelen finnes ikke eller er deaktivert. Sjekk at hele strengen ble kopiert. | | `401` | `Daglig forespørsels-grense (24/dag) brukt opp. …` | Du sender uten nøkkel og har brukt gratisnivået fra denne IP-adressen. Opprett en nøkkel eller vent. | | `401` | `Daglig forespørsels-grense (N/dag) brukt opp på -planen. …` | Planens daglige kvote er brukt. Telleren nullstilles 00:00 UTC. | | `403` | `Extended forecast requires Basic tier or higher` | Endepunktet eller valget krever betalt plan. | | `429` | `Daglig anlegg-kvote brukt opp.` | Du har spurt om flere unike koordinater enn planen gir. Svaret inneholder et `quota`-objekt, se [kvoter](/api/dokumentasjon/grenser-og-feil). | ## Oppbevaring og rotasjon - Kall API-et fra tjenersiden. Nøkkelen skal ikke ligge i JavaScript som sendes til nettleseren, i mobilapper eller i offentlige repoer. API-et tillater kall fra nettleser (`Access-Control-Allow-Origin: *`), men da er nøkkelen synlig for alle som åpner utviklerverktøyet. - Legg nøkkelen i en miljøvariabel (`SOLKART_API_KEY`) eller et hemmelighetslager, og les den inn ved oppstart. - Én nøkkel per system. Da kan én roteres uten at de andre stopper. - Er en nøkkel lekket, [kontakt oss](/kontakt) så deaktiverer vi den og utsteder en ny. Kvoter følger med til den nye nøkkelen. ## Hvem ser hva Registrering lagrer e-postadresse, plan og teller per døgn. Forespørsler logges med tidspunkt, endepunkt og status for kvoteregning og feilsøking. Koordinater brukes til å regne ut kvoten og caches i inntil ett døgn. Se [bruksvilkårene](/vilkar). --- # Kvoter, grenser og feil > Planer og kvoter, hva et «anlegg» er, hvor raskt du kan kalle hvert endepunkt, og hvordan feilsvar ser ut med status, error og code. Kilde: https://solkart.no/api/dokumentasjon/grenser-og-feil · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json ## Planer Prognose-endepunktene (`/api/forecast*`) styres av planen på nøkkelen. Tallene under er de som håndheves i koden i dag. Priser står på [priser](/priser). | Plan | Forespørsler per døgn | Anlegg per døgn | Anlegg per bulk-kall | Maks kWp per anlegg | Utvidet prognose (`/extended`) | Døgnprognose (`daily`) | Koordinatoppløsning | |---|---|---|---|---|---|---|---| | Uten nøkkel (per IP) | 24 | 1 | 1 | 25 | Nei | Nei | 0,1° | | Gratis | 24 | 1 | 1 | 25 | Nei | Nei | 0,1° | | Basic | 1 000 | Kjøpt antall | Inntil 10 (begrenset av antall anlegg på nøkkelen) | 150 | Ja | Ja | 0,03° | | Pro | 10 000 | Kjøpt antall | Inntil 50 (begrenset av antall anlegg på nøkkelen) | 1 000 | Ja | Ja | 0,03° | | Enterprise | Ubegrenset | Ubegrenset | Ubegrenset | Ubegrenset | Ja | Ja | 0,03° | TMY-endepunktene har egen teller: i lanseringsperioden får alle inntil 2000 forespørsler per døgn, med alle formater, produkter og P-verdier. Beregningene uten nøkkel (PV, snølast, snøtap, snøutsikt, terrenghorisont) har ingen kvote. Tellerne for nøkler nullstilles 00:00 UTC. Telleren for kall uten nøkkel lever i 24 timer etter siste kall fra IP-adressen. ## Hva er et «anlegg»? Ett anlegg er én unik koordinat du har spurt om i løpet av et døgn. Koordinaten rundes til planens oppløsning (0,1° på gratis, 0,03° på betalte planer) før den telles. Samme koordinat kan spørres om så mange ganger du vil innenfor forespørselskvoten; det er først en ny koordinat som bruker en plass. Flere takflater (`arrays`) på samme koordinat er fortsatt ett anlegg. Når kvoten er brukt opp, får du `429` med detaljer: ```json { "error": "Daglig anlegg-kvote brukt opp.", "details": "Du har 1 anlegg-plass på free-planen, og har allerede spurt om 1 unik koordinat i dag. Denne forespørselen ville lagt til 1 ny (1 avvist). Telleren nullstilles 00:00 UTC.", "what_is_anlegg": "Et \"anlegg\" er en unik koordinat (lat/lon snapet til tierens grid-oppløsning) i en 24-timersperiode. …", "quota": { "tier": "free", "limit": 1, "used": 1, "would_add": 1, "accepted": 0, "rejected": 1, "resets_at": "2026-09-16T00:00:00.000Z" }, "rejected_coords": [ { "lat": 59.9, "lon": 10.8 } ], "upgrade": "https://solkart.no/api" } ``` I bulk-kall avvises hele kallet når kvoten ikke rekker til alle nye koordinater; `quota.would_add` og `rejected_coords` viser hva som stoppet. Bruk `quota.resets_at` til å planlegge neste forsøk. ## Hastighetsgrenser De tunge beregningene har grenser per sekund og per time, per IP-adresse i pilotperioden. Ved brudd får du `429` med `Retry-After` i sekunder. | Endepunkt | Per sekund | Per time | |---|---|---| | `POST /api/horizon/rooftop` | 5 | 300 | | `POST /api/horizon/precise` | 1 | 30 | | `POST /api/terrain/category`, `POST /api/terrain/jobs` | 1 | 30 | | `POST /api/roof/jobs`, `POST /api/roof/layout` | 1 | 20 | Statuspolling på jobber (`GET /api/terrain/jobs/{id}`, `GET /api/roof/jobs/{id}`) teller ikke. Trenger du mer i produksjon, [kontakt oss](/kontakt) for en avtale med egne grenser og `X-Quota-Remaining` per bruker. Prognose-endepunktene har ingen grense per sekund utover døgnkvoten, men prognosen oppdateres bare én gang i timen, så det er ingen grunn til å hente samme anlegg oftere. Se [caching](/api/dokumentasjon/caching-og-versjonering). ## Feilformat Alle feil er JSON med `Content-Type: application/json` og feltet `error` med en forklaring på norsk (noen eldre meldinger i prognose-API-et er på engelsk). Endepunktene for horisont (nivå 2 og 3), terreng og tak legger til `code` i STORE_BOKSTAVER som du kan programmere mot. Ett unntak: `422` fra horisont nivå 2 og 3 når høydemodell mangler kommer rått fra beregningstjeneren som `{"detail": "…"}` uten `error`. ```json { "error": "lat må være et tall mellom 57 og 72.", "code": "INVALID_INPUT" } ``` | Status | Betyr | `code` (der den finnes) | Hva du bør gjøre | |---|---|---|---| | `400` | Ugyldig parameter, JSON eller koordinat utenfor Norge | `INVALID_INPUT` | Rett forespørselen. Ikke prøv på nytt uendret. | | `401` | Manglende eller ugyldig nøkkel, eller døgnkvoten for kall er brukt | `UNAUTHENTICATED`, `PASSWORD_REQUIRED` | Sjekk nøkkelen; vent til nullstilling. | | `402` | Nøkkelen har ingen anleggskvote, eller kvoten på en avtale er brukt opp | `QUOTA_EXHAUSTED` | Oppgrader eller vent til `quota_reset_at`. | | `403` | Planen gir ikke tilgang (utvidet prognose, for mange anlegg, for mange kWp) | | Oppgrader, eller del opp forespørselen. | | `404` | Ukjent jobb, ingen datacelle ved punktet, ingen høydemodell | `NOT_FOUND` | Sjekk id eller koordinat. | | `405` | Feil HTTP-metode | `METHOD_NOT_ALLOWED` | Se `Allow`-hodet. | | `409` | Jobben er ikke ferdig | `NOT_READY` | Poll status først. | | `410` | Tegnegrunnlaget for en jobb er utløpt | `EXPIRED` | Kjør analysen på nytt. | | `413` | For stor forespørsel | `TOO_LARGE` | Reduser innholdet. | | `422` | Ingen bygning ved punktet, ingen datadekning | `NO_BUILDING`, `NO_COVERAGE` | Flytt punktet. | | `429` | Anleggskvote eller hastighetsgrense | `RATE_LIMITED` | Vent `Retry-After` sekunder, eller til `resets_at`. | | `500` | Intern feil | `FORMAT_ERROR` m.fl. | Prøv igjen; vedvarer det, [meld fra](/kontakt). | | `502` | Bakenforliggende tjeneste svarte feil (MET, NVE, beregningstjener) | `BACKEND_ERROR` | Prøv igjen med økende ventetid (2, 4, 8 s). | | `503` | Prognosedata mangler, kø full, tjeneste opptatt | `BACKEND_BUSY` | Vent `Retry-After` (standard 30 s) og prøv igjen. | | `504` | Beregningen tok for lang tid | `BACKEND_TIMEOUT`, `TIMEOUT` | Prøv igjen, eller bruk jobb-endepunktet i kø. | Ukjent sti under `/api/` på prognosetjeneren svarer `200` med en katalog over endepunkter, ikke `404`, og teller som ett kall. Sjekk derfor at svaret inneholder feltene du forventer, ikke bare statuskoden. ## Kvotestatus i hodene Det finnes ingen `X-RateLimit-*`-hoder. Prognose-API-et gir kvotestatus i `429`-svaret (`quota`). Horisont nivå 2 og 3 setter `X-Quota-Remaining` (`unmetered` i pilot) og `X-Worker-Request-Id`, som du bør oppgi ved feilmeldinger til oss. Terreng- og takendepunktene setter bare fagspesifikke hoder (`X-Terrengkategori`, `X-Konfidens` på PDF/HTML; `X-Moduler`, `X-Kwp` på tegningen). ## Robust klient i praksis - Sett tidsavbrudd: 15 s for prognose og TMY, 30 s for horisont nivå 2, 60 s for terrengkategori og horisont nivå 3, 120 s for takanalyse (eller bruk jobb-endepunktene). - Prøv på nytt bare ved `429`, `502`, `503` og `504`, med `Retry-After` der det finnes, ellers eksponentiell ventetid med tilfeldig tillegg. Maks 3 forsøk. - Aldri på nytt ved `400`, `401`, `402`, `403`, `422`. - Logg `X-Worker-Request-Id` og `cycle_time`/`issued_utc` sammen med svaret. ## Helsesjekk `GET https://api.solkart.no/health` svarer `{"status":"ok","auth_enabled":true}`. Det bekrefter at tjeneren svarer, ikke at prognosedata er ferske. Bruk `GET /api/forecast/latest` og sammenlign `cycle_time` med nå for å se om prognosen er oppdatert. --- # Konvensjoner: tid, enheter og koordinater > Tidsstempler (bin-start, UTC), enheter, asimut- og helningskonvensjoner per endepunkt, koordinatsystemer, dataformater og HTTP-detaljer som gjelder på tvers av API-et. Kilde: https://solkart.no/api/dokumentasjon/konvensjoner · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json ## Tid **Tidsstempler markerer starten på timen, i UTC.** Etiketten `2026-09-15T10:00:00Z` betyr middelverdien over 10:00 til 11:00 UTC. Dette gjelder `/api/forecast*` (siden 7. september 2026) og `/api/tmy` i JSON og CSV. - Skal du plotte kurven, legg punktet midt i timen (tidsstempel pluss 30 minutter). Døgn- og månedssummer påvirkes ikke. - `cycle_time` i prognosen er når prognosen ble kjørt, ikke hvilken time den gjelder. `issued_utc` i snøutsikten er tilsvarende. - Feltet `hour` i prognosen er en indeks fra 0 i serien, ikke klokkeslett. - **Unntak:** EPW- og TMY3-filer følger sine egne standarder: timeslutt i lokal normaltid (UTC+1, uten sommertid). Rad 1 dekker 00:00 til 01:00 lokal tid. `tz=local` i TMY-JSON og CSV roterer serien til UTC+1 med `+01:00` i tidsstemplet. - I utvidet prognose (`/api/forecast/extended`) er modelltimene bin-start, mens timene som kommer fra MET Locationforecast (`source: "locationforecast"`) er MET sine øyeblikkstidspunkt. Behandle dem som time-verdier for timen som starter da. - TMY-serien har år 2001 i tidsstemplene. Året er en plassholder for et typisk år, ikke et kalenderår. ## Koordinater - Inn: `lat` og `lon` i desimalgrader, WGS84 (EPSG:4326). Punktum som desimaltegn. Rekkefølgen er alltid breddegrad først. - Dekning: fastlands-Norge. Prognose og horisont aksepterer 57 til 72° N og 4 til 32° Ø. TMY, PV, snøtap og snøutsikt aksepterer 57 til 71,5° N og 4 til 31,5° Ø og krever at det finnes en datacelle innen 6 km. Svalbard dekkes ikke. - Snølast tar også `x`,`y` i UTM 33 (EPSG:25833), som er rutenettet seNorge bruker. - Svar oppgir cellen som ble brukt (`cell_id`, `center_cell`, `tile_key`) og avstanden fra ditt punkt (`cell_distance_km`). Oppløsningen er 0,03° (om lag 3 km × 1,7 km) for prognosen, 1 km for snø og høydemodell, 3 km for TMY og PV. ## Vinkler Konvensjonene skiller seg mellom endepunktene fordi de følger hvert sitt fagmiljø. Sjekk tabellen før du regner om. | Endepunkt | Helning | Asimut | |---|---|---| | `/api/forecast*` (`arrays[].tilt_deg`, `azimuth_deg`) | 0° = flatt, 90° = vegg | Kompass: 0° = nord, 90° = øst, 180° = sør, 270° = vest | | `/api/pv/calc` (`angle`, `aspect`, `arrays`) | 0° = flatt, 90° = vegg | PVGIS-konvensjon: 0° = sør, −90° = øst, +90° = vest, ±180° = nord | | `/api/snowsoiling/calc`, `/api/snow/outlook` (`angle`, `aspect`) | som PV | som PV (0° = sør) | | `/api/horizon/*` (`azimuth_deg`) | Horisonthøyde i grader over horisontalplanet | Kompass: 0° = nord, med klokka, 0,5° oppløsning | | `/api/horizon/precise` (`panel_az_deg`, `panel_tilt_deg`) | 0 til 90° | Kompass: 0° = nord | | `/api/terrain/category` (`akse_grader`, `senter_grader`) | | Kompass 0 til 179,99° for byggeakse (retning uten fortegn), 0 til 359° for sektorer | | `/api/roof/*` (`rad_retning_grader`) | `helning_grader` 5 til 20° | 0 til 179,99°, byggets akse | ## Enheter | Størrelse | Enhet | Felt (eksempler) | |---|---|---| | Innstråling | W/m² (timemiddel) | `ghi_wm2`, `ghi`, `dni`, `dhi` | | Innstrålingssum | kWh/m² | `daily_ghi_kwh_m2`, `H(i)_m`, `annual_ghi_kwh_m2`, `poa_kwh_m2` | | Effekt | W (prognose), kW (PV-kalkulator) | `total_W`, `_W`, `P_peak_kW`, `maxpower` | | Energi | kWh | `total_kWh`, `E_m`, `E_y` | | Installert effekt | kWp | `kwp`, `peakpower` | | Spesifikk avling | kWh/kWp per år | `specific_yield_kwh_kwp` | | Temperatur | °C | `temp_air`, `temp_c` | | Vind | m/s | `wind_speed` | | Trykk | hPa | `mslp` | | Snø | mm snødybde eller mm vannekvivalent (SWE), oppgitt i feltnavnet | `snow_depth_mm`, `char_swe_mm` | | Snølast | kN/m² | `characteristic_snow_load_kn_m2`, `sk_kn_m2` | | Tap | prosent | `l_total`, `snow_loss_pct`, `loss_pct` | | Andeler | 0 til 1 | `coverage`, `konfidens`, `sky_view_factor` | | Høyde | m over havet (`_masl`) eller m over terreng | `elevation_m`, `observer_z_masl`, `observer_height_m` | | Avstand | m eller km, i feltnavnet | `distance_m`, `radius_km` | Negative tapstall i PV-kalkulatoren (`l_aoi: -2.4`) betyr tap; positive betyr gevinst i forhold til referansen. ## Format - JSON er UTF-8 med punktum som desimaltegn og `null` for manglende verdier. Feltnavn er stabile; nye felt kan komme til uten varsel, se [versjonering](/api/dokumentasjon/caching-og-versjonering). - CSV bruker komma som skilletegn og punktum som desimaltegn, uansett `format`. Filer får `Content-Disposition: attachment; filename="…"`. - Store svar: en horisontprofil er om lag 12 kB, en TMY-fil i JSON om lag 480 kB. Be om `Accept-Encoding: gzip`; Cloudflare komprimerer. - POST-kropper skal være JSON med `Content-Type: application/json`. Booleans er ekte `true`/`false`, ikke strenger. - Brytere i GET-parametre tolkes ulikt per endepunkt, bruk verdien i tabellen: `daily=true`, `snow=1` (eller `true`), `snowloss=1`, `horizon=0` for å slå av. Andre verdier ignoreres. ## HTTP - Alle endepunkter tillater kall fra nettleser (`Access-Control-Allow-Origin: *`, `OPTIONS` besvares). Ikke send nøkkelen fra nettleseren. - GET er idempotent og kan caches. POST til `/api/forecast` er også trygt å gjenta; POST til jobbendepunktene oppretter en ny jobb hver gang. - Svartid: prognose og TMY under 1 s ved treff i cache, PV-kalkulator 1 til 3 s, horisont nivå 2 2 til 5 s, terrengkategori 20 til 60 s, takanalyse 15 til 90 s. Bruk jobbendepunktene for de to siste. --- # Asynkrone jobber > Terrengkategori og takanalyse kan ta opptil et par minutter. Jobbendepunktene legger analysen i kø og lar deg hente status og resultat når den er ferdig. Kilde: https://solkart.no/api/dokumentasjon/jobber · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json ## Når du bør bruke kø To beregninger er for tunge til at et vanlig HTTP-kall alltid rekker fram: terrengkategori (leser høydemodeller ut til 10 km) og takanalyse (høydemodell 1 m, flyfoto og bildeanalyse). Begge finnes i to utgaver: | Beregning | Synkront | I kø | |---|---|---| | Terrengkategori | `POST /api/terrain/category` (svarer innen 60 s) | `POST /api/terrain/jobs` | | Takanalyse | `POST /api/roof/layout` (svarer innen 90 s) | `POST /api/roof/jobs` | Bruk køen i alt som ikke er interaktiv testing. Den synkrone varianten gir `503 BACKEND_BUSY` når tjenesten er opptatt, og `504` når analysen tar for lang tid. ## Livsløpet til en jobb 1. **Opprett:** `POST` med samme kropp som det synkrone endepunktet. Svar `202 Accepted`: ```json { "jobb_id": "3f9a1c2b7d0e", "status": "queued", "posisjon": 2, "foran": 1, "estimert_sekunder": 45, "ventende_i_koen": 2 } ``` `posisjon` er plassen din i køen (1 = neste), `foran` antall jobber foran deg, `estimert_sekunder` et grovt anslag. Terrengjobber har i tillegg `format` og `bane`. 2. **Poll:** `GET /api/{terrain|roof}/jobs/{jobb_id}` gir samme konvolutt med oppdatert `status`: | `status` | Betyr | |---|---| | `queued` | Venter i kø | | `running` | Analysen kjører | | `done` | Ferdig; resultatet ligger i svaret | | `error` | Feilet; `feil: {status, melding}` forklarer | 3. **Hent resultat:** Ved `done` inneholder svaret `resultat` (JSON-analysen). For terrengkategori med `format: "pdf"` eller `"html"` får du i stedet `fil: "/terrain/jobs/{id}/fil"` og henter fila fra `GET /api/terrain/jobs/{id}/fil`. Takanalysen legger tegningen på `GET /api/roof/jobs/{id}/tegning.png` (`tegning_url` i svaret). ## Regler du må ta hensyn til - **Levetid: 15 minutter** etter at jobben er ferdig. Deretter svarer `GET` med `404 NOT_FOUND`. Hent resultatet med én gang og lagre det selv. - **Køstørrelse:** maks 20 ventende jobber per tjeneste. Er køen full, får du `503` med `code: "BACKEND_BUSY"` og `Retry-After` (anslått ventetid i sekunder, 30 når anslag mangler). Vent og opprett jobben på nytt. - **Tidsavbrudd i tjenesten:** 180 s for terrengkategori, 120 s for takanalyse. Overskrides det, ender jobben som `error`. - **Hastighet:** opprettelse er begrenset til 1 per sekund og 30 per time (terreng) eller 20 per time (tak) per IP-adresse. Polling teller ikke. - **Id-format:** 12 heksadesimale tegn. Alt annet gir `404`. - Fil før jobben er ferdig gir `409 NOT_READY`. Tegning etter at grunnlaget er borte gir `410 EXPIRED`. - Statussvarene har `Cache-Control: private, no-store`; bare tegningen (`tegning.png`) kan caches i 15 minutter. ## Polling som oppfører seg pent Poll hvert 2. sekund de første 20 sekundene, deretter hvert 5. sekund. Gi opp etter 5 minutter. Bruk `estimert_sekunder` fra første svar til å sette første ventetid. ```python import time, requests API = "https://api.solkart.no" r = requests.post(f"{API}/api/terrain/jobs", json={"lat": 59.2185, "lon": 10.9298, "format": "json"}, timeout=15) r.raise_for_status() job = r.json() jobb_id = job["jobb_id"] time.sleep(min(job.get("estimert_sekunder", 5), 20)) deadline = time.time() + 300 while time.time() < deadline: s = requests.get(f"{API}/api/terrain/jobs/{jobb_id}", timeout=15).json() if s["status"] == "done": print(s["resultat"]["resultat"]["terrengkategori"]) break if s["status"] == "error": raise RuntimeError(s["feil"]["melding"]) time.sleep(2 if time.time() < deadline - 280 else 5) ``` ```bash # Opprett jobb for PDF-rapport curl -s -X POST https://api.solkart.no/api/terrain/jobs \ -H "Content-Type: application/json" \ -d '{"lat": 59.2185, "lon": 10.9298, "format": "pdf", "sted": "Jegerveien 8, Fredrikstad"}' # → {"jobb_id":"3f9a1c2b7d0e","status":"queued",...} # Status curl -s https://api.solkart.no/api/terrain/jobs/3f9a1c2b7d0e # Fil når status er done curl -s -o terrengkategori.pdf https://api.solkart.no/api/terrain/jobs/3f9a1c2b7d0e/fil ``` Detaljer om kroppen og resultatet står på [terrengkategori](/api/dokumentasjon/terrengkategori) og [takanalyse](/api/dokumentasjon/takanalyse). --- # Caching, versjonering og utfasing > Hvor ofte data endres, hvilke Cache-Control-hoder hvert endepunkt setter, hvordan du finner ut hvilken modellversjon du fikk, og hva som fases ut når. Kilde: https://solkart.no/api/dokumentasjon/caching-og-versjonering · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json ## Hvor ofte endrer dataene seg? | Data | Oppdateres | Hent | |---|---|---| | Solprognose (`/api/forecast*`) | Ny syklus hver time, publisert rundt 50 minutter over hel time | Én gang per time per anlegg. Sjekk `cycle_time`. | | Nowcast (`/api/forecast/nowcast`) | Hvert 15. minutt (satellitt) | Hvert 15. minutt | | Snøutsikt (`/api/snow/outlook`) | Daglig (seNorge) | Én gang per dag | | TMY, PV-kalkulator, snøtap, snølast, horisont | Klimatologi og statiske modeller; endres bare ved nye produktversjoner | Lagre resultatet hos deg | | Terrengkategori, takanalyse | Statisk grunnlag; ny analyse gir samme svar med samme parametre | Lagre rapporten hos deg | Bruk `GET /api/forecast/latest` (uten kvote) til å se om det finnes en ny `cycle_time` før du henter prognoser for mange anlegg. ## Cache-Control per endepunkt | Endepunkt | Hode | Ekstra | |---|---|---| | `/api/forecast`, `/extended`, `/latest` | Ingen | `/extended` og `/latest` bruker V1.5-rutenettet (`production_v1`) | | `/api/forecast/bulk` | `public, max-age=` (minst 60) | `X-Solkart-Cache: HIT|MISS`, `X-Solkart-Cache-Ttl`; nøkkel er SHA-256 av kroppen | | `/api/forecast/nowcast` | `public, max-age=120` | | | `/api/tmy`, `/api/tmy/stats`, `/api/tmy/sources` | `public, max-age=86400` | `X-Tmy-Cell`, `X-Tmy-Cell-Distance-Km`, `X-Tmy-Product` | | `/api/pv/calc` | `public, max-age=86400` (JSON) | `X-Pv-Cache: HIT` når resultatet lå i vår cache (7 døgn) | | `/api/snowload/calc` | `public, max-age=86400` (JSON) | | | `/api/snowsoiling/calc` | `public, max-age=86400` | `X-Snowsoil-Cache: HIT` | | `/api/snow/outlook` | `public, max-age=3600` | `X-Snow-Outlook-Cache: HIT|MISS` | | `/api/horizon/terrain` | `public, max-age=86400` | `X-Horizon-Tile-Key`, `X-DTM-Year`, `X-Api-Version` | | `/api/horizon/rooftop`, `/precise` | Ingen | `X-Worker-Request-Id`, `X-API-Tier`, `X-Quota-Remaining` | | `/api/terrain/*`, `/api/roof/*` | `private, no-store` (tegning.png: `private, max-age=900`) | `X-Terrengkategori`, `X-Konfidens` (terreng, PDF/HTML); `X-Moduler`, `X-Kwp` (tegning) | Det finnes ikke `ETag` eller `Last-Modified`, og `If-None-Match` støttes ikke. Kvote- og planvurdering skjer før cachen sjekkes, så et cachet bulk-svar bruker fortsatt kvote. ## Hvilken versjon fikk jeg? Svarene forteller selv hva som ble brukt. Logg disse feltene sammen med resultatet. | Endepunkt | Felt | Verdier i dag | |---|---|---| | `/api/forecast*` | `model`, `data_mode` | `production_v2_3b` / `v23b`, `v23b_daily`; ved fall tilbake `production_v1` / `latest`, `daily`, `corrected`, `rolling` | | `/api/forecast/nowcast` | `source` | `v7_eumetsat_nowcast` eller `v23b_fallback` | | `/api/horizon/terrain` | `version`, `api_tier`, `dtm_year` | `v3.1`, `terrain` | | `/api/horizon/rooftop`, `/precise` | `version`, `api_tier`, `dom_year`, `dtm_year` | `v3.1` (`v3.2` med panelgeometri), `rooftop`, `precise` | | `/api/tmy` | `meta.product`, `meta.license_version`, `meta.generator` | `ens_tmy30`, `tmy-v1-2026-09-30` | | `/api/pv/calc` | `meta.generator`, `inputs.meteo_data.source` | `SunPoint PV-kalkulator v1` | | `/api/snowload/calc`, `/api/snowsoiling/calc` | `method.reference` | SINTEF 102027401 v2; IFE/E-2024/005 | | `/api/terrain/category` | `norm`, `meta` | NS-EN 1991-1-4:2005/NA:2009 | | `/api/roof/*` | `meta.versjon`, `grunnlag` | `1` | ## Modellvalg i prognosen Standard er V2.3b, modellen som også driver kartet på solkart.no. De eldre variantene kan fortsatt velges, men fases ut: | Valg | Gir | Status | |---|---|---| | (ingen) | V2.3b, `data_mode: "v23b"` | Anbefalt | | `daily=true` | V2.3b sydd fra midnatt, `v23b_daily` (Basic+) | Anbefalt | | `model=v1` eller `v23b=false` | V1.5-rutenettet | Fases ut 19. november 2026 | | `corrected=true` | V1.5 med statistisk korreksjon | Fases ut 19. november 2026 | | `fresh=true` | V1.5 rullerende sammensying | Fases ut 19. november 2026 | | `precise=true` | PV-modell i pvlib med PVGIS-horisont (tregere) | Beholdes | | `snow=1` | Snøtapsfaktorer fra seNorge på produksjonen | Beholdes | Etter 19. november 2026 ignoreres `model`, `corrected` og `fresh`, og svaret bruker V2.3b. Integrasjoner som ikke sender disse, påvirkes ikke. ## Slik endrer vi API-et - **Uten varsel:** nye felt i svar, nye valgfrie parametre, nye formater, nye endepunkter, mer presise tall når modellene forbedres. - **Med varsel på [endringsloggen](/api/dokumentasjon/endringslogg) og minst 60 dager før:** fjerning av felt eller parametre, endret betydning av et felt, endret tidskonvensjon, strengere validering. - Sikkerhetsfeil og faktafeil rettes umiddelbart, og endringen dokumenteres samme dag (som solposisjonsfeilen 15. september 2026). - Det finnes ingen versjon i URL-en eller i hoder. Klienter bør tåle ukjente felt og ikke bruke rekkefølgen på felt. ## TMY-lisens TMY-nedlastinger merkes med `license_version: "tmy-v1-2026-09-30"`: dataene er lisensiert for prosjekter som prosjekteres til og med 30. september 2026. Ny versjon utstedes før den datoen; klienter bør lese `meta.license` og `meta.license_no` og vise teksten videre til sluttbruker. --- # 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. Kilde: https://solkart.no/api/dokumentasjon/prognose · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json ## 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](/api/dokumentasjon/autentisering) og [kvoter](/api/dokumentasjon/grenser-og-feil). ## GET /api/forecast: innstråling for et punkt ```bash 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`: ```json { "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](/api/dokumentasjon/caching-og-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. | !!! note "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](/api/dokumentasjon/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. ```bash 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 (`_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): ```json { "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[]._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. ```bash 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`: ```json { "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. ```bash curl "https://api.solkart.no/api/forecast/extended?lat=59.19&lon=10.90" -H "X-API-Key: $SOLKART_API_KEY" ``` Svar `200` (utdrag): ```json { "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. ```bash 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. ```json { "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 ```javascript 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`); ``` ```python 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](/om). --- # PV-produksjonsberegning > Forventet års- og månedsproduksjon for et solcelleanlegg hvor som helst i Norge, regnet på TMY Norge med terrenghorisont. Flere takflater, klipping, snøtap, P50 til P95 og optimal vinkel. Samme beregning som PVGIS, med norske data. Kilde: https://solkart.no/api/dokumentasjon/pv · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json ## Hva du får Månedlig og årlig produksjon (kWh), innstråling i modulplanet (kWh/m²), standardavvik mellom år, månedlig makseffekt og tapspostene hver for seg. Modellkjeden er den samme som i EUs PVGIS (Perez-transposisjon, Martin-Ruiz-refleksjon, Faiman-temperatur, Huld-effektmodell), men klimadataene er [TMY Norge](/api/dokumentasjon/tmy) i 3 km og horisonten leses fra Kartverkets høydemodell for punktet. Beregningen er validert mot PVGIS 5.3. Endepunktet krever ingen nøkkel og har ingen kvote. Timeverdier leveres ikke; trenger du dem, hent [TMY](/api/dokumentasjon/tmy) og regn selv. ## GET /api/pv/calc ```bash curl "https://api.solkart.no/api/pv/calc?lat=59.91&lon=10.75&peakpower=10&angle=35&aspect=0" ``` | Parameter | Type | Standard | Beskrivelse | |---|---|---|---| | `lat`, `lon` | tall | påkrevd | 57 til 71,5° N, 4 til 31,5° Ø, fastlands-Norge | | `peakpower` | 0,05 til 100 000 kWp | 1 | Installert effekt for én flate | | `angle` | 0 til 90° | 35 | Helning (0 = flatt) | | `aspect` | −180 til 180° | 0 | Asimut, **0 = sør**, −90 = øst, +90 = vest | | `arrays` | `kwp:vinkel:asimut,…` | | 1 til 4 flater i samme beregning, f.eks. `arrays=6:35:0,4:25:-90`. Overstyrer `peakpower`, `angle`, `aspect`. Kan ikke kombineres med `optimize`. | | `loss` | 0 til 60 % | 14 | Systemtap: inverter, kabling, mismatch, LID. 14 er PVGIS-standard; moderne anlegg ligger på 5 til 7. | | `pvtechchoice` (`tech`) | `crystSi` \| `CIS` \| `CdTe` | `crystSi` | Modulteknologi (Huld-koeffisienter). TOPCon og PERC = `crystSi`. | | `mountingplace` (`mounting`) | `free` \| `building` | `free` | Ventilert eller bygningsintegrert (Faiman-temperaturmodell) | | `optimize` | `none` \| `slope` \| `both` | `none` | Finn optimal helning, eller helning og asimut | | `confidence` | `p50` \| `p75` \| `p90` \| `p95` | `p50` | Solår-persentil fra TMY-statistikken. P90 = året som overskrides 90 % av årene. | | `maxpower` | 0,05 til 100 000 kW | | Klipping: maks AC-effekt ut (inverter eller nettgrense). Klippes per time på summen av flatene. | | `horizon` | `0` | på | `0` slår av terrenghorisonten | | `snowloss` | `1` | av | Legg til stedlig snø- og smusstap (samme modell som [snøtap](/api/dokumentasjon/snotap)) | | `snowmounting` | `roof` \| `rack` \| `flat` | `rack` ved `free`, ellers `roof` | Montasje for snømodellen | | `format` | `json` \| `csv` | `json` | | Svar `200` (ekte svar, Oslo sentrum, 10 kWp, 35°, sør): ```json { "inputs": { "location": { "lat": 59.9105, "lon": 10.7687, "elevation_m": 61.3, "cell_id": "y0578x614" }, "meteo_data": { "source": "SunPoint V6 ens_tmy30 (NORA3+SunPoint 1991-2020)", "confidence": "p50", "horizon": "V3 terrain (DTM10)" }, "pv_module": { "technology": "crystSi", "peak_power_kwp": 10, "system_loss_pct": 14 }, "mounting_system": { "type": "free", "slope_deg": 35, "azimuth_deg": 0, "optimized": null }, "snow_loss": null }, "outputs": { "monthly": [ { "month": 1, "E_d": 5.29, "E_m": 163.94, "H(i)_d": 0.63, "H(i)_m": 19.63, "SD_m": 10.82, "P_peak_kW": 4.553 }, { "month": 6, "E_d": 48.11, "E_m": 1443.27, "H(i)_d": 6.04, "H(i)_m": 181.12, "SD_m": 205.14, "P_peak_kW": 8.031 }, { "month": 12, "E_d": 4.42, "E_m": 137.11, "H(i)_d": 0.53, "H(i)_m": 16.41, "SD_m": 14.0, "P_peak_kW": 3.391 } ], "totals": { "E_d": 26.95, "E_m": 819.63, "E_y": 9835.55, "H(i)_d": 3.3, "H(i)_m": 100.48, "H(i)_y": 1205.78, "SD_y": 320.5, "l_aoi": -2.4, "l_spec": 1.6, "l_tg": -4.3, "l_total": -18.4, "specific_yield_kwh_kwp": 984 } }, "meta": { "sky_view_factor": 0.998, "model": "Perez1990 + Martin-Ruiz(ar=0.16) + Faiman + Huld2010; spektral konstant per teknologi (tilnaerming)", "note": "Kun maaneds- og aarsverdier (+ maanedlig makseffekt) leveres - timeserier er ikke tilgjengelige her.", "generator": "SunPoint PV-kalkulator v1 (solkart.no/sunpoint)" } } ``` | Felt | Enhet | Beskrivelse | |---|---|---| | `outputs.monthly[].E_d`, `E_m` | kWh | Produksjon per dag (middel) og per måned | | `outputs.monthly[].H(i)_d`, `H(i)_m` | kWh/m² | Innstråling i modulplanet per dag og måned | | `outputs.monthly[].SD_m` | kWh | Standardavvik i månedsproduksjon mellom år | | `outputs.monthly[].P_peak_kW` | kW | Høyeste timeeffekt i måneden (sum over flatene) | | `outputs.monthly[].snow_loss_pct` | % | Bare med `snowloss=1` | | `outputs.totals.E_y` | kWh | Årsproduksjon | | `outputs.totals.H(i)_y` | kWh/m² | Årsinnstråling i modulplanet | | `outputs.totals.l_aoi` | % | Refleksjonstap ved innfallsvinkel | | `outputs.totals.l_spec` | % | Spektral effekt (positiv = gevinst) | | `outputs.totals.l_tg` | % | Temperatur og lav innstråling | | `outputs.totals.l_clip` | % | Klipping, bare med `maxpower` | | `outputs.totals.l_snow` | % | Snø og smuss, bare med `snowloss=1` | | `outputs.totals.l_total` | % | Sum av alle tap inkludert `loss` | | `outputs.totals.specific_yield_kwh_kwp` | kWh/kWp | Spesifikk avling per år | | `outputs.arrays[]` | | Med `arrays`: `kwp`, `angle_deg`, `aspect_deg`, `E_y`, `specific_yield_kwh_kwp` per flate | | `inputs.mounting_system.optimized` | | Med `optimize`: `{angle, aspect}` som ble funnet | | `meta.sky_view_factor` | 0 til 1 | Andel av himmelen som er synlig over horisonten | Tapene `l_aoi`, `l_spec`, `l_tg`, `l_clip` og `l_snow` modelleres eksplisitt og skal derfor ikke også legges i `loss`. ## Flere takflater og klipping ```bash # Øst/vest-anlegg, 60 kWp per side, 10° helning, inverter begrenset til 100 kW curl "https://api.solkart.no/api/pv/calc?lat=59.22&lon=10.93&arrays=60:10:-90,60:10:90&maxpower=100&loss=7" ``` Energiene summeres per time før klipping, så øst- og vestflater som ikke topper samtidig gir riktig `P_peak_kW` og `l_clip`. ## CSV `format=csv` gir månedstabellen (`month,E_d,E_m,H(i)_d,H(i)_m,SD_m,P_peak_kW`), en tom linje og totalene som `key,value`. Fil: `sunpoint_pv__.csv`. ## Caching JSON-svaret har `Cache-Control: public, max-age=86400` og lagres hos oss i 7 døgn (`X-Pv-Cache: HIT` viser treff); CSV caches ikke. Horisonten for punktet lagres i 30 døgn. ## Feil | Status | `error` | |---|---| | `400` | `Ugyldige tall: peakpower (kWp), loss (%), angle (0-90), aspect (-180..180, 0=sor).` | | `400` | `arrays: 1-4 flater som kwp:vinkel:asimut, kommaseparert.` | | `400` | `optimize stottes ikke sammen med arrays.` | | `400` | `confidence ma vaere p50\|p75\|p90\|p95`, `maxpower: 0.05-100000 kW …`, `format ma vaere json\|csv` | | `404` | `Ingen TMY-celle innen ~6 km av punktet (utenfor fastlands-Norge-masken).` | | `503` | `TMY-data ikke tilgjengelig.` | ## Samme beregning i nettleseren [solkart.no/sunpoint](/sunpoint) kjører dette endepunktet med adressesøk, kart, rapport til PDF og valgfri takanalyse fra flyfoto. Rapporten viser parametrene som ble brukt, så en beregning kan gjentas via API-et. --- # TMY Norge > Typisk meteorologisk år for ethvert punkt på fastlands-Norge, 8760 timer med GHI, DNI, DHI, temperatur, fukt, vind og trykk. 15 filformater, fire produkter, P50 til P95, statistikk og kilder per celle. Kilde: https://solkart.no/api/dokumentasjon/tmy · Sist oppdatert 2026-09-15 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json ## Hva du får Et typisk meteorologisk år (TMY) er 12 typiske måneder valgt fra en lang periode og satt sammen til ett år med 8760 timer. TMY Norge er bygd for 38 671 celler i 3 km fra NORA3 (Meteorologisk institutts reanalyse) og SunPoint (1 km solmodell), biaskorrigert mot 45 MET-pyranometerstasjoner. Etter korreksjon er middelfeilen +0,5 W/m² og korrelasjonen 0,94. Filene er laget for PVsyst, EnergyPlus, SAM, PV*SOL og egne beregninger. Nøkkel er valgfri i lanseringsperioden: inntil 2000 forespørsler per døgn per IP-adresse, alle formater og produkter. En nøkkel gir ikke høyere kvote enn dette før planene aktiveres. Nedlastinger er lisensiert for prosjekter som prosjekteres til og med 30. september 2026 (`license_version: "tmy-v1-2026-09-30"`). ## GET /api/tmy: last ned året ```bash curl -o oslo.epw "https://api.solkart.no/api/tmy?lat=59.91&lon=10.75&format=epw" ``` | Parameter | Type | Standard | Beskrivelse | |---|---|---|---| | `lat`, `lon` | tall | påkrevd | 57 til 71,5° N, 4 til 31,5° Ø. Nærmeste celle innen 6 km brukes. | | `format` | se tabell | `epw` | Filformat | | `source` | `ensemble` \| `nora3` \| `sunpoint` | `ensemble` | Datakilde | | `period` | `30` \| `18` | `30` | 1991 til 2020, eller 2008 til 2025 (bare `nora3`) | | `product` | `ens_tmy30` \| `nora3_tmy30` \| `nora3_tmy18` \| `sunpoint_tmy30` | fra `source`+`period` | Velg produkt direkte | | `confidence` | `tmy` \| `mean` \| `p50` \| `p75` \| `p90` \| `p95` | `tmy` | `tmy` er de valgte typiske månedene uskalert. `mean` og `pXX` skalerer serien så årssummen av GHI treffer langtidsmiddelet eller persentilen. P90 = årssum som overskrides 90 % av årene. | | `tz` | `utc` \| `local` | `utc` | `local` er UTC+1 uten sommertid (gjelder JSON og CSV) | ### Formater | `format` | Filtype | Til | Tidskonvensjon | |---|---|---|---| | `json` | .json | Egen kode | UTC, bin-start | | `csv` | .csv | Regneark, pandas | UTC, bin-start | | `epw` | .epw | EnergyPlus, IDA ICE, DesignBuilder | Timeslutt, lokal normaltid (UTC+1) | | `tmy3` | .csv (NREL TMY3) | SAM, pvlib | Timeslutt, lokal normaltid | | `pvsyst` | .csv | PVsyst (importer som «Custom») | Timeslutt, lokal normaltid (UTC+1) | | `meteonorm` | .dat | PVsyst, Polysun | Timeslutt, lokal normaltid | | `pvgis` | .csv | Verktøy som leser PVGIS TMY | UTC | | `nsrdb` | .csv | Verktøy som leser NSRDB PSM3 | Timeslutt, lokal normaltid | | `solcast` | .csv | Verktøy som leser Solcast TMY | UTC | | `solaranywhere` | .csv | Verktøy som leser SolarAnywhere | Timeslutt, lokal normaltid | | `dwd`, `dwdxml` | .dat, .xml | Verktøy som leser DWD TRY | Timeslutt, lokal normaltid | | `custom` | .csv | Fritt kolonneformat med hode | Timeslutt, lokal normaltid | | `wbv` | .wbv | Windows-baserte simuleringsverktøy | Timeslutt, lokal normaltid | | `measurement` | .csv | Måledata-lignende format for validering | UTC | Fila leveres som `Content-Disposition: attachment; filename="sunpoint_tmy____."` (`inline` for JSON), med `Cache-Control: public, max-age=86400` og hodene `X-Tmy-Cell`, `X-Tmy-Cell-Distance-Km`, `X-Tmy-Product`. ### JSON-strukturen ```json { "meta": { "cell_id": "y0578x614", "lat": 59.9105, "lon": 10.7687, "elevation_m": 61.3, "product": "ens_tmy30", "product_years": [1991, 2020], "selected_years": [2003, 2005, 2017, 2010, 2012, 2010, 2001, 2007, 2018, 1999, 2004, 2008], "confidence": "tmy", "scale_factor": 1, "annual_ghi_kwh_m2": { "tmy": 992.2, "mean": 966.3, "p50": 965.4, "p75": 940.4, "p90": 925.1, "p95": 908.2 }, "annual_dni_kwh_m2_tmy": 1089.7, "bias_correction_wm2": [-5.6, -11.2, -12.4, -10.2, -9.6, -9.2, -9.6, 0, -5.4, -6.8, 0, 0], "n_stations_bias": 3, "ensemble_weights": { "nora3": 0.40, "sunpoint": 0.60 }, "time_convention": "UTC, bin-start: value = mean over [t, t+1h); met vars instantaneous at t", "sources": "NORA3 (MET Norway reanalysis, 3 km) + SunPoint ML-Optimized GHI (MET Norway, 1 km); station bias-correction vs MET obs", "method": "TMY3-style Finkelstein-Schafer month selection (GHI 0.5, DNI 0.25, Tair 0.15, Tdew 0.05, wind 0.05); DNI/DHI via DIRINT", "license": "Data downloaded from this service is licensed for use only in projects designed on or before 30 September 2026.", "license_version": "tmy-v1-2026-09-30", "generator": "SunPoint V6 TMY API (solkart.no), record v1" }, "hourly": { "time": ["2001-01-01T00:00:00Z", "2001-01-01T01:00:00Z", "…8760 verdier"], "ghi": [0, 0, "…"], "dni": [], "dhi": [], "temp_air": [], "rel_hum": [], "wind_speed": [], "mslp": [] }, "units": { "ghi": "W/m2", "dni": "W/m2", "dhi": "W/m2", "temp_air": "degC", "rel_hum": "%", "wind_speed": "m/s", "mslp": "hPa" } } ``` | Felt | Beskrivelse | |---|---| | `meta.selected_years[]` | Kalenderåret hver av de 12 månedene er hentet fra | | `meta.annual_ghi_kwh_m2` | Årssum GHI for TMY-året, langtidsmiddelet og persentilene | | `meta.scale_factor` | Faktoren serien er skalert med for valgt `confidence` (1 for `tmy`) | | `meta.bias_correction_wm2[]` | Korreksjon per måned fra målestasjoner, W/m² | | `hourly.time[]` | År 2001 er plassholder for et typisk år | Innstrålingen er timemiddel over `[t, t+1h)`; temperatur, fukt, vind og trykk er øyeblikksverdier ved `t`. ## GET /api/tmy/stats: årssummer og persentiler Statistikk for alle fire produktene i cellen, uten å laste ned timedata. ```bash curl "https://api.solkart.no/api/tmy/stats?lat=59.91&lon=10.75" ``` ```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 }, "products": { "ens_tmy30": { "years": [1991, 2020], "selected_years": ["…12"], "annual_ghi_kwh_m2": { "tmy": 992.2, "mean": 966.3, "p50": 965.4, "p75": 940.4, "p90": 925.1, "p95": 908.2 }, "annual_ghi_std_kwh_m2": 40.2, "annual_dni_kwh_m2_tmy": 1089.7 }, "nora3_tmy30": { "…": "…" }, "nora3_tmy18": { "…": "…" }, "sunpoint_tmy30": { "…": "…" } }, "monthly_ghi_kwh_m2": { "ens_tmy30": { "p50": ["…12"], "p90": ["…12"] }, "nora3_tmy30": { "…": "…" } }, "bias_correction": { "applied_wm2_per_month": ["…12"], "n_stations": 3, "mean_abs_wm2": 6.7 }, "ensemble_weights": { "nora3": 0.40, "sunpoint": 0.60 }, "n_years": { "nora3": 30, "sunpoint": 30 }, "exceedance_definition": "Pxx = annual/monthly GHI exceeded in xx % of years of the product period (P90 = 10th percentile)" } ``` ## GET /api/tmy/sources: hvor kommer hver måned fra ```bash curl "https://api.solkart.no/api/tmy/sources?lat=59.91&lon=10.75" ``` Svarer med `products..{source, period, selected_year_per_month[12]}`, `bias_correction_wm2_per_month[12]`, `n_stations_bias` og `method`. Nyttig i rapporter som skal dokumentere datagrunnlaget. ## POST /api/tmy/lead Skjemaet på [solkart.no/tmy](/tmy) registrerer firma, navn og e-post før nedlasting og lisensaksept. Endepunktet er åpent, men beregnet på skjemaet: `{company, name, email, lat, lon, license_accepted: true}` pluss valgfrie `phone`, `address`, `product`, `format`. Svar `{ok: true, stored: true, id, license_version}`. Grense 200 per IP-adresse per døgn. ## Eksempler i kode ```python import pandas as pd, requests r = requests.get("https://api.solkart.no/api/tmy", params={"lat": 59.91, "lon": 10.75, "format": "json", "confidence": "p90"}, timeout=30) r.raise_for_status() d = r.json() df = pd.DataFrame(d["hourly"]).set_index(pd.to_datetime(d["hourly"]["time"])) print(d["meta"]["annual_ghi_kwh_m2"]["p90"], df["ghi"].sum() / 1000) ``` ```bash # PVsyst: last ned og importer som Custom-fil curl -o oslo_p90.csv "https://api.solkart.no/api/tmy?lat=59.91&lon=10.75&format=pvsyst&confidence=p90" ``` ## Feil | Status | `error` | |---|---| | `400` | `lat og lon må være tall (grader, WGS84).` | | `400` | `Punktet er utenfor dekningsområdet (lat 57-71.5, lon 4-31.5, fastlands-Norge).` | | `400` | `Ukjent format ''. 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).