← Developers

GIPOD, the Flemish roadworks register.

Every permitted occupation of the public domain in Flanders — road works, detours, events, scaffolding — is registered in GIPOD before it happens. The open OGC API Features service in front of it needs no key, no account and no rate-limit negotiation. It also returns geometry, Dutch status strings and end dates two years out, which is where most first attempts go wrong.

What GIPOD is

GIPOD (Generiek Informatieplatform Openbaar Domein) is the register Flemish road authorities, utilities and event organisers file into before they take space on the public domain. It is run by Digitaal Vlaanderen. Because filing is a precondition for the permit, the register is close to complete for permitted work — which is a different thing from complete for all work. An emergency water-main repair appears when it is filed, not when the hole opens.

There are two ways in. The OGC API Features service at geo.api.vlaanderen.be/GIPOD/ogc/features/v1 is open and is what this page documents. A separate authenticated REST API lives at gipod.api.vlaanderen.be; the Uri property on every feature points into it. Narrative documentation for both is on the GIPOD Confluence wiki.

The collections

Eleven collections, each in a polygon flavour and a _PUNT point-on-surface flavour. Ask the service itself rather than trusting a list in a blog post, this one included:

request
curl -s "https://geo.api.vlaanderen.be/GIPOD/ogc/features/v1/collections?f=application/json"
collection ids, 2026-08-19
INNAME                GIPOD - inname openbaar domein
INNAME_PUNT           ... as a point on the surface
HINDER                GIPOD - geplande mobiliteitshinder
HINDER_PUNT           ... as a point
HINDERGEVOLG          gevolg van geplande mobiliteitshinder
HINDERGEVOLG_PUNT     ... as a point
OMLEIDING             GIPOD - geplande omleiding
OMLEIDING_PUNT        ... as a point
OMLEIDINGGEVOLG       gevolg van geplande omleiding
OMLEIDINGGEVOLG_PUNT  ... as a point
UITZONDERINGSZONE     zones where specific conditions apply

For “is there a hole in the road near this address”, you want INNAME — the concrete, planned-or-running occupation. The HINDER collections describe the mobility hindrance a work is expected to cause, and OMLEIDING the diversions put in place; both are useful once you care about routing rather than proximity.

Querying by bounding box

The only spatial filter is bbox, in WGS84 and in longitude-first order: minLng,minLat,maxLng,maxLat. There is no radius parameter, so a “within 2 km” query is a box query followed by a distance filter you do yourself.

request
curl -s "https://geo.api.vlaanderen.be/GIPOD/ogc/features/v1/collections/INNAME/items\
?f=application/geo%2Bjson\
&limit=3\
&bbox=4.38,51.21,4.42,51.23"
deriving the box from a point and a radius
// A bounding box in degrees around a point, for a radius in kilometres.
// One degree of latitude is ~111 km everywhere; one degree of longitude
// shrinks with the cosine of the latitude, which at 51°N is about 0.63.
const dLat = radiusKm / 111;
const dLng = radiusKm / (111 * Math.cos(lat * Math.PI / 180));
const bbox = [lng - dLng, lat - dLat, lng + dLng, lat + dLat].join(",");
f
Response format. Use application/geo+json, URL-encoded as application/geo%2Bjson. Without it you get HTML.
bbox
Longitude-first WGS84 box. Filters on geometry intersection, not centroid, so a long linear work is returned when any part of it enters the box.
limit
Page size. Defaults are small; Stadiq asks for 100 on an address query and 1000 on a city-wide sweep.
startIndex
Offset. You rarely set this by hand — follow the rel="next" link instead.

What comes back

A GeoJSON FeatureCollection. Here is one real feature, whole, with only the coordinate array and the taxonomy UUIDs trimmed:

one INNAME feature, 2026-08-19
{
  "type": "Feature",
  "id": "INNAME.11264719-2603090500",
  "geometry": { "type": "MultiPolygon", "coordinates": [ ... ] },
  "properties": {
    "GipodId": 11264719,
    "Uri": "https://gipod.api.vlaanderen.be/api/v1/groundworks/11264719",
    "Description": "2000 - Antwerpen: DP Van De Werve-/Osy-/Van Maerlant-/Vondelstraat - rioleringswerken",
    "Reference": "RI3A343",
    "Type": "Grondwerk",
    "TypeId": "https://gipod.api.vlaanderen.be/api/v1/taxonomies/entitytypes/718225ee-…",
    "PublicDomainOccupancyTypes": "Riolering",
    "Status": "In uitvoering",
    "StatusId": "https://gipod.api.vlaanderen.be/api/v1/taxonomies/statuses/a2536c98-…",
    "Start": "2026-03-09T05:00:00Z",
    "End": "2028-03-20T17:00:00Z",
    "TimeSchedule": null,
    "Owner": "Aquafin - RioLink",
    "OwnerId": "https://gipod.api.vlaanderen.be/api/v1/organisations/52c20269-…",
    "ContactOrganisations": null,
    "MobilityHindrances": null,
    "GroundworkCategory": "Categorie 1",
    "GroundworkCategoryId": "https://gipod.api.vlaanderen.be/api/v1/taxonomies/…",
    "GroundworkSpecification": "distributienet",
    "GroundworkPartOfTrenchSynergy": null,
    "CreatedOn": "2024-12-23T23:16:00.047Z",
    "LastModifiedOn": "2026-03-11T23:16:43.972Z"
  }
}
GipodId
Stable numeric id for the occupation. This is the id to deduplicate and to store.
Description
Free text, Dutch, and it usually begins with the postcode and municipality ("2000 - Antwerpen: …"). Useful for display, not safe to parse.
Status
Dutch string. "In uitvoering" is the one meaning “running right now”. Match on this, not on dates.
Type
What kind of occupation, e.g. "Grondwerk". The TypeId is the stable taxonomy URI if you need to key off it.
Start / End
ISO 8601 with a Z offset. See the warning below about how far out End can sit.
Owner
The organisation that filed it — "Aquafin - RioLink", "Fluvius Site Antwerpen", a municipality. Good for grouping, and the most human-readable field in the set.
LastModifiedOn
When the record last changed. This, not CreatedOn, is what an incremental sync should track.

Five things that will catch you

1. End dates are not a proxy for “active”

The sewer work quoted above starts in March 2026 and ends in March 2028. That is normal: a multi-year utility programme is filed as one occupation covering the whole programme. If you compute “active” as Start < now < End you will tell a shopkeeper their street is dug up for two years. Use Status === "In uitvoering", and treat the date range as scope rather than schedule.

2. Geometry is MultiPolygon, so there is no point to measure from

A work is an area, often a long thin one along a street. To answer “how far is this from my door” you have to reduce it yourself. Stadiq flattens the nested coordinate arrays and takes the midpoint of the bounding box, then runs haversine from there. That is an approximation, and it is wrong by half the length of the work for anything linear — which is acceptable at a 2 km radius and would not be at 200 m. The _PUNT collections give you a point on the surface if you would rather the service made that choice.

3. There is no total count

The response carries numberReturned but no numberMatched, so you cannot tell from one page whether there is a second. Follow the rel="next" link until it stops appearing.

response envelope
{
  "type": "FeatureCollection",
  "features": [ … ],
  "numberReturned": 3,
  "timeStamp": "…",
  "links": [
    { "rel": "next", "type": "application/geo+json",
      "href": "…/items?f=application%2Fgeo%2Bjson&limit=3&bbox=…&startIndex=3" },
    …
  ]
}

4. Recurring events arrive as many near-identical records

A weekly market or a monthly street closure is filed as one occupation per occurrence, all with the same description and effectively the same location. A naive count reports forty road works on a street with one market. Deduplicate on description plus rounded distance, keep the widest date range, and count the collapses so you can still say “weekly”.

5. Everything is in Dutch, including the values

Field names are English; Status, Type, PublicDomainOccupancyTypes, GroundworkCategory and Description are not. If you are building an English-language product you are translating the values, not the schema.

Distance is not relevance

The bounding box and the haversine filter both treat the city as a flat plane. Antwerp is not: the Schelde cuts it in two, with a road tunnel and a pedestrian tunnel as the only central crossings. A work 400 m away on Linkeroever has no walk-up effect on a café on the Meir, and a radius filter cannot tell.

Stadiq tests which side of a traced river centreline both points fall on and drops the ones across the water. A travel-time isochrone is the more general version of the same idea. Whichever you pick, the point is that a proximity query is the start of relevance, not the end of it.

Licence and attribution

GIPOD data is published under the Modellicentie Gratis Hergebruik v1.0, which permits commercial and non-commercial reuse and requires attribution to the source. Name GIPOD and Digitaal Vlaanderen where you show the data.

How Stadiq uses it

Every road work in the product comes from the INNAME collection through this service. Stadiq derives a bounding box from the address and a radius, filters by centroid distance, drops the far bank of the Schelde, collapses recurring entries, and exposes the result at GET /api/v1/disruptions alongside the transit feed. The API reference has the response shape.

  • IRCELINE air qualityBelgium's official air-quality measurements, over a 52°North SOS timeseries API. Open, and stranger than it looks.
  • De Lijn realtimeDetours and stop data for Flemish public transport, and which of De Lijn's API products actually carries what.
  • Antwerp open dataWhat the city of Antwerp publishes, where the ArcGIS endpoints are, and how to query them as GeoJSON.
  • Stadiq CLIInstall the `stadiq` command, store a key, and read disruptions or a briefing from a terminal or a cron job.
  • Stadiq MCP serverThe same four endpoints as read-only agent tools, for Claude Desktop, Cursor or any MCP client.