Belgian official open data: dataset search, Statbel figures, air, rivers, weather and trains.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Air quality at an address or point anywhere in Belgium from IRCEL-CELINE, read live: this hour's modelled NO2, PM2.5, PM10, ozone and black carbon for the 4 km cell, the last 24-hour PM means against the WHO 24-hour guidelines, the BelAQI forecast for today and the next three days (1 excellent to 10 horrible), annual means of the last complete year (street level in Flanders via ATMO-Street, 4 km background elsewhere) compared with the WHO 2021 guidelines and the current and 2030 EU limit values, and the nearest measuring stations that are reporting now (out-of-service stations are skipped and named). Includes the municipality (NIS code) with its population and income. Starts with key_facts; cite IRCEL-CELINE (CC BY 4.0). Examples: How is the air in central Brussels now, and over the year? → {"address":"Rue Neuve 1, 1000 Bruxelles"}; Air quality forecast for Liège → {"address":"Place Saint-Lambert 1, 4000 Liège"}; Annual NO2 at street level near Antwerp central station → {"latitude":51.2194,"longitude":4.4025}.
Address in Belgium, e.g. 'Grote Markt 1, 3000 Leuven' or 'Place Saint-Lambert 1, 4000 Liège'.
WGS84 latitude, e.g. 51.0453 (use with longitude instead of address).
WGS84 longitude, e.g. 3.7275.
Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude.
Belgian Lambert 72 (EPSG:31370) y in metres.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http belgium-data-desk https://data.vecture.be/mcp
Air quality at an address or point anywhere in Belgium from IRCEL-CELINE, read live: this hour's modelled NO2, PM2.5, PM10, ozone and black carbon for the 4 km cell, the last 24-hour PM means against the WHO 24-hour guidelines, the BelAQI forecast for today and the next three days (1 excellent to 10 horrible), annual means of the last complete year (street level in Flanders via ATMO-Street, 4 km background elsewhere) compared with the WHO 2021 guidelines and the current and 2030 EU limit values, and the nearest measuring stations that are reporting now (out-of-service stations are skipped and named). Includes the municipality (NIS code) with its population and income. Starts with key_facts; cite IRCEL-CELINE (CC BY 4.0). Examples: How is the air in central Brussels now, and over the year? → {"address":"Rue Neuve 1, 1000 Bruxelles"}; Air quality forecast for Liège → {"address":"Place Saint-Lambert 1, 4000 Liège"}; Annual NO2 at street level near Antwerp central station → {"latitude":51.2194,"longitude":4.4025}.
| Argument | Type | Description |
|---|---|---|
| address | string | Address in Belgium, e.g. 'Grote Markt 1, 3000 Leuven' or 'Place Saint-Lambert 1, 4000 Liège'. |
| latitude | number | WGS84 latitude, e.g. 51.0453 (use with longitude instead of address). |
| longitude | number | WGS84 longitude, e.g. 3.7275. |
| x_lambert72 | number | Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude. |
| y_lambert72 | number | Belgian Lambert 72 (EPSG:31370) y in metres. |
{
"type": "object",
"properties": {
"address": {
"type": "string",
"description": "Address in Belgium, e.g. 'Grote Markt 1, 3000 Leuven' or 'Place Saint-Lambert 1, 4000 Liège'."
},
"latitude": {
"type": "number",
"description": "WGS84 latitude, e.g. 51.0453 (use with longitude instead of address)."
},
"longitude": {
"type": "number",
"description": "WGS84 longitude, e.g. 3.7275."
},
"x_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude."
},
"y_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) y in metres."
}
}
}Answers with Statbel's official figures (not dataset links). Places: any of the 565 municipalities (2025 boundaries; Dutch, French or pre-merger names such as Melle work; NIS codes too), the provinces, the three regions or Belgium. topic 'profile' (default) gives population on 1 January (total, sex, age bands, non-Belgian nationality, change since 2019) and average net taxable income per inhabitant and per declaration (income years up to the latest published); a single municipality comes with its province, region and Belgium for comparison. rank_by ranks municipalities within a province, region or Belgium (e.g. highest income per inhabitant in Limburg, oldest population); with no places, topic 'population' or 'income' ranks the municipalities of Belgium by it. topic 'prices' gives the latest CPI, inflation and (smoothed) health index read live from Statbel; topic 'labour' gives the latest quarterly employment, unemployment and activity rates for Belgium and the regions (Labour Force Survey). Each answer starts with key_facts and states reference dates, definitions and the Statbel citation (CC BY 4.0). Examples: How many people live in Ghent? → {"places":["Gent"],"topic":"population"}; The largest municipalities in Belgium (no places: ranks by population) → {"topic":"population"}; Which municipalities in Limburg have the highest income per inhabitant? → {"rank_by":"income_per_inhabitant","within":"Limburg","limit":5}; What is the current inflation and health index? → {"topic":"prices"}.
| Argument | Type | Description |
|---|---|---|
| year | integer | Population year (1 January), 2019 to the latest; default latest. |
| limit | integer | With rank_by; default 10. |
| order | string | With rank_by; default highest. |
Counts of the catalogue by scope and topic, the date it was built, and when file links were last checked: what is available and how fresh the evidence is.
No arguments.
{
"type": "object",
"properties": {}
}Prepare a message to the people who publish a dataset, for the user to send themselves: the contact the publisher declared in its catalogue record (never a guessed address), a polite draft in the publisher's language (Dutch, French, English or German) naming the dataset, file, issue and the evidence checked, and a mailto: link. Nothing is sent by this tool. Use it when the user wants to report a problem (stale data, broken link, missing units or metadata, wrong values) or ask the publisher a question. Run get_dataset or preview_dataset first and pass what they showed as evidence; the answer says what to check before writing. Show the draft to the user to edit and send; send one message per problem, not one per related dataset. Example: {"id":"national:d04b704a-1672-4567-bf0d-9a9452618812","issue":"metadata","details":"The record says 2019 but the file has 2026 data."}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Dataset id from search_datasets or get_dataset. |
| issue* | string | What the message is about: stale, access, metadata, units, values, missing, schema, licence or question. |
| details | string | What is wrong or what the user wants to know, in the user's words (at most 1,500 characters). |
| evidence | array | Up to 5 facts checked with the other tools, each with its source, e.g. 'preview_dataset: TIMESTAMP_EXTRACT goes up to 2026-11-01, catalogue says 2019-01-21'. |
| language | string |
Fetch the full catalogue record for an id returned by search.
| Argument | Type | Description |
|---|---|---|
| id* | string | Record id from search. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Record id from search."
}
}
}Whether an address or point in Flanders is flood-prone on the official VMM maps of flood-prone areas from rivers (fluvial), heavy rain (pluvial) and the sea, each as class A (no flooding modelled), B (small chance under climate change), C (small chance) or D (medium chance). These maps underlie the flood information required when property in Flanders is sold or let and the water test for permits. Includes the municipality (NIS code) with its population and income. Flanders only. Starts with key_facts; describes the location, not a building's floor level or defences. Examples: Is the Grote Markt in Leuven flood-prone? → {"address":"Grote Markt 1, 3000 Leuven"}; Flood classes at a point in Ghent → {"latitude":51.05,"longitude":3.72}.
| Argument | Type | Description |
|---|---|---|
| address | string | Address in Flanders, e.g. 'Groenplaats 1, 2000 Antwerpen'. |
| latitude | number | WGS84 latitude, e.g. 51.0453 (use with longitude instead of address). |
| longitude | number | WGS84 longitude, e.g. 3.7275. |
| x_lambert72 | number | Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude. |
| y_lambert72 | number | Belgian Lambert 72 (EPSG:31370) y in metres. |
{
"type": "object",
"properties": {
"address": {
"type": "string",
"description": "Address in Flanders, e.g. 'Groenplaats 1, 2000 Antwerpen'."
},
"latitude": {
"type": "number",
"description": "WGS84 latitude, e.g. 51.0453 (use with longitude instead of address)."
},
"longitude": {
"type": "number",
"description": "WGS84 longitude, e.g. 3.7275."
},
"x_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude."
},
"y_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) y in metres."
}
}
}Full catalogue record for one dataset id from search_datasets: publisher, licence and what it allows, update cycle, contact, description, file links, publisher-declared columns, link-check evidence, and whether preview_dataset can read the file. For files checked weekly it adds a dataset card computed from the file itself: whether it is overdue against its declared update cycle, the period the data covers, join keys (NIS municipality codes incl. pre-2025 codes, enterprise numbers, postcodes, coordinates), sparse and constant columns, column changes since the last check, and quotable facts each with its evidence. Fields the publisher leaves empty are listed under not_declared_by_publisher with the source page; for analysis over the whole file, the analysis block gives download links and the domains a sandbox must allow. Example: {"id":"national:d04b704a-1672-4567-bf0d-9a9452618812"}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Dataset id as returned by search_datasets. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Dataset id as returned by search_datasets."
}
}
}Details of one DOV record by id from subsurface_at_location: for a borehole ('boring/…') its depth, purpose and layer-by-layer interpretations (formal stratigraphy with formation names, the logged lithological description, hydrogeological units) plus ids of further interpretations; for a groundwater screen ('filter/…') the aquifer, screen depth, water levels (latest, lowest, highest, last 12 readings, yearly means) and groundwater quality (every result of the latest lab sample, and trends of nitrate, chloride, sulphate, ammonium, conductivity and pH); for a CPT ('sondering/…') cone resistance and sleeve friction per metre with the Robertson soil behaviour type; for a soil profile ('bodemlocatie/…') its classification, site (water table, drainage, land use, parent material) and per horizon the Munsell colour, texture, organic carbon, pH and lime; or one interpretation ('interpretatie/…'). Codes are decoded with DOV's published code lists; every answer starts with key_facts. Examples: Layer-by-layer log of one borehole → {"id":"boring/2016-140688"}; Water levels and groundwater quality at one monitoring screen → {"id":"filter/1978-006372"}; Soil behaviour per metre from one cone penetration test → {"id":"sondering/1984-065526"}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Record id such as 'boring/2016-140688', 'filter/1978-006372', 'sondering/1984-065526', 'bodemlocatie/1964-007478' or 'interpretatie/1993-088861' (a DOV URL for the record also works). |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Record id such as 'boring/2016-140688', 'filter/1978-006372', 'sondering/1984-065526', 'bodemlocatie/1964-007478' or 'interpretatie/1993-088861' (a DOV URL for the record also works)."
}
}
}Read the first rows of a dataset's CSV/TSV file directly from the publisher and return the column names, inferred column types, the delimiter and encoding, and up to 20 sample rows as published. Works for datasets whose get_dataset record shows preview_available: true. Reads at most the first 64 KiB of the file, so it shows structure and example values, not totals over the whole file; for those, its analysis block gives the download links, a DuckDB query in the file's own dialect and the domains to allow in a sandbox. Example: {"id":"national:d04b704a-1672-4567-bf0d-9a9452618812","rows":5}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Dataset id as returned by search_datasets or get_dataset. |
| rows | integer | Number of sample rows, default 10. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Dataset id as returned by search_datasets or get_dataset."
},
"rows": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Number of sample rows, default 10."
}
}
}What homes sell for in any of the 565 municipalities (2025 boundaries; Dutch, French or pre-merger names and NIS codes work), a province, a region or Belgium, from Statbel's official real-estate sales statistics (deeds of sale, 2010 to the latest full year plus the latest half-year). For houses (all, or terraced/semi-detached with 2-3 facades, or detached with 4+ facades) and apartments: the median price, the 25th and 75th percentile, the number of sales and the change of the median over five years. rank_by 'median_price' ranks municipalities within a province, region or Belgium, leaving out places with too few sales for a comparable median. Starts with key_facts; says when a figure rests on few sales. Prices are nominal sale prices of the homes that happened to be sold, not valuations of a specific home, and not rents. Examples: What does a house or an apartment cost in Mechelen compared with Leuven? → {"places":["Mechelen","Leuven"]}; Where in Limburg are houses most expensive? → {"rank_by":"median_price","within":"Limburg","type":"house","limit":5}; Median apartment price in Belgium in 2020 → {"places":["Belgium"],"type":"apartment","year":2020}.
| Argument | Type | Description |
|---|---|---|
| type | string | Default 'all' (houses and apartments). h23 = terraced or semi-detached houses, h4 = detached houses. |
| year | integer | Sale year, 2010 to the latest full year; default the latest. |
| limit | integer | With rank_by; default 10. |
| order | string | With rank_by; default highest. |
| places |
Live water levels at about 650 river, canal and tidal gauges in Flanders and on the Flemish waterways (VMM and HIC, waterinfo.be): the nearest gauges to an address or point, a named gauge, or the gauges on a river. For each gauge: the level now in metres TAW (and above the gauge zero where that is how it is published), the change over 1, 3 and 24 hours (rising/falling/steady, or low and high water for tidal gauges), the 24-hour minimum and maximum, how far it is below the gauge's official watch and alarm levels, whether it is within its usual range (the long-term band of 80 % of the time), the publisher's official alarm status and its short-term forecast status. Starts with key_facts. Values are provisional measurements updated every 5-15 minutes. Does not say whether a specific address will flood (use flood_risk for Flanders' official flood-prone maps), and does not cover Wallonia (SPW's terms forbid passing its gauge data on), Brussels' Flowbru gauges, discharge or rainfall. Examples: How high is the Dijle at Korbeek-Dijle, and how far from the alarm level? → {"station":"Korbeek-Dijle"}; Is the Demer rising near Diest? → {"address":"Grote Markt 1, 3290 Diest","river":"Demer"}; Water levels around Ghent now → {"address":"Korenmarkt 1, 9000 Gent","radius_km":5}; The tide in the Scheldt at Antwerp → {"latitude":51.2213,"longitude":4.3977,"max_stations":2}.
| Argument | Type | Description |
|---|---|---|
| river | string | Only gauges on this river or canal, e.g. 'Demer', 'Zeeschelde', 'Dender', 'Kanaal Gent-Terneuzen'; combine with an address to get that stretch. |
| address | string | Address or place, e.g. 'Grote Markt 1, 3000 Leuven': the nearest gauges are returned. |
| station | string | A gauge by name or number instead of a place, e.g. 'Korbeek-Dijle', 'L08_097', 'Werchter', 'Antwerpen tij'. |
Search Belgian open-data records. Returns result ids, titles and landing-page URLs; use fetch with an id for the full record.
| Argument | Type | Description |
|---|---|---|
| query* | string | Search query. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"description": "Search query."
}
}
}Search Belgian open data (about 21,700 records from federal, regional and local publishers: hand-reviewed national registers, data.gov.be and directly harvested portals) in Dutch, French or English. For common needs such as population, the enterprise register (KBO/BCE), air quality, unemployment or train punctuality, the official reference source is listed first, marked authoritative_source, with a guidance block saying who publishes it and the usual pitfalls. Scope 'datasets' (default) means data files and APIs; map layers, PDF publications, research supplements and metadata-only records are separate scopes. Results are catalogue metadata and link-check evidence, not statements about data correctness. Examples: {"query":"bevolking per gemeente"}; {"query":"thuisbatterij"}; {"query":"census 2021","open_licence_only":true}; {"query":"wegenregister","scope":"maps"}; {"query":"luchtkwaliteit","topic":"environment","limit":5}.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Number of results, default 10. |
| query* | string | Words in Dutch, French or English, e.g. 'population by municipality' or 'bevolking gemeente'. |
| scope | string | Kind of record. Default 'datasets'. |
| topic | string | Optional topic id: geology, water, energy, transport, health, population, economy, environment, agriculture, education, government, places, other. |
| open_licence_only | boolean | Only records whose licence permits reuse (open or share-alike). |
Find DOV records by area and attributes, e.g. the deepest boreholes in a municipality, geothermal boreholes since 2020, groundwater wells in the Brussel sand with quality data, electric CPTs near an address, soil profiles with lab data, or the largest groundwater abstraction permits in a municipality (with the licensed total per aquifer). Area: a municipality (official 2025 boundary; old pre-merger names work), or an address/coordinates with radius_m, or nothing for all of Flanders. Filtering and sorting run on DOV's server, so counts cover every matching record. Use get_subsurface_record with a result id for details. Examples: The deepest boreholes in Leuven → {"record_type":"boreholes","municipality":"Leuven","limit":3}; Geothermal boreholes drilled in Flanders since 2020 → {"record_type":"boreholes","purpose":"geothermal","date_from":"2020","limit":5}; The largest groundwater abstraction permits in Ghent → {"record_type":"groundwater_permits","municipality":"Gent","sort":"largest","limit":5}.
| Argument | Type | Description |
|---|---|---|
| sort | string | Default: nearest with a location; otherwise deepest (boreholes, CPTs), newest (wells), largest (permits), most_described (soil profiles). |
| limit | integer | Results to list, default 10. |
| address | string | Address in Flanders, as an alternative to municipality (then radius_m applies). |
| aquifer | string | Wells and permits: HCOV code (A0620, or A06 for the whole system) or words from the unit name ('Brussel', 'Krijt'). |
| date_to |
What is under a location in Flanders, read live from Databank Ondergrond Vlaanderen (DOV), the Flemish Government's subsurface database: the soil-map unit, the Tertiary and Quaternary geological map units and the groundwater bodies at the point, whether it lies in a drinking-water protection zone, the modelled column of geological and hydrogeological (aquifer) units with depths from DOV's 3D models (an answer even where no borehole exists), the boreholes, cone penetration tests (CPT) and groundwater monitoring wells within radius_m (counts plus the nearest and deepest, with ids), groundwater abstraction permits and described soil profiles within at least 1 km (licensed volume per aquifer; names of private persons withheld), and the current shallow groundwater status at the nearest status well. Starts with key_facts: the answer in a few sentences. Give an address in Flanders, or latitude/longitude, or Lambert 72 x/y. Use get_subsurface_record with a returned id for layer-by-layer borehole logs, CPT profiles or groundwater levels and quality. Map units and the model column are map- and model-scale information, not a site investigation. Examples: What is under the Grote Markt in Leuven? → {"address":"Grote Markt 1, 3000 Leuven"}; Deep aquifers and boreholes near Antwerp central station, for a geothermal question → {"latitude":51.2194,"longitude":4.4025,"radius_m":500,"max_depth_m":1000}.
| Argument | Type | Description |
|---|---|---|
| address | string | Address in Flanders, e.g. 'Grote Markt 1, 3000 Leuven'. Looked up in the Flemish address register. |
| latitude | number | WGS84 latitude, e.g. 51.0453 (use with longitude instead of address). |
| radius_m | integer | Search radius for boreholes, CPTs and wells in metres, default 250. |
How punctual Belgian trains are, from Infrabel's official open data. For a station (name in Dutch, French or English, or the nearest one to an address): the share of trains arriving less than 6 minutes late in the latest month against the average over all stops, its rank, the last 13 months, and yesterday train by train (delay bands, average delay, the latest trains). For a train number: every point it passed yesterday with its delays, where the delay grew and whether it was on time at the official measuring points. For an IC line (e.g. 'IC 01'): monthly punctuality per direction and by time of day against the national figure. With none of these: the national figure (also counting cancellations), by train type, punctuality lost by cause, cancellations per operator, and today so far. Starts with key_facts. Does not give live departures or platform changes, and has no train-by-train data before yesterday. Examples: How punctual are trains at Leuven station? → {"station":"Leuven"}; Was train 2112 late yesterday, and where did it lose time? → {"train_number":"2112"}; How punctual is the IC 01 Oostende-Eupen? → {"ic_line":"IC 01"}; How punctual were Belgian trains last month, and today? → {}.
| Argument | Type | Description |
|---|---|---|
| month | string | Month for the monthly figures as YYYY-MM, e.g. '2026-03'; default the latest Infrabel published. |
| address | string | An address or place instead of a station: the nearest station is used, e.g. 'Grote Markt 1, 2800 Mechelen'. |
| ic_line | string | An InterCity line, e.g. 'IC 01', 'IC 16-1' or 'IC3'. |
| station | string | A passenger station, e.g. 'Leuven', 'Bruxelles-Midi', 'Gent-Sint-Pieters', 'Luik-Guillemins'. |
The weather at an address or point in Belgium from the Royal Meteorological Institute (KMI/IRM) open data: what the nearest synoptic station measures now (temperature, wind and gusts, humidity, cloud cover, pressure), its last 24 hours (minimum, maximum, precipitation), the last 7 days at the nearest automatic station (daily rain, max/min, sunshine), and KMI's ALARO model forecast for that point for the next 48 hours (3-hourly for the first day: temperature, precipitation, snow, wind, gusts, cloud cover) with 24-hour summaries and when rain is first expected. Starts with key_facts. Observations come from a station up to tens of km away; the forecast is a single deterministic model run without probabilities. Does not give official weather warnings (not in KMI's open data), climate normals, rain radar or forecasts beyond about 60 hours. Examples: What is the weather in Leuven now, and will it rain tomorrow? → {"address":"Grote Markt 1, 3000 Leuven"}; Weather forecast for Liège for the next two days → {"address":"Place Saint-Lambert 1, 4000 Liège"}; How windy is it at the coast in Ostend? → {"latitude":51.2194,"longitude":2.9269}.
| Argument | Type | Description |
|---|---|---|
| address | string | Address or place in Belgium, e.g. 'Grote Markt 1, 3000 Leuven' or 'Place Saint-Lambert 1, 4000 Liège'. |
| latitude | number | WGS84 latitude, e.g. 51.0453 (use with longitude instead of address). |
| longitude | number | WGS84 longitude, e.g. 3.7275. |
| x_lambert72 | number | Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude. |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 15, 2026.
| topic |
| string |
| Default 'profile' (population and income). |
| places | array | Up to 6 places to compare, e.g. ['Leuven','Gent'], ['Limburg','Wallonia','Belgium'] or ['44088']. A bare 'Brussels' means the region; use 'City of Brussels' for the municipality. |
| within | string | With rank_by: a province, region or 'Belgium' (default). |
| rank_by | string | Rank municipalities by this indicator instead of listing places. |
| income_year | integer | Income year, default the latest published. |
| with_context | boolean | Default true: one municipality is shown with its province, region and Belgium. |
{
"type": "object",
"properties": {
"year": {
"type": "integer",
"description": "Population year (1 January), 2019 to the latest; default latest."
},
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "With rank_by; default 10."
},
"order": {
"enum": [
"highest",
"lowest"
],
"type": "string",
"description": "With rank_by; default highest."
},
"topic": {
"enum": [
"profile",
"population",
"income",
"prices",
"labour"
],
"type": "string",
"description": "Default 'profile' (population and income)."
},
"places": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 6,
"description": "Up to 6 places to compare, e.g. ['Leuven','Gent'], ['Limburg','Wallonia','Belgium'] or ['44088']. A bare 'Brussels' means the region; use 'City of Brussels' for the municipality."
},
"within": {
"type": "string",
"description": "With rank_by: a province, region or 'Belgium' (default)."
},
"rank_by": {
"enum": [
"population",
"population_growth_pct",
"share_65_plus_pct",
"share_0_17_pct",
"non_belgian_nationality_pct",
"income_per_inhabitant",
"income_per_declaration"
],
"type": "string",
"description": "Rank municipalities by this indicator instead of listing places."
},
"income_year": {
"type": "integer",
"description": "Income year, default the latest published."
},
"with_context": {
"type": "boolean",
"description": "Default true: one municipality is shown with its province, region and Belgium."
}
}
}| Language of the draft; default the publisher's (Dutch for Flemish bodies, French for Walloon and Brussels ones, else English). |
{
"type": "object",
"required": [
"id",
"issue"
],
"properties": {
"id": {
"type": "string",
"description": "Dataset id from search_datasets or get_dataset."
},
"issue": {
"enum": [
"stale",
"access",
"metadata",
"units",
"values",
"missing",
"schema",
"licence",
"question"
],
"type": "string",
"description": "What the message is about: stale, access, metadata, units, values, missing, schema, licence or question."
},
"details": {
"type": "string",
"description": "What is wrong or what the user wants to know, in the user's words (at most 1,500 characters)."
},
"evidence": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"description": "Up to 5 facts checked with the other tools, each with its source, e.g. 'preview_dataset: TIMESTAMP_EXTRACT goes up to 2026-11-01, catalogue says 2019-01-21'."
},
"language": {
"enum": [
"nl",
"fr",
"en",
"de"
],
"type": "string",
"description": "Language of the draft; default the publisher's (Dutch for Flemish bodies, French for Walloon and Brussels ones, else English)."
}
}
}| array |
| Up to 6 places to compare, e.g. ['Mechelen','Leuven'], ['Limburg','Flanders','Belgium'] or ['44088']. Default Belgium. |
| within | string | With rank_by: a province, region or 'Belgium' (default). |
| rank_by | string | Rank municipalities by median price of one type (default houses) instead of listing places. |
| min_sales | integer | With rank_by: leave out municipalities with fewer sales than this, default 20. |
{
"type": "object",
"properties": {
"type": {
"enum": [
"all",
"house",
"h23",
"h4",
"apartment"
],
"type": "string",
"description": "Default 'all' (houses and apartments). h23 = terraced or semi-detached houses, h4 = detached houses."
},
"year": {
"type": "integer",
"description": "Sale year, 2010 to the latest full year; default the latest."
},
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "With rank_by; default 10."
},
"order": {
"enum": [
"highest",
"lowest"
],
"type": "string",
"description": "With rank_by; default highest."
},
"places": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 6,
"description": "Up to 6 places to compare, e.g. ['Mechelen','Leuven'], ['Limburg','Flanders','Belgium'] or ['44088']. Default Belgium."
},
"within": {
"type": "string",
"description": "With rank_by: a province, region or 'Belgium' (default)."
},
"rank_by": {
"enum": [
"median_price"
],
"type": "string",
"description": "Rank municipalities by median price of one type (default houses) instead of listing places."
},
"min_sales": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "With rank_by: leave out municipalities with fewer sales than this, default 20."
}
}
}| latitude | number | WGS84 latitude, e.g. 51.0453 (use with longitude instead of address). |
| longitude | number | WGS84 longitude, e.g. 3.7275. |
| radius_km | number | Search radius around the place in km, default 10. |
| x_lambert72 | number | Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude. |
| y_lambert72 | number | Belgian Lambert 72 (EPSG:31370) y in metres. |
| max_stations | integer | How many gauges to return, default 3. |
{
"type": "object",
"properties": {
"river": {
"type": "string",
"description": "Only gauges on this river or canal, e.g. 'Demer', 'Zeeschelde', 'Dender', 'Kanaal Gent-Terneuzen'; combine with an address to get that stretch."
},
"address": {
"type": "string",
"description": "Address or place, e.g. 'Grote Markt 1, 3000 Leuven': the nearest gauges are returned."
},
"station": {
"type": "string",
"description": "A gauge by name or number instead of a place, e.g. 'Korbeek-Dijle', 'L08_097', 'Werchter', 'Antwerpen tij'."
},
"latitude": {
"type": "number",
"description": "WGS84 latitude, e.g. 51.0453 (use with longitude instead of address)."
},
"longitude": {
"type": "number",
"description": "WGS84 longitude, e.g. 3.7275."
},
"radius_km": {
"type": "number",
"maximum": 30,
"minimum": 1,
"description": "Search radius around the place in km, default 10."
},
"x_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude."
},
"y_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) y in metres."
},
"max_stations": {
"type": "integer",
"maximum": 6,
"minimum": 1,
"description": "How many gauges to return, default 3."
}
}
}{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Number of results, default 10."
},
"query": {
"type": "string",
"description": "Words in Dutch, French or English, e.g. 'population by municipality' or 'bevolking gemeente'."
},
"scope": {
"enum": [
"datasets",
"maps",
"publications",
"research",
"metadata",
"all"
],
"type": "string",
"description": "Kind of record. Default 'datasets'."
},
"topic": {
"type": "string",
"description": "Optional topic id: geology, water, energy, transport, health, population, economy, environment, agriculture, education, government, places, other."
},
"open_licence_only": {
"type": "boolean",
"description": "Only records whose licence permits reuse (open or share-alike)."
}
}
}| string |
| Same formats as date_from. |
| purpose | string | Boreholes: why it was drilled. |
| latitude | number | WGS84 latitude, e.g. 51.0453 (use with longitude instead of address). |
| radius_m | integer | Radius around the address or coordinates, default 1000 m. |
| date_from | string | YYYY, YYYY-MM or YYYY-MM-DD: drilling/test date, last water-level date for wells, permit start, survey date. |
| longitude | number | WGS84 longitude, e.g. 3.7275. |
| cpt_method | string | CPTs: electric CPTs also measure sleeve friction. |
| max_depth_m | number | Maximum depth, same fields. |
| min_depth_m | number | Minimum depth (borehole or CPT depth, well screen bottom, permitted well depth). |
| record_type* | string | What to find. |
| x_lambert72 | number | Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude. |
| y_lambert72 | number | Belgian Lambert 72 (EPSG:31370) y in metres. |
| municipality | string | Municipality in Flanders, e.g. 'Leuven' or 'Merelbeke-Melle'. |
| min_annual_m3 | number | Permits: minimum licensed annual volume in m³. |
| with_lab_data | boolean | Soil profiles: only those with lab samples. |
| with_quality_data | boolean | Wells: only screens with groundwater quality samples. |
| with_stratigraphy | boolean | Boreholes: only those with a formal, hydrogeological or Quaternary stratigraphy. |
{
"type": "object",
"required": [
"record_type"
],
"properties": {
"sort": {
"enum": [
"nearest",
"deepest",
"newest",
"oldest",
"largest",
"most_described"
],
"type": "string",
"description": "Default: nearest with a location; otherwise deepest (boreholes, CPTs), newest (wells), largest (permits), most_described (soil profiles)."
},
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "Results to list, default 10."
},
"address": {
"type": "string",
"description": "Address in Flanders, as an alternative to municipality (then radius_m applies)."
},
"aquifer": {
"type": "string",
"description": "Wells and permits: HCOV code (A0620, or A06 for the whole system) or words from the unit name ('Brussel', 'Krijt')."
},
"date_to": {
"type": "string",
"description": "Same formats as date_from."
},
"purpose": {
"enum": [
"geological",
"geotechnical",
"groundwater_abstraction",
"dewatering",
"hydrogeological",
"geothermal",
"groundwater_monitoring",
"energy_exploration",
"contaminated_site_monitoring"
],
"type": "string",
"description": "Boreholes: why it was drilled."
},
"latitude": {
"type": "number",
"description": "WGS84 latitude, e.g. 51.0453 (use with longitude instead of address)."
},
"radius_m": {
"type": "integer",
"maximum": 5000,
"minimum": 25,
"description": "Radius around the address or coordinates, default 1000 m."
},
"date_from": {
"type": "string",
"description": "YYYY, YYYY-MM or YYYY-MM-DD: drilling/test date, last water-level date for wells, permit start, survey date."
},
"longitude": {
"type": "number",
"description": "WGS84 longitude, e.g. 3.7275."
},
"cpt_method": {
"enum": [
"electric",
"mechanical"
],
"type": "string",
"description": "CPTs: electric CPTs also measure sleeve friction."
},
"max_depth_m": {
"type": "number",
"description": "Maximum depth, same fields."
},
"min_depth_m": {
"type": "number",
"description": "Minimum depth (borehole or CPT depth, well screen bottom, permitted well depth)."
},
"record_type": {
"enum": [
"boreholes",
"cpts",
"groundwater_wells",
"groundwater_permits",
"soil_profiles"
],
"type": "string",
"description": "What to find."
},
"x_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude."
},
"y_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) y in metres."
},
"municipality": {
"type": "string",
"description": "Municipality in Flanders, e.g. 'Leuven' or 'Merelbeke-Melle'."
},
"min_annual_m3": {
"type": "number",
"description": "Permits: minimum licensed annual volume in m³."
},
"with_lab_data": {
"type": "boolean",
"description": "Soil profiles: only those with lab samples."
},
"with_quality_data": {
"type": "boolean",
"description": "Wells: only screens with groundwater quality samples."
},
"with_stratigraphy": {
"type": "boolean",
"description": "Boreholes: only those with a formal, hydrogeological or Quaternary stratigraphy."
}
}
}| longitude | number | WGS84 longitude, e.g. 3.7275. |
| max_depth_m | integer | Deepest unit start listed in the modelled column, default 300 m; deeper units are counted. Raise it for deep geothermal or deep aquifer questions. |
| x_lambert72 | number | Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude. |
| y_lambert72 | number | Belgian Lambert 72 (EPSG:31370) y in metres. |
{
"type": "object",
"properties": {
"address": {
"type": "string",
"description": "Address in Flanders, e.g. 'Grote Markt 1, 3000 Leuven'. Looked up in the Flemish address register."
},
"latitude": {
"type": "number",
"description": "WGS84 latitude, e.g. 51.0453 (use with longitude instead of address)."
},
"radius_m": {
"type": "integer",
"maximum": 500,
"minimum": 25,
"description": "Search radius for boreholes, CPTs and wells in metres, default 250."
},
"longitude": {
"type": "number",
"description": "WGS84 longitude, e.g. 3.7275."
},
"max_depth_m": {
"type": "integer",
"maximum": 5000,
"minimum": 10,
"description": "Deepest unit start listed in the modelled column, default 300 m; deeper units are counted. Raise it for deep geothermal or deep aquifer questions."
},
"x_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude."
},
"y_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) y in metres."
}
}
}| latitude | number | WGS84 latitude, e.g. 51.0453 (use with longitude instead of address). |
| longitude | number | WGS84 longitude, e.g. 3.7275. |
| x_lambert72 | number | Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude. |
| y_lambert72 | number | Belgian Lambert 72 (EPSG:31370) y in metres. |
| train_number | string | A train number as on the departure board, e.g. '2112': its run yesterday stop by stop. |
{
"type": "object",
"properties": {
"month": {
"type": "string",
"description": "Month for the monthly figures as YYYY-MM, e.g. '2026-03'; default the latest Infrabel published."
},
"address": {
"type": "string",
"description": "An address or place instead of a station: the nearest station is used, e.g. 'Grote Markt 1, 2800 Mechelen'."
},
"ic_line": {
"type": "string",
"description": "An InterCity line, e.g. 'IC 01', 'IC 16-1' or 'IC3'."
},
"station": {
"type": "string",
"description": "A passenger station, e.g. 'Leuven', 'Bruxelles-Midi', 'Gent-Sint-Pieters', 'Luik-Guillemins'."
},
"latitude": {
"type": "number",
"description": "WGS84 latitude, e.g. 51.0453 (use with longitude instead of address)."
},
"longitude": {
"type": "number",
"description": "WGS84 longitude, e.g. 3.7275."
},
"x_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude."
},
"y_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) y in metres."
},
"train_number": {
"type": "string",
"description": "A train number as on the departure board, e.g. '2112': its run yesterday stop by stop."
}
}
}| y_lambert72 |
| number |
| Belgian Lambert 72 (EPSG:31370) y in metres. |
{
"type": "object",
"properties": {
"address": {
"type": "string",
"description": "Address or place in Belgium, e.g. 'Grote Markt 1, 3000 Leuven' or 'Place Saint-Lambert 1, 4000 Liège'."
},
"latitude": {
"type": "number",
"description": "WGS84 latitude, e.g. 51.0453 (use with longitude instead of address)."
},
"longitude": {
"type": "number",
"description": "WGS84 longitude, e.g. 3.7275."
},
"x_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) x in metres, as an alternative to latitude/longitude."
},
"y_lambert72": {
"type": "number",
"description": "Belgian Lambert 72 (EPSG:31370) y in metres."
}
}
}