# data.europa.eu

The European data portal harvests the catalogues of the EU institutions and of all member states, including the Dutch one. On 15 October 2026 it held 1,752,057 datasets from 212 catalogues, 30,119 of them from the Netherlands. You can search via an API and via SPARQL.

- Publisher: Publicatiebureau van de Europese Unie
- Area: Europe · Finest detail: dataset (metadata)
- Period: actueel · Refreshed: daily
- Access: Open · Licence: CC0 1.0 (metadata); datasets onder hun eigen licentie
- Join keys: dataset-id, catalogus-id, landcode (nl)
- Status: ok (2026-10-15) · 30126 datasets uit Nederland
- URL: https://data.europa.eu

## What can you do with it?
- **How open is the Netherlands, compared with its neighbours?.** Count datasets per country. On 15 October 2026: Germany 850,606, France 183,233, the Netherlands 30,119. Note: this mostly reflects how each country organises its catalogue, not how much data really exists.
- **Which Dutch datasets are 'high-value'?.** The EU designates high-value datasets that must be free and available via an API. The is_hvd facet finds them; for the Netherlands there were 451 (15 Oct 2026).
- **The same dataset in other countries.** Search a topic (e.g. charging points or air quality) across all countries at once and see which cities or countries do or do not publish it.
- **Map the licences.** The license facet counts licences. Of the Dutch datasets, 9,111 had CC BY 4.0, 5,946 CC0 and 664 'licence unknown' (15 Oct 2026).

## How to process it
1. **View the list of catalogues.** 212 catalogue ids. The Dutch ones: dataportaal-van-de-nederlandse-overheid (data.overheid.nl), ngr-nl (National Georegister) and nsip-nl (Logius).
   `https://data.europa.eu/api/hub/search/catalogues`
2. **Search and count with a POST.** Send a JSON query to /api/hub/search/search. With limit 0 you only get the count and the facets (country, catalogue, format, licence, high-value).
   `curl -X POST https://data.europa.eu/api/hub/search/search -H 'Content-Type: application/json' -d '{"filters":["dataset"],"limit":0,"facets":{"country":["nl"]}}'`
3. **Fetch one dataset.** With the id you get title (in all EU languages), description, publisher, distributions with format and licence.
   `https://data.europa.eu/api/hub/search/datasets/83957-cbs-vierkantstatistieken-100m`
4. **Count with SPARQL.** The /sparql endpoint answers questions about the whole catalogue as linked data (DCAT-AP). Send the query as a POST.
   `curl -X POST https://data.europa.eu/sparql -H 'Accept: application/sparql-results+json' --data-urlencode 'query=PREFIX dcat: <http://www.w3.org/ns/dcat#> SELECT (COUNT(?d) AS ?n) WHERE { <http://data.europa.eu/88u/catalogue/dataportaal-van-de-nederlandse-overheid> dcat:dataset ?d }'`

## Interesting combinations
- Does everything from data.overheid.nl reach Europe? → [data-overheid](https://www.opendataindex.nl/en/bron/data-overheid.md) via dataset-id = name in data.overheid.nl (bv. 83957-cbs-vierkantstatistieken-100m). Compare the counts. On 15 October 2026 data.europa.eu counted 19,351 datasets from data.overheid.nl, while we counted 20,794 there ourselves.

## Similar sources
- [data-overheid](https://www.opendataindex.nl/en/bron/data-overheid.md): The Dutch source itself, with the owner per dataset (authority) and more Dutch-specific fields.
- [Nationaal Georegister](https://www.nationaalgeoregister.nl): All Dutch geodata and map services, with the services (WMS/WFS) belonging to each dataset.

## What to watch out for
- **Counted twice.** data.overheid.nl itself also harvests the National Georegister. Because data.europa.eu harvests both catalogues, many Dutch geodatasets appear twice. So don't simply add them up.
- **Metadata only.** The portal stores descriptions and links, not the data itself. A download always goes to the original publisher.
- **Translated by machine.** Titles and descriptions exist in all EU languages, but most translations are automatic (field translation_meta). Search Dutch data in Dutch.
- **robots.txt forbids search URLs.** robots.txt forbids /*search?* and /*?query=*. That covers GET /api/hub/search/search?q=… and GET /sparql?query=…. The POST variants are documented and are not covered.

## API (REST (JSON, POST-zoeken) en SPARQL)

- Base: https://data.europa.eu/api/hub/search
- Access: Reading and searching without a key. Write actions in the OpenAPI (creating, changing datasets) need a key and are for catalogue managers. (tested)
- Formats: json, sparql-json
- Size: 30132 datasets with country nl (16 Oct 2026); 213 catalogues in total (tested)
- Filtering: JSON body with q (free text), filters (document type) and facets (field → list of values). Several values within a facet = OR, facets combined = AND (facetOperator, facetGroupOperator).; facets, q, AND, OR

### Endpoints
- `POST /search`: Search and count with a JSON body: q, filters (dataset, catalogue …), facets (country, catalog, format, license, is_hvd …), page, sort. Response: result.count, results and facets with counts.
- `GET /datasets/{id}`: One dataset: title and description in all EU languages, publisher, catalogue, distributions (format, access_url, licence), keywords, quality measurements.
- `GET /catalogues`: List of all 213 catalogue ids.
- `GET /catalogues/{id}`: One catalogue with title, country, publisher, homepage, number of datasets (count) and modified. Netherlands: dataportaal-van-de-nederlandse-overheid, ngr-nl, nsip-nl.
- `POST https://data.europa.eu/sparql`: SPARQL over the whole catalogue (DCAT-AP). Query as form field query, answer with Accept: application/sparql-results+json.
- `GET /openapi.yaml`: The OpenAPI description (also scroll, feeds per dataset, vocabularies).

### Parameters
- `q`: Search term (in the JSON body). laadpalen + country nl returned 13 datasets. (tested)
- `filters`: Document type: ["dataset"], ["catalogue"], also dataservice, datasetseries … (tested)
- `facets`: Filter on facets: {"country":["nl"],"catalog":["ngr-nl"],"is_hvd":["true"],"format":["CSV"]}. Facets in the response include country, catalog, publisher, format, license, categories, keywords, is_hvd, hvdCategory, scoring. (tested)
- `aggregationAllFields / aggregationFields`: Only count the facets you name: "aggregationAllFields": false, "aggregationFields": ["catalog","license"]. (tested)
- `aggregation`: false = no facets (much smaller response). (tested)
- `includes`: Only these fields per result, e.g. ["id","title.nl","modified","catalog.id"]: 1 kB instead of 500 kB. (tested)
- `sort`: A list, not a string: ["modified+desc"]. As a string: 400 ValidationException. (tested)
- `page`: Page number (from 0). (from the description)
- `limit`: According to the OpenAPI 0 to 1,000 (more or a string gives 400), but see the notes: the POST always returned 10 results. (tested)
- `minDate, maxDate, dateType, bbox…, scroll, searchAfter`: Listed in the OpenAPI (date and map filters, deep paging). minDate with dateType modified did not change the count for us: verify before relying on it. (tested)

### Fields in the search response (10)
`result.count` integer, `result.facets[].items[].id / count` lijst, `results[].id` tekst, `results[].title` object, `results[].catalog.id` tekst, `results[].publisher.resource` url, `results[].distributions[]` lijst, `results[].is_hvd` boolean, `results[].translation_meta` object, `results[].modified` datum

### Limits and pitfalls
- No key and no documented request limit. A response with all facets is large (600 kB for limit 0): set aggregation to false or name aggregationFields. (tested)
- Keep it small: includes ["id"] plus aggregationFields turns a count with two facets into 5 kB instead of 500 kB. (tested)
- robots.txt forbids /*search?* and /*?query=*, i.e. GET /api/hub/search/search?q=… and GET /sparql?query=…. Use the documented POST variants; /datasets/{id} and /catalogues may use GET. (tested)
- In the POST body, limit 0, 1 and 50 always returned 10 results (16 Oct 2026); page does work. Counts and facets are correct; for large lists use SPARQL or the original source. (tested)
- Duplicates: data.overheid.nl harvests the NGR itself, and data.europa.eu harvests both. NL counted 30,132 datasets: data.overheid.nl 19,363, ngr-nl 9,333, nsip-nl 1,436. Don't simply add them up. (tested)
- Licences come as URIs: http://creativecommons.org/licenses/by/4.0/deed.nl (9,117 NL datasets), CC0 (5,954), Public Domain Mark (4,000), licence unknown (665). (tested)
- Metadata only: downloads go to the original publisher (access_url). (tested)
- SPARQL counts dcat:dataset per catalogue quickly (ngr-nl: 9,330 in 0.1 s), slightly different from the search facet (9,333). (tested)

### Example
```
https://data.europa.eu/api/hub/search/search
```

## How to fetch it

### curl
```bash
curl -X POST https://data.europa.eu/api/hub/search/search -H 'Content-Type: application/json' -d '{"filters":["dataset"],"limit":0,"facets":{"country":["nl"]}}'
```

### python
```python
import requests

r = requests.post("https://data.europa.eu/api/hub/search/search", json={
    "filters": ["dataset"], "limit": 0, "facets": {"country": ["nl"]}}).json()["result"]
print(r["count"], "datasets uit Nederland")
for f in r["facets"]:
    if f["id"] == "catalog":
        for c in f["items"]:
            print(c["id"], c["count"])
```


## Examples with real figures (2)

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

- **Dutch datasets on data.europa.eu by theme: most environment (4,271 datasets), then economy and finance and transport** (oktober 2026). Table hub/search. [Example](https://www.opendataindex.nl/en/voorbeeld/data-europa-nl-themas)
  - `https://data.europa.eu/api/hub/search/search`
- **Datasets on data.europa.eu by country: most Germany (850,095 datasets), then France and Austria** (oktober 2026). Table hub/search. [Example](https://www.opendataindex.nl/en/voorbeeld/data-europa-per-land)
  - `https://data.europa.eu/api/hub/search/search`
