Nordic Weather Forecast API: SMHI, Yr (MET Norway), FMI, DMI avatar

Nordic Weather Forecast API: SMHI, Yr (MET Norway), FMI, DMI

Pricing

$1.00 / 1,000 weather rows

Go to Apify Store
Nordic Weather Forecast API: SMHI, Yr (MET Norway), FMI, DMI

Nordic Weather Forecast API: SMHI, Yr (MET Norway), FMI, DMI

Returns hourly weather forecasts or station observations for Sweden, Norway, Finland, Denmark and Iceland from SMHI, MET Norway (Yr), FMI and DMI in one schema: temperature, wind, gusts, precipitation, humidity, pressure, cloud cover and weather symbol.

Pricing

$1.00 / 1,000 weather rows

Rating

0.0

(0)

Developer

Viktor Wiberg

Viktor Wiberg

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Share

A weather forecast API for the Nordics: hourly weather forecasts and station observations for Sweden, Norway, Finland, Denmark and Iceland, straight from the four national weather institutes: SMHI, MET Norway (the data behind Yr), FMI and DMI. Every source is converted to the same row format, so the weather data for Stockholm, Oslo, Helsinki and Copenhagen comes back with the same fields, the same units and the same weather symbols.

Ask for a city by name or any point by coordinates. In auto mode each place gets the forecast from its own country's institute, which is usually the best local model. You can also pick one source for every place, for example to compare SMHI and MET Norway for the same city.

What you get

One row per place and hour:

  • temperature (°C), wind speed, gusts (m/s) and wind direction (degrees)
  • precipitation (mm) and the length of the period it covers
  • relative humidity (%), sea level pressure (hPa) and cloud cover (%)
  • a weather symbol in one shared vocabulary, plus the source's own code
  • the source, license and attribution text for each row

Forecasts run from the current hour up to 10 days ahead. Observations are measured values from the nearest weather station for up to the last 7 days (Sweden, Finland and Denmark).

Typical uses

  • Weather columns for logistics, field service, construction or event planning in the Nordics
  • Inputs for energy and demand models (temperature, wind and cloud cover by hour)
  • Comparing forecasts from two institutes for the same place
  • A daily feed of forecasts or observations into a spreadsheet, database or AI agent

Input

FieldTypeDefaultDescription
citiesarray["Stockholm"] if no locationsBuilt-in Nordic places by name. Swedish, English and local spellings work. See the list below.
locationsarraynoneAny point as {"name": "Cabin", "lat": 61.1, "lon": 12.9}. Add "country": "NO" to set the country yourself, otherwise it is taken from the nearest built-in place.
modestringforecastforecast or observations.
sourcestringautoauto, smhi, met, fmi or dmi. See below.
hoursAheadinteger48Forecast length from the current hour, 1 to 240.
hoursBackinteger24Observation period up to now, 1 to 168.
maxResultsinteger50Maximum rows in total, shared evenly between the places. 1 to 10 000.
onlyNewbooleanfalseOnly rows later than the last row delivered by an earlier run with the same input.

A run with empty input returns the next 48 hours for Stockholm.

Source per country in auto mode

CountryForecastObservations
SwedenSMHISMHI
NorwayMET Norwaynot available
FinlandFMIFMI
DenmarkDMIDMI
Iceland and elsewhereMET Norwaynot available

MET Norway publishes observations through the Frost API, which requires each user to register a client ID. This actor does not use it, so observations for Norway and Iceland are skipped with a message in the log.

Built-in places

CountryPlaces
SwedenStockholm, Göteborg (Gothenburg), Malmö, Uppsala, Västerås, Örebro, Linköping, Helsingborg, Jönköping, Norrköping, Lund, Umeå, Gävle, Borås, Sundsvall, Karlstad, Växjö, Halmstad, Luleå, Östersund, Kalmar, Visby, Kiruna, Falun, Åre
NorwayOslo, Bergen, Trondheim, Stavanger, Drammen, Fredrikstad, Kristiansand, Tromsø, Ålesund, Bodø, Lillehammer, Hammerfest, Longyearbyen
FinlandHelsinki (Helsingfors), Espoo (Esbo), Tampere (Tammerfors), Vantaa (Vanda), Turku (Åbo), Oulu (Uleåborg), Jyväskylä, Kuopio, Lahti, Vaasa (Vasa), Rovaniemi, Joensuu, Mariehamn
DenmarkKøbenhavn (Copenhagen, Köpenhamn), Aarhus (Århus), Odense, Aalborg, Esbjerg, Randers, Kolding, Roskilde, Helsingør (Elsinore), Rønne
IcelandReykjavík, Akureyri

Names are matched without regard to case or accents, so goteborg and Tromso also work. For any other place, use locations.

Example input

The input used for the sample output below: the next 24 hours for the four capitals.

{
"cities": ["Stockholm", "Oslo", "Helsinki", "Copenhagen"],
"mode": "forecast",
"hoursAhead": 24,
"maxResults": 100
}

Observations for the last 6 hours at a construction site and in Aarhus:

{
"locations": [{ "name": "Site 14", "lat": 59.62, "lon": 16.55 }],
"cities": ["Aarhus"],
"mode": "observations",
"hoursBack": 6
}

Output

FieldDescription
locationName of the place as given, or the built-in name
lat, lonCoordinates used for the request
countrySE, NO, FI, DK, IS, or null for points far from the Nordics
sourcesmhi, met, fmi or dmi
modeforecast or observations
timeHour in UTC, ISO 8601
temperatureCAir temperature at 2 m, °C
windSpeedMsMean wind speed at 10 m, m/s
windGustMsWind gust, m/s
windDirectionDegDirection the wind comes from, degrees (0 north, 90 east)
precipitationMmPrecipitation in the period that ends at time, mm
precipitationPeriodHoursLength of that period: 1 for hourly steps, longer for later forecast steps (SMHI uses 3, 6 and 12 hours after a few days, MET Norway 6 hours)
humidityPctRelative humidity, %
pressureHpaAir pressure at sea level, hPa
cloudCoverPctTotal cloud cover, %
weatherSymbolShared symbol, see below
weatherSymbolOriginalThe source's own code, for example smhi:2, met:lightrain, fmi:3, fmi-wawa:61. null when the source has none
stationObservation station and its distance from the place. null for forecasts
license, attributionLicense and credit line for the source of the row

A value the source does not provide for that hour is null.

Sample rows from a cloud run on 3 October 2026 with the example input above:

[
{
"location": "Stockholm", "lat": 59.3293, "lon": 18.0686, "country": "SE",
"source": "smhi", "mode": "forecast", "time": "2026-10-03T15:00:00Z",
"temperatureC": 17.4, "windSpeedMs": 4.2, "windGustMs": 8.3, "windDirectionDeg": 241,
"precipitationMm": 0, "precipitationPeriodHours": 1, "humidityPct": 55, "pressureHpa": 1024.8,
"cloudCoverPct": 75, "weatherSymbol": "clear", "weatherSymbolOriginal": "smhi:2", "station": null,
"license": "CC BY 4.0", "attribution": "Swedish Meteorological and Hydrological Institute (SMHI)"
},
{
"location": "Oslo", "lat": 59.9139, "lon": 10.7522, "country": "NO",
"source": "met", "mode": "forecast", "time": "2026-10-03T15:00:00Z",
"temperatureC": 15.1, "windSpeedMs": 3.8, "windGustMs": 10.2, "windDirectionDeg": 187,
"precipitationMm": 0.2, "precipitationPeriodHours": 1, "humidityPct": 90, "pressureHpa": 1021.4,
"cloudCoverPct": 100, "weatherSymbol": "light_rain", "weatherSymbolOriginal": "met:lightrain", "station": null,
"license": "CC BY 4.0 / NLOD 2.0", "attribution": "Data from MET Norway (Norwegian Meteorological Institute)"
},
{
"location": "Helsinki", "lat": 60.1699, "lon": 24.9384, "country": "FI",
"source": "fmi", "mode": "forecast", "time": "2026-10-03T15:00:00Z",
"temperatureC": 14.4, "windSpeedMs": 3.4, "windGustMs": 6, "windDirectionDeg": 221,
"precipitationMm": 0, "precipitationPeriodHours": 1, "humidityPct": 95, "pressureHpa": 1023.9,
"cloudCoverPct": 100, "weatherSymbol": "cloudy", "weatherSymbolOriginal": "fmi:3", "station": null,
"license": "CC BY 4.0", "attribution": "Finnish Meteorological Institute (FMI) open data"
},
{
"location": "København", "lat": 55.6761, "lon": 12.5683, "country": "DK",
"source": "dmi", "mode": "observations", "time": "2026-10-03T12:00:00Z",
"temperatureC": 17.8, "windSpeedMs": 4.1, "windGustMs": 6.7, "windDirectionDeg": 170,
"precipitationMm": 0, "precipitationPeriodHours": 1, "humidityPct": 73, "pressureHpa": 1030.8,
"cloudCoverPct": 0, "weatherSymbol": "clear", "weatherSymbolOriginal": null, "station": "DMI 06186 (2 km)",
"license": "CC BY 4.0", "attribution": "Danish Meteorological Institute (DMI) open data"
}
]

The last row is from an observations run on the same day.

Weather symbols

clear, partly_cloudy, cloudy, fog, light_rain, rain, heavy_rain, rain_showers, thunder, sleet, sleet_showers, light_snow, snow, heavy_snow, snow_showers.

SMHI, MET Norway and FMI forecasts come with their own symbol, which is mapped to this list (SMHI's "nearly clear" and MET Norway's "fair" both become clear). The symbol always comes from the source, so it can differ slightly from the cloud cover value in the same row. DMI forecasts and SMHI and DMI observations have no symbol; there it is derived from precipitation per hour (rain or snow depending on the temperature) and otherwise from cloud cover (clear under 25 %, partly_cloudy under 75 %, cloudy above). FMI observations use the station's present weather code when it reports one.

Example from a real run

Input:

{
"cities": [
"Stockholm"
],
"hoursAhead": 6,
"maxResults": 5
}

Output (first 3 of 5 rows, values unchanged):

[
{
"location": "Stockholm",
"lat": 59.3293,
"lon": 18.0686,
"country": "SE",
"source": "smhi",
"mode": "forecast",
"time": "2026-10-04T08:00:00Z",
"temperatureC": 13.2,
"windSpeedMs": 4.4,
"windGustMs": 8.8,
"windDirectionDeg": 267,
"precipitationMm": 0,
"precipitationPeriodHours": 1,
"humidityPct": 76,
"pressureHpa": 1019.4,
"cloudCoverPct": 100,
"weatherSymbol": "cloudy",
"weatherSymbolOriginal": "smhi:6",
"station": null,
"license": "CC BY 4.0",
"attribution": "Swedish Meteorological and Hydrological Institute (SMHI)"
},
{
"location": "Stockholm",
"lat": 59.3293,
"lon": 18.0686,
"country": "SE",
"source": "smhi",
"mode": "forecast",
"time": "2026-10-04T09:00:00Z",
"temperatureC": 13.6,
"windSpeedMs": 4,
"windGustMs": 8.7,
"windDirectionDeg": 282,
"precipitationMm": 0,
"precipitationPeriodHours": 1,
"humidityPct": 76,
"pressureHpa": 1019.6,
"cloudCoverPct": 100,
"weatherSymbol": "cloudy",
"weatherSymbolOriginal": "smhi:6",
"station": null,
"license": "CC BY 4.0",
"attribution": "Swedish Meteorological and Hydrological Institute (SMHI)"
},
{
"location": "Stockholm",
"lat": 59.3293,
"lon": 18.0686,
"country": "SE",
"source": "smhi",
"mode": "forecast",
"time": "2026-10-04T10:00:00Z",
"temperatureC": 14,
"windSpeedMs": 3.5,
"windGustMs": 7.9,
"windDirectionDeg": 286,
"precipitationMm": 0,
"precipitationPeriodHours": 1,
"humidityPct": 76,
"pressureHpa": 1019.7,
"cloudCoverPct": 100,
"weatherSymbol": "cloudy",
"weatherSymbolOriginal": "smhi:6",
"station": null,
"license": "CC BY 4.0",
"attribution": "Swedish Meteorological and Hydrological Institute (SMHI)"
}
]

Run ZYBMjgHKgdLQWjm5h on 2026-10-04, 5 rows, 4 seconds.

Monitoring and scheduling

To keep a table up to date, schedule the actor in Apify (Schedules, Create new) and turn on onlyNew:

{
"cities": ["Stockholm", "Göteborg", "Malmö"],
"mode": "observations",
"hoursBack": 24,
"maxResults": 300,
"onlyNew": true
}

With the cron expression 0 6 * * * this runs every morning at 06:00 UTC and returns only the hours measured since the previous run. The first run returns everything in the window. The last delivered hour is stored per place, source and mode in the key-value store nightwave-state-nordic-weather, under a record named after a hash of the input, so different inputs do not affect each other.

For forecasts, onlyNew returns only hours later than those already delivered. Updated forecasts for hours you already have are not sent again, so turn it off if you want each run to replace the whole forecast.

Good to know

  • Forecast models differ in length: SMHI and FMI reach about 10 days, MET Norway about 9 to 10 days and DMI about 60 hours. A longer hoursAhead simply returns what the source has.
  • SMHI, FMI and DMI forecasts cover a limited area around their own country and the Nordic region. A place outside the area of a chosen source is skipped with a message in the log; auto and met work everywhere.
  • Observations use the nearest station that measures each value, within about 40 to 50 km. For SMHI and DMI the station named in station is the temperature station, and wind or cloud values can come from another station nearby. The latest hour is left out until a station has reported it.
  • Times are in UTC. Swedish, Norwegian, Danish and Finnish local time is UTC+1 in winter and UTC+2 in summer (Finland UTC+2 and UTC+3).
  • Every request is retried three times on network errors, rate limits (HTTP 429) and server errors. A response in an unexpected format stops the run with a clear message instead of storing broken rows.

Data sources, licenses and limits

SourceAPILicenseCreditLimits
SMHIMeteorological Forecasts (snow1g, which replaced pmp3g) and Meteorological ObservationsCC BY 4.0Swedish Meteorological and Hydrological Institute (SMHI)No key. No published request limit; SMHI asks users not to overload the service.
MET NorwayLocationforecast 2.0 (complete)CC BY 4.0 and NLOD 2.0Data from MET NorwayNo key. Terms of service: requests must carry an identifying User-Agent with contact details, at most 20 requests per second per application, coordinates with at most 4 decimals, and clients should respect the Expires header. The actor sends NightwaveNordicWeather/0.1 (Apify actor; kontakt@nightwave.se), rounds coordinates to 4 decimals and makes one request per place per run. For forecasts, one scheduled run per hour is plenty.
FMIFMI open data WFSCC BY 4.0Finnish Meteorological InstituteNo key. The open data manual sets a daily request limit per user (20 000 requests per day when this was written).
DMIForecast Data EDR API (opendataapi.dmi.dk/v1/forecastedr, HARMONIE DINI) and Meteorological Observation API (opendataapi.dmi.dk/v2/metObs)CC BY 4.0Danish Meteorological Institute (DMI)No key (checked October 2026). DMI applies rate limits and answers HTTP 429 when they are reached; the actor waits and retries.

When you publish or share the data, credit the source given in attribution on each row and link to the license. The actor converts units and names but does not change the values.

This actor is not affiliated with SMHI, MET Norway, FMI or DMI.

Pricing

Pay per event: USD 0.001 per weather row (event weather-row), which is USD 1 per 1 000 rows. Platform usage is included, so you pay only per row. A run with 4 cities and 24 hours (100 rows) costs USD 0.10 and takes about 10 seconds. maxResults caps how many rows, and so how much, a run can cost.

Rows are delivered only after they have been charged. If you set a maximum cost per run (maxTotalChargeUsd), the run stops there and its status message says how many rows were delivered.

Contact

Built and maintained by Nightwave AB. Questions, bugs and feature requests: kontakt@nightwave.se

På svenska

Actorn hämtar väderprognoser och observationer för Sverige, Norge, Finland, Danmark och Island direkt från SMHI, MET Norway (som står bakom Yr), FMI och DMI. Alla källor får samma radformat: temperatur, vind, byvind, vindriktning, nederbörd, luftfuktighet, lufttryck, molnighet och en gemensam vädersymbol, timme för timme i UTC.

Exempel från en verklig körning: input och de första raderna i outputen finns i avsnittet Example from a real run ovan (körning ZYBMjgHKgdLQWjm5h, 2026-10-04, 5 rader, 4 sekunder).

  • Ange orter med namn (till exempel Stockholm, Göteborg, Oslo, Helsingfors eller Köpenhamn) eller valfria koordinater.
  • auto väljer det egna landets institut: SMHI för Sverige, MET Norway för Norge och Island, FMI för Finland och DMI för Danmark. Du kan också välja en källa för alla orter.
  • Prognoser upp till 10 dygn framåt. Observationer från närmaste station upp till 7 dygn bakåt för Sverige, Finland och Danmark. Norska observationer kräver registrering hos MET Norway och ingår inte.
  • onlyNew ger bara nya timmar vid schemalagda körningar.
  • Källor: SMHI, MET Norway, FMI och DMI. Alla under CC BY 4.0 (MET Norway även NLOD 2.0). Ange källan enligt fältet attribution när du publicerar datan.
  • Pris: 0,001 USD per rad (1 USD per 1 000 rader). Plattformsanvändningen ingår.
  • Kontakt: kontakt@nightwave.se