# NDE Dataset Register

The Dataset Register of the Dutch Digital Heritage Network is the catalogue of Dutch heritage data: archives, museums, libraries and municipalities register their dataset descriptions, the register harvests and validates them and loads them into a SPARQL endpoint. On 16 October 2026 it held 3,401 datasets with a valid registration from 159 publishers. The register contains descriptions, not the data itself: each description points to downloads or APIs (OAI-PMH, SPARQL, IIIF) at the institution. It is maintained by the National Archives.

- Publisher: Netwerk Digitaal Erfgoed, Nationaal Archief
- Area: Netherlands · Finest detail: dataset
- Period: actueel (beschrijvingen worden steeds opnieuw opgehaald) · Refreshed: daily
- Access: Open · Licence: Per datasetbeschrijving; meestal CC BY 4.0 of CC0 (geldt voor de metadata, niet voor de collectiestukken)
- Join keys: IRI van de dataset, uitgever (IRI van de organisatie)
- Status: ok (2026-10-16) · 3.391 datasets met een geldige registratie
- URL: https://datasetregister.netwerkdigitaalerfgoed.nl

## What can you do with it?
- **What heritage data exist about my town?.** Search titles and keywords for a place name. You will find archives of societies, notaries and companies, photo collections and museum catalogues, each with its own download or API.
- **What am I allowed to do?.** Every description names a licence. Of the 3,401 datasets, 1,832 are under CC BY 4.0, 1,098 under CC0 and 436 under CC BY-SA 4.0. That licence covers the description; for the items themselves check with the institution.
- **All linked data entry points in heritage.** Filter the distributions on dct:conformsTo: 147 datasets have a SPARQL endpoint, 94 an OAI-PMH endpoint, 17 IIIF. That gives you a list of machine-readable entry points for your own search service.
- **Who publishes what?.** Count datasets per publisher: Het Utrechts Archief (1,572), Stadsarchief Rotterdam (696) and Streekarchief Voorne-Putten (346) describe each archive as a separate dataset; museums often register one large collection. Dataset counts therefore say little about size.

## How to process it
1. **Search the website or via SPARQL.** The search page turns your query into a SPARQL query that you can open and adjust. The endpoint is freely accessible; ask for application/sparql-results+json to get JSON.
   `https://datasetregister.netwerkdigitaalerfgoed.nl/sparql`
2. **Only valid registrations.** The register counts a dataset when its registration is valid: schema:subjectOf/schema:additionalType is …/registry/valid. Without that condition you also get gone and invalid descriptions: 3,461 instead of 3,401.
3. **From description to data.** Each dataset has one or more dcat:distribution with dcat:accessURL or dcat:downloadURL, a media type and sometimes dct:conformsTo (the protocol). Those addresses belong to the institution; the register stores no data.

## Interesting combinations
- Which Rijksmuseum data exist besides the search API? → [rijksmuseum](https://www.opendataindex.nl/en/bron/rijksmuseum.md) via uitgever (Rijksmuseum Amsterdam). The Rijksmuseum has 16 datasets in the register, with LDES, IIIF and Linked Art as protocols. That shows which entry points the museum itself lists.
- Which KB datasets are registered? → [kb-linked-data](https://www.opendataindex.nl/en/bron/kb-linked-data.md) via uitgever (KB, nationale bibliotheek). The 17 KB datasets in the register are the same as the dataset descriptions on data.bibliotheken.nl (NBT, STCN, thesauri), each with a SPARQL and download address.

## Similar sources
- [europeana](https://www.opendataindex.nl/en/bron/europeana.md): Europeana aggregates the objects themselves (with images) from European institutions, but requires a key. The Dataset Register only describes datasets, without a key.
- [data-overheid](https://www.opendataindex.nl/en/bron/data-overheid.md): The same set-up (a catalogue of descriptions) for government data. Heritage datasets rarely appear there.
- [open-archieven](https://www.opendataindex.nl/en/bron/open-archieven.md): Open Archives holds the person records themselves, searchable by name; in the register Open Archives appears with 306 dataset descriptions: genealogical metadata and linksets per participating archive.

## What to watch out for
- **A dataset is not always the same size.** Some archives register every archive group separately (Het Utrechts Archief: 1,572 datasets), others one whole collection. Do not compare institutions by number of datasets.
- **Licence of the description.** According to the register itself, the licence applies to the metadata. The underlying collection items may fall under a different, sometimes stricter licence.
- **Dates missing or in the future.** 124 of the 3,401 datasets have no dct:modified. Only use complete dates up to today when looking at freshness.

## API (SPARQL 1.1 (QLever) en REST)

- Base: https://datasetregister.netwerkdigitaalerfgoed.nl/sparql
- Access: Reading (SPARQL) without a key. Registering is for institutions; the register keeps an allow list of domains (/api/allowed-domains). (tested)
- Formats: sparql-results+json, csv, tsv, json-ld, turtle
- Size: 3392 datasets with a valid registration (SPARQL count, 16 Oct 2026 around 23:45; 3,401 earlier that day) (tested)
- Filtering: SPARQL 1.1 with prefixes dcat: <http://www.w3.org/ns/dcat#>, dct: <http://purl.org/dc/terms/>, schema: <https://schema.org/> (https). FILTER(CONTAINS(LCASE(?title), "…")) for text search.; SELECT, FILTER, CONTAINS, GROUP BY, COUNT(DISTINCT), OPTIONAL, pad/pad, GRAPH

### Endpoints
- `GET /sparql?query=…`: SPARQL query in the URL. With Accept: application/json or application/sparql-results+json the standard JSON, text/csv a table. The response also has meta.query-time-ms.
- `POST /sparql`: The same query as form field query= (handy for long queries).
- `GET /api/datasets?url=…`: REST: is a description at this URL already registered?
- `POST /api/datasets`: REST: register a dataset description (for institutions; see allowed-domains).
- `POST /api/datasets/validate`: REST: validate a description in the body against the NDE requirements; PUT with a URL validates what is at that address.
- `GET /api/shacl`: REST: the SHACL shape used to validate descriptions.
- `GET /api/allowed-domains?url=…`: REST: is the domain on the allow list?

### Parameters
- `query`: The SPARQL query (GET in the URL or POST as form field). (tested)
- `Accept`: application/sparql-results+json (also for application/json), text/csv. (tested)
- `schema:subjectOf/schema:additionalType`: Registration status: <https://data.netwerkdigitaalerfgoed.nl/registry/valid> for valid descriptions; without this filter you also count gone and invalid ones. (tested)

### Predicates of a dataset and its distributions (selection) (14)
`dcat:Dataset` klasse, `dct:title / dct:description` tekst, `dct:publisher / dct:creator` uri, `dct:license` uri, `dcat:keyword / dcat:theme` tekst, `dct:modified / dct:created / dct:issued` datum, `dct:spatial / dct:temporal` tekst, `dcat:distribution` uri, `dcat:distribution / dcat:accessURL, dcat:downloadURL` url, `dcat:distribution / dcat:mediaType, dct:conformsTo` tekst, `dcat:distribution / dcat:byteSize` getal, `schema:subjectOf / schema:additionalType` uri, `schema:contentRating` uri, `schema:dateRead / nde:dateCrawled` datetime

### Limits and pitfalls
- No documented limit or key. Counts over the whole register took 50 to 70 ms. (tested)
- robots.txt only disallows search.php, show.php and viaurl.php of the old app; /sparql and /api are allowed. (tested)
- Count only valid registrations (schema:subjectOf/schema:additionalType …/registry/valid): 3,392 on 16 Oct 2026 around 23:45, while 3,401 were counted earlier that day. The number fluctuates because the register keeps re-fetching descriptions. (tested)
- schema: here is https://schema.org/ (https), dct: is http://purl.org/dc/terms/ (with a slash). Different from the KB. (tested)
- Each registered description sits in its own graph (the registration URL); besides that there are graphs with registrations, ratings, SHACL results and distribution reachability (…/sparql/distribution-health). (tested)
- Counting licences by URI: CC0 appears as http:// (1,063) and https:// (34). Normalise before adding up. (tested)
- The register holds descriptions, not collection data: fetch the data from the institution via dcat:accessURL or dcat:downloadURL. (from the description)

### Example
```
https://datasetregister.netwerkdigitaalerfgoed.nl/sparql?query=PREFIX%20dcat%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2Fns%2Fdcat%23%3E%20PREFIX%20dct%3A%20%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Fterms%2F%3E%20PREFIX%20schema%3A%20%3Chttps%3A%2F%2Fschema.org%2F%3E%20SELECT%20%3Flicentie%20%28COUNT%28DISTINCT%20%3Fd%29%20AS%20%3Fdatasets%29%20WHERE%20%7B%20%3Fd%20a%20dcat%3ADataset%20%3B%20dct%3Alicense%20%3Flicentie%20%3B%20schema%3AsubjectOf%2Fschema%3AadditionalType%20%3Chttps%3A%2F%2Fdata.netwerkdigitaalerfgoed.nl%2Fregistry%2Fvalid%3E%20%7D%20GROUP%20BY%20%3Flicentie%20ORDER%20BY%20DESC%28%3Fdatasets%29%20LIMIT%205
```

## How to fetch it

### curl
```bash
curl -H "Accept: application/sparql-results+json" --data-urlencode 'query=PREFIX dcat: <http://www.w3.org/ns/dcat#> PREFIX schema: <https://schema.org/> SELECT (COUNT(DISTINCT ?d) AS ?n) WHERE { ?d a dcat:Dataset ; schema:subjectOf/schema:additionalType <https://data.netwerkdigitaalerfgoed.nl/registry/valid> }' https://datasetregister.netwerkdigitaalerfgoed.nl/sparql
```

### python
```python
import requests

q = """PREFIX dcat: <http://www.w3.org/ns/dcat#> PREFIX dct: <http://purl.org/dc/terms/> PREFIX schema: <https://schema.org/>
SELECT ?d ?titel WHERE {
  ?d a dcat:Dataset ; dct:title ?titel ;
     schema:subjectOf/schema:additionalType <https://data.netwerkdigitaalerfgoed.nl/registry/valid> .
  FILTER(CONTAINS(LCASE(?titel), "notaris"))
} LIMIT 10"""
r = requests.post("https://datasetregister.netwerkdigitaalerfgoed.nl/sparql", data={"query": q},
                  headers={"Accept": "application/sparql-results+json", "User-Agent": "mijnproject/1.0"}).json()
for b in r["results"]["bindings"]:
    print(b["titel"]["value"], b["d"]["value"])
```


## What is in it: 3,409 datasets

All datasets in the Dataset Register of the Dutch Digital Heritage Network, by institution, fetched every night. Every dataset has its own page with licence and distributions (download, SPARQL, OAI-PMH).

- Kinds: dataset 3,409
- Last changed: 2026-11-01 (852 in the past 30 days)
- With an API call on the dataset page: 3,407
- Search: https://www.opendataindex.nl/api/catalogus/nde?q=… or the MCP function zoek_datasets with herkomst=nde
- Every row has its own page: https://www.opendataindex.nl/en/dataset/nde/<key>

### Folders
- Het Utrechts Archief (1,573)
- Stadsarchief Rotterdam (696)
- Streekarchief Voorne-Putten (347)
- Open Archieven (306)
- Streekarchief Langstraat Heusden Altena (76)
- Van Gogh worldwide consortium, represented by the Netherlands Institute of Art History (RKD) (49)
- Nationaal Archief (34)
- Gouda Tijdmachine (29)
- KB, nationale bibliotheek (17)
- Rijksmuseum Amsterdam (16)
- Nederlands Instituut voor Beeld en Geluid (15)
- Bibliotheek UvA (10)
- GLOBALISE project (9)
- CBS (7)
- HAN - Het Hannemahuis (6)
- Literatuurmuseum (6)
- Mibudera (6)
- Rijksdienst voor het Cultureel Erfgoed (6)
- DC4EU (5)
- Gemeente Borne (5)
- MHD - Museum Huis Doorn (5)
- Digitaal Erfgoed Friesland (4)
- NIMH / Nederlands Instituut voor Militaire Historie (4)
- Amsterdam Time Machine (3)
- Erfgoed Enschede (3)
- Gemeente Zoetermeer (3)
- MHM - Moluks Historisch Museum (3)
- PeelenMaasNet (3)
- Stichting WO2Net (3)
- WRT - Gemeente Weert (3)
- Airborne Museum Hartenstein (2)
- Archeologiemuseum Huis van Hilde (HVH) (2)
- CREATE (2)
- FEHAC (2)
- Genealogie Online (2)
- Historische Vereniging Maassluis (2)
- IHLIA - LGBTI Heritage (2)
- Korpora, Erfgoed Publieke Veiligheid (2)
- KW - Kamp Westerbork (2)
- LI-MA Mediakunst (2)
- … and 123 more folders

## Examples with real figures (1)

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

- **Heritage datasets in the NDE Dataset Register by licence: most CC BY 4.0 (1,834 datasets), then CC0 1.0 and CC BY-SA 4.0** (november 2026). Table SPARQL, dct:license. [Example](https://www.opendataindex.nl/en/voorbeeld/nde-datasetregister-licenties)
  - `https://datasetregister.netwerkdigitaalerfgoed.nl/sparql?query=PREFIX%20dcat%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2Fns%2Fdcat%23%3E%20PREFIX%20dct%3A%20%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Fterms%2F%3E%20PREFIX%20schema%3A%20%3Chttps%3A%2F%2Fschema.org%2F%3E%0ASELECT%20%3Flicentie%20(COUNT(DISTINCT%20%3Fd)%20AS%20%3Fn)%20WHERE%20%7B%0A%20%20%3Fd%20a%20dcat%3ADataset%20%3B%20schema%3AsubjectOf%2Fschema%3AadditionalType%20%3Chttps%3A%2F%2Fdata.netwerkdigitaalerfgoed.nl%2Fregistry%2Fvalid%3E%20.%0A%20%20OPTIONAL%20%7B%20%3Fd%20dct%3Alicense%20%3Flicentie%20%7D%0A%7D%20GROUP%20BY%20%3Flicentie`
