OAI-PMH (Open Archives Initiative Protocol for Metadata Harvesting) ist ein einfaches, weit verbreitetes Protokoll für den Austausch von Metadaten zwischen Repositorien. Ein Data Provider stellt seine Metadaten über einen einzigen HTTP-Endpunkt zur Verfügung; ein Service Provider (Harvester) ruft diese Metadaten ab und verarbeitet sie weiter — etwa für Suchportale, Aggregatoren oder Langzeitarchivierung.

Das Protokoll wurde 1999 initiiert und liegt seit 2002 in Version 2.0 vor. Trotz seines Alters ist OAI-PMH in Bibliotheken, Archiven und Forschungs-Repositorien Standard — nicht zuletzt, weil es so schlank ist: HTTP GET (oder POST) mit Query-Parametern, XML als Antwort, sechs definierte Verben.

Die sechs Verben

Die gesamte Protokoll-Oberfläche besteht aus sechs Verben (verb=…-Parameter):

  • Identify — Eckdaten des Repositoriums (Name, Basis-URL, Granularität, Admin-Kontakt, frühester DateStamp).
  • ListMetadataFormats — welche Metadaten-Schemata werden angeboten (oai_dc, mods, marc21, mets, tei …).
  • ListSets — die hierarchische Set-Struktur des Repositoriums; Sets erlauben thematische Filter beim Harvesting.
  • ListIdentifiers — nur die Header (Identifier, DateStamp, Set-Zugehörigkeit) der Records einer Selektion.
  • ListRecords — Header + vollständige Metadaten der Records einer Selektion.
  • GetRecord — ein einzelner Record per Identifier und Metadaten-Format.

Anfrage-Beispiel

GET /oai?verb=ListRecords
        &metadataPrefix=oai_dc
        &set=archive:einsiedeln
        &from=2024-01-01
        &until=2024-12-31

Verpflichtendes Minimum: oai_dc

Jeder OAI-PMH-konforme Endpunkt muss mindestens das Format oai_dc anbieten — Dublin Core (15 unqualifizierte Elemente: title, creator, subject, description, publisher, contributor, date, type, format, identifier, source, language, relation, coverage, rights). Optional dürfen weitere, reichere Schemata bereitgestellt werden — typisch METS, MODS, MARCXML, EAD, TEI, qualified Dublin Core.

Resumption Tokens

Grosse Ergebnislisten werden über Resumption Tokens paginiert. Die erste Antwort enthält am Ende ein <resumptionToken>…</resumptionToken>; die nächste Anfrage liefert den Token zurück:

GET /oai?verb=ListRecords&resumptionToken=abc123

Tokens sind opak (ihre Struktur wird vom Server bestimmt) und haben in der Regel eine begrenzte Lebensdauer.

DateStamps und Granularität

Records sind mit einem DateStamp versehen, an dem das Repositorium den letzten relevanten Update vermerkt. Zwei Granularitäten sind möglich:

  • YYYY-MM-DD — Tagesgenauigkeit (Default)
  • YYYY-MM-DDThh:mm:ssZ — Sekundengenauigkeit (UTC)

Welche das Repositorium nutzt, wird in der Identify-Antwort als <granularity> angegeben. Harvester können dann inkrementell harvesten (from/until).

Selektive Harvesting-Strategien

  • Initial-Harvest: ListRecords ohne from-Beschränkung — kann Stunden dauern.
  • Inkrementell: from = letzter Harvest-Zeitpunkt (DateStamp).
  • Set-basiert: mit set=… nur einen thematischen Ausschnitt holen.
  • Header-only: ListIdentifiers erst, danach gezielte GetRecord-Aufrufe — nützlich, wenn nur ein Bruchteil der Records überhaupt benötigt wird.

Fehlerbehandlung

OAI-PMH definiert ein eigenes Set von Fehler-Codes im <error>-Element:

  • badArgument, badResumptionToken, badVerb
  • cannotDisseminateFormat — angefordertes Format wird nicht unterstützt
  • idDoesNotExist, noRecordsMatch, noMetadataFormats, noSetHierarchy

HTTP-Statuscodes bleiben in der Regel 200 OK — die eigentliche Fehlermeldung steckt im XML.

Werkzeuge

  • OAI-PMH Validator — offizielle Web-Validierung unter validator.oaipmh.com.
  • PyOAI / sickle (Python) — verbreitete Harvester-Libraries für eigene Pipelines.
  • VuFind, DSpace, Fedora, TYPO3 — gängige Repositorien mit eingebauter OAI-PMH-Schnittstelle.

Aus unserer Praxis

Wir haben einen Laravel-nativen OAI-PMH-2.0-Server aus Anton extrahiert und als eigenständiges Open-Source-Paket veröffentlicht. Es bringt Verb-Dispatching, Resumption-Tokens, Blade-Views und einen austauschbaren Repository-Vertrag mit, sodass es sich an jede Laravel-Datenquelle anschliessen lässt. Siehe oai-pmh in unseren Open-Source-Paketen.