# Overijssel Province geoportal (ArcGIS REST)

The ArcGIS REST server of the province of Overijssel: 45 services, each a theme with a B code (B22 roads, B42 energy, B46 nature and landscape, B73 culture …). On 16 October 2026 our index held 436 map layers, together over 20 million features (duplicate layers included), from energy labels of 503,016 homes to 4,040 national monuments. About 60 percent of the layers are also in the National Georegister, as WMS/WFS on the province's GeoServer; this server mainly adds per-feature queries and counts.

- Publisher: Provincie Overijssel
- Area: Netherlands · Finest detail: feature (province of Overijssel)
- Period: actuele stand (geen datums op de server) · Refreshed: yearly
- Access: Open · Licence: niet vastgesteld
- Join keys: dienst + laagnaam, OBJECTID, gemeentenaam (in veel lagen), RD-coördinaten (EPSG:28992)
- Status: grijs · 45 diensten · ArcGIS 10.51
- URL: https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services

## What can you do with it?
- **Energy labels per municipality.** The layer B42_Energielabel_woningen has 503,016 homes with label, construction year, dwelling type and municipality. Fetch one municipality and chart the labels.
- **Browse by theme.** Each service is a theme with a B code. Roads (B22) has the most layers (62), followed by nature and landscape (B46). The folder tree below lists every layer per service.
- **Asbestos roofs next to energy labels.** B41_bodem contains an inventory of asbestos roofs (798,807 polygons). Overlay it on the energy labels to find areas where insulation and asbestos removal could be combined.
- **Link to the National Georegister.** Strip the B42_ prefix and replace _ with a space: the layer names then match the titles in the NGR almost one-to-one, with metadata and licence.

## How to process it
1. **Read the directory.** All services sit in the root, without folders. Per service, ?f=json lists the layers with their ids.
   `https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services/B42_energie/FeatureServer?f=json`
2. **Query features, in degrees.** Filter with where, pick fields with outFields and request longitude/latitude with outSR=4326. Use f=json: f=geojson returns 400 here, even though the layer lists geoJSON.
   `https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services/B42_energie/FeatureServer/926/query?where=GEMEENTE%3D%27Zwolle%27%20AND%20ENERGIELAB%3D%27A%27&outFields=ENERGIELAB,BOUWJAAR,WONINGTYPE&outSR=4326&resultRecordCount=5&f=json`
3. **Page by 10,000.** maxRecordCount is 10,000. Loop with resultOffset and resultRecordCount and sort by OBJECTID so nothing is missed. Set returnGeometry=false if you only need attributes.
   `https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services/B42_energie/FeatureServer/926/query?where=1%3D1&outFields=OBJECTID,ENERGIELAB&returnGeometry=false&orderByFields=OBJECTID&resultOffset=10000&resultRecordCount=10000&f=json`
4. **Count yourself.** returnCountOnly always returns the layer total, even with a filter, and statistics (outStatistics) return an error. So count by paging with only the fields you need.
   `https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services/B42_energie/FeatureServer/926/query?where=1%3D1&returnCountOnly=true&f=json`

## Interesting combinations
- Which homes have no energy label yet? → [pdok-bag](https://www.opendataindex.nl/en/bron/pdok-bag.md) via adres of RD-coördinaten. Put the labelled homes next to all residential units in the BAG; the difference are homes without a registered label.
- Energy labels per resident or per dwelling → [cbs-kwb](https://www.opendataindex.nl/en/bron/cbs-kwb.md) via gemeentenaam (en coördinaten voor buurten). Count labels per municipality or neighbourhood and divide by the number of dwellings from the CBS key figures.

## Similar sources
- [data-overheid](https://www.opendataindex.nl/en/bron/data-overheid.md): Overijssel lists 337 datasets on data.overheid.nl, with a licence (mostly CC0 and public domain) but without per-feature queries.
- [geoportaal-gelderland](https://www.opendataindex.nl/en/bron/geoportaal-gelderland.md): The same kind of server at the neighbouring province, with a Portal that gives dates and readable titles.
- [GeoServer Overijssel (WMS/WFS)](https://services.geodataoverijssel.nl/geoserver/B42_energie/wfs?service=WFS&request=GetCapabilities&version=2.0.0): The same themes as WMS/WFS, as referenced by the NGR. That host's robots.txt disallows all automated access (16 Oct 2026).

## What to watch out for
- **Licence not established.** The server says nothing about reuse. The same layers in the NGR are mostly CC0 or public domain, but that is not stated here.
- **Not a genuine ArcGIS server.** A proxy sits in front (version 10.51): f=geojson returns 400, outStatistics 500, returnCountOnly ignores the filter and numbers come back as text ('1989'). Plain JSON queries with where, outSR and paging do work.
- **Layer ids shift.** The ids are global (B42_energie runs from 172 to 2494) and change on republication: Watergebonden bedrijventerreinen moved from /2579 to /2588. Look layers up by name, not by id.
- **No dates.** Layers and services carry no modification date. How current a layer is can at most be found in the matching NGR record.
- **Duplicate layers.** The same layer sometimes appears in several services (BAG addresses in B02, B08 BGT points and B08 BGT polygons). Deduplicate on layer name.

## API (ArcGIS REST (nagebootst, beperkt))

- Base: https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services
- Access: No key or token: the directory and all calls below worked anonymously. (tested)
- Formats: json
- Size: 439 layers in 45 FeatureServers (388 unique names) (tested)
- Filtering: where works for ordinary feature queries (GEMEENTE='Zwolle' AND ENERGIELAB='A'), but not with returnCountOnly and returnIdsOnly: those always return the whole layer. Server-side statistics and spatial filtering do not work.; =, <>, >, <, LIKE, AND, OR

### Endpoints
- `GET ?f=json`: Directory: 45 services (B42_energie, B61_economie …), version 10.51, no folders.
- `GET /{dienst}/FeatureServer?f=json`: Service: layers, maxRecordCount (10,000), serviceDescription with the theme.
- `GET /{dienst}/FeatureServer/{laag}?f=json`: Layer: fields and geometry type. Layer ids are global numbers (926, 2588 …).
- `GET /{dienst}/FeatureServer/{laag}/query?where=…&outFields=…&f=json`: Query features: where, outFields, outSR, orderByFields, resultOffset/resultRecordCount and returnDistinctValues work. Esri JSON only.

### Parameters
- `where`: Condition in SQL-92 style: 1=1 for everything, text in single quotes (GEMEENTE='Zwolle'), LIKE with %, AND/OR, dates as DATE 'YYYY-MM-DD'. Required when there is no other filter. (tested)
- `outFields`: Fields in the response, comma-separated, or * for all fields. (tested)
- `returnGeometry`: false = attributes only (much smaller response). (tested)
- `outSR`: Projection of the geometry in the response; 4326 = degrees (WGS84). Default is the layer's projection, here RD (28992). (tested)
- `f`: Format: only json (Esri JSON) works; geojson and pbf return HTTP 400. (tested)
- `resultOffset`: Pagination: number of features to skip (from 0). Use together with orderByFields for a stable order. (tested)
- `resultRecordCount`: Maximum number of features in this response (capped at the layer's maxRecordCount). (tested)
- `orderByFields`: Sort order, e.g. 'OBJECTID' or 'n DESC' (also on a statistics field). (tested)
- `returnCountOnly`: Always returns the total of the whole layer: where is ignored. (tested)
- `outStatistics`: Does not work here: HTTP 500. Count yourself after fetching. (tested)
- `returnDistinctValues`: true with outFields and returnGeometry=false: the unique values of those fields. (tested)
- `geometry`: Spatial filtering does not work here: an envelope with geometryType=esriGeometryEnvelope returned HTTP 500. Filter on a field (GEMEENTE) or on the coordinates yourself. (tested)

### Fields of the example layer (10)
`OBJECTID` OID, `ENERGIELAB` String, `BOUWJAAR` Integer, `BOUWJAARKL` String, `WONINGTYPE` String, `GEMEENTE` String, `NAAM_CORPO` String, `TYPE_EIGEN` String, `REG_DATUM_` String, `VBO_ID` String

### Limits and pitfalls
- maxRecordCount 10,000 per response. No exceededTransferLimit is returned: page yourself with resultOffset until a page has fewer than resultRecordCount features. (tested)
- No key and no documented rate limit. Take it easy (a few requests per second) and prefer statistics or counts over fetching all features. (experience)
- This is not a real ArcGIS Server but a Spring proxy imitating the ArcGIS format (errors in Spring JSON with timestamp and path). Not everything the layer JSON promises (supportedQueryFormats JSON, geoJSON; supportsStatistics true) is true. (tested)
- Measured: f=geojson and f=pbf return HTTP 400, outStatistics en een ruimtelijk filter HTTP 500, /MapServer and /WMSServer 404. returnCountOnly and returnIdsOnly ignore where (the Zwolle filter still returned 503,016). (tested)
- Numbers come back as text ('BOUWJAAR': '1989', 'OBJECTID': '6'), and the response always lists all fields in fields, even if you restrict outFields. (tested)
- Layer ids shift on republishing (B61_economie/2579 became /2588). Look up a layer by name via /{service}/FeatureServer?f=json. (experience)
- The same themes are also published as real OGC services on GeoServer (services.geodataoverijssel.nl/geoserver/<theme>/wfs), but robots.txt there disallows everything; we do not call it. (experience)
- The server gives no modification date per service or layer (no editingInfo). How current a layer is, is not stated. (tested)

### Example
```
https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services/B42_energie/FeatureServer/926/query?where=GEMEENTE%3D%27Zwolle%27%20AND%20ENERGIELAB%3D%27A%27&outFields=ENERGIELAB,BOUWJAAR,WONINGTYPE,GEMEENTE&returnGeometry=false&resultRecordCount=5&f=json
```

## How to fetch it

### curl
```bash
curl "https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services/B42_energie/FeatureServer/926/query?where=GEMEENTE%3D%27Zwolle%27&outFields=ENERGIELAB,BOUWJAAR&returnGeometry=false&resultRecordCount=100&f=json"
```

### python
```python
import requests

url = "https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services/B42_energie/FeatureServer/926/query"
labels, offset = {}, 0
while True:
    r = requests.get(url, params={"where": "GEMEENTE='Zwolle'", "outFields": "ENERGIELAB",
                                  "returnGeometry": "false", "orderByFields": "OBJECTID",
                                  "resultOffset": offset, "resultRecordCount": 10000, "f": "json"})
    rijen = r.json()["features"]
    for f in rijen:
        lab = f["attributes"]["ENERGIELAB"].strip() or "geen"
        labels[lab] = labels.get(lab, 0) + 1
    if len(rijen) < 10000:
        break
    offset += 10000
print(labels)
```

## Who uses it
- [Nationaal Georegister](https://www.nationaalgeoregister.nl): Metadata for the same themes (via the province's GeoServer)


## What is in it: 439 map layers

All services and layers on this ArcGIS server, fetched every night. Every layer has its own page with fields, geometry and a query call.

- Kinds: kaartlaag 439
- With an API call on the dataset page: 439
- Search: https://www.opendataindex.nl/api/catalogus/arcgis-overijssel?q=… or the MCP function zoek_datasets with herkomst=arcgis-overijssel
- Every row has its own page: https://www.opendataindex.nl/en/dataset/arcgis-overijssel/<key>

### Folders
- Achtergrondkaarten (4)
- B02 topografie (3)
- B03 projectgrenzen (2)
- B04 stedelijk gebied (3)
- B05 postcodegebieden (1)
- B06 bladindelingen (6)
- B08 BGT (21)
- B08 BGT BRMO (37)
- B08 BGT lijnen (7)
- B08 BGT punten (6)
- B08 BGT vlakken (10)
- B14 bestuurlijke grenzen (6)
- B22 wegen (64)
- B23 waterwegen (9)
- B24 spoorwegen (3)
- B27 vliegverkeer (9)
- B32 waterkeringen (3)
- B33 beheer oppervlaktewater (8)
- B34 beheer grondwater (23)
- B35 waterlopen (4)
- B41 bodem (9)
- B42 energie (21)
- B43 luchtverontreiniging (1)
- B44 geluidshinder (2)
- B45 ontgrondingen (3)
- B46 natuur en landschap (55)
- B47 flora en fauna (7)
- B51 recreatie (8)
- B61 economie (8)
- B63 landbouw (2)
- B64 nutsvoorzieningen (4)
- B73 Cultuur (37)
- B82 volkshuisvesting (3)
- B83 stads en dorpsvernieuwing (1)
- B92 veiligheid (1)
- Informatiekaart Natuur (8)
- INSPIRE AM (3)
- INSPIRE PS (2)
- LIP (32)
- WKO-tool (3)

## Examples with real figures (1)

For each example the finding, the reference date and the call that fetches exactly these figures.

- **Map layers on the Overijssel ArcGIS server by service: most wegen (B22) (64 layers), then natuur en landschap (B46) and BGT BRMO (B08)** (november 2026). Table https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services. [Example](https://www.opendataindex.nl/en/voorbeeld/geoportaal-overijssel-lagen)
  - `https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services?f=json`
  - `https://arcgisrest.geodataoverijssel.nl/arcgis/rest/services/Achtergrondkaarten/FeatureServer?f=json`
