API¶
verAIficATor stellt seine öffentlichen Daten zusätzlich zur HTML-Seite
maschinenlesbar unter /api/v1/ bereit. Alle Pfade in dieser Seite sind
relativ zur Basis-URL der jeweiligen Umgebung
(https://www.veraificator.com/api/v1/… im Pilotbetrieb).
Eine interaktive, automatisch generierte Referenz mit allen Endpunkten,
Parametern und Antwortschemata steht unter GET /api/v1/docs zur
Verfügung. Diese Seite hier beschreibt dieselben Endpunkte in Prosa, mit
Fokus darauf, was die Daten bedeuten und welche Garantien dahinterstehen
— nicht nur ihre Feldnamen.
Drei Vertrauensstufen¶
| Bereich | Authentifizierung | Inhalt |
|---|---|---|
Öffentlich (/api/v1/…) |
keine | ausschließlich aus veröffentlichten Snapshots sowie anonymisierten, plattformweiten Kennzahlen |
Institutionell (/api/v1/institutions/{slug}/…) |
angemeldete Sitzung, mandantengeprüft | private Registerdaten der eigenen Institution — siehe Einsatz in Institutionen |
Administration (/api/v1/admin/…) |
angemeldete Sitzung, Plattform-Administration | zusätzliche Betriebskennzahlen, weiterhin ohne Aufschlüsselung nach Person oder Institution |
Alles unter „Öffentlich" ist bewusst so gebaut, dass es ausschließlich
aus RecordVersion.snapshot und daraus abgeleiteten, ebenfalls
veröffentlichungspflichtigen Zusammenfassungen gespeist wird — derselbe
Baustein, der auch die HTML-Seite und das PDF rendert (siehe Grundsätze). Es gibt keinen Pfad, über den ein privates
Feld eines institutionellen Registereintrags in eine öffentliche
API-Antwort gelangen könnte, weil dieser Teil der API die entsprechenden
Datenmodelle gar nicht importiert.
Öffentliche Endpunkte¶
GET /api/v1/records/{id}¶
Der vollständige, maschinenlesbare Record. Für einen Record mit veröffentlichter Version enthält die Antwort den kompletten Snapshot plus drei zusätzliche Felder:
recordHash— die SHA-256-Prüfsumme genau dieses Snapshots (siehe Versionierung); bewusst neben, nicht innerhalb des Snapshots geführt;versions— die Liste aller veröffentlichten Versionen dieses Records, älteste zuerst (siehe unten);url— die kanonische, absolute Adresse der Record-Seite.
Ob ein Record das Verifiziert-Kennzeichen trägt, ist nicht Teil der API-Antwort (und nicht des Snapshots): Diese Tatsache erscheint ausschließlich auf der HTML-Seite des Records. Wer bestätigt hat, wird nirgends ausgegeben.
Ein Record, dessen Status zwar bereits öffentlich ist (self_declared oder
pending_full_disclosure), der aber noch keine veröffentlichte Version
besitzt, liefert stattdessen eine kurze Platzhalter-Antwort:
{
"recordId": "PILOT-2026-0001",
"status": "pending_full_disclosure",
"schemaVersion": "0.3",
"message": "Full disclosure record is currently being completed."
}
Dieser eine Satz ist bewusst der einzige englische UI-Text der Plattform (siehe Grundsätze).
Eine unbekannte Record-ID und eine existierende, aber nicht-öffentliche ID
(z. B. Status draft) beantwortet dieser und jeder andere öffentliche
Endpunkt identisch mit „nicht gefunden" — die beiden Fälle sind für eine
anonyme Anfrage ununterscheidbar, aus demselben Grund wie bei der
HTML-Seite (siehe Datenschutzmodell).
GET /api/v1/records/{id}/versions¶
Alle veröffentlichten Versionen eines öffentlichen Records, älteste zuerst. Jeder Eintrag:
{
"label": "1.0",
"publishedAt": "2026-09-14T10:00:00+00:00",
"hash": "e823c28da19e1a6bddd66009b7977dc25195da26f4afa745b59afb234a20f782",
"url": "https://www.veraificator.com/r/PILOT-2026-0002/v/1.0"
}
GET /api/v1/records/{id}/versions/{label}¶
Der Snapshot einer bestimmten Version (z. B. 1.0), zusammen mit ihrem
recordHash — unabhängig davon, ob diese Version noch die aktuelle ist.
Da veröffentlichte Versionen unveränderlich sind (siehe Versionierung), bleibt diese Antwort für ein gegebenes
{id}/{label}-Paar für alle Zeit identisch.
GET /api/v1/records/{id}/jsonld¶
Dieselben Daten als JSON-LD, auf Basis von
schema.org, mit Content-Type: application/ld+json. Nützlich für Systeme,
die strukturierte Daten generisch weiterverarbeiten, ohne das
verAIficATor-eigene Schema zu kennen. Die HTML-Seite selbst verlinkt auf dieses
Dokument, statt es einzubetten (Details dazu in Sicherheit).
GET /api/v1/stats¶
Anonymisierte, plattformweite Kennzahlen — nichts davon lässt sich auf eine einzelne Person, einen einzelnen Record oder eine einzelne Institution zurückführen:
{
"records": {"total": 2, "published": 1, "pending": 1, "withdrawn": 0},
"workTypes": {"projektarbeit": 1},
"contributionLevels": {"A0": 0, "A1": 2, "A2": 1, "A3": 2, "A4": 1},
"verificationLevels": {"V0": 0, "V1": 2, "V2": 4, "V3": 0},
"researchCriticalAI": {"yes": 1, "no": 0},
"authorEvaluations": 0,
"externalEvaluations": 0,
"effortDistribution": {},
"reuse": {},
"evaluatorWelcome": {}
}
(Echte Antwort vom Stand dieser Dokumentation; die Zahlen wachsen mit dem
Pilot.) records zählt Records nach ihrem aktuellen Status; alle übrigen
Felder zählen Angaben aus den Snapshots der jeweils aktuellen Version bzw.
aus Evaluationsantworten, aggregiert über alle Records. Ein Antwortwert
taucht in workTypes, effortDistribution, reuse und evaluatorWelcome
nur auf, wenn ihn mindestens eine Person tatsächlich gewählt hat — eine
fehlende Kategorie bedeutet „bisher niemand", nicht „0 %".
GET /api/v1/schema¶
Die festen Vokabulare, die zum Interpretieren eines Records nötig sind, ohne sie aus Beispieldaten erraten zu müssen:
{
"disclosureSchemaVersion": "0.3",
"evaluationSchemaVersion": "0.1",
"platformVersion": "0.3.1",
"statusVocabulary": {
"draft": "Entwurf",
"self_declared": "Self-Declared",
"pending_full_disclosure": "Self-Declared / Pending Full Disclosure",
"published": "Published",
"amended": "Amended",
"withdrawn": "Withdrawn"
},
"contributionLevels": {
"A0": "A0 – None",
"A1": "A1 – Technical / Editorial Assistance",
"A2": "A2 – Advisory Assistance",
"A3": "A3 – Co-Productive Assistance",
"A4": "A4 – Delegated Task"
},
"verificationLevels": {
"V0": "V0 – No documented verification",
"V1": "V1 – Plausibility Review",
"V2": "V2 – Source / Data Verification",
"V3": "V3 – Independent Verification"
}
}
GET /api/v1/docs¶
Die interaktive, automatisch aus den API-Definitionen erzeugte Dokumentation (OpenAPI). Sie ist immer aktuell zum tatsächlich ausgelieferten Code, da sie aus demselben Quelltext entsteht, der auch die Endpunkte implementiert.
Institutionelle Endpunkte¶
Nur nach Anmeldung und ausschließlich für die eigene Institution erreichbar (siehe Einsatz in Institutionen für das Mandantenmodell):
GET /api/v1/institutions/{slug}/records— paginierte, private Registerliste der Institution (Name, Matrikelnummer, Studiengang, Semester, Modul, Kohorte, betreuende Person, interne Referenz u. a.).GET /api/v1/institutions/{slug}/records.csv— dieselbe, aktuell gefilterte Liste als CSV-Download — das programmatische Gegenstück zum CSV-Export im institutionellen Bereich.
Eine unbekannte oder fremde slug beantwortet auch diese Endpunkte mit
„nicht gefunden" statt „kein Zugriff" — dieselbe Regel wie beim
HTML-Bereich.
Administrationsendpunkt¶
GET /api/v1/admin/stats liefert alles aus /stats, ergänzt um
Betriebskennzahlen (Nutzer:innen- und Institutionenzahl, offene
Evaluationen, Verbesserungsvorschläge nach Status) — weiterhin ohne
Aufschlüsselung nach Person oder Institution. Nur für die
Plattform-Administration; jede andere anfragende Person erhält hier
ausdrücklich „kein Zugriff" (nicht „nicht gefunden") — die Existenz dieses
Endpunkts ist kein Geheimnis, im Unterschied zu einem institutionellen
Mandanten-Namen.
Caching und Stabilität¶
Öffentliche Antworten sind kurz cachebar (aktuell 60 Sekunden) und damit für
den Einbau in andere Systeme (Bibliothekskataloge, institutionelle
Dashboards, Repositorien) geeignet, ohne bei jedem Aufruf eine neue Anfrage
gegen die Plattform auszulösen. Das Schema einer bereits veröffentlichten
Version ändert sich nie rückwirkend (siehe Versionierung); künftige Schema-Änderungen erhöhen die
disclosureSchemaVersion, ohne bestehende Versionen zu berühren.