Skip to content

API documentation

Jules Dejaeghere edited this page Jan 10, 2025 · 15 revisions

Introduction

This file describes the API used in this repository to get the weather data. The API is not publicly documented and has been reversed engineered using the Android app be.irm.kmi.meteo.

Data available for the following countries: Belgium, The Netherlands and Luxembourg.

Please be mindful if you plan to use this API:

  • This is not a publicly documented API: behavior could change without notice
  • Avoid spamming: this integration refreshes the data every 7 minutes by default
  • Make your client identifiable: this integration uses the following HTTP header User-Agent: github.com/jdejaegh/irm-kmi-ha

Disclaimer

This is a personal project and isn't in any way affiliated with, sponsored or endorsed by The Royal Meteorological Institute of Belgium.

Overview

API endpoint: https://app.meteo.be/services/appv4/

Operations and parameters are passed using a query string. All requests are HTTP GET requests.

Example: GET https://app.meteo.be/services/appv4/?l=fr&s=searchCities&n=Bru

Available operations

method name description
getForecasts Main operation to get current weather as well as hourly and daily forecast
searchCities Search a city to get its city code (used to get forecasts)
getWarnings Get a global list of all warnings, for the three countries
getWarningLegend Get the legend for the different levels of a given warning
getIncaImage Get precipitation radar image (observation and forecast)
getLocalizationLayer Get image with a dot at the given coordinates (for radar animation)
getSvg Get SVG graph for max temp, min temp and rain for 14-days forecast
getCommunesPerProvince Lists all municipalities in the specified province

Common parameters

Not all parameters are used for each method. There are other parameters, but they seem useless (they can be omitted without modifying the output).

parameter name type description example
s string operation to perform (see Available operations) getForecasts
l string language for the response fr
lat float latitude (avoid putting lots of decimals) 51.2213
long float longitude (avoid putting lots of decimals) 4.4051
th string theme modifier (d for day theme, n for night theme) n
rs int other theme modifier 1
ins int city number (different from postal code) 92094
i string date and time 202412301830
k string key to use the service (md5 hex-encoded, changes based on time and method) 53355e94f33c3abba785ecc064a17a55

Compute the key

The key for the parameter k is required for most methods.

The key is generated by MD5 hashing the following values, separated by semicolon: r9EnW374jkJ9acc, method name and today's date (dd/mm/yyyy). The following Python snippet is an example:

import hashlib
hashlib.md5("r9EnW374jkJ9acc;getForecasts;31/12/2024".encode()).hexdigest()

Return values

This section briefly describes what each method returns and how the parameters are used.

As you will notice, some values that are integers or floats are sometimes returned as strings. Keep that in mind when using the values.

getForecasts

Required parameters: s, k, and either lat and long or ins
Optional parameters: l (seems to default to English)

Example: GET https://app.meteo.be/services/appv4/?lat=51.2213&long=4.4051&k=585940aff31585bcfff7f3aa0dc290de&s=getForecasts

Output schema is as follows. Some full examples can be found in the tests/fixtures folder (example)

{
  "cityName": "Antwerp",
  "country": "BE",
  "obs": {},
  "for": {},
  "module": [],
  "animation": [],
  "todayObsCount": 569
}

The keys cityName and country are self-explanatory.
The cityName key is subject to translation according to the l parameter (could have been Anvers or Antwerpen here).

The key todayObsCount indicates how many observations the users of the application submitted today.

Other keys have their own section below

obs key

Give the current weather observation, with temperature (in Celsius) and weather condition.

Example

{
  "temp": 6,
  "timestamp": "2024-12-30T14:50:00+01:00",
  "ww": 15,
  "dayNight": "d"
}

The combination of ww and dayNight (d if the sun is above the horizon, n if below) determines which icon is shown for the weather condition.

Table with icons matching
ww-dayNight icon
0-d
0-n
10-d
10-n
11-d
11-n
12-d
12-n
13-d
13-n
14-d
14-n
15-d
15-n
16-d
16-n
17-d
17-n
18-d
18-n
19-d
19-n
1-d
1-n
20-d
20-n
21-d
21-n
22-d
22-n
23-d
23-n
24-d
24-n
25-d
25-n
26-d
26-n
27-d
27-n
2-d
2-n
3-d
3-n
4-d
4-n
5-d
5-n
6-d
6-n
7-d
7-n
8-d
8-n
9-d
9-n

for key

This key provides information about daily and hourly forecasts, as well as warnings for the current location.

for.daily: list of daily weather forecast (including today)

The list in for.daily is sorted by time: today is the first element of the list. The list may also contain one element for the next (or current) night prevision. It generally contains 7 days of forecast.

Example of list item

{
  "dayName": {"fr": "Lundi", "nl": "Maandag", "en": "Monday", "de": "Montag"},
  "period": "1",
  "day_night": "1",
  "dayNight": "d",
  "text": {
    "nl": "Deze namiddag...",
    "fr": "Cette après-midi..."
  },
  "dawnRiseSeconds": "31500",
  "dawnSetSeconds": "60360",
  "tempMin": null,
  "tempMax": 7,
  "ww1": 15,
  "ww2": null,
  "wwevol": null,
  "ff1": 4,
  "ff2": null,
  "ffevol": null,
  "dd": 45,
  "ddText": {"fr": "SO", "nl": "ZW", "en": "SW", "de": "SW"},
  "wind": {
    "speed": 20,
    "peakSpeed": null,
    "dir": 45,
    "dirText": { "fr": "SO", "nl": "ZW", "en": "SW", "de": "SW"}
  },
  "precipChance": 0,
  "precipQuantity": "0"
}

Note that no matter the language set by the parameter l, all the languages will be present in the output show here.

  • dayName is self-explanatory.
  • period: ?
  • day_night and dayNight: are 1 and d respectively when the forecast is for daytime; are 0 and n respectively when the forecast is for nighttime.
  • text: gives weather forecast in plain language, for Dutch en French only.
  • dawnRiseSeconds and dawnSetSeconds: sunrise and sunset time in seconds after midnight that day.
  • tempMin and tempMax: minimum and maximum temperature. Minimum is null when not relevant anymore (in the today's forecast when it's the afternoon)
  • ww1 and ww2: weather condition, which, in combination with day_night, give the icon to show (see table in obs key section). Two values may be given if the condition is forecasted to change during the day.
  • wwevol: how the condition will evolve between ww1 and ww2. Non null only if ww2 is non null. Values are null or integer, but I did not investigate what they produce in the app.
Example of two weather conditions

In this image, the partly cloudy icon is given by ww1, the rainy icon is given by ww2 and the double arrow is given by wwevol.

  • ff1, ff2 and ffevol: ?
  • dd and wind.dir: wind direction, but WATCH OUT! To get the real direction (where the wind is coming from), you have to do: (dd + 180) mod 360. They use that value to rotate an arrow that defaults to north (when dd=0), hence the trick.
  • ddText and wind.dirText: wind direction (no trick here)
  • wind.speed and wind.peakSpeed: forecasted wind speed and wind gusts speed (if any, might be null), in km/h.
  • precipChance: precipitation probability in percents (between 0 and 100)
  • precipQuantity: forecasted amount of precipitation in mm/m²

for.hourly: list of hourly weather forecast (including current hour)

The list in for.hourly is sorted by time: current hour is the first element of the list.
It generally contains 48 hours of forecast.

Example of list item

{
  "hour": "14",
  "dayNight": "d",
  "temp": 7,
  "ww": "15",
  "precipChance": "0",
  "precipQuantity": 0,
  "pressure": 1028,
  "windSpeedKm": 25,
  "windPeakSpeedKm": null,
  "windDirection": 23,
  "windDirectionText": {"nl": "ZZW", "fr": "SSO", "en": "SSW", "de": "SSW"}
}

Note that no matter the language set by the parameter l, all the languages will be present in the output show here.

  • hour: hour of the day for which the forecast is. This is represented as a zero-padded string ("01" is 1 AM) and there is no indication of the day. The list starts with the current hour, and it is up to the client to keep track of the day.
  • dayNight: d when the forecast is for daytime; n when the forecast is for nighttime.
  • temp: forecasted temperature in Celsius.
  • ww: weather condition, which, in combination with dayNight, give the icon to show (see table in obs key section).
  • precipChance: precipitation probability in percents (between 0 and 100)
  • precipQuantity: forecasted amount of precipitation in mm/m²
  • pressure: atmospheric pressure in hPa.
  • windSpeedKm and windPeakSpeedKm: forecasted wind speed and wind gusts speed (if any, might be null), in km/h.
  • windDirection: wind direction, but WATCH OUT! To get the real direction (where the wind is coming from), you have to do: (windDirection + 180) mod 360. They use that value to rotate an arrow that defaults to north (when windDirection=0), hence the trick.
  • windDirectionText: wind direction (no trick here)

for.warning: list of warnings

List of upcoming and current warnings for the current location.

The for.showWarningTab is true when the list in for.warning is not empty.

Example of list item

{
  "icon_country": "BE",
  "warningType": {
    "id": "2",
    "name": {
      "fr": "Conditions glissantes",
      "nl": "Gladheid",
      "en": "Ice or snow",
      "de": "Glätte"
    }
  },
  "warningLevel": "1",
  "text": {
    "fr": "Ce soir...",
    "nl": "Vanavond, vannacht...",
    "en": "The ground...",
    "de": "Der Boden..."
  },
  "fromTimestamp": "2025-01-03T21:00:00+01:00",
  "toTimestamp": "2025-01-04T10:00:00+01:00"
}

Note that no matter the language set by the parameter l, all the languages will be present in the output show here.

  • icon_country: country code for the warning.
  • warningType.id: id of the warning, see the warning table for all the known ids.
  • warningType.name: translated names for the warning, see table below for all names.
  • warningLevel: level of the warning from 1 (weak) to 3 (strong).
  • text: translated descriptions for the warning text.
  • fromTimestamp and toTimestamp: timespan of the warning. Note that warnings may appear before the fromTimestamp. They are generally not shown after the toTimestamp.

for.graph: 14-days forecast graphs

This key contains three graphs for the 14-days forecast: maximum temperature, minimum temperature and rainfall. The graphs are always nested under the svg key, which contains a list of objects. Each graph is translated in the four languages.

Here is an example

{
  "svg": [
    {
      "url": {
        "nl": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=tx&l=nl&k=c10e09ed15d26f241cfc056ccac49b5e",
        "fr": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=tx&l=fr&k=c10e09ed15d26f241cfc056ccac49b5e",
        "en": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=tx&l=en&k=c10e09ed15d26f241cfc056ccac49b5e",
        "de": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=tx&l=de&k=c10e09ed15d26f241cfc056ccac49b5e"
      },
      "ratio": 1.3638709677419354
    },
    {
      "url": {
        "nl": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=tn&l=nl&k=c10e09ed15d26f241cfc056ccac49b5e",
        "fr": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=tn&l=fr&k=c10e09ed15d26f241cfc056ccac49b5e",
        "en": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=tn&l=en&k=c10e09ed15d26f241cfc056ccac49b5e",
        "de": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=tn&l=de&k=c10e09ed15d26f241cfc056ccac49b5e"
      },
      "ratio": 1.3638709677419354
    },
    {
      "url": {
        "nl": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=rr&l=nl&k=c10e09ed15d26f241cfc056ccac49b5e",
        "fr": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=rr&l=fr&k=c10e09ed15d26f241cfc056ccac49b5e",
        "en": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=rr&l=en&k=c10e09ed15d26f241cfc056ccac49b5e",
        "de": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=rr&l=de&k=c10e09ed15d26f241cfc056ccac49b5e"
      },
      "ratio": 1.3638709677419354
    }
  ]
}

The e query parameter determines the kind of graph:

  • tx for maximum temperature
  • tn for minimum temperature
  • rr for rainfall

I don't know what ratio is used for, maybe display settings.

module key

This key provides information about the following elements: UV index, pollen levels, user observation and sunset/sunrise.

The module key holds a list of JSON objects. Each object contains two keys: type and data.

type: svg

Objects with key type set to svg contain URLs to SVG for different information: pollen levels and sunset/sunrise.

Here is an example:

{
  "type": "svg",
  "data": {
    "url": {
      "nl": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=pollen&l=nl&k=cceae7a769ddd926624778bb15d069f5",
      "fr": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=pollen&l=fr&k=cceae7a769ddd926624778bb15d069f5",
      "en": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=pollen&l=en&k=cceae7a769ddd926624778bb15d069f5",
      "de": "https:\/\/app.meteo.be\/services\/appv4\/?s=getSvg&ins=11002&e=pollen&l=de&k=cceae7a769ddd926624778bb15d069f5"
    },
    "ratio": 2.193
  }
}

When the URL contains e=pollen, the SVG contains information about the active pollens. e=efem is used when the information is about sunset/sunrise.

Note that the SVG structure is subject to change: the pollen SVG changed three times in 2024.

type: uv

Objects with the key type set to uv contain the current UV index. The data is quite self-explanatory.

{
  "type": "uv",
  "data": {
    "levelValue": 0.6,
    "level": {
      "nl": "Laag",
      "fr": "Faible",
      "en": "Low",
      "de": "Niedrig"
    },
    "title": {
      "nl": "Uv-index",
      "fr": "Indice UV",
      "en": "UV Index",
      "de": "UV Index"
    }
  }
}

type: observation

Objects with the key type set to observation contain the current number of daily crowdsourced weather observations. The data is self-explanatory.

I did not investigate how to retrieve the observations. This data seems to be available as open-data: https://opendata.meteo.be/geonetwork/srv/eng/catalog.search#/metadata/RMI_DATASET_APPOBS

{
  "type": "observation",
  "data": {
    "count": 569,
    "title": {
      "nl": "Waarnemingen vandaag",
      "fr": "Observations d'aujourd'hui",
      "en": "Today's Observations",
      "de": "Beobachtungen heute"
    }
  }
}

animation key

This key contains data needed to construct the rain radar animation. The picture below shows an example of such animation:

An animated example is available here: https://github.com/jdejaegh/irm-kmi-ha/blob/main/img/radar_example.svg

The key contains an object like the following:

{
  "localisationLayer": "https:\/\/app.meteo.be\/services\/appv4\/?s=getLocalizationLayer&lat=51.2213&long=4.4051&f=2&k=878df4e4552a3d09be730f77ed8e3114",
  "localisationLayerRatioX": 0.5886,
  "localisationLayerRatioY": 0.2706,
  "speed": 0.3,
  "type": "10min",
  "unit": {
    "fr": "mm\/10min",
    "nl": "mm\/10min",
    "en": "mm\/10min",
    "de": "mm\/10min"
  },
  "country": "BE",
  "threshold": [],
  "sequenceHint": {
    "nl": "Regen",
    "fr": "Pluie",
    "en": "Rain",
    "de": "Regen"
  },
  "sequence": []
}
  • localisationLayer: contains the URL of a PNG file with a dot at the location where the forecast was requested. This is supposed to be overlaid on a PNG representing the map of Belgium (see the resources folder in the repository for the images).
  • localisationLayerRatioX and localisationLayerRatioX: no idea what those do. Probably for display ratio.
  • speed: number of seconds to leave each frame on display. The frames are in the list called sequence (more on this later).
  • type: type of graph. Generally gives out the interval between the frames.
  • unit: translated version of the unit for the value key of each frame in the list called sequence.
  • country: self-explanatory.
  • treshold: never seen a value here, other than an empty list. No idea what this represents.
  • sequenceHint: short text describing the weather condition shown on the radar.
  • sequence: list of objects. Each object represent a frame of the animation and contains the rain layer of the animation. It also contains the amount of rain expected (in the unit given in unit key)

Here is an example of an object in the sequence list:

{
  "time": "2025-01-08T18:40:00+01:00",
  "uri": "https:\/\/app.meteo.be\/services\/appv4\/?s=getIncaImage&i=202501081750&f=2&k=9250a005050e123e98ebcee80590808a&d=202501081710",
  "value": 0.15,
  "position": 0.09,
  "positionLower": 0.084,
  "positionHigher": 0.102
}
  • time: timestamp of the frame. Might be in the past (observation) or in the future (forecast)
  • uri: link to an PNG file representing the rain.
  • value: amount of rain, expressed in the unit described above.
  • position: vertical position of line in forecast graph (at the bottom of the example image)
  • positionLower and positionHigher: used to draw the confidence margin around the line in the graph. Respectively, the lower and higher bound of the margin.

To reproduce the image at the beginning of the section:

  1. Overlay the map, the rain layer (in sequence) and localization layer (in localisationLayer) to get the map.
  2. Make the elements of sequence appear for speed seconds to create the animation effect.
  3. For the bottom part, use the time, value, position, positionLower, and positionHigher to create the animated graph.

searchCities

Required parameters: s and n (the search query)
Optional parameters: l (seems to default to English)

Example: GET https://app.meteo.be/services/appv4/?s=searchCities&n=Brux

The result is a list of location along with their id. The id can be used where the parameter ins is accepted (in getForecasts, for example, instead of using the coordinates).

Output for the example:

[
  {
    "id": "21004",
    "name": "Brussels (BE)"
  },
  {
    "id": "31005",
    "name": "Brugge (BE)"
  }
]

The value of name depends on the parameter l (defaults to English). Results can be located in one of the three countries: Belgium, The Netherlands and Luxembourg.

getWarnings

Required parameters: s and k

Example: GET https://app.meteo.be/services/appv4/?k=6d117b8dfe18e683cdb6481be04671dd&s=getWarnings

This method returns the warnings for the three countries: Belgium, The Netherlands and Luxembourg. Warnings are sorted by province in the countries. If you are only interested in getting the warnings for a specific location, use getForecasts for that specific location and check the key for.warning in the response.

The response of getWarnings is a list of warnings. Each warning is emitted for a specific country, so if a rain warning is emitted for the three countries, the list will contain three elements. Below, an overview of the structure. A full response can be found in the test fixtures folder.

[
  {
    "icon_country": "BE",
    "warningType": {
      "id": "2",
      "name": {"nl": "Gladheid", "fr": "Conditions glissantes", "de": "Gl\u00e4tte", "en": "Ice or snow"}
    },
    "text": {
      "nl": "Vanochtend...",
      "fr": "Ce matin..."
    },
    "legendUri": {
      "nl": "https:\/\/app.meteo.be\/services\/appv4\/?s=getWarningLegend&k=39fd3df3c7e9ba2bd6dabddf23c7a352&wa=2&l=nl",
      "fr": "https:\/\/app.meteo.be\/services\/appv4\/?s=getWarningLegend&k=39fd3df3c7e9ba2bd6dabddf23c7a352&wa=2&l=fr",
      "de": "https:\/\/app.meteo.be\/services\/appv4\/?s=getWarningLegend&k=39fd3df3c7e9ba2bd6dabddf23c7a352&wa=2&l=de",
      "en": "https:\/\/app.meteo.be\/services\/appv4\/?s=getWarningLegend&k=39fd3df3c7e9ba2bd6dabddf23c7a352&wa=2&l=en"
    },
    "region": [
      {
        "name": {"nl": "Brussel", "fr": "Bruxelles", "en": "Brussels", "de": "Br\u00fcssel"},
        "district": [
          {
            "region": {
              "code": 6446,
              "name": {"nl": "Brussel", "fr": "Bruxelles", "en": "Brussels", "de": "Br\u00fcssel" }
            },
            "intervals": [
              {
                "level": "1",
                "fromTimestamp": "2025-01-10T05:00:00+00:00",
                "toTimestamp": "2025-01-10T12:00:00+00:00"
              }
            ]
          }
        ]
      },
      {
        "name": {
          "nl": "Vlaanderen", "fr": "Flandre", "en": "Flanders", "de": "Flandern"},
        "district": [
          {
            "region": {
              "code": 6404,
              "name": {"nl": "Kust", "fr": "C\u00f4te", "en": "Coast", "de": "K\u00fcste"}
            },
            "intervals": [
              {
                "level": "1",
                "fromTimestamp": "2025-01-10T05:00:00+00:00",
                "toTimestamp": "2025-01-10T12:00:00+00:00"
              }
            ]
          },
          {
            "region": {
              "code": 6407,
              "name": {"nl": "West-Vlaanderen", "fr": "Flandre-Occidentale", "en": "West Flanders", "de": "Westflandern"}
            },
            "intervals": [
              {
                "level": "1",
                "fromTimestamp": "2025-01-10T05:00:00+00:00",
                "toTimestamp": "2025-01-10T12:00:00+00:00"
              }
            ]
          },
          {...}
        ]
      },
      {
        "name": {"nl": "Walloni\u00eb", "fr": "Wallonie", "en": "Wallonia", "de": "Wallonien"},
        "district": [
          {
            "region": {
              "code": 6478,
              "name": {"nl": "Luik", "fr": "Li\u00e8ge", "en": "Liege", "de": "L\u00fcttich"}
            },
            "intervals": [
              {
                "level": "1",
                "fromTimestamp": "2025-01-10T05:00:00+00:00",
                "toTimestamp": "2025-01-10T12:00:00+00:00"
              }
            ]
          },
          {
            "region": {
              "code": 6432,
              "name": {"nl": "Henegouwen", "fr": "Hainaut", "en": "Hainaut", "de": "Hennegau"}
            },
            "intervals": [
              {
                "level": "1",
                "fromTimestamp": "2025-01-10T05:00:00+00:00",
                "toTimestamp": "2025-01-10T12:00:00+00:00"
              }
            ]
          },
          {...}
        ]
      }
    ]
  },
  {...},
  {...}
]

Each element in the list of warning is an object with the following keys:

  • icon_country: country of the warning (2 letters country code)
  • warningType: object with a key id with the identifier of the warning (see warning table) and a key name with the translated name of the warning.
  • text: multiple translated sentences to describe the warning. Note that the languages available depend on the country.
  • legendUri: links to an HTML document describing the different levels for the warning.
  • region: list of regions where the warning can apply. The list contains objects, and each object has a key name (name of the region) and district (subdivisions of the region). For Belgium the regions are as expected (Brussels, Wallonia and Flanders) and the districts are the provinces in each region (plus a special district called "Coast" in Flanders). For the other countries, a single region is listed and has the name of the country and the districts are the provinces in the country.
    Each element in the district list is quite self-explanatory: it contains the start and end time of the warning period, the level and the name of the affected location.

Warning table

Table with known warning ids and names.

This table may not be exhaustive: it was build by observing the data returned by the API over time. You can open an issue if you find a new id and name.

Warning id Warning name (en, fr, nl, de)
0 Wind, Vent, Wind, Wind
1 Rain, Pluie, Regen, Regen
2 Ice or snow, Chute de neige ou verglas, Sneeuw of ijzel, Glätte
3 Thunder, Orage, Onweer, Gewitter
7 Fog, Brouillard, Mist, Nebel
9 Cold, Froid, Koude, Kalt
12 Thunder Wind Rain, Orage, rafales et averses, Onweer Wind Regen, Gewitter Windböen Regen
13 Thunderstorm & strong gusts, Orage et rafales, Onweer en wind, Gewitter und Windböen
14 Thunderstorm & large rainfall, Orage et averses, Onweer en regen, Gewitter und Regen
15 Storm surge, Marée forte, Stormtij, Sturmflut
17 Coldspell, Vague de froid, Koude, Koude

getWarningLegend

Required parameters: s, k, and wa the identifier of the warning (see warning table)
Optional parameters: l (seems to default to English)

Example: GET https://app.meteo.be//services//appv4//?s=getWarningLegend&k=39fd3df3c7e9ba2bd6dabddf23c7a352&wa=2

Note that you generally don't have to construct the URL yourself, it can be obtained when using the getWarnings method.

This method returns an HTML document with a description of each level for the specified warning. The HTML is quite simple: it can be displayed or parsed automatically. Below is an example of the body tag:

<body>
<h1>Ice or snow</h1>

<p>
<li class='level1'>
<p>
The ground may become slippery...<br/>
</p>
</li>

<li class='level2'>
<p>
A lot of dangerous icy conditions...<br/>
</p>
</li>

<li class='level3'>
<p>
General icy conditions....<br/>
</p>
</li>
</body>

getIncaImage

Required parameters: s, k, and i the date and time (e.g. 202501101130 for January 10th, 2025 at 11.30 AM)
Optional parameters: rs (seems to default to 1) changes the color style of the image and can be 1, 2 or 3.

Example: GET https://app.meteo.be/services/appv4/?s=getIncaImage&i=202501101130&k=6a86d2c8bc0ae0ed82763ff7ceffaee3

Note that you generally don't have to construct the URL yourself, it can be obtained when using the getForecasts method, in the animation key.

This method returns an PNG image with the clouds as detected by the weather radar or forecasted by the Inca model. It is made to be overlaid on top of a map of Belgium (see the resources folder) along with the localization layer returned getLocalizationLayer.

This only works for Belgium and Luxembourg.
For The Netherlands, the getForecast method will include a URI to the KNMI endpoint, which acts similarly.

getLocalizationLayer

Required parameters: s, k, and either lat and long or ins
Optional parameters: th if omitted dot is blue, if th=d dot is red, if th=n dot is white. For theming purpose.

Note that you generally don't have to construct the URL yourself, it can be obtained when using the getForecasts method, in the animation key.

This method returns an PNG image with a dot at the location given by the coordinates or by ins. It is made to be overlaid on top of a map of Belgium (see the resources folder) along with the could returned by getIncaImage.

getSvg

Required parameters: s, k, e (type of SVG to get) and ins (only for some values of e)
Optional parameters: l (seems to default to English)

Example: GET https://app.meteo.be/services/appv4/?s=getSvg&ins=11002&e=pollen&k=36bc4e79637d329ed6911c37310f3d32

Note that you generally don't have to construct the URL yourself. It can be obtained when using the getForecasts method, in the for.graph key or in the module key.

This method returns SVG graphics for different elements related to the weather. The table below lists the possible types of SVG and if the ins parameter is required.

value of e description ins required
pollen Returns a graph with the currently active pollens yes
efem Returns a graph with sunrise and sunset no (request fails if you set it)
tx 14-days graph with maximum forecasted temperature yes
tn 14-days graph with minimum forecasted temperature yes
rr 14-days graph with forecasted rainfall yes

getCommunesPerProvince

Required parameters: s, kand prov the identifier of the province

Example: GET https://app.meteo.be/services/appv4/?k=536bb7c84936e2240eb1cc74dc8840c3&s=getCommunesPerProvince&prov=11

Returns a JSON list of objects with the ins code for each locality and the translated locality name.

[
  {
    "ins": 21001,
    "names": {
      "nl": "Anderlecht",
      "fr": "Anderlecht",
      "de": "Anderlecht",
      "en": "Anderlecht"
    }
  },
  {
    "ins": 21002,
    "names": {
      "nl": "Oudergem",
      "fr": "Auderghem",
      "de": "Oudergem",
      "en": "Oudergem"
    }
  },
  {
    "ins": 21003,
    "names": {
      "nl": "Sint-Agatha-Berchem",
      "fr": "Berchem-Sainte-Agathe",
      "de": "Sint-Agatha-Berchem",
      "en": "Sint-Agatha-Berchem"
    }
  },
  {...}
]

The identifier of the provinces are as follows:

  1. West-Vlaanderen
  2. Oost-Vlaanderen
  3. Antwerpen
  4. Limburg
  5. Hainaut
  6. Vlaams-Brabant
  7. Brabant wallon
  8. Namur
  9. Liège
  10. Luxembourg
  11. Brussels Capital Region