Zusammenfassung

Das MOOChub Metadatenprofil ist ein unter der MIT-Lizenz veröffentlichtes, bildungsbereichübergreifendes Metadatenprofil für die interoperable Beschreibung von Lernangeboten, Kursen, Bildungsprogrammen und zugehörigen Lernressourcen. Das Profil verwendet [[?JSON-LD 1.1]] und [[?JSON Schema Draft 2020-12]]. Es ist mit dem [[?AMB]] (Allgemeines Metadatenprofil für Bildungsressourcen) kompatibel und erweitert dieses um detailliertere Angaben mit Fokus auf Kurse sowie um Profile für Bildungsprogramme und erwerbbare Bildungsnachweise. Die fachlichen Begriffe stammen vorwiegend aus [[?schema.org]] und dem AMB-Profil, ergänzt um [[?SKOS]]-Konzepte, europäische Vokabulare für Credential-Kategorien und europäische Semantik für Learning Outcomes aus dem europäischen Learning-Outcome-Vokabular sowie MOOChub-spezifische Einschränkungen. Der Katalogtransport verwendet eine paginierte [[?JSON:API]]-Struktur. Ein Provider kann verschiedene unabhängig harvestbare Ressourcentypen in einem gemeinsamen Feed anbieten, ohne die fachlichen Objekte in ein proprietäres Format zu übersetzen.

Einleitung

[[?MOOChub]] ist der Zusammenschluss verschiedener MOOC-Portale, Betreiber von Online-Lernplattformen, Hochschulen und hochschulnahen Verbänden. Ziel ist es, Synergien in der Online-Lehre zu nutzen und gemeinsame Standards zu entwickeln. Der Schwerpunkt liegt zunächst auf dem deutschsprachigen Hochschulraum; der Austausch mit internationalen Partnern soll Bildung über Hochschul- und Landesgrenzen hinweg zugänglich machen. MOOChub bietet Lernenden eine zentrale Anlaufstelle für MOOCs und weitere digitale Bildungsangebote. Das vorliegende Profil beschreibt die maschinenlesbaren Metadaten, mit denen beteiligte Anbieter Informationen über Lernangebote, Kurse und Bildungsprogramme über offene Schnittstellen austauschen können. Das MOOChub-Profil ist darauf ausgerichtet, mit AMB kompatibel zu bleiben und zugleich detailliertere Informationen für Lernangebote und Kurse bereitzustellen. Zusätzlich beschreibt es Bildungsprogramme und erwerbbare Bildungsnachweise. Das Profil ist auf einen kleinen, verlässlich austauschbaren Kern ausgerichtet: Die Pflichtangaben ermöglichen das Auffinden und Einordnen eines Kurses oder Programms, während optionale Angaben detaillierte Suche, Darstellung und die Weiterleitung zu den Angeboten unterstützen. Für Nachweis-Kategorien und Lernergebnisse nutzt das Profil ergänzend europäische Vokabulare und Semantik. Die normativen JSON Schemas sind beispielsweise im Kurs-Schema, Programm-Schema und Katalog-Schema verlinkt. Beispiele sind Bestandteil der Entwicklung und zeigen typische gültige und ungültige Dokumente.

Versionsstatus

Dieses Dokument beschreibt den veröffentlichten MOOChub-v4-Stand 4.0.0. Die in den Schemas verwendeten URLs enthalten deshalb den Pfad `4.0.0`. Änderungen an Pflichtfeldern, Wertebereichen oder der JSON-LD-Semantik werden als neue Version veröffentlicht. Die Aushandlung paralleler API-Versionen und die Abkündigungsphase sind in API-Versionierung beschrieben.

Konformität

Ein Dokument ist MOOChub-v4-konform, wenn es das passende Root-Schema ohne Validierungsfehler erfüllt und die JSON-LD-Regeln dieses Profils einhält. Provider MÜSSEN die Pflichtangaben liefern. Clients MÜSSEN optionale Angaben und unbekannte Erweiterungen robust behandeln.

API-Versionierung

API-Versionen MÜSSEN abwärtskompatibel weiterentwickelt werden. Ist eine inkompatible Änderung erforderlich, MÜSSEN die alte und die neue Version für eine Übergangszeit parallel angeboten werden. Die Version bezieht sich auf das API- und Transportformat, nicht auf die fachliche Identität einer JSON-LD-Ressource.

Versionsaushandlung

Clients SOLLTEN bei jeder Anfrage die höchste API-Hauptversion angeben, gegen die sie implementiert wurden. Dazu setzen sie den Parameter moochub-version im Accept-Header. Der Parameter wird zusammen mit dem JSON:API-Medientyp verwendet:

GET /api/catalog HTTP/1.1
Host: provider.example
Accept: application/vnd.api+json; moochub-version=4

Der Provider MUSS die tatsächlich ausgelieferte Version im Content-Type-Header der Antwort mit demselben Parameter bestätigen. Fehlt der Versionsparameter in der Anfrage, darf der Provider die neueste unterstützte Version des Endpunkts verwenden. Ein Provider MUSS eine angeforderte Version entweder bedienen oder mit 406 Not Acceptable ablehnen; er darf eine nicht unterstützte Version nicht stillschweigend als eine andere Version ausliefern. Die Antwort SOLLTE Vary: Accept enthalten.

HTTP/1.1 200 OK
Content-Type: application/vnd.api+json; moochub-version=4
Vary: Accept

Sunset-Phase

Während einer Sunset-Phase MÜSSEN Provider die bisherige und die neue API-Version parallel akzeptieren, sofern beide Versionen für den jeweiligen Endpunkt angekündigt sind. Jede Antwort MUSS erkennen lassen, welche Version tatsächlich ausgeliefert wurde. Clients MÜSSEN weiterhin ihre unterstützte Version anfordern und dürfen aus der Existenz einer neuen Version nicht auf einen Formatwechsel innerhalb ihrer Antwort schließen.

Für eine veraltete oder zur Abkündigung vorgesehene Version MUSS der Provider den HTTP-Header Sunset nach [[?RFC8594]] mitsenden. Sein Wert ist ein HTTP-Datum und bezeichnet den Zeitpunkt, ab dem die betreffende Version nicht mehr unterstützt wird:

HTTP/1.1 200 OK
Content-Type: application/vnd.api+json; moochub-version=3.8
Sunset: Tue, 15 Aug 2027 00:00:00 GMT
Vary: Accept

Der Sunset-Zeitpunkt MUSS vor Beginn der Abkündigung kommuniziert werden. Clients MÜSSEN das Vorhandensein und den Wert von Sunset überwachen und ihre Migration vor diesem Zeitpunkt planen. Nach Ablauf des Zeitpunkts darf der Provider die alte Version ablehnen; eine solche Ablehnung SOLLTE mit 410 Gone oder, wenn die Version am Endpunkt nicht mehr verfügbar ist, mit 406 Not Acceptable erfolgen. Die konkrete Abschaltung MUSS den betroffenen Teilnehmern vorher angekündigt werden.

Client-Verhalten

Ein Client, der sowohl v3 als auch v4 unterstützt, MUSS für jede Anfrage genau die gewünschte Version angeben und die bestätigte Version aus Content-Type prüfen. Ein Client, der nur v3 unterstützt, fordert moochub-version=3 an und verarbeitet eine Sunset-Angabe als Migrationssignal. Nach erfolgreicher Migration fordert er moochub-version=4 an und prüft erneut, dass der Provider diese Version bestätigt.

Datenformat und JSON-LD

MOOChub-Objekte werden als JSON-Dokumente übertragen. Die optionale `@context`-Eigenschaft kann die JSON-LD-Bedeutung eines Objekts beschreiben. In JSON:API-Attributen und eingebetteten Objekten ist sie nicht erforderlich. Ein eigenständig veröffentlichtes JSON-LD-Dokument SOLLTE eine kompatible MOOChub-Kontextdefinition am Dokumentanfang enthalten:
{
  "@context": [
    "https://w3id.org/moochub/4.0.0/context.jsonld",
    { "@language": "de" }
  ]
}
Das Sprachobjekt legt die Standardsprache für lokalisierte Werte fest. Explizite Sprachkarten wie `{ "de": "...", "en": "..." }` bleiben für lokalisierte Plain-Text-Felder zulässig. Sprachcodes MÜSSEN BCP-47-kompatibel sein. `id` ist die JSON-LD-Identität und MUSS eine URI sein. `url` bezeichnet die öffentlich erreichbare Darstellungs- oder Angebotsseite. Diese Werte sind nicht automatisch identisch.

Datenmodell

Die folgenden Abschnitte definieren die Objektarten des MOOChub-v4-Profils. Ein Objekt wird durch seinen JSON-LD-Typ bestimmt und kann über Eigenschaften mit anderen Objektarten verbunden werden. Zum Beispiel verweist ein Kurs mittels creator auf ein Person- oder Organization-Objekt.

Course

Ein Course-Objekt ist eine einzelne Lernressource. Die Eigenschaften beschreiben Identität, Darstellung, fachlichen Inhalt und konkrete Kursangebote. Verschachtelte Objekte wie Medien, Angebote oder Kursinstanzen haben eigene Strukturen, die in der Property-Referenz und den verlinkten Schemas erläutert werden.
Eigenschaft Pflichtfeld Typ Hinweis
@context ja array[string|object] JSON-LD-Kontext.
type ja ["LearningResource", "Course"]
id ja ID URI der fachlichen Identität.
url ja string (URL) Öffentlich erreichbare Kursseite.
name ja LocalizedString Name des Kurses
publisher ja Organization|Person Veröffentlichende oder anbietende Organisation oder Person.
creator ja Organization|Person Erstellende Personen oder Organisationen.
license ja License Rechteangabe.
courseCode nein string Vom Anbieter vergebener Kurscode.
abstract nein LocalizedString Kurzbeschreibung als Plain Text.
description nein RichText Ausführliche Beschreibung, mehrsprachig und formatiert.
keywords nein array[string] Schlagworte, Tags oder Stichworte, die den Kurs beschreiben und bei der Suche oder Kategorisierung helfen.
inLanguage nein array[string] Sprachen, in denen der Kurs angeboten wird. Die Werte MÜSSEN BCP-47-kompatibel sein.
timeRequired nein ISO 8601 duration Geschätzter Zeitaufwand (Workload), der aktiv für die Bearbeitung des Kurses benötigt wird.
numberOfCredits nein number Anzahl der Leistungspunkte (Credits) als ECTS, die für den Kurs vergeben werden.
interactivityType nein array[InteractivityType] Vorherschende Lehr-/Lernformen, z. B. "active", "expositive" oder "mixed".
isAccessibleForFree nein boolean Gibt an, ob der Kurs frei zugänglich ist.
conditionsOfAccess nein AccessConditionType Zugangsbedingung, ob der Kurs eine Anmeldung benötigt oder ohne zugänglich ist.
accessMode nein array[AccessMode] Sensorische oder kognitive Zugangsmodi der Lerninhalte, z. B. "auditory", "tactile", "textual" oder "visual".
image nein ImageObject Ein Bild, das den Kurs repräsentiert, z. B. ein Titelbild oder Logo.
trailer nein Trailer Ein kurzer Video- oder Audiotrailer, der den Kurs vorstellt.
contributor nein array[Organization|Person] Personen oder Organisationen, die zum Kurs beigetragen haben, z. B. als Gastdozenten.
funder nein array[Organization|Person] Organisationen oder Personen, die den Kurs finanziert haben.
audience nein Audience Zielgruppe des Kurses, z. B. Studierende, Lehrkräfte oder Fachleute.
coursePrerequisites nein RichText Beschreibung der Vorraussetzungen, die für die Teilnahme am Kurs erforderlich sind.
prerequisiteCourses nein array[Course] Liste von Kursen, die als Voraussetzung für diesen Kurs gelten.
competencyRequired nein array[Competency] Liste von Kompetenzen, die für die Teilnahme am Kurs erforderlich sind.
learningOutcomeSummary nein RichText Zusammenfassung der Lernziele, die durch den Kurs erreicht werden sollen.
teaches nein array[Competency] Liste von Kompetenzen, die durch den Kurs vermittelt werden.
assesses nein array[Competency] Liste von Kompetenzen, die durch den Kurs bewertet werden.
educationalLevel nein array[EducationalLevel] Bildungsstufe des Kurses.
educationalAlignment nein array[EducationalAlignment] Zuordnung zu einem bildungstechnischen Klassifikationsstandard, z.B. ISCED-F, OEFOS, Hochschulfächersystematik oder Schulfächerliste.
hasCourseInstance nein array[CourseInstance] Liste von konkreten Kursdurchführungen
educationalCredentialAwarded nein array[EducationalOccupationalCredential] Liste von Bildungsnachweisen, die nach erfolgreichem Abschluss des Kurses vergeben werden.
isBasedOn nein array[LearningItem] Liste von Lernressourcen, auf denen der Kurs basiert.
isPartOf nein array[ProgramReference|CourseReference] Liste von Programmen oder Kursen, zu denen der Kurs gehört.
hasPart nein array[LearningItem|CourseReference] Liste von Lernressourcen oder Kursen, die Teil des Kurses sind.
aggregateRating nein AggregateRating Aggregierte Bewertung des Kurses.
dateCreated nein ISO 8601 date-time Datum und Uhrzeit der Erstellung des Kursobjekts.
datePublished nein ISO 8601 date-time Datum und Uhrzeit der Veröffentlichung des Kurses.
dateModified nein ISO 8601 date-time Datum und Uhrzeit der letzten Änderung des Kursobjekts.
expires nein ISO 8601 date-time Datum und Uhrzeit, an dem der Kurs nicht mehr verfügbar ist.
{
  "@context": [
    "https://w3id.org/moochub/4.0.0/context.jsonld",
    { "@language": "de" }
  ],
  "type": ["LearningResource", "Course"],
  "id": "https://example.org/courses/python",
  "url": "https://example.org/courses/python",
  "name": { "de": "Einführung in Python" },
  "publisher": { "type": "Organization", "name": "Beispiel-Universität" },
  "creator": [{ "type": "Person", "name": "Beispielperson" }],
  "license": { "type": "License", "id": "https://creativecommons.org/licenses/by/4.0/", "identifier": "CC-BY-4.0" },
  "courseCode": "PY101",
  "abstract": { "de": "Ein kurzer Überblick über die Grundlagen der Programmiersprache Python." },
  "description": [ "..." ],
  "keywords": ["Python", "Programmierung", "Einführung"],
  "inLanguage": ["de", "en"],
  "timeRequired": "P20H",
  "numberOfCredits": 5,
  "interactivityType": { "..." },
  "isAccessibleForFree": true,
  "conditionsOfAccess": { "..." },
  "accessMode": [ "auditory", "textual", "visual" ],
  "image": { "..." },
  "trailer": { "..." },
  "contributor": [ "..." ],
  "funder": [ "..." ],
  "audience": { "..." },
  "coursePrerequisites": [ "..." ],
  "prerequisiteCourses": [ "..." ],
  "competencyRequired": [ "..." ],
  "learningOutcomeSummary": [ "..." ],
  "teaches": [ "..." ],
  "assesses": [ "..." ],
  "educationalLevel": [ "..." ],
  "educationalAlignment": [ "..." ],
  "hasCourseInstance": [ "..." ],
  "educationalCredentialAwarded": [ "..." ],
  "isBasedOn": [ "..." ],
  "isPartOf": [ "..." ],
  "hasPart": [ "..." ],
  "aggregateRating": { "..." },
  "dateCreated": "2024-01-15T10:00:00Z",
  "datePublished": "2024-02-01T12:00:00Z",
  "dateModified": "2024-03-01T14:30:00Z",
  "expires": "2025-01-01T00:00:00Z"
}
    

CourseReference

Ein CourseReference verweist kompakt auf einen bereits beschriebenen Kurs.

Eigenschaft Pflichtfeld Typ Hinweis
type ja ["LearningResource", "Course"]
id ja ID Identifikation des referenzierten Kurses.
name ja LocalizedString Name des Kurses.
{
  "id": "https://example.org/courses/python",
  "type": ["LearningResource", "Course"],
  "name": {
    "de": "Einführung in Python",
    "en": "Introduction to Python"
  }
}
        
Referenzen
Course (hasPart, isPartOf)
Validierung
JSON Schema: courseReference.json

CourseInstance

Eine CourseInstance beschreibt eine konkrete Durchführung oder Angebotsform eines Kurses.
Eigenschaft Pflichtfeld Typ Hinweis
type ja "CourseInstance"
id ja ID URI der Kursinstanz
name nein LocalizedString Name der Kursinstanz
courseMode nein array[LearningMode] Arten der Bereitstellung oder Durchführung des Kurses
maximumAttendeeCapacity nein integer Maximale Teilnehmerzahl
subEvent nein array[CourseEvent] Liste von Einzelterminen oder Phasen innerhalb der Kursdurchführung
courseSchedule nein array[Schedule] Liste von wiederkehrenden Terminen innerhalb der Kursdurchführung
startDate nein RFC 3339 date-time Beginn der Kursdurchführung
endDate nein RFC 3339 date-time Ende der Kursdurchführung
duration nein ISO 8601 duration Dauer der Kursdurchführung
applicationStartDate nein RFC 3339 date-time Beginn der Bewerbungsphase
applicationDeadline nein RFC 3339 date-time Fristende der Bewerbungsphase
location nein Location Physischer oder virtueller Ort der Kursdurchführung
instructor nein array[Person] Liste von Personen, die den Kurs betreuen
offers nein array[Offer] Liste von Angeboten mit Preisen und Zugangsbedingungen
"hasCourseInstance": [{
  "type": "CourseInstance",
  "id": "https://example.org/courses/python/summer-2026",
  "courseMode": ["onsite", "synchronous"],
  "startDate": "2026-03-01T00:00:00Z",
  "endDate": "2026-07-31T23:59:59Z",
  "duration": "P5M",
  "applicationStartDate": "2026-01-01T00:00:00Z",
  "applicationDeadline": "2026-02-15T23:59:59Z",
  "courseSchedule": [ "..." ],
  "location": [ "..." ],
  "instructor": [ "..." ]
}]
      
"hasCourseInstance": [{
  "type": "CourseInstance",
  "id": "https://example.org/courses/python/certification-2026",
  "courseMode": ["online", "synchronous"],
  "subEvent": [
    {
      "type": "Event",
      "name": {
        "de": "Prüfungsvorbereitung"
      },
      "eventSchedule": [ "..." ],
      "location": [ "..." ],
      "instructor": [ "..." ]
    },
    {
      "type": "Event",
      "name": {
        "de": "Prüfung"
      },
      "startDate": "2026-06-15T10:00:00Z",
      "endDate": "2026-06-15T12:00:00Z",
      "location":  [ "..." ],
      "instructor": [ "..." ]
    }
  ],
  "maximumAttendeeCapacity": 30,
  "offers": [ "..." ]
}]
      
Referenzen
LearningItem (hasCourseInstance)
Validierung
JSON Schema: courseInstance.json

CourseEvent

Ein CourseEvent beschreibt einen einzelnen Termin oder eine Phase innerhalb einer Kursinstanz.
Eigenschaft Pflichtfeld Typ Hinweis
type ja "Event"
name nein LocalizedString Name des Termins oder der Phase
startDate Ja, wenn eventSchedule nicht angegeben ist RFC 3339 date-time Startdatum und -uhrzeit des Termins oder der Phase
endDate Ja, wenn eventSchedule nicht angegeben ist RFC 3339 date-time Enddatum und -uhrzeit des Termins oder der Phase
eventSchedule Ja, wenn startDate und endDate nicht angegeben sind schedule wiederkehrender Terminplan für den Termin oder die Phase
location nein Location Physischer oder virtueller Ort des Termins oder der Phase
instructor nein array[Person] Liste von Personen, die den Termin oder die Phase betreuen
{
  "type": "Event",
  "name": {
    "de": "Prüfung"
  },
  "startDate": "2026-06-15T10:00:00Z",
  "endDate": "2026-06-15T12:00:00Z",
  "location": [ "..." ],
  "instructor": [ "..." ]
}
      
{
  "type": "Event",
  "name": {
    "de": "Labor Praktikum"
  },
  "eventSchedule": [ "..." ],
  "location": [ "..." ],
  "instructor": [ "..." ]
}
      
Referenzen
CourseInstance (subEvent)
Validierung
JSON Schema: courseEvent.json

LearningItem

Ein LearningItem beschreibt eine einzelne Lernressource innerhalb eines Kurses.

Eigenschaft Pflichtfeld Typ Hinweis
type ja array[string] Konkrete Art der Lernressource. Erlaubte Werte sind Subklassen von https://schema.org/CreativeWork. MUSS immer "LearningResource" enthalten. z. B. ["LearningResource", "VideoObject"].
id ja ID Eindeutige Identifikation der Lernressource.
name ja LocalizedString Name der Lernressource.
description nein RichText Beschreibung der Lernressource.
timeRequired nein ISO 8601 duration Für die Bearbeitung erforderliche Zeit.
competencyRequired nein array[Competency] Kompetenzen, die für die Bearbeitung der Lernressource erforderlich sind.
teaches nein array[Competency] Kompetenzen, die durch die Bearbeitung der Lernressource vermittelt werden.
assesses nein array[Competency] Kompetenzen, die durch die Bearbeitung der Lernressource überprüft werden.
license nein License Lizenz der Lernressource.
creator nein array[Person|Organization] Urheber der Lernressource.
publisher nein array[Person|Organization] Herausgeber der Lernressource.
Referenzen
Course (isBasedOn, hasPart)
Validierung
JSON Schema: learningItem.json

EducationalOccupationalProgram

Ein EducationalOccupationalProgram-Objekt ist ein Paket von Kursen. Neben Identität und Darstellung beschreibt es den Anbieter, die enthaltenen Kurse und optionale Angaben zu Organisation, Umfang, Bewerbung und Abschluss.
Eigenschaft Pflichtfeld Typ Hinweis
@context nein array[string|object] JSON-LD-Kontext
type ja "EducationalOccupationalProgram"
id ja ID URI der fachlichen Identität des Programms
url ja string (URL) Öffentlich erreichbare Programmseite
name ja LocalizedString Name des Programms
abstract nein LocalizedString Kurzbeschreibung des Programms
description nein RichText Ausführliche Beschreibung des Programms
inLanguage nein array[string] Liste der Sprachen, in denen das Programm angeboten wird als BCP 47 Sprachcode, z. B. ["de", "en"]
educationalProgramMode nein array[LearningMode] Arten der Bereitstellung oder Durchführung des Programms
timeToComplete nein ISO 8601 duration Aktiver Zeitaufwand, der für die Bearbeitung des Programms erforderlich ist
numberOfCredits nein number Anzahl der Leistungspunkte in ECTS, die für das Programm vergeben werden
programPrerequisites nein RichText Voraussetzungen für die Teilnahme am Programm
educationalLevel nein array[EducationalLevel] Bildungsstufe des Programms
educationalAlignment nein array[EducationalAlignment] Zuordnung zu einem bildungstechnischen Klassifikationsstandard, z.B. ISCED-F, OEFOS, Hochschulfächersystematik oder Schulfächerliste
applicationStartDate nein RFC 3339 date-time Beginn der Bewerbungsphase
applicationDeadline nein RFC 3339 date-time Fristende der Bewerbungsphase
image nein ImageObject Bild oder Logo des Programms
provider ja Organization|Person Anbietende Organisation oder Person
hasPart ja array[ProgramPart] Modulbereiche mit Credits und den jeweils enthaltenen Kursen
isPartOf nein array[ProgramReference] Liste von Programmen, zu denen das Programm gehört
educationalCredentialAwarded nein array[EducationalOccupationalCredential] Liste der verliehenen Abschlüsse
dateModified nein RFC 3339 date-time Zeitpunkt der letzten Änderung der veröffentlichten Programmdaten
{
  "@context": [
    "https://w3id.org/moochub/4.0.0/context.jsonld",
    { "@language": "de" }
  ]
  "type": "EducationalOccupationalProgram",
  "id": "https://example.org/programs/python-bootcamp",
  "url": "https://example.org/programs/python-bootcamp",
  "name": {
    "de": "Python-Bootcamp",
    "en": "Python Bootcamp"
  },
  "provider": {
    "type": "Organization",
    "name": {
      "de": "Beispiel Universität",
      "en": "Example University"
    }
  },
  "hasPart": [
    {
      "name": { "de": "Pflichtbereich" },
      "numberOfCredits": 30,
      "hasCourse": [{
        "type": ["LearningResource", "Course"],
        "id": "https://example.org/courses/python",
        "name": {
          "de": "Einführung in Python",
          "en": "Introduction to Python"
        }
      }]
    },
    {
      "name": { "de": "Wahlbereich" },
      "numberOfCredits": 30,
      "hasCourse": [{
        "type": ["LearningResource", "Course"],
        "id": "https://example.org/courses/python-advanced",
        "name": {
          "de": "Fortgeschrittene Python-Programmierung",
          "en": "Advanced Python Programming"
        }
      }]
    }
  ],
  "abstract": {
    "de": "Ein kompaktes Bootcamp, um die Grundlagen von Python zu erlernen.",
    "en": "A compact bootcamp to learn the basics of Python."
  },
  "description": [{
    "type": "TextObject",
    "text": "# Python-Bootcamp\n\nIn diesem Bootcamp lernen Sie die Grundlagen der Programmiersprache Python...",
    "inLanguage": "de",
    "encodingFormat": "text/markdown"
  }],
  "applicationStartDate": "2026-01-01T00:00:00Z",
  "applicationDeadline": "2026-02-01T23:59:59Z",
  "educationalCredentialAwarded": [{,
    "type": "EducationalOccupationalCredential",
    "id": "https://example.org/credentials/python-bootcamp-certificate",
    "name": {"de": "Urkunde für den Abschluss des Python-Bootcamps"}
  }],
  "educationalProgramMode": ["online", "asynchronous"],
  "timeToComplete": "P2M",
  "numberOfCredits": 5,
  "programPrerequisites": [{
    "type": "TextObject",
    "text": "Für die Teilnahme am Bootcamp sind grundlegende Kenntnisse in Programmierung erforderlich.",
    "inLanguage": "de",
    "encodingFormat": "text/plain"
  }]
}
      
Validierung
JSON Schema: educationalOccupationalProgram.json

ProgramPart

ProgramPart beschreibt einen Modulbereich eines Bildungsprogramms, einschließlich seiner Credit-Anforderung und der zugehörigen Kurse.

Eigenschaft Pflichtfeld Typ Hinweis
name ja LocalizedString Name des Modulbereichs.
description nein RichText Beschreibung des Modulbereichs.
numberOfCredits ja number Anzahl der für den Bereich erforderlichen Credits.
hasCourse ja array[CourseReference] Kurse des Modulbereichs.
  {
    "name": {
      "de": "Pflichtbereich"
    },
    "description": [{ "..." }]
    "numberOfCredits": 30,
    "hasCourse": [{
      "id": "https://example.org/courses/python",
      "type": ["LearningResource", "Course"],
      "name": {
        "de": "Einführung in Python"
      }
    }]
  }
        
Referenzen
EducationalOccupationalProgram (hasPart)
Validierung
JSON Schema: programPart.json

ProgramReference

Ein ProgramReference verweist kompakt auf ein bereits beschriebenes Bildungsprogramm.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "EducationalOccupationalProgram" Typ des Bildungsprogramms.
id ja ID Identifikation des referenzierten Programms.
name ja LocalizedString Name des Programms.
  {
        "type": "EducationalOccupationalProgram",
        "id": "https://example.org/programs/python-bootcamp",
        "name": {
          "de": "Python-Bootcamp",
          "en": "Python Bootcamp"
        }
  }
        
Referenzen
Course (isPartOf)
Validierung
JSON Schema: programReference.json

EducationalOccupationalCredential

Ein EducationalOccupationalCredential beschreibt eine Bildungs- oder Berufsqualifikation.

Eigenschaft Pflichtfeld Typ Hinweis
@context nein array[string|object] JSON-LD-Kontext
type ja "EducationalOccupationalCredential" Fester Typ des Credentials.
id ja ID Identifikation des Credentials.
name ja LocalizedString Name des Credentials.
abstract nein LocalizedString Kurzbeschreibung des Credentials.
description nein RichText Beschreibung des Credentials.
inLanguage nein array[string] Sprachen, in denen das Credential beschrieben oder ausgestellt wird.
credentialCategory nein CredentialCategory Kategorie aus dem europäischen Digital-Credentials-Vokabular.
url nein string (URL) Eine Webseite, auf der das Credential beschrieben ist.
image nein ImageObject Bild des Credentials.
hasPart nein array[CredentialReference] Credentials, die Teil dieses Credentials sind.
isPartOf nein array[CredentialReference] Credentials, von denen dieses Credential Teil ist.
numberOfCredits nein number Anzahl der Leistungspunkte in ECTS, die für das Credential vergeben werden.
competencyRequired nein array[Competency] Kompetenzen, die für den Erwerb des Credentials erforderlich sind.
educationalLevel nein array[EducationalLevel] Bildungsstufe des Credentials.
educationalAlignment nein array[EducationalAlignment] Zuordnung des Credentials zu einem Bildungs- oder Klassifikationsstandard.
isAwardedBy nein array[CourseReference|ProgramReference] Kurse oder Programme, über die dieses Credential vergeben werden kann. Dies sind nicht zwingend die einzigen Erwerbswege.
publisher nein Organization|Person Herausgeber des Credentials.
recognizedBy nein array[Organization] Organisationen, die das Credential anerkennen.
dateModified nein RFC 3339 date-time Zeitpunkt der letzten Änderung der veröffentlichten Credential-Daten.
{
  "type": "EducationalOccupationalCredential",
  "id": "urn:uuid:1f9d2f1d-2d30-4d18-9e0e-12c004a1cf15",
  "name": {
    "de": "Python-Bootcamp-Zertifikat"
  },
  "description": [{
    "type": "TextObject",
    "text": "Dieses Zertifikat bescheinigt, dass die Inhaberin oder der Inhaber erfolgreich am Python-Bootcamp teilgenommen hat und die vermittelten Kompetenzen erworben wurden.",
    "inLanguage": "de",
    "encodingFormat": "text/plain"
  }],
  "competencyRequired": [
    {
      "type": "Competency",
      "id": "urn:uuid:9e7c1b64-c460-4672-b666-cb64dc2d3921",
      "name": {
        "de": "Fähigkeit, einfache Python-Programme zu schreiben und auszuführen"
      },
      "relatedSkill": [ "..." ]
    }
  ],
  "credentialCategory": {
    "type": "Concept",
    "id": "http://data.europa.eu/snb/credential/e34929035b",
    "prefLabel": {
      "de": "Generisch"
    },
    "inScheme": "http://data.europa.eu/snb/credential/25831c2"
  },
  "recognizedBy": [{
    "type": "Organization",
    "name": {
      "de": "Beispiel Universität"
    }
  }],
  "isPartOf": [
    {
      "type": "EducationalOccupationalCredential",
      "id": "urn:uuid:2f9d2f1d-2d30-4d18-9e0e-12c004a1cf15",
      "name": {
        "de": "Microcredential: Skriptprogrammierung"
      }
    }
  ]
}
      
Referenzen
Course (educationalCredentialAwarded), EducationalOccupationalProgram (educationalCredentialAwarded)
Validierung
JSON Schema: educationalOccupationalCredential.json

CredentialReference

Eine CredentialReference verweist kompakt auf ein bereits beschriebenes EducationalOccupationalCredential

Eigenschaft Pflichtfeld Typ Hinweis
type ja "EducationalOccupationalCredential" Fester Typ des Credentials.
id ja ID Identifikation des referenzierten Credentials.
name ja LocalizedString Name des Credentials.
{
  "type": "EducationalOccupationalCredential",
  "id": "urn:uuid:1f9d2f1d-2d30-4d18-9e0e-12c004a1cf15",
  "name": {
    "de": "Python-Bootcamp-Zertifikat"
  }
}
        
Referenzen
EducationalOccupationalCredential (isPartOf, hasPart)
Validierung
JSON Schema: credentialReference.json

ID

Eine URI, die die fachliche Identität der Ressource bezeichnet.

Die Id MUSS eine gültige URI sein. Sie KANN eine HTTPS-URI sein. Sie KANN auch eine nicht aufrufbare URI sein, z. B. ein URN.

"id": "https://example.org/courses/python"
        
"id": "urn:uuid:123e4567-e89b-12d3-a456-426614174000"
        
"id": "urn:moochub:course:python"
        
Typ
string (URI)
Referenzen
Course (id), CourseInstance (id), EducationalOccupationalProgram (id), EducationalOccupationalCredential (id), Person (id), Organization (id), Concept (id)
Validierung
JSON Schema: id.json

LocalizedString

Ein LocalizedString ist ein Objekt, das einen Text in mehreren Sprachen enthalten KANN.

Jede Sprache MUSS durch einen BCP 47-Sprachcode als Property-Name angegeben. Der Wert ist der Text in dieser Sprache.

{
  "de": "Dies ist ein Text auf Deutsch.",
  "en": "This is a text in English."
}
      
Typ
Objekt mit BCP 47-Sprachcodes als Property-Namen
Validierung
JSON Schema: localizedString.json

RichText

Ein RichText ist eine nichtleere Liste von TextObject-Objekten, die denselben Text in verschiedenen Sprachen und Formaten enthalten.

[
  {
    "type": "TextObject",
    "text": "Dies ist ein **Beispieltext**.",
    "inLanguage": "de",
    "encodingFormat": "text/markdown"
  },
  {
    "type": "TextObject",
    "text": "This is an **example text**.",
    "inLanguage": "en",
    "encodingFormat": "text/markdown"
  }
]
      
Referenzen
Course (description, learningOutcomeSummary, coursePrerequisites), EducationalOccupationalProgram (description, programPrerequisites), EducationalOccupationalCredential (description) Person (description), Organization (description), Location (description), Audience (description)
Validierung
JSON Schema: richText.json

TextObject

Ein TextObject enthält Text mit zusätzlichen Infomrationen über Sprache und Format.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "TextObject"
text ja string Textinhalt des Objekts
inLanguage ja string Sprache des Textes als BCP 47-Sprachcode, z. B. "de" oder "en"
encodingFormat ja string Medienformat des Textes, z. B. "text/plain", "text/html" oder "text/markdown"
{
  "type": "TextObject",
  "text": "Dies ist ein Beispieltext.",
  "inLanguage": "de",
  "encodingFormat": "text/plain"
}
      
{
  "type": "TextObject",
  "text": "

Dies ist ein Beispieltext.

", "inLanguage": "de", "encodingFormat": "text/html" }
{
  "type": "TextObject",
  "text": "Dies ist ein **Beispieltext**.",
  "inLanguage": "de",
  "encodingFormat": "text/markdown"
}
      
Referenzen
RichText
Validierung
JSON Schema: textObject.json

Schedule

Ein Schedule beschreibt regelmäßige oder wiederkehrende Termine.
Eigenschaft Pflichtfeld Typ Hinweis
type ja "Schedule"
byDay ja array[DayOfWeek] Liste der Wochentage, an denen ein Termin im Zeitplan stattfindet
startTime ja RFC 3339 time Startuhrzeit des Termins im Zeitplan
endTime ja RFC 3339 time Enduhrzeit des Termins im Zeitplan
scheduleTimezone nein string IANA-Zeitzone des Zeitplans, z. B. "Europe/Berlin" (optional)
repeatFrequency ja ISO 8601 duration Wiederholungsintervall, z. B. "P1W" für wöchentliche Wiederholung
startDate ja RFC 3339 date Erstes Kalenderdatum, an dem ein Termin im Zeitplan stattfindet
endDate nein RFC 3339 date Letztes Kalenderdatum, an dem ein Termin im Zeitplan stattfindet
{
  "type": "Schedule",
  "byDay": ["https://schema.org/Monday", "https://schema.org/Wednesday", "https://schema.org/Friday"],
  "startTime": "10:00:00",
  "endTime": "12:00:00",
  "scheduleTimezone": "Europe/Berlin",
  "repeatFrequency": "P1W",
  "startDate": "2026-06-01",
  "endDate": "2026-06-30"
}
      
{
  "type": "Schedule",
  "byDay": ["https://schema.org/Tuesday"],
  "startTime": "14:00:00",
  "endTime": "16:00:00",
  "scheduleTimezone": "Europe/Berlin",
  "repeatFrequency": "P1M",
  "startDate": "2026-06-01",
  "endDate": "2026-12-31"
}
      
Referenzen
CourseInstance (courseSchedule), CourseEvent (eventSchedule)
Validierung
JSON Schema: schedule.json

Offer

Ein Offer beschreibt Preis und Zugangsbedingungen für einen Kurs, ein Zertifikat oder das Gesamtpaket.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "Offer"
price ja number Preis in der angegebenen Währung, z. B. 49.99
priceCurrency ja string Dreistelliger ISO-4217-Code der Währung, z. B. "EUR" für Euro
category ja OfferCategory Kategorie des Angebots, z. B. "course", "certificate" oder "complete"
paymentFrequency nein PaymentFrequency Zahlungsfrequenz, z. B. "monthly" für monatliche Zahlungen
availabilityStarts nein RFC 3339 date-time Startdatum und -uhrzeit der Verfügbarkeit des Angebots, z. B. "2024-01-01T00:00:00Z"
availabilityEnds nein RFC 3339 date-time Enddatum und -uhrzeit der Verfügbarkeit des Angebots, z. B. "2024-12-31T23:59:59Z"
url nein string (URL) URL der Buchungs- oder Einschreibeseite, z. B. "https://example.org/courses/python/enroll"
{
  "type": "Offer",
  "price": 49.99,
  "priceCurrency": "EUR",
  "category": "course",
  "paymentFrequency": "monthly",
  "availabilityStarts": "2024-01-01T00:00:00Z",
  "availabilityEnds": "2024-12-31T23:59:59Z",
  "url": "https://example.org/courses/python/enroll"
}
      
{
  "type": "Offer",
  "price": 19.99,
  "priceCurrency": "EUR",
  "category": "certificate",
  "availabilityStarts": "2024-01-01T00:00:00Z",
  "availabilityEnds": "2024-12-31T23:59:59Z",
  "url": "https://example.org/courses/python/certificate"
}
      
{
  "type": "Offer",
  "price": 69.99,
  "priceCurrency": "EUR",
  "category": "complete",
  "availabilityStarts": "2024-01-01T00:00:00Z",
  "availabilityEnds": "2024-12-31T23:59:59Z",
  "url": "https://example.org/courses/python/complete"
}
      
Referenzen
Course (offers)
Validierung
JSON Schema: offer.json

Person

Beschreibt eine beteiligte Person, zum Beispiel eine Lehrperson, erstellende Person oder beitragende Person.

Eigenschaft Pflichtfeld Typ Hinweis
@context nein array[string|object] JSON-LD-Kontext
type ja "Person"
id ja ID Eindeutiger Identifikator der Person, z. B. eine URI oder ein URN
name ja LocalizedString Name der Person in einer oder mehreren Sprachen
honorificPrefix nein string Akademischer oder höflicher Titel vor dem Namen, z. B. "Dr.", "Prof.", "Sir"
honorificSuffix nein string Akademischer oder höflicher Titel nach dem Namen, z. B. "PhD", "Jr.", "Sr."
jobTitle nein string Berufsbezeichnung oder Funktion der Person, z. B. "Professor für Informatik"
description nein RichText Längere Beschreibung der Person in einer oder mehreren Sprachen und Formaten
sameAs nein array[string (URI)] Liste von URIs, die auf die Person verweisen, z. B. Homepage, Wikipedia-Seite, LinkedIn-Profil etc.
image nein ImageObject Bilder der Person, z. B. Porträtfotos
affiliation nein array[Organization] Organisationen, mit der die Person verbunden ist, z. B. Arbeitgeber oder Hochschule
dateModified nein RFC 3339 date-time Zeitpunkt der letzten Änderung der veröffentlichten Personendaten
{
  "type": "Person",
  "id": "https://example.org/people/beispielperson",
  "name": "Beispielperson",
  "honorificPrefix": "Prof.",
  "honorificSuffix": "Dr.",
  "jobTitle": "Professor für Informatik",
  "description": [{
    "type": "TextObject",
    "text": "Beispielperson ist Professorin für Informatik an der Technischen Hochschule Lübeck.",
    "inLanguage": "de",
    "encodingFormat": "text/plain"
  }],
  "sameAs": [
    "https://example.org/people/beispielperson"
  ],
  "image": {
    "type": "ImageObject",
    "contentUrl": "https://example.org/images/beispielperson.jpg",
    "license": {
      "type": "License",
      "identifier": "Proprietary",
      "id": null
    }
  },
  "affiliation": {
    "type": "Organization",
    "name": {
      "de": "Technische Hochschule Lübeck"
    }
  }
}
      
Referenzen
Course (publisher, creator, contributor, funder), CourseInstance (instructor), CourseEvent (instructor), EducationalOccupationalProgram (provider), Location (owner), LearningItem (publisher, creator)
Validierung
JSON Schema: person.json

Organization

Beschreibt eine Institution, einen Anbieter, Herausgeber, Förderer oder eine andere Organisation.

Eigenschaft Pflichtfeld Typ Hinweis
@context nein array[string|object] JSON-LD-Kontext
type ja "Organization"
id ja ID Eindeutiger Identifikator der Organisation, z. B. eine URI oder ein URN
name ja LocalizedString Name der Organisation in einer oder mehreren Sprachen
sameAs nein array[string (URL)] Liste von URIs, die auf die Organisation verweisen, z. B. Homepage, Wikipedia-Seite, LinkedIn-Profil etc.
description nein RichText Längere Beschreibung der Organisation in einer oder mehreren Sprachen und Formaten
image nein ImageObject Bilder der Organisation, z. B. Logos
dateModified nein RFC 3339 date-time Zeitpunkt der letzten Änderung der veröffentlichten Organisationsdaten
{
  "name": {
    "de": "Institut für Interaktive Systeme"
  },
  "sameAs": [
    "https://www.th-luebeck.de"
  ],
  "type": "Organization",
  "image": {
    "description": {
      "de": "Logo der Technischen Hochschule Lübeck"
    },
    "type": "ImageObject",
    "contentUrl": "https://futurelearnlab.de/hub/pluginfile.php/1/local_ildmeta/provider/2/fhl-intern-logo.png",
    "license": {
      "type": "License",
      "identifier": "Proprietary",
      "id": null
    }
  }
}
      
Referenzen
Course (publisher, creator, contributor, funder), EducationalOccupationalProgram (provider), Location (owner), LearningItem (publisher, creator), Person (affiliation)
Validierung
JSON Schema: organization.json

Location

Location beschreibt einen physischen oder virtuellen Veranstaltungsort.

Eigenschaft Pflichtfeld Typ Hinweis
@context nein array[string|object] JSON-LD-Kontext
type ja "Place" oder "VirtualLocation"
id ja ID Eindeutiger Identifikator des Ortes.
name ja LocalizedString Name des Ortes, z. B. "Technische Hochschule Lübeck" oder "Zoom-Meetingraum"
address Ja, wenn nicht url oder geo angegeben PostalAddress Physische Adresse des Ortes, z. B. "Mönkhofer Weg 239, 23562 Lübeck, Deutschland"
url Ja, wenn nicht address oder geo angegeben string (URL) Virtuelle URL des Ortes, z. B. "https://example.org/online-course"
geo Ja, wenn nicht address oder url angegeben GeoCoordinates Geografische Koordinaten des Ortes, z. B. {"latitude": 53.8791, "longitude": 10.6866}
description nein RichText Beschreibung des Ortes, z. B. "Hauptcampus der Technischen Hochschule Lübeck"
publicAccess nein boolean Gibt an, ob der Ort öffentlich zugänglich ist (true) oder nicht (false)
photo nein ImageObject Ein Bild des Ortes, z. B. ein Titelbild oder ein Foto der Räumlichkeiten
openingHoursSpecification nein array[OpeningHoursSpecification] Öffnungszeiten des Ortes
owner nein Organization | Person Die Organisation oder Person, die den Ort besitzt oder verwaltet, z. B. die Technische Hochschule Lübeck
maximumAttendeeCapacity nein integer Maximale Teilnehmerkapazität des Ortes, z. B. 100
sameAs nein array[string (URL)] Eine Liste von URLs, die den Ort beschreiben, z. B. Wikipedia-Artikel oder eine Webseite des Anbieters
dateModified nein RFC 3339 date-time Zeitpunkt der letzten Änderung der veröffentlichten Ortsdaten.
{
  "type": "Place",
  "id": "urn:uuid:f988cf9e-d10e-4847-8c0f-d87e88ff4f2a",
  "name": {
    "en": "Campus Luebeck, Building A, Room 101"
  },
  "description": [ "..." ],
  "address": {
    "type": "PostalAddress",
    "streetAddress": "Mönkhofer Weg 239",
    "postalCode": "23562",
    "addressLocality": "Luebeck",
    "addressCountry": "Germany"
  },
  "geo": {
    "type": "GeoCoordinates",
    "latitude": 53.8695,
    "longitude": 10.6861
  },
  "publicAccess": true,
  "photo": {
    "type": "ImageObject",
    "..."
  },
  "openingHoursSpecification": [
    {
      "type": "OpeningHoursSpecification",
      "dayOfWeek": [
        "https://schema.org/Monday",
        "https://schema.org/Wednesday"
      ],
      "opens": "08:00:00",
      "closes": "18:00:00"
    }
  ],
  "owner": {
    "type": "Organization",
    "..."
  },
  "maximumAttendeeCapacity": 20,
  "sameAs": [
    "https://pubdoc.th-luebeck.de/1af09392ff"
  ]
}
      
{
  "type": "VirtualLocation",
  "name": {
    "en": "Virtual Meeting Room"
  },
  "url": "https://example.org/virtual-meeting-room"
}
      
Referenzen
CourseInstance (location), CourseEvent (location)
Validierung
JSON Schema: location.json

PostalAddress

Eine PostalAddress beschreibt eine physische Adresse mit Straße, Ort, Postleitzahl und Land.
Eigenschaft Pflichtfeld Typ Hinweis
type ja "PostalAddress"
streetAddress ja string Straße und Hausnummer, z. B. "Mönkhofer Weg 239"
addressLocality nein string Stadt oder Ort, z. B. "Lübeck"
postalCode nein string Postleitzahl, z. B. "23562"
addressCountry nein string Land, z. B. "Deutschland"
{
  "type": "PostalAddress",
  "streetAddress": "Mönkhofer Weg 239",
  "addressLocality": "Lübeck",
  "postalCode": "23562",
  "addressCountry": "Deutschland"
}
        
Referenzen
Location (postalAddress)
Validierung
JSON Schema: postalAddress.json

GeoCoordinates

GeoCoordinates beschreibt die geografische Position eines Ortes mit latitude und longitude.
Eigenschaft Pflichtfeld Typ Hinweis
type ja "GeoCoordinates"
latitude ja number Breitengrad in Dezimalgrad, z. B. 53.8791
longitude ja number Längengrad in Dezimalgrad, z. B. 10.6866
{
  "type": "GeoCoordinates",
  "latitude": 53.8791,
  "longitude": 10.6866
}
      
Referenzen
Location (geo)
Validierung
JSON Schema: geoCoordinates.json

OpeningHoursSpecification

Eine OpeningHoursSpecification beschreibt die Öffnungszeiten eines Ortes.
Eigenschaft Pflichtfeld Typ Hinweis
type ja "OpeningHoursSpecification"
dayOfWeek ja array[DayOfWeek] Liste der Wochentage, an denen der Ort geöffnet ist.
opens ja RFC 3339 time Öffnungszeit im Format "hh:mm:ss", z. B. "08:00:00"
closes ja RFC 3339 time Schließzeit im Format "hh:mm:ss", z. B. "18:00:00"
validFrom nein RFC 3339 date Einschränkung des Gültigkeitszeitraums der Öffnungszeiten (optional)
validThrough nein RFC 3339 date Einschränkung des Gültigkeitszeitraums der Öffnungszeiten (optional)
Referenzen
Location (openingHoursSpecification)
Validierung
JSON Schema: openingHoursSpecification.json

License

Ein License-Objekt beschreibt die Rechte an einer Ressource.

Sie MUSS einen identifier als lesbare Bezeichnung und MUSS id als URI der Lizenzbedingungen benennen.

Wenn keine öffentliche Lizenz-URI existiert, SOLL id ausdrücklich null sein, zum Beispiel bei proprietären Inhalten. identifier MUSS dann weiterhin den Rechtezustand verständlich benennen.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "License"
id nein string (URL) URI der Lizenzbedingungen. Bei fehlender öffentlicher Lizenz-URI wird das Feld weggelassen.
identifier ja string Lesbare Bezeichnung der Lizenz, z. B. "CC BY 4.0" oder "Proprietary".

Für Rechteangaben wie „Alle Rechte vorbehalten“ MUSS ein lesbarer identifier angegeben werden. Gibt es kein öffentliches Lizenzdokument, DARF id entfallen. id: null ist nicht zulässig, weil id im JSON-LD-Kontext als @id interpretiert wird und JSON-LD dort keine Nullwerte erlaubt.

{
  "type": "License",
  "id": "https://creativecommons.org/licenses/by/4.0/",
  "identifier": "CC BY 4.0"
}
      
Referenzen
Course (license), ImageObject (license), Trailer (license)
Validierung
JSON Schema: license.json

ImageObject

Ein ImageObject ist ein lizenziertes Bild

Es MUSS contentUrl und license enthalten sein.

Zusätzlich KANN eine Beschreibung als lokalisierter Plain-Text-Wert angegeben werden.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "ImageObject"
contentUrl ja string (URL) URL des Bildes, z. B. "https://example.org/images/python-bootcamp-cover.jpg"
license ja License Lizenzinformationen für das Bild.
description nein LocalizedString Lokalisiert beschreibender Text für das Bild.
"image": {
  "type": "ImageObject",
  "contentUrl": "https://example.org/images/python-bootcamp-cover.jpg",
  "license": {
    "type": "License",
    "id": "https://creativecommons.org/licenses/by/4.0/",
    "identifier": "CC BY 4.0"
  },
  "description": {
    "de": "Titelbild des Python-Bootcamps",
    "en": "Cover image of the Python Bootcamp"
  }
}
      
Referenzen
Course (image), EducationalOccupationalProgram (image), Location (photo), Person (image), Organization (image)
Validierung
JSON Schema: image.json

Trailer

Ein Trailer ist ein lizenziertes Video.

Es MUSS entweder contentUrl oder embedUrl enthalten und MUSS license enthalten.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "VideoObject" oder "AudioObject"
contentUrl ja, wenn kein embedUrl angegeben ist string (URL) URL des Videos, z. B. "https://example.org/videos/python-bootcamp-trailer.mp4"
embedUrl ja, wenn kein contentUrl angegeben ist string (URL) URL zum Einbetten des Videos, z. B. "https://www.youtube.com/embed/abc123"
encodingFormat nein string IANA-MIME-Typ des Videos, z. B. "video/mp4" oder "video/webm". Siehe IANA Media Types.
contentSize nein string Größe des Videos in Bytes, z. B. "1048576" für 1 MB.
sha256 nein string SHA-256-Hash des Videos.
bitrate nein string Bitrate des Videos in Kilobytes pro Sekunde, z. B. "5000" für 5 Mbps.
license ja License Lizenzinformationen für das Video.
description nein LocalizedString Lokalisiert beschreibender Text für das Video.
"trailer": {
  "type": "VideoObject",
  "embedUrl": "https://example.org/videos/embed/python-bootcamp-trailer.mp4",
  "license": {
    "type": "License",
    "id": "https://creativecommons.org/licenses/by/4.0/",
    "identifier": "CC BY 4.0"
  },
  "description": {
    "de": "Trailer des Python-Bootcamps",
    "en": "Trailer of the Python Bootcamp"
  }
}
      
Referenzen
Course (trailer)
Validierung
JSON Schema: trailer.json

Enum-Typen

Die folgenden Typen sind Enumerationen, die nur bestimmte Werte zulassen.

LearningMode

Die Art der Bereitstellung oder Durchführung eines Leranangebots.

Der Wert von learningMode MUSS einem der folgenden Werte entsprechen:

  • online: Der Kurs kann vollständig online bearbeitet werden.
  • onsite: Der Kurs kann vollständig vor Ort bearbeitet werden.
  • blended: Der Kurs muss sowohl online als auch vor Ort bearbeitet werden.
  • synchronous: Der Kurs findet zu festen Terminen statt, die von allen Teilnehmern gleichzeitig wahrgenommen werden müssen.
  • asynchronous: Der Kurs kann zeitlich flexibel bearbeitet werden, ohne dass alle Teilnehmer gleichzeitig anwesend sein müssen.
"courseMode": ["online", "asynchronous"]
        
"courseMode": ["onsite", "synchronous"]
        
"courseMode": ["blended", "synchronous"]
        
"courseMode": ["online", "onsite", "synchronous"]
        
Referenzen
Course (courseMode), EducationalOccupationalProgram (educationalProgramMode)
Validierung
JSON Schema: learningMode.json

AccessMode

Ein AccessMode beschreibt den sensorischen oder kognitiven Zugangsmodus einer Lernressource.

Der Wert von accessMode MUSS einem der folgenden Werte entsprechen:

  • auditory: Die Lernressource kann über das Gehör wahrgenommen werden.
  • tactile: Die Lernressource kann über den Tastsinn wahrgenommen werden.
  • textual: Die Lernressource kann über das Lesen von Text wahrgenommen werden.
  • visual: Die Lernressource kann über das Sehen wahrgenommen werden.
"accessMode": ["textual", "auditory", "visual"]
      
Referenzen
Course (accessMode)
Validierung
JSON Schema: accessModeType.json

DayOfWeek

Ein DayOfWeek ist ein Wochentag Enum-Typ, der in schema.org definiert ist. Folgende Werte sind zulässig:
  • https://schema.org/Monday
  • https://schema.org/Tuesday
  • https://schema.org/Wednesday
  • https://schema.org/Thursday
  • https://schema.org/Friday
  • https://schema.org/Saturday
  • https://schema.org/Sunday
Referenzen
OpeningHoursSpecification (dayOfWeek), Schedule (byDay),
Validierung
JSON Schema: dayOfWeek.json

OfferCategory

Eine OfferCategory ist ein ENUM-Wert, der die Kategorie eines Angebots beschreibt.

Es MUSS einer der folgenden Werte sein:

  • "course" – Angebot für einen Kurs
  • "certificate" – Angebot für ein Zertifikat
  • "complete" – Angebot für das Gesamtpaket (Kurs + Zertifikat)
Referenzen
Offer (category)
Validierung
JSON Schema: offerCategory.json

PaymentFrequency

Eine PaymentFrequency ist ein ENUM-Wert, der die Zahlungsfrequenz eines Angebots beschreibt.

Es KANN einer der folgenden Werte sein:

  • "one-time" – Einmalige Zahlung (Standardwert)
  • "weekly" – Wöchentliche Zahlung
  • "monthly" – Monatliche Zahlung
  • "quarterly" – Vierteljährliche Zahlung
  • "by-term" – Zahlung pro Semester oder Trimester
  • "half-yearly" – Halbjährliche Zahlung
  • "yearly" – Jährliche Zahlung
  • "other" – Andere Zahlungsfrequenz
Referenzen
Offer (paymentFrequency)
Validierung
JSON Schema: paymentFrequency.json

AlignmentObject

Ein AlignmentObject beschreibt die Zuordnung einer Ressource zu einem Klassifikationssystem.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "AlignmentObject"
alignmentType ja string Typ der Zuordnung, z. B. "educationalSubject".
educationalFramework ja string Name des Klassifikationssystems, z. B. "ISCED-F".
targetUrl ja, wenn keine identifier angegeben ist string (URI) Eindeutige URL des zugeordneten Objekts in der Klassifikation.
identifier ja, wenn keine targetUrl angegeben ist string Eindeutiger Bezeichner des zugeordneten Objekts in der Klassifikation.
targetName ja LocalizedString Name des zugeordneten Objekts in der Klassifikation.
targetDescription nein LocalizedString Beschreibung des zugeordneten Objekts in der Klassifikation.
{
  "type": "AlignmentObject",
  "alignmentType": "educationalSubject",
  "educationalFramework": "ISCED-F",
  "targetName": {
    "en": "Computer use"
  },
  "targetUrl": "http://data.europa.eu/esco/isced-f/0611",
  "identifier": "0611",
  "targetDescription": {
    "en": "The ability to use computers and related technology efficiently."
  }
}
      
Validierung
JSON Schema: alignmentObject.json

EducationalAlignment

Ein EducationalAlignment ordnet den Kurs einem oder mehreren Fächern, Wissensgebieten oder Lernerinteressen in einem benannten Klassifikationssystem zu.

Die Property MUSS eine nichtleere Liste enthalten von AlignmentObject-Objekten oder eines der folgenden empfohlenen spezialisierten Profile.

"educationalAlignment": [
  {
    "type": "AlignmentObject",
    "alignmentType": "educationalSubject",
    "educationalFramework": "ISCED-F",
    "targetName": {
      "en": "Computer use"
    },
    "targetUrl": "http://data.europa.eu/esco/isced-f/0611"
  },
  {
    "type": "AlignmentObject",
    "alignmentType": "educationalSubject",
    "educationalFramework": "OEFOS",
    "targetName": {
      "en": "Computer use"
    },
    "identifier": "0611"
  },
  {
    "type": "AlignmentObject",
    "alignmentType": "educationalSubject",
    "educationalFramework": "Hochschulfächersystematik",
    "targetName": {
      "en": "Medieninformatik"
    },
    "targetUrl": "https://w3id.org/kim/hochschulfaechersystematik/n121"
  },
  {
    "type": "AlignmentObject",
    "alignmentType": "educationalSubject",
    "educationalFramework": "Schulfächer",
    "targetName": {
      "en": "Informatik"
    },
    "targetUrl": "http://w3id.org/kim/schulfaecher/s1013"
  },
  {
    "type": "AlignmentObject",
    "alignmentType": "educationalSubject",
    "educationalFramework": "Holland Codes",
    "targetName": {
      "en": "Artistic (A)"
    },
    "targetUrl": "https://www.onetcenter.org/rdf/resources/onet/Element/52c657cb-1b12-11ea-8239-782bcb5df6ac",
    "identifier": "A"
  }
]
        
Referenzen
Course (educationalAlignment)
Validierung
JSON Schema: educationalAlignment.json

ISCED-F Alignment

Für das Framework ISCED-F (International Standard Classification of Education - Fields of Education and Training 2013) wird der alignmentType educationalSubject verwendet.

targetUrl MUSS eine gültige URL im ESCO-ISCED-F-Vokabular verweisen. Es gilt das Muster ^http://data.europa.eu/esco/isced-f/.*$.

Weitere Informationen: [[!ISCED-F]].

{
  "type": "AlignmentObject",
  "alignmentType": "educationalSubject",
  "educationalFramework": "ISCED-F",
  "targetName": {
    "en": "Computer use"
  },
  "targetUrl": "http://data.europa.eu/esco/isced-f/0611"
}
          
Validierung
JSON Schema: iscedFAlignment.json

OEFOS Alignment

Für das Framework OEFOS (Österreichische Systematik der Wissenschaftszweige) wird der alignmentType educationalSubject verwendet. Der identifier MUSS ein numerischer Code mit zwei bis vier Ziffern sein.

{
  "type": "AlignmentObject",
  "alignmentType": "educationalSubject",
  "educationalFramework": "OEFOS",
  "targetName": {
    "en": "Computer use"
  },
  "identifier": "0611"
}
          

Weitere Informationen: [[!OEFOS]].

Validierung
JSON Schema: oefosAlignment.json

Hochschulfächersystematik Alignment

Die Hochschulfächersystematik ist die Destatis-Systematik der Fächergruppen, Studienbereiche und Studienfächer. Für dieses Framework wird der alignmentType educationalSubject verwendet.

targetUrl MUSS auf einen Eintrag der Hochschulfächersystematik verweisen. Es gilt das Muster ^https://w3id.org/kim/hochschulfaechersystematik/.*$.

Weitere Informationen: [[!Hochschulfächersystematik]].

{
  "type": "AlignmentObject",
  "alignmentType": "educationalSubject",
  "educationalFramework": "Hochschulfächersystematik",
  "targetName": {
    "en": "Medieninformatik"
  },
  "targetUrl": "https://w3id.org/kim/hochschulfaechersystematik/n121"
}
          
Validierung
JSON Schema: hochschulfaechersystematikAlignment.json

Schulfächer Alignment

Die Schulfächer ist eine Werteliste für allgemeinbildende Schulfächer. Für dieses Framework wird der alignmentType educationalSubject verwendet.

targetUrl MUSS auf einen Eintrag der Schulfächerliste verweisen. Es gilt das Muster ^http://w3id.org/kim/schulfaecher/.*$.

Weitere Informationen: [[!Schulfächerliste]].

{
  "type": "AlignmentObject",
  "alignmentType": "educationalSubject",
  "educationalFramework": "Schulfächer",
  "targetName": {
    "en": "Informatik"
  },
  "targetUrl": "http://w3id.org/kim/schulfaecher/s1013"
}
          
Validierung
JSON Schema: schulfaecherAlignment.json

Holland Codes Alignment

Die Holland Codes (RIASEC) beschreiben berufliche Interessen in sechs Interessentypen. Für dieses Framework wird der alignmentType educationalSubject verwendet.

Das erforderliche identifier MUSS genau einem der sechs Holland-Codes R (Realistic), I (Investigative), A (Artistic), S (Social), E (Enterprising) oder C (Conventional) entsprechen.

Weitere Informationen: [[!Holland Codes]].

{
  "type": "AlignmentObject",
  "alignmentType": "educationalSubject",
  "educationalFramework": "Holland Codes",
  "targetName": {
    "en": "Artistic (A)"
  },
  "targetUrl": "https://www.onetcenter.org/rdf/resources/onet/Element/52c657cb-1b12-11ea-8239-782bcb5df6ac",
  "identifier": "A"
}
          
Validierung
JSON Schema: hollandCodesAlignment.json

Concept

Ein Concept verweist auf einen Begriff aus einem stabilen, veröffentlichten und kontrollierten Vokabular.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "Concept"
id ja string (URI) URI, die das Concept eindeutig identifiziert.
inScheme nein string (URI) URI des Vokabulars, in dem das Concept enthalten ist.
prefLabel ja LocalizedString Name des Concepts.
definition nein LocalizedString Definition des Concepts.
{
  "type": "Concept",
  "id": "https://w3id.org/kim/educationalLevel/level_6",
  "prefLabel": {
    "de": "Bachelor oder äquivalent"
  },
  "definition": {
    "de": "Ein Bildungsniveau, das einem Bachelorabschluss oder einem gleichwertigen Abschluss entspricht."
  },
  "inScheme": "https://w3id.org/kim/educationalLevel/"
}
      
Referenzen
Competency (proficiencyLevel)
Validierung
JSON Schema: concept.json

Skill Concept

Ein Skill wird in MOOChub als Concept beschrieben. Es gibt dafür keinen zusätzlichen eigenständigen Datentyp.

Skillkonzepte SOLLEN in einem stabilen, veröffentlichten und kontrollierten Vokabular enthalten sein. Provider SOLLTEN die ursprünglichen URIs, inScheme-Angaben und Labels des jeweiligen Kompetenzmodells übernehmen. Die folgenden Modelle werden von MOOChub für Skills besonders empfohlen:

  • [[!ESCO]]: id ist die URI des Skills, zum Beispiel http://data.europa.eu/esco/skill/...; inScheme ist http://data.europa.eu/esco/concept-scheme/skills.
  • [[!DigComp]]: Kompetenzkonzepte sollen mit ihrer originalen id, inScheme, Bezeichnung und Definition aus dem veröffentlichten DigComp-Datensatz übernommen werden. DigComp enthält neben Kompetenzkonzepten auch Proficiency-Level-Konzepte; deren Verwendung wird im Abschnitt ProficiencyLevel beschrieben.
{
  "type": "Concept",
  "id": "http://data.europa.eu/esco/skill/ccd0a1d9-afda-43d9-b901-96344886e14d",
  "prefLabel": {
    "de": "Python (Computerprogrammierung)"
  },
  "definition": {
    "de": "Techniken und Grundsätze der Softwareentwicklung wie Analyse, Algorithmen, Programmierung, Testen und Kompilieren von Programmierparadigmen in Python."
  },
  "inScheme": "http://data.europa.eu/esco/concept-scheme/skills"
}
      
Referenzen
Competency (relatedSkill)
Validierung
JSON Schema: concept.json

ProficiencyLevel

proficiencyLevel beschreibt das Beherrschungsniveau einer Competency. Der Wert ist ein oder mehrere Concept-Objekte. ProficiencyLevel ist kein eigener Datentyp und bringt keine zusätzliche Validierung mit. Es gelten ausschließlich die Regeln für Concept.

Die Verwendung des DigComp-Vokabulars wird empfohlen. Provider sollten die originale id, die URI des Vokabulars in inScheme und, sofern vorhanden, das originale prefLabel übernehmen. Ein Beispiel für ein DigComp-3.0- Konzept:

{
  "type": "Concept",
  "id": "https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/DIGCOMP/DIGCOMP3.0/DigComp%203.0%20Data%20Supplement%2024%20Nov%202025.jsonld#ProficiencyLevel/Intermediate_3",
  "inScheme": "https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/DIGCOMP/DIGCOMP3.0/DigComp%203.0%20Data%20Supplement%2024%20Nov%202025.jsonld",
  "prefLabel": {
    "en": "Intermediate"
  }
}
        
Typ
Concept
Validierung
JSON Schema: concept.json

EducationalLevel

Verweis auf eine Stufe im Bildungssystem als Lehr-/Lernkontext, für den eine Bildungsressource ausgewiesen ist.

Ein EducationalLevel ist ein Concept zur Beschreibung einer Bildungsstufe.

Die Property `id` MUSS einer URI aus den [[!Bildungsstufen]] entsprechen.

{
  "type": "Concept",
  "id": "https://w3id.org/kim/educationalLevel/level_6",
  "prefLabel": {
    "de": "Bachelor oder äquivalent",
    "en": "Bachelor or equivalent"
  },
  "definition": {
    "de": "Ein Bildungsniveau, das einem Bachelorabschluss oder einem gleichwertigen Abschluss entspricht.",
    "en": "An educational level equivalent to a bachelor's degree or equivalent."
  },
  "inScheme": "https://w3id.org/kim/educationalLevel/"
}
      
Typ
Concept
Referenzen
Course (educationalLevel) EducationalOccupationalCredential (educationalLevel)
Validierung
JSON Schema: educationalLevel.json

AudienceType

Ein AudienceType ist ein Verweis auf eine Zielgruppenrolle aus dem [[!LRMI]]-Vokabular in Form eines Concept-Objekts.

id MUSS einem der folgenden LRMI-Vokabular-URIs entsprechen:

  • http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/administrator
  • http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/generalPublic
  • http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/mentor
  • http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/parent
  • http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/peerTutor
  • http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/professional
  • http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/student
  • http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/teacher

inScheme MUSS auf http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole verweisen.

{
  "type": "Concept",
  "id": "http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/student",
  "prefLabel": {
    "en": "Student",
    "de": "Studierende"
  },
  "inScheme": "http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole"
}
        
Referenzen
Audience (audienceType)
Validierung
JSON Schema: audienceType.json

CredentialCategory

Ein CredentialCategory beschreibt die Kategorie eines Bildungs- oder Berufsqualifikationsnachweises.

Ein CredentialCategory ist ein Concept basierend auf dem europäischen Vokabular für Credential-Typen.

Der Wert von inScheme MUSS http://data.europa.eu/snb/credential/25831c2 sein.

Der Wert von id MUSS eine der folgenden URIs sein:

  • http://data.europa.eu/snb/credential/48b514e72a - Lernaktivität (Learning Activity)
  • http://data.europa.eu/snb/credential/6dff8a0f87 - Diplomzusatz (Diploma Supplement)
  • http://data.europa.eu/snb/credential/bdc47cb449 - Ansprüche auf Teilnahme an Bildungsmaßnahmen (Learning Entitlement)
  • http://data.europa.eu/snb/credential/e34929035b - Generisch (Generic)
  {
    "type": "Concept",
    "id": "http://data.europa.eu/snb/credential/e34929035b",
    "prefLabel": {
      "de": "Generisch",
      "en": "Generic"
    },
    "inScheme": "http://data.europa.eu/snb/credential/25831c2"
  }
        
Referenzen
EducationalOccupationalCredential (credentialCategory)
Validierung
JSON Schema: credentialCategory.json

InteractivityType

Ein InteractivityType ist ein Concept zur Beschreibung der vorherrschenden Lehr-/Lernform einer Bildungsressource anhand des [[!LRMI]]-Vokabulars.

Die Property `id` MUSS einem der folgenden LRMI-Vokabular-URIs entsprechen:

  • http://purl.org/dcx/lrmi-vocabs/interactivityType/active
  • http://purl.org/dcx/lrmi-vocabs/interactivityType/expositive
  • http://purl.org/dcx/lrmi-vocabs/interactivityType/mixed
"interactivityType": {
  "type": "Concept",
  "id": "http://purl.org/dcx/lrmi-vocabs/interactivityType/active",
  "prefLabel": {
    "de": "aktiv",
    "en": "active"
  },
  "inScheme": "http://purl.org/dcx/lrmi-vocabs/interactivityType/"
}
        
Referenzen
Course (interactivityType)
Validierung
JSON Schema: interactivityType.json

AccessConditionType

Ein AccessConditionType ist ein Concept zur Beschreibung der Zugangsbedingungen einer Bildungsressource.

Die Property `id` MUSS einer URI aus dem Zugangsbedingungen-Vokabular entsprechen.

Folgende Werte sind zulässig:

  • http://w3id.org/kim/conditionsOfAccess/no_login - Zugang ohne Login
  • http://w3id.org/kim/conditionsOfAccess/login - Zugang mit Login
"conditionsOfAccess": {
  "type": "Concept",
  "id": "http://w3id.org/kim/conditionsOfAccess/no_login",
  "prefLabel": {
    "de": "Zugang ohne Login",
    "en": "Access without login"
  },
  "inScheme": "https://w3id.org/kim/conditionsOfAccess/"
}
          
Referenzen
Course (conditionsOfAccess)
Validierung
JSON Schema: conditionsOfAccess.json

Competency

Competency beschreibt eine Kompetenz oder ein Lernergebnis.

Die Eigenschaft name KANN eine freie Kompetenzbezeichnung enthalten.

Es SOLLTE wo möglich relatedSkill verwendet werden, um die Kompetenz durch die Referenz eines oder mehrerer Skillkonzepten aus einem bekannten Kompetenzvokabular zu spezifizieren. Siehe Skill Concept.

Zusätzlich KANN proficiencyLevel angegeben werden, um das Beherrschungsniveau der Kompetenz zu spezifizieren. Siehe ProficiencyLevel.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "Competency"
id ja string (URI) URI, die die Kompetenz eindeutig identifiziert.
name ja LocalizedString Name der Kompetenz.
relatedSkill nein array[Concept] Skills aus einem bekannten oder provider-eigenen Kompetenzvokabular.
proficiencyLevel nein array[Concept] Framework-spezifisches Beherrschungsniveau dieser Kompetenz.
{
  "type": "Competency",
  "id": "urn:uuid:9e7c1b64-c460-4672-b666-cb64dc2d3921",
  "name": {
    "de": "Fähigkeit, einfache Python-Programme zu schreiben und auszuführen"
  },
  "relatedSkill": [
    {
      "type": "Concept",
      "id": "http://data.europa.eu/esco/skill/ccd0a1d9-afda-43d9-b901-96344886e14d",
      "inScheme": "http://data.europa.eu/esco/concept-scheme/skills",
      "prefLabel": {
        "de": "Python (Computerprogrammierung)"
      }
    }
  ],
  "proficiencyLevel": [
    {
      "type": "Concept",
      "id": "https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/DIGCOMP/DIGCOMP3.0/DigComp%203.0%20Data%20Supplement%2024%20Nov%202025.jsonld#ProficiencyLevel/Intermediate_3",
      "inScheme": "https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/DIGCOMP/DIGCOMP3.0/DigComp%203.0%20Data%20Supplement%2024%20Nov%202025.jsonld",
      "prefLabel": {
        "en": "Intermediate"
      }
    }
  ]
}
        
Referenzen
Course (competencyRequired, teaches, assesses) EducationalOccupationalCredential (competencyRequired)
Validierung
JSON Schema: competency.json

Audience

Audience beschreibt die vorgesehene Zielgruppe eines Kurses.

Mindestens eine Eigenschaft von audienceType, description oder suggestedAge MUSS angegeben werden.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "Audience"
audienceType nein array[AudienceType] Zielgruppenrollen, z. B. "Student", "Teacher" oder "Parent" aus dem LRMI-Vokabular.
description nein RichText Freitextliche Beschreibung der Zielgruppe.
suggestedAge nein SuggestedAge Einschränkung des Altersbereichs der Zielgruppe, z. B. minValue: 16, maxValue: 50.
{
  "type": "Audience",
  "audienceType": [
    {
      "type": "Concept",
      "id": "http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/student",
      "prefLabel": {
        "en": "Student",
        "de": "Studierende"
      },
      "inScheme": "http://purl.org/dcx/lrmi-vocabs/educationalAudienceRole"
    }
  ],
  "description": [
    {
      "type": "TextObject",
      "inLanguage": "de",
      "text": "Dieser Kurs richtet sich an Studierende, die ihre Programmierkenntnisse in Python erweitern möchten.",
      "encodingFormat": "text/plain"
    }
  ],
  "suggestedAge": {
    "minValue": 16,
    "maxValue": 50
  }
}
      
Referenzen
Course (audience)
Validierung
JSON Schema: audience.json

SuggestedAge

Ein SuggestedAge beschreibt den Altersbereich der Zielgruppe.

minValue und maxValue sind optional, aber mindestens eine der beiden Eigenschaften MUSS angegeben werden.

Eigenschaft Pflichtfeld Typ Hinweis
minValue ja, wenn maxValue nicht angegeben ist integer Minimales Alter der Zielgruppe, z. B. 16
maxValue ja, wenn minValue nicht angegeben ist integer Maximales Alter der Zielgruppe, z. B. 50
{
  "minValue": 16,
  "maxValue": 50
}
        
Referenzen
Audience (suggestedAge)
Validierung
JSON Schema: suggestedAge.json

AggregateRating

Ein AggregateRating beschreibt die zusammengefasste Bewertung, basierend auf den Einzelbewertungen einer Sache.

Eigenschaft Pflichtfeld Typ Hinweis
type ja "AggregateRating"
ratingValue ja number Durchschnittliche Bewertung, z. B. 4.5
reviewCount ja integer Anzahl der Bewertungen, z. B. 120
bestRating nein number Höchste mögliche Bewertung, z. B. 5
worstRating nein number Niedrigste mögliche Bewertung, z. B. 1
{
  "type": "AggregateRating",
  "ratingValue": 4.5,
  "reviewCount": 120,
  "bestRating": 5,
  "worstRating": 1
}
        
Referenzen
Course (aggregateRating)
Validierung
JSON Schema: aggregateRating.json

JSON:API-Katalog

Der Katalog ist ein paginierter JSON:API-Feed für unabhängig harvestbare Ressourcen wie `courses`, `programs`, `credentials`, `persons`, `organizations` und `locations`. Die Transportstruktur ist in api/catalogFeed.json definiert.

Der Katalog MUSS den Medientyp application/vnd.api+json verwenden und eine JSON:API-1.1- Antwort liefern. Die Ressourcentypen dürfen im selben Feed gemischt werden. Anbieter SOLLTEN einen kanonischen Katalog-Endpunkt anbieten und filter[type] unterstützen, damit Harvester bei Bedarf einen oder mehrere homogene Teilbestände abrufen können. Zusätzliche typspezifische Endpunkte sind zulässig, müssen aber denselben Identitätsraum verwenden.

Katalogeigenschaften

links

Seitennavigation des Katalogs mit self, first, last sowie optional next und prev.
Pflichtfeld
ja
Typ
Objekt
Validierung
JSON Schema

data

Die Liste der als JSON:API-Ressourcen übertragenen unabhängig harvestbaren Objekte. Unterstützte Ressourcentypen sind courses, programs, credentials, persons, organizations und locations.
Pflichtfeld
ja
Typ
array[CatalogResource]
Validierung
JSON Schema
{
  "links": {
    "self": "https://provider.example/api/catalog?page[number]=1",
    "first": "https://provider.example/api/catalog?page[number]=1",
    "last": "https://provider.example/api/catalog?page[number]=1",
    "next": null,
    "prev": null
  },
  "data": [
    {
      "type": "courses",
      "id": "course-123",
      "attributes": { "...": "vollständiges Course-Objekt" }
    }
  ]
}
Der Katalog verwendet eine provider-lokale JSON:API-ID in `data[].id`. Die fachliche URI des Objekts steht in `data[].attributes.id`.

Pagination und Filter

Die kanonischen Query-Parameter sind:

links.self ist Pflicht. Anbieter SOLLTEN first, last, next und prev liefern. Am jeweiligen Ende des Ergebnisses sind next beziehungsweise prev null. Die Reihenfolge MUSS während eines vollständigen Harvesting-Laufs stabil bleiben. meta.total kann die Gesamtzahl nach Anwendung des Filters angeben.

Eine gültige Anfrage, auch für eine leere Seite, wird mit 200 OK beantwortet. Ungültige Pagination- oder Filterwerte MÜSSEN mit einem JSON:API-Fehlerdokument und 400 Bad Request beantwortet werden. Nicht vorhandene Ressourcen SOLLTEN 404 Not Found liefern; für bewusst zurückgezogene Ressourcen kann 410 Gone verwendet werden.

Ressourcen-IDs und JSON-LD

data[].id ist eine nichtleere, provider-lokale JSON:API-ID. Die fachliche JSON-LD-Ressource in data[].attributes besitzt zusätzlich eine stabile URI in id. Beide Identitäten dienen unterschiedlichen Ebenen und müssen nicht denselben Wert haben.

Jedes unabhängig harvestbare Objekt MUSS eine stabile attributes.id und einen passenden fachlichen attributes.type besitzen. Die Kombination aus attributes.type und attributes.id bildet den fachlichen Identitätsschlüssel. Die JSON Schemas verlangen keine @context-Eigenschaft. Ein eigenständig veröffentlichtes JSON-LD-Dokument SOLLTE jedoch einen kompatiblen MOOChub-Kontext am Dokumentanfang enthalten.

Ein kompaktes Referenzobjekt darf nur id, type und optional name enthalten. Es bezeichnet dieselbe Ressource wie eine vollständige Darstellung und darf beim Zusammenführen bereits gespeicherte Eigenschaften nicht löschen.

JSON-Schemas und Beispiele

Das Root-Schema für Kurse ist schemas/course.json, für Programme schemas/program.json und für den Katalog schemas/api/catalogFeed.json. Wiederverwendbare Teilmodelle liegen im selben Schema-Verzeichnis. Gültige Beispiele sind beispielsweise für Kurse, für Programme und für Kataloge.

Weiterführende Dokumente