What Antwerp actually publishes.
The city runs an ArcGIS estate rather than a hand-built API, which is better news than it sounds: every layer is queryable, self-describing, and will hand you GeoJSON in WGS84 if you ask correctly. The trick is knowing that you have to ask, and where the layers live.
Where the data is
portaal-stadantwerpen.opendata.arcgis.com- The catalogue. An ArcGIS Hub site: search it in a browser, find the dataset, then take the REST endpoint it exposes. Start here.
geodata.antwerpen.be- The ArcGIS Server itself, under
/arcgissql/rest/services/<folder>/<service>/MapServer/<layer>. This is what you call in code. No key required for the public services. data.gov.be- The federal catalogue. Useful for finding out that a dataset exists and who owns it; the actual endpoint it points at is usually one of the two above.
Layers are addressed by number, and the numbers are not stable across service versions — MapServer/283 in one service is not the same thing as MapServer/283 in another. Pin the full path, and re-check it when something starts returning an empty set rather than an error.
Querying an ArcGIS layer
Every layer has a /query endpoint. Four parameters do almost everything:
where- A SQL-ish predicate.
1=1, URL-encoded as1%3D1, means “everything”. Required — omitting it is an error, not a default. outFields- Comma-separated field names, or
*. Naming them keeps the payload small; field names are Dutch and usually upper-case. fgeojsongives you standard GeoJSON. The default,json, is Esri's own geometry format, which is not the same thing and will not drop into a mapping library.outSR4326for WGS84 lat/lng. Without it you may get Belgian Lambert 72 coordinates, which look like plausible numbers and are in metres. This is the single most common way to waste an afternoon here.resultRecordCount- Page size. Large layers are also capped server-side; check for `exceededTransferLimit` on the response.
A layer will describe its own fields and geometry type if you ask it, which beats guessing at column names:
# Any layer describes itself. Ask before you guess at field names:
curl -s "https://geodata.antwerpen.be/arcgissql/rest/services\
/P_Publiek/Astad_20160208/MapServer/62?f=json"
# {"name":"publieke_parkings", "geometryType":"esriGeometryPoint", "fields":[…]}Worked example: the low-emission zone
Antwerp's LEZ is a single polygon, and it is the one boundary a delivery or logistics operator genuinely needs in code. It sits on layer 283 of P_Portal/portal_publiek4:
curl -s "https://geodata.antwerpen.be/arcgissql/rest/services\
/P_Portal/portal_publiek4/MapServer/283/query\
?where=1%3D1\
&outFields=NAAM,GISID,SHAPE_Area\
&f=geojson"# FeatureCollection, 1 feature, geometry MultiPolygon
{
"NAAM": "Lage-emissiezone (LEZ)",
"GISID": "LEZ0001",
"SHAPE_Area": 23073814.028491016
}One MultiPolygon feature covering about 23.1 km² — SHAPE_Area is in square metres. The multi-part geometry is not decoration: the zone has holes and exclusions, so a point-in-polygon test has to handle the rings rather than treating the outline as one loop.
A word of warning about simplifying it. A hand-traced approximation of this boundary is fine for “roughly inside the ring” and wrong at the edges, which is exactly where someone stands when they ask the question. If your answer carries a fine attached to it, fetch the real geometry and cache it — the boundary changes rarely enough that a daily refresh is generous. The rules themselves live on slimnaarantwerpen.be/lez and are the authority on who may enter; the polygon only tells you where.
Worked example: public parking
curl -s "https://geodata.antwerpen.be/arcgissql/rest/services\
/P_Publiek/Astad_20160208/MapServer/62/query\
?where=1%3D1\
&outFields=NAAM,STRAATNAAM,PLAATSEN,EXPLOITANT,ELEKTRISCHE_PLAATSEN,KEY_P\
&f=geojson&outSR=4326&resultRecordCount=50"Layer 62 of P_Publiek/Astad_20160208 is publieke_parkings, a point layer: name, street, operator, capacity and the number of EV spaces. Static metadata, and useful for “where can a customer park”.
It is notlive occupancy. Real-time free-space counts for Antwerp's garages are not available through the public open-data estate; they come through a commercial arrangement. If a product promises you live parking availability for Antwerp from open data, ask which endpoint.
What else is there
The catalogue is large and this page does not claim to have read it. Broadly, expect city-district boundaries, street and address layers, public facilities, traffic-counting points, event locations and works permits. Two caveats worth carrying into any of them:
- Municipal works are not the whole picture. A permitted road work in Antwerp is in GIPOD, the Flemish register, which is where you should look for it rather than in a city layer that may only cover city-owned projects.
- Antwerp the city is nine districts plus the port, and its boundaries do not match what most people mean by “Antwerp”. Berchem and Deurne are in it; Mortsel and Edegem are not, and are a ten-minute tram ride away. Decide early whether your product means the administrative city or the travel-to-work area, because the datasets mean the first.
Licence and attribution
Datasets in the city catalogue carry their own licence statement on the dataset page — check the one you are using rather than assuming a blanket policy, and credit Stad Antwerpen where you display it. The public ArcGIS services need no key, which makes it easy to forget they are someone's infrastructure: cache the boundaries that change yearly instead of refetching them per request.
How Stadiq uses it
Stadiq reads the LEZ boundary and the public parking layer from geodata.antwerpen.be, both cached at the edge. LEZ status for a point is returned in the lez block of GET /api/v1/air-quality. See the API reference.
Read next
- GIPODEvery permitted road work and public-domain occupation in Flanders, over an open OGC API Features service that needs no key.
- 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.
- 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.