# Europeana

Europeana combines the collections of thousands of heritage institutions in Europe, including Dutch ones: artworks, photographs, newspapers, books, natural history items. According to its API page there are more than 3 million artworks, 6 million photographs, 2 million newspapers and 12 million natural history items. All metadata are CC0; images carry their own rights statement per object. The APIs (Search, Record, IIIF, SPARQL, OAI-PMH) require a free key.

- Publisher: Europeana Foundation
- Area: Europe · Finest detail: object
- Period: per collectie verschillend · Refreshed: monthly
- Access: Free key · Licence: Metadata CC0 1.0; beelden en media per object een eigen rechtenverklaring
- Join keys: Europeana-record-id (/<dataset>/<object>), land en instelling van herkomst
- Status: grijs · API-pagina bereikbaar; de API zelf vraagt een sleutel
- URL: https://api.europeana.eu/en

## What can you do with it?
- **The Netherlands next to Europe.** Search a subject (a city, an artist, an event) and compare what Dutch institutions contribute with those from other countries.
- **Freely reusable images.** Filter with reusability=open for images with an open licence or in the public domain. Useful for an article or infographic, but always check the rights statement per object.
- **Newspapers over time.** According to its own page Europeana has more than 2 million newspapers, with millions of pages as searchable full text. Track how often a word appears in newspapers from different countries.

## How to process it
1. **Request a key.** Create a free Europeana account and request a key on the API page. Without a key every call returns HTTP 401 with invalid_apikey.
   `https://api.europeana.eu/en`
2. **Search.** The Search API with query= and your key as wskey= or in the X-Api-Key header (both recognised, tested with an invalid key). At most 100 results per request (rows); for deep paging cursor=*. Refine with qf= (repeatable) and reusability=open|restricted|permission.
   `https://europeana.atlassian.net/wiki/spaces/EF/pages/2385739812/Search+API+Documentation`
3. **Start without a key.** To try Dutch museum data without an account first, start with the Rijksmuseum's open API. It also offers its data in the Europeana Data Model (EDM).
   `https://data.rijksmuseum.nl/search/collection?type=painting&imageAvailable=true`

## Interesting combinations
- Which European objects resemble this Rijksmuseum object? → [rijksmuseum](https://www.opendataindex.nl/en/bron/rijksmuseum.md) via titel of objectnummer. Fetch an object through the Rijksmuseum API and search Europeana for the same maker or subject in collections from other countries.

## Similar sources
- [rijksmuseum](https://www.opendataindex.nl/en/bron/rijksmuseum.md): One Dutch museum, but fully open without a key, with images via IIIF and a daily change stream.
- [kb-linked-data](https://www.opendataindex.nl/en/bron/kb-linked-data.md): Catalogue data of everything printed in the Netherlands, as open SPARQL without a key.
- [NDE Datasetregister](https://datasetregister.netwerkdigitaalerfgoed.nl): Overview of Dutch heritage datasets with their own (often open) access, searchable without a key.

## What to watch out for
- **Key required.** All APIs require a personal key tied to an account. That is why this page shows no figures we fetched from Europeana ourselves; the chart on this page comes from the open Rijksmuseum API.
- **Rights per object.** The metadata are CC0, the images are not automatically. Each object has its own rights statement, from public domain to all rights reserved.
- **Depends on what institutions supply.** Europeana shows what heritage institutions supply. How completely a Dutch collection is included differs per institution; for the full collection, check the institution itself.
- **Website not for scripts.** The robots.txt of europeana.eu disallows search pages and /api/ for crawlers. Use the API at api.europeana.eu with a key, not the website.

## API (REST (JSON), OAI-PMH 2.0, IIIF, SPARQL)

- Base: https://api.europeana.eu
- Access: Search, Record, Entity and the other REST APIs require a free key tied to a Europeana account: a personal key (one per account) or a project key with higher limits. Send it in the X-Api-Key header (preferred) or as wskey= (deprecated). Without a key: HTTP 401 invalid_apikey. The OAI-PMH service and the IIIF manifests worked without a key on 16 Oct 2026. (tested)
- Formats: json, json-ld, RDF/XML (EDM), OpenSearch RSS, xml
- Size: 2268 datasets (OAI-PMH sets) at Europeana, 16 Oct 2026; the Rijksmuseum set 90402 alone holds 337,641 records (tested)
- Filtering: Search API: Lucene/Solr-style query in query= plus repeatable refinements qf=FIELD:value; ranges with [a TO b]. OAI-PMH: set (dataset) and from/until.; veld:waarde, AND, OR, NOT, [a TO b], *, qf (herhaald)

### Endpoints
- `GET /record/v2/search.json`: Search API: search all records with query, qf, reusability, facets and paging (key required).
- `GET /record/v2/{dataset}/{lokaal-id}.json`: Record API: all metadata of one object; also .jsonld and .rdf (key required).
- `GET /entity/search, /entity/{type}/base/{id}, /entity/resolve`: Entity API: persons, places, concepts and organisations that records refer to (key required).
- `GET /fulltext/search.json, /fulltext/{record-id}/…`: Fulltext: searchable text of newspapers and other digitised items.
- `GET /oai/record?verb=…`: OAI-PMH 2.0 (version 0.8 beta): Identify, ListSets (datasets), ListIdentifiers, ListRecords, GetRecord; format edm. Worked without a key.
- `GET https://iiif.europeana.eu/presentation/{dataset}/{lokaal-id}/manifest`: IIIF Presentation manifest of an object (worked without a key); images via https://iiif.europeana.eu/image/….
- `GET https://sparql.europeana.eu/`: SPARQL endpoint over the EDM data; a bare GET redirects to the console at api.europeana.eu/console/sparql/.
- `GET ftp://download.europeana.eu/dataset/{XML|TTL}/{dataset}.zip`: Full dataset as ZIP (RDF/XML or Turtle), regenerated every Sunday evening; anonymous FTP.

### Parameters
- `query`: Search term(s), with field search (who:, what:, when:, where:, title:) and Lucene syntax. (from the description)
- `qf`: Refinement, repeatable: qf=where:Amsterdam, qf=TYPE:IMAGE, qf=YEAR:[1600 TO 1700]; filter fields include COUNTRY, DATA_PROVIDER, PROVIDER, RIGHTS, LANGUAGE, MIME_TYPE, IMAGE_SIZE. (from the description)
- `reusability`: open, restricted or permission (by rights statement). (from the description)
- `media / thumbnail / landingpage`: Only records with a reachable media file, a thumbnail or a working link to the institution. (from the description)
- `theme`: Thematic collection: art, newspaper, photography, map, ww1 … (from the description)
- `profile`: Richness of the response: minimal, standard, rich, facets, params … (from the description)
- `facet`: Facets besides DEFAULT, e.g. facet=LANGUAGE&profile=facets&rows=0 for counts only. (from the description)
- `rows`: Results per request, max 100 (default 12). (from the description)
- `start`: Offset (first = 1); start + rows at most 1,000. (from the description)
- `cursor`: cursor=* for deep paging; follow nextCursor. Not together with start. (from the description)
- `sort`: score, timestamp_created, timestamp_update, europeana_id, COMPLETENESS …, with +asc/+desc; also random or random_SEED. (from the description)
- `X-Api-Key`: The key (preferred); wskey= in the URL is deprecated. (from the description)

### Fields in the Search response (according to the documentation) (10)
`totalResults` getal, `items[].id` tekst, `items[].title / dcCreator` lijst, `items[].type` tekst, `items[].country / edmDataProvider / provider` lijst, `items[].year` lijst, `items[].rights` lijst, `items[].edmPreview / edmIsShownBy / edmIsShownAt` url, `nextCursor` tekst, `facets[]` lijst

### Limits and pitfalls
- Personal keys: limits were reduced step by step until April 2026; project keys have higher limits. When exceeded HTTP 429. (from the description)
- Search: max 100 per request; basic paging only over the first 1,000 results, beyond that cursor. (from the description)
- OAI-PMH: 300 identifiers per page; the resumptionToken is valid for one day. (tested)
- We have no key and do not call the Search and Record APIs; their description comes from the documentation. The example goes through the OAI-PMH service, which answers without a key. (tested)
- pro.europeana.eu returned 403 to our honest User-Agent; not circumvented. The documentation is also on europeana.atlassian.net/wiki (robots.txt allows /wiki/). api.europeana.eu has no robots.txt (redirect to an HTML page). (tested)
- Europeana keeps no register of deleted records (OAI-PMH deletedRecord=no): re-harvest at least every six months. (from the description)
- The Rijksmuseum is set 90402 with 337,641 records, against 841,378 objects in its own API: Europeana does not have everything. An object id looks like http://data.europeana.eu/item/90402/AK_BR_325. (tested)

### Example
```
https://api.europeana.eu/oai/record?verb=GetRecord&metadataPrefix=edm&identifier=http://data.europeana.eu/item/90402/AK_BR_325
```

## How to fetch it

### curl
```bash
curl "https://api.europeana.eu/record/v2/search.json?wskey=JOUW_SLEUTEL&query=Rembrandt&reusability=open&rows=10"
```

### python
```python
import requests

r = requests.get("https://api.europeana.eu/record/v2/search.json",
                 params={"wskey": "JOUW_SLEUTEL", "query": "Rembrandt", "reusability": "open", "rows": 10})
d = r.json()
print(d.get("totalResults"))
for item in d.get("items", []):
    print(item.get("id"), item.get("title"))
```


## Examples with real figures (1)

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

- **Rijksmuseum objects with and without a digital image (figures from the Rijksmuseum API): with an image is the largest part, 88% in November 2026** (november 2026). Table search/collection. [Example](https://www.opendataindex.nl/en/voorbeeld/rijksmuseum-met-afbeelding)
  - `https://data.rijksmuseum.nl/search/collection?imageAvailable=true`
  - `https://data.rijksmuseum.nl/search/collection?imageAvailable=false`
